315 lines
9.0 KiB
Go
315 lines
9.0 KiB
Go
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
|
||
}
|