Files
arenax-server/internal/logic/task/task.go

315 lines
9.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package task
import (
"context"
"encoding/json"
"fmt"
"server/internal/dao"
"server/internal/model"
"server/internal/model/do"
"server/internal/service"
"server/utility/ecode"
"server/utility/snowid"
"server/utility/tencent"
"sort"
"strconv"
"strings"
"time"
)
type sTask struct{}
func New() service.ITask {
return &sTask{}
}
func init() {
service.RegisterTask(New())
}
func (s *sTask) UserTaskRankingList(ctx context.Context, in *model.UserTaskRankingIn) (out *model.UserTaskRankingOut, err error) {
// 判断排行类型
var start, end time.Time
if in.Type == 1 {
// 日
now := time.Now()
// 当天开始时间
start = time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
// 当天结束时间
end = time.Date(now.Year(), now.Month(), now.Day(), 23, 59, 59, 0, now.Location())
fmt.Println("开始时间:", start)
fmt.Println("结束时间:", end)
} else if in.Type == 2 {
// 周
now := time.Now()
loc := now.Location()
weekday := int(now.Weekday())
if weekday == 0 { // 周日是0
weekday = 7
}
// 本周开始时间(周一 00:00:00
start = time.Date(now.Year(), now.Month(), now.Day()-weekday+1, 0, 0, 0, 0, loc)
// 本周结束时间(周日 23:59:59
end = time.Date(now.Year(), now.Month(), now.Day()-weekday+7, 23, 59, 59, 0, loc)
} else if in.Type == 3 {
// 月
now := time.Now()
loc := now.Location()
// 本月开始时间1号 00:00:00
start = time.Date(now.Year(), now.Month(), 1, 0, 0, 0, 0, loc)
// 下月1号
nextMonth := start.AddDate(0, 1, 0)
// 本月结束时间(本月最后一天 23:59:59
end = nextMonth.Add(-time.Second)
} else {
return nil, ecode.Params.Sub("排行方式错误")
}
m := dao.UserTasks.Ctx(ctx)
// 构建查询条件
if in.Page == 0 {
in.Page = 1
}
if in.Size == 0 {
in.Size = 10
}
if in.StoreId > 0 {
m = m.Where(dao.UserTasks.Columns().StoreId, in.StoreId)
}
list := make([]model.UserTaskRankingArgs, 0)
var total int
// SELECT `uid`,`nickname` FROM `user` ORDER BY `uid` asc
err = m.Page(in.Page, in.Size).LeftJoin(dao.Users.Table(), fmt.Sprintf("`%s`.`id` = `%s`.`user_id`", dao.Users.Table(), dao.UserTasks.Table())).
Fields("username,avatar,count(*) num").Where(dao.UserTasks.Columns().Status, 2).
WhereBetween(dao.UserTasks.Columns().CompletedAt, start, end).OrderDesc("num").OrderDesc("username").Group("user_id").
ScanAndCount(&list, &total, false)
if err != nil {
return nil, ecode.Fail.Sub("查询排行榜失败")
}
// 判断登录查询当前任务完成数量,排名
var rankingNum int
var loginUserRanking []model.LoginUserRanking
var loginUserRankingNum model.LoginUserRankingNum
if in.OperatorId != 0 {
value, err := dao.UserTasks.Ctx(ctx).Fields("count(*) num").Where(dao.UserTasks.Columns().UserId, in.OperatorId).Where(dao.UserTasks.Columns().StoreId, in.StoreId).Where(dao.UserTasks.Columns().Status, 2).
WhereBetween(dao.UserTasks.Columns().CompletedAt, start, end).Group("user_id").
Value()
if err != nil {
return nil, ecode.Fail.Sub("查询当前登录用户完成数失败")
}
if value.IsEmpty() {
loginUserRankingNum.Num = 0
} else {
loginUserRankingNum.Num = value.Int()
}
err = dao.UserTasks.Ctx(ctx).LeftJoin(dao.Users.Table(), fmt.Sprintf("`%s`.`id` = `%s`.`user_id`", dao.Users.Table(), dao.UserTasks.Table())).
Fields("username,count(*) num").Where(dao.UserTasks.Columns().StoreId, in.StoreId).Where(dao.UserTasks.Columns().Status, 2).
WhereBetween(dao.UserTasks.Columns().CompletedAt, start, end).OrderDesc("num").OrderDesc("username").Group("user_id").
Scan(&loginUserRanking)
if err != nil {
return nil, ecode.Fail.Sub("查询当前登录用户排名失败")
}
// 查找当前登录用户排名
//index := sort.Search(len(loginUserRanking), func(i int) bool {
// return loginUserRanking[i].Num <= loginUserRankingNum.Num
//})
index, flag := sort.Find(len(loginUserRanking), func(i int) int {
return strings.Compare(strconv.Itoa(loginUserRanking[i].Num), strconv.Itoa(loginUserRankingNum.Num))
})
if flag {
rankingNum = index + 1
}
}
return &model.UserTaskRankingOut{
List: list,
Total: total,
CompletedNum: loginUserRankingNum.Num,
RankingNum: rankingNum,
}, nil
}
// GetNonLoginTaskList 获取下发到指定网吧的任务列表(未登录)
func (s *sTask) GetNonLoginTaskList(ctx context.Context, in *model.GetNonLoginTaskListIn) (out *model.GetNonLoginTaskListOut, err error) {
// 调用外部接口
data, err := tencent.GetNonLoginTaskList(ctx, in)
if err != nil {
return nil, err
}
var store *model.Store
// 获取网吧账号 id用作存储task
err = dao.Stores.Ctx(ctx).Where(dao.Stores.Columns().NetbarAccount, in.NetBarAccount).Scan(&store)
if err != nil {
return nil, ecode.Fail.Sub("查找网吧失败")
}
if store == nil {
return nil, ecode.Fail.Sub("当前网吧不存在")
}
// 任务列表数据处理
if jsonData, ok := data.(map[string]interface{}); ok {
// 现在可以访问 jsonData 中的字段
list := jsonData["task_list"]
// 将 interface{} 转换为结构体
var result []model.MyData
jsonBytes, err := json.Marshal(list)
if err != nil {
return nil, ecode.Fail.Sub("JSON序列化失败")
}
err = json.Unmarshal(jsonBytes, &result)
if err != nil {
return nil, ecode.Fail.Sub("JSON反序列化失败")
}
for _, v := range result {
exist, err := dao.Tasks.Ctx(ctx).Where(dao.Tasks.Columns().QqNetbarTaskId, v.TaskId).Exist()
if err != nil {
return nil, ecode.Fail.Sub("查询该任务失败")
}
str := ""
for i, vv := range v.PrizeList {
str += vv.PrizeName
if i+1 != len(v.PrizeList) {
str += ","
}
}
// 数据库是否存在,无则添加
if !exist {
_, err := dao.Tasks.Ctx(ctx).Insert(do.Tasks{
QqNetbarTaskId: v.TaskId,
QqNetbarTaskMemo: v.QQNetBarTaskMemo,
QqNetbarTaskName: v.QQNetBarTaskName,
QqNetbarTaskRules: v.QQNetBarTaskRules,
GameId: in.Gid,
StoreId: store.Id,
QqNetbarReward: str,
})
if err != nil {
return nil, ecode.Fail.Sub("添加任务失败")
}
}
}
}
return &model.GetNonLoginTaskListOut{
Data: data,
}, err
}
func (s *sTask) GetLoginTaskList(ctx context.Context, in *model.GetLoginTaskListIn) (out *model.GetLoginTaskListOut, err error) {
// 调用外部接口
data, err := tencent.GetLoginTaskList(ctx, in)
if err != nil {
return nil, err
}
// 任务列表数据处理
return &model.GetLoginTaskListOut{
Data: data,
}, err
}
func (s *sTask) GetTaskList(ctx context.Context, in *model.TaskListIn) (out *model.TaskListOut, err error) {
var data []model.Task
var total int
m := dao.Tasks.Ctx(ctx)
if in.StoreId != 0 {
m = m.Where(do.Tasks{StoreId: in.StoreId})
}
err = m.Page(in.Page, in.Size).Where(do.Tasks{GameId: in.Gid}).ScanAndCount(&data, &total, false)
if err != nil {
return nil, ecode.Fail.Sub("任务列表获取失败")
}
for i, v := range data {
if err = dao.StoreTaskRewards.Ctx(ctx).Where(do.StoreTaskRewards{TaskId: v.Id, StoreId: in.StoreId}).LeftJoin(
dao.Rewards.Table(),
fmt.Sprintf("%s.%s = %s.%s", dao.Rewards.Table(), dao.Rewards.Columns().Id, dao.StoreTaskRewards.Table(), dao.StoreTaskRewards.Columns().RewardId),
).Fields(fmt.Sprintf("%s.*", dao.Rewards.Table())).Scan(&data[i].NetbarRewards); err != nil {
return nil, ecode.Fail.Sub("任务奖励获取失败")
}
}
return &model.TaskListOut{
List: data,
Total: total,
}, nil
}
func (s *sTask) GetSelectorList(ctx context.Context, in *model.SelectorIn) (out *[]model.SelectorOut, err error) {
data := make([]model.SelectorOut, 0)
err = dao.Merchants.Ctx(ctx).WithAll().Scan(&data)
for i, v := range data {
for j, vv := range v.StoreDatas {
str, err := dao.Stores.Ctx(ctx).Fields("name").One(do.Stores{Id: vv.Id})
if err != nil {
return nil, ecode.Fail.Sub("获取门店名称失败")
}
data[i].StoreDatas[j].StoreName = str.Map()["name"].(string)
}
}
if err != nil {
return nil, ecode.Fail.Sub("获取选择列表失败")
}
return &data, nil
}
// GetTask 完成任务
func (s *sTask) GetTask(ctx context.Context, in *model.GetTaskIn) (out *model.GetTaskOut, err error) {
var userTask []*model.UserTask
err = dao.UserTasks.Ctx(ctx).Where(do.UserTasks{UserId: in.UserId, TaskId: in.TaskId, StoreId: in.StoreId}).WhereNot("status", 3).Scan(&userTask)
if err != nil {
return nil, ecode.Fail.Sub("查询用户该任务记录失败")
}
if userTask != nil {
return nil, ecode.Fail.Sub("该任务记录已存在")
}
// TODO 流水号未知
serialNumber, err := snowid.GetSnowClient().GenerateSerialNumber()
if err != nil {
return nil, ecode.Fail.Sub("生成流水号异常")
}
dao.UserTasks.Ctx(ctx).Where(do.UserTasks{UserId: in.UserId, TaskId: in.TaskId})
_, err = dao.UserTasks.Ctx(ctx).Insert(do.UserTasks{
UserId: in.UserId,
TaskId: in.TaskId,
StoreId: in.StoreId,
Status: 1,
SerialNumber: serialNumber,
})
if err != nil {
return nil, ecode.Fail.Sub("添加任务记录异常")
}
return &model.GetTaskOut{
Success: true,
}, nil
}