调整回调,奖励领取

This commit is contained in:
chy
2025-07-03 13:40:53 +08:00
parent 6e562de6df
commit 4f9afe5df5
15 changed files with 722 additions and 287 deletions

View File

@ -6,6 +6,7 @@ import (
"fmt"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/os/glog"
"github.com/gogf/gf/v2/os/gtime"
"github.com/gogf/gf/v2/util/gconv"
"github.com/gogf/gf/v2/util/guid"
"server/internal/consts"
@ -454,12 +455,353 @@ func (s *sTask) GetUserTaskRecordsList(ctx context.Context, in *model.UserTaskRe
}
// GetTaskList PC-WEB获取任务列表
//func (s *sTask) GetTaskList(ctx context.Context, in *model.GetTaskListV2In) (out *model.GetTaskListV2Out, err error) {
// var tasks []model.Task
// var pageIdx string
// var data []model.GameTask
// if in.IsBound == 0 {
// // 未绑定游戏查询自己数据库
// err := dao.Tasks.Ctx(ctx).Where(do.Tasks{GameId: in.Gid, NetbarAcconut: in.NetBarAccount}).WithAll().WithAll().Scan(&tasks)
// if err != nil {
// return nil, ecode.Fail.Sub("获取任务列表失败")
// }
//
// for i, v := range tasks {
// err := json.Unmarshal([]byte(v.Task), &tasks[i].GameTask)
// if err != nil {
// return nil, ecode.Fail.Sub("解析任务信息失败")
// }
// tasks[i].Task = ""
// for _, i3 := range tasks[i].TaskRewards {
// tasks[i].GameTask.Reward = append(tasks[i].GameTask.Reward, i3.Rewards)
// }
//
// for _, prize := range tasks[i].GameTask.PrizeList {
// for _, goods := range prize.GoodsList {
// if goods.GoodsType != 37 {
// tasks[i].GameTask.Reward = append(tasks[i].GameTask.Reward, model.SimpleReward{
// Source: 1,
// RewardTypeId: int64(goods.GoodsType),
// Name: goods.GoodsName,
// ImageUrl: goods.GoodsIcon,
// TotalLimit: uint64(v.GameTask.LimitNum),
// })
// }
// }
// }
//
// data = append(data, tasks[i].GameTask)
// }
//
// return &model.GetTaskListV2Out{
// Data: data,
// }, nil
// } else {
// // 已绑定
// // 调用外部接口
// activity, err := gamelife.GetGamelifeClient(ctx).RequestActivity(ctx, &model.QQNetbarActivityIn{ServiceName: consts.GetTaskList, PopenId: in.PopenId, BindType: in.BindType, TaskParam: model.TaskParam{Gid: in.Gid, NetBarAccount: in.NetBarAccount, Num: in.Num, Pageidx: in.Pageidx}})
// if err != nil {
// return nil, err
// }
// result, ok := activity.(*model.GameTaskResponse)
// if !ok {
// return nil, ecode.Fail.Sub("数据类型转换失败")
// }
//
// pageIdx = result.PageIdx
// // 剔除不需要的任务数据
// for i, task := range result.TaskList {
//
//
// // 组装门店奖励数据
// err := dao.TaskRewards.Ctx(ctx).
// LeftJoin(dao.Rewards.Table(),
// fmt.Sprintf("`%s`.`%s` = `%s`.`%s`",
// dao.Rewards.Table(), dao.Rewards.Columns().Id,
// dao.TaskRewards.Table(), dao.TaskRewards.Columns().RewardId)).
// LeftJoin(dao.RewardTypes.Table(),
// fmt.Sprintf("`%s`.`%s` = `%s`.`%s`",
// dao.RewardTypes.Table(), dao.RewardTypes.Columns().Id,
// dao.Rewards.Table(), dao.Rewards.Columns().RewardTypeId)).
// Fields(
// fmt.Sprintf("%s.*, `%s`.`%s` AS %s",
// dao.Rewards.Table(),
// dao.RewardTypes.Table(), dao.RewardTypes.Columns().Name,
// "reward_type_name",
// ),
// ).Where(dao.TaskRewards.Columns().TaskId, task.TaskID).Scan(&result.TaskList[i].Reward)
// if err != nil {
// return nil, err
// }
//
// // 尝试转换q 币结构体
// //for _, prize := range task.PrizeList {
// // for _, goods := range prize.GoodsList {
// // if goods.GoodsType != 37 {
// // task.Reward = append(task.Reward, model.SimpleReward{
// // Source: 1,
// // RewardTypeId: int64(goods.GoodsType),
// // Name: goods.GoodsName,
// // ImageUrl: goods.GoodsIcon,
// // TotalLimit: uint64(task.LimitNum),
// // })
// // }
// // }
// //}
//
// //任务状态=1或者2不做操作其他查询门店奖励是否全部领取
// if task.Status != 1 && task.Status != 2 {
// count, err := dao.UserTasks.Ctx(ctx).Where(dao.UserTasks.Columns().TaskId, task.TaskID).Where(dao.UserTasks.Columns().UserId, in.UserId).LeftJoin(dao.UserTaskRewards.Table(),
// fmt.Sprintf("%s.user_task_id = %s.id", dao.UserTaskRewards.Table(), dao.UserTasks.Table())).LeftJoin(dao.Rewards.Table(), fmt.Sprintf("%s.id = %s.reward_id",
// dao.Rewards.Table(), dao.UserTaskRewards.Table())).Where("rewards.source", 2).Where(dao.UserTaskRewards.Columns().Status, 2).Count()
// if err != nil {
// return nil, ecode.Fail.Sub("查询用户门店任务奖励失败")
// }
//
// if count > 0 {
// result.TaskList[i].Status = 2
// //tasks[i].Status = 2
// } else {
// result.TaskList[i].Status = 3
// //tasks[i].Status = 3
// }
// }
// //else {
// // data.Status = task.Status
// //}
// //tasks = append(tasks, data)
//
// // 根据用户完成次数和任务指标次数判任务是否完成,修改任务记录状态为 3
// if int(task.UserTimes) >= task.TargetTimes {
// if err = dao.UserTasks.Transaction(ctx, func(ctx context.Context, tx gdb.TX) error {
// orm := dao.UserTasks.Ctx(ctx).Where(do.UserTasks{UserId: in.UserId, TaskId: task.TaskID})
// if task.GameTaskConfig.TimeType == 1 {
// // 每日任务
// start := gtime.Now().StartOfDay()
// end := gtime.Now().EndOfDay()
// orm = orm.WhereBetween(dao.UserTasks.Columns().CreatedAt, start, end)
// }
// value, err := orm.Fields(dao.UserTasks.Columns().Id).Value()
// if err != nil {
// return ecode.Fail.Sub("获取用户任务失败")
// }
// if value.IsEmpty() {
// glog.Info(ctx, "用户任务不存在")
// v, err := dao.Stores.Ctx(ctx).Fields(dao.Stores.Columns().Id).Where(do.Stores{NetbarAccount: in.NetBarAccount}).Value()
// if err != nil {
// return ecode.Fail.Sub("获取门店信息失败")
// }
// serialNumber, err := snowid.GetSnowClient().GenerateSerialNumber()
// if err != nil {
// return ecode.Fail.Sub("生成流水号异常")
// }
// id, err := dao.UserTasks.Ctx(ctx).InsertAndGetId(do.UserTasks{
// UserId: in.UserId,
// TaskId: task.TaskID,
// StoreId: v.Int64(),
// Status: 3,
// SerialNumber: serialNumber,
// TaskName: task.Title,
// GameId: in.Gid,
// TaskType: task.GameTaskConfig.TimeType,
// })
// if err != nil {
// return ecode.Fail.Sub("创建用户任务记录失败")
// }
//
// // 查询该任务相关联的奖励, 创建对应奖励下发记录id
// array, err := dao.TaskRewards.Ctx(ctx).LeftJoin(dao.Rewards.Table(), "rewards.id = task_rewards.reward_id").Where(do.TaskRewards{TaskId: task.TaskID}).Fields(dao.TaskRewards.Columns().RewardId).Fields(dao.Rewards.Columns().Name).All()
// if err != nil {
// return ecode.Fail.Sub("获取任务关联奖励列表失败")
// }
// for _, v := range array {
// _, err = dao.UserTaskRewards.Ctx(ctx).Data(do.UserTaskRewards{
// UserTaskId: id,
// RewardId: v["reward_id"].Int64(),
// RewardName: v["name"].String(),
// Status: consts.RewardPendingStatus,
// InnerOrderId: fmt.Sprintf("reward%s", guid.S()),
// }).Insert()
// if err != nil {
// return ecode.Fail.Sub("创建用户任务奖励记录失败")
// }
// }
// } else {
// glog.Info(ctx, "用户任务存在")
// _, err = dao.UserTasks.Ctx(ctx).WherePri(value.Int64()).Where(dao.UserTasks.Columns().Status).WhereNot(dao.UserTasks.Columns().Status, 2).Update(do.UserTasks{
// Status: 3,
// })
// if err != nil {
// return ecode.Fail.Sub("修改用户任务状态失败")
// }
// _, err = dao.UserTaskRewards.Ctx(ctx).Where(do.UserTaskRewards{UserTaskId: value.Int()}).Where(dao.UserTaskRewards.Columns().Status, 1).Update(do.UserTaskRewards{
// Status: 2,
// })
// if err != nil {
// return ecode.Fail.Sub("修改用户任务奖励状态失败")
// }
// }
// return nil
// }); err != nil {
// return nil, err
// }
//
// }
// }
// data = result.TaskList
// return &model.GetTaskListV2Out{
// Data: data,
// PageIdx: pageIdx,
// }, nil
// }
//}
func (s *sTask) GetTaskList(ctx context.Context, in *model.GetTaskListV2In) (out *model.GetTaskListV2Out, err error) {
var tasks []model.Task
var pageIdx string
var data []model.GameTask
if in.IsBound == 0 {
// 未绑定游戏查询自己数据库
out = &model.GetTaskListV2Out{}
if in.IsBound == 1 {
// 查询实时任务数据
activity, err := gamelife.GetGamelifeClient(ctx).RequestActivity(ctx, &model.QQNetbarActivityIn{ServiceName: consts.GetTaskList, PopenId: in.PopenId, BindType: in.BindType, TaskParam: model.TaskParam{Gid: in.Gid, NetBarAccount: in.NetBarAccount, Num: in.Num, Pageidx: in.Pageidx}})
if err != nil {
return nil, err
}
result, ok := activity.(*model.GameTaskResponse)
if !ok {
return nil, ecode.Fail.Sub("数据类型转换失败")
}
for i, v := range result.TaskList {
// 获取任务奖励列表
err := dao.TaskRewards.Ctx(ctx).Where(do.TaskRewards{TaskId: v.TaskID}).WhereOr(do.TaskRewards{TaskId: v.TaskID, NetbarAccount: in.NetBarAccount}).
LeftJoin(dao.Rewards.Table(), "rewards.id = task_rewards.reward_id").Fields("rewards.*").Scan(&result.TaskList[i].Rewards)
if err != nil {
return nil, ecode.Fail.Sub("获取任务奖励列表失败")
}
if int(v.UserTimes) >= v.TargetTimes {
// 判断当前用户完成情况,已完成根据任务、用户,任务类型检查是否存在用户任务记录
orm := dao.UserTasks.Ctx(ctx).Where(do.UserTasks{UserId: in.UserId, TaskId: v.TaskID})
if v.GameTaskConfig.TimeType == 1 {
// 每日任务
start := gtime.Now().StartOfDay()
end := gtime.Now().EndOfDay()
orm = orm.WhereBetween(dao.UserTasks.Columns().CreatedAt, start, end)
}
value, err := orm.Fields(dao.UserTasks.Columns().Id).Value()
if err != nil {
return nil, ecode.Fail.Sub("获取用户任务失败")
}
if value.IsEmpty() {
// 不存在创建用户任务完成记录,同时组装用户可领取奖励数据,
glog.Info(ctx, "用户不存在创建用户任务完成记录,同时组装用户可领取奖励数据")
if err = dao.UserTaskRewards.Transaction(ctx, func(ctx context.Context, tx gdb.TX) (err error) {
storeId, err := dao.Stores.Ctx(ctx).Fields(dao.Stores.Columns().Id).Where(do.Stores{NetbarAccount: in.NetBarAccount}).Value()
if err != nil {
return ecode.Fail.Sub("获取门店信息失败")
}
if storeId.IsEmpty() {
return ecode.Fail.Sub("获取门店信息失败")
}
serialNumber, err := snowid.GetSnowClient().GenerateSerialNumber()
if err != nil {
return ecode.Fail.Sub("生成流水号异常")
}
id, err := dao.UserTasks.Ctx(ctx).Data(do.UserTasks{
UserId: in.UserId,
TaskId: v.TaskID,
StoreId: storeId.Int(),
Status: 3,
SerialNumber: serialNumber,
TaskName: v.Title,
GameId: in.Gid,
TaskType: v.GameTaskConfig.TimeType,
}).InsertAndGetId()
if err != nil {
return ecode.Fail.Sub("创建用户任务记录失败")
}
result.TaskList[i].UserTaskId = id
insertData := make([]do.UserTaskRewards, 0)
// 首先拼装平台奖励
for _, prize := range v.PrizeList {
for _, goods := range prize.GoodsList {
if goods.GoodsType == 37 {
continue
}
insertData = append(insertData, do.UserTaskRewards{
UserTaskId: id,
RewardName: goods.GoodsName,
Status: consts.RewardPendingStatus,
IssueQuantity: goods.Num,
Source: 1,
RewardTypeId: goods.GoodsType,
})
}
}
// 拼装门店奖励数据
if len(result.TaskList[i].Rewards) > 0 {
for _, reward := range result.TaskList[i].Rewards {
in := do.UserTaskRewards{
RewardId: reward.Id,
UserTaskId: id,
RewardName: reward.Name,
Status: consts.RewardPendingStatus,
IssueQuantity: reward.GrantQuantity,
Source: 2,
RewardTypeId: reward.RewardTypeId,
}
if reward.RewardTypeId == 37 {
in.Source = 1
}
insertData = append(insertData, in)
}
}
if _, err = dao.UserTaskRewards.Ctx(ctx).Data(insertData).Insert(); err != nil {
return ecode.Fail.Sub("创建用户任务奖励记录失败")
}
return
}); err != nil {
return nil, err
}
} else {
result.TaskList[i].UserTaskId = value.Int64()
// 存在该任务记录,则判断该任务记录对应的奖励是否都已领取,需要修改任务状态
glog.Info(ctx, "用户存在该任务记录,则判断该任务记录对应的奖励是否都已领取,需要修改任务状态")
if v.Status != 1 && v.Status != 2 {
count, err := dao.UserTaskRewards.Ctx(ctx).Where(do.UserTaskRewards{UserTaskId: value.Int()}).WhereIn(dao.UserTasks.Columns().Status, []int{2, 3, 5}).Count()
if err != nil {
return nil, ecode.Fail.Sub("查询用户门店任务奖励失败")
}
if count > 0 {
result.TaskList[i].Status = 2
} else {
result.TaskList[i].Status = 3
}
}
if err = dao.UserTaskRewards.Transaction(ctx, func(ctx context.Context, tx gdb.TX) (err error) {
_, err = dao.UserTasks.Ctx(ctx).WherePri(value.Int64()).Where(dao.UserTasks.Columns().Status).WhereNot(dao.UserTasks.Columns().Status, 2).Update(do.UserTasks{
Status: 3,
})
if err != nil {
return ecode.Fail.Sub("修改用户任务状态失败")
}
_, err = dao.UserTaskRewards.Ctx(ctx).Where(do.UserTaskRewards{UserTaskId: value.Int()}).Where(dao.UserTaskRewards.Columns().Status, 1).Update(do.UserTaskRewards{
Status: 2,
})
if err != nil {
return ecode.Fail.Sub("修改用户任务奖励状态失败")
}
return
}); err != nil {
return nil, err
}
}
}
}
out.PageIdx = result.PageIdx
out.Data = result.TaskList
} else {
// 从数据库获取数据
tasks := make([]model.Task, 0)
err := dao.Tasks.Ctx(ctx).Where(do.Tasks{GameId: in.Gid, NetbarAcconut: in.NetBarAccount}).WithAll().WithAll().Scan(&tasks)
if err != nil {
return nil, ecode.Fail.Sub("获取任务列表失败")
@ -470,101 +812,37 @@ func (s *sTask) GetTaskList(ctx context.Context, in *model.GetTaskListV2In) (out
if err != nil {
return nil, ecode.Fail.Sub("解析任务信息失败")
}
tasks[i].Task = ""
for _, i3 := range tasks[i].TaskRewards {
tasks[i].GameTask.Reward = append(tasks[i].GameTask.Reward, i3.Rewards)
}
data = append(data, tasks[i].GameTask)
}
return &model.GetTaskListV2Out{
Data: data,
}, nil
} else {
// 已绑定
// 调用外部接口
activity, err := gamelife.GetGamelifeClient(ctx).RequestActivity(ctx, &model.QQNetbarActivityIn{ServiceName: consts.GetTaskList, PopenId: in.PopenId, BindType: in.BindType, TaskParam: model.TaskParam{Gid: in.Gid, NetBarAccount: in.NetBarAccount, Num: in.Num, Pageidx: in.Pageidx}})
if err != nil {
return nil, err
}
result, ok := activity.(*model.GameTaskResponse)
if !ok {
return nil, ecode.Fail.Sub("数据类型转换失败")
}
if err = dao.TaskRewards.Ctx(ctx).Where(do.TaskRewards{TaskId: v.TaskId, StoreId: in.StoreId, NetbarAccount: in.NetBarAccount}).OmitEmptyWhere().
LeftJoin(dao.Rewards.Table(), "rewards.id = task_rewards.reward_id").Fields("rewards.*").Scan(&tasks[i].GameTask.Rewards); err != nil {
pageIdx = result.PageIdx
// 剔除不需要的任务数据
for i, task := range result.TaskList {
//data := model.Task{
// QqNetbarTaskId: task.TaskID,
// QqNetbarTaskName: task.Title,
// QqNetbarTaskMemo: task.TaskDesc,
// QqNetbarTaskRules: task.RuleDesc,
// QqNetbarTargetName: task.TargetName,
// QqNetbarTargetTime: task.TargetTimes,
// StartTime: task.CycleStart,
// EndTime: task.CycleEnd,
// //Status: task.Status,
//}
//data.UserTaskResult.Usertimes = task.UserTimes
// 组装门店奖励数据
err := dao.TaskRewards.Ctx(ctx).
LeftJoin(dao.Rewards.Table(),
fmt.Sprintf("`%s`.`%s` = `%s`.`%s`",
dao.Rewards.Table(), dao.Rewards.Columns().Id,
dao.TaskRewards.Table(), dao.TaskRewards.Columns().RewardId)).
LeftJoin(dao.RewardTypes.Table(),
fmt.Sprintf("`%s`.`%s` = `%s`.`%s`",
dao.RewardTypes.Table(), dao.RewardTypes.Columns().Id,
dao.Rewards.Table(), dao.Rewards.Columns().RewardTypeId)).
Fields(
fmt.Sprintf("%s.*, `%s`.`%s` AS %s",
dao.Rewards.Table(),
dao.RewardTypes.Table(), dao.RewardTypes.Columns().Name,
"reward_type_name",
),
).Where(dao.TaskRewards.Columns().TaskId, task.TaskID).Scan(&result.TaskList[i].Reward)
if err != nil {
return nil, err
}
//任务状态=1或者2不做操作其他查询门店奖励是否全部领取
if task.Status != 1 && task.Status != 2 {
count, err := dao.UserTasks.Ctx(ctx).Where(dao.UserTasks.Columns().TaskId, task.TaskID).Where(dao.UserTasks.Columns().UserId, in.UserId).LeftJoin(dao.UserTaskRewards.Table(),
fmt.Sprintf("%s.user_task_id = %s.id", dao.UserTaskRewards.Table(), dao.UserTasks.Table())).LeftJoin(dao.Rewards.Table(), fmt.Sprintf("%s.id = %s.reward_id",
dao.Rewards.Table(), dao.UserTaskRewards.Table())).Where("rewards.source", 2).Where(dao.UserTaskRewards.Columns().Status, 2).Count()
if err != nil {
return nil, ecode.Fail.Sub("查询用户门店任务奖励失败")
}
if count > 0 {
result.TaskList[i].Status = 2
//tasks[i].Status = 2
} else {
result.TaskList[i].Status = 3
//tasks[i].Status = 3
}
}
//else {
// data.Status = task.Status
//}
//tasks = append(tasks, data)
// 根据用户完成次数和任务指标次数判任务是否完成,修改任务记录状态为 3
if int(task.UserTimes) >= task.TargetTimes {
_, err := dao.UserTasks.Ctx(ctx).Where(do.UserTasks{TaskId: task.TaskID}).Where(do.UserTasks{UserId: in.UserId}).Data(do.UserTasks{Status: 3}).Update()
if err != nil {
return nil, ecode.Fail.Sub("更新用户任务记录状态异常")
}
return nil, ecode.Fail.Sub("获取任务奖励列表失败")
}
// 根据任务 id 查询门店奖励追加记录
out.Data = append(out.Data, tasks[i].GameTask)
}
data = result.TaskList
return &model.GetTaskListV2Out{
Data: data,
PageIdx: pageIdx,
}, nil
}
}
// 遍历任务列表数据,进行处理
// 根据门店查询出当前门店追加的奖励
for i, v := range out.Data {
for _, prize := range v.PrizeList {
for _, goods := range prize.GoodsList {
if goods.GoodsType == 37 {
continue
}
out.Data[i].Rewards = append(out.Data[i].Rewards, model.SimpleReward{
Source: 1,
RewardTypeId: int64(goods.GoodsType),
Name: goods.GoodsName,
ImageUrl: goods.GoodsIcon,
GrantQuantity: uint64(goods.Num),
TotalLimit: uint64(v.LimitNum),
})
}
}
}
return
}
func (s *sTask) SyncTaskFromGamelife(ctx context.Context) (out *model.SyncTaskOut, err error) {
stores, err := dao.Stores.Ctx(ctx).Fields(dao.Stores.Columns().Id, dao.Stores.Columns().NetbarAccount).All()
if err != nil {
@ -628,8 +906,8 @@ func (s *sTask) SyncTaskFromGamelife(ctx context.Context) (out *model.SyncTaskOu
}
taskMap := gconv.Map(task)
delete(taskMap, "PrizeList")
delete(taskMap, "prize_list")
//delete(taskMap, "PrizeList")
//delete(taskMap, "prize_list")
delete(taskMap, "reward")
_, err = dao.Tasks.Ctx(ctx).Data(do.Tasks{