实现网费奖励下发和回调接口

This commit is contained in:
2025-07-05 14:45:02 +08:00
parent 357ada8455
commit 3933d98c4d
17 changed files with 271 additions and 17 deletions

View File

@ -678,6 +678,7 @@ func (s *sTask) GetTaskList(ctx context.Context, in *model.GetTaskListV2In) (out
}
if int(v.UserTimes) >= v.TargetTimes {
completedTime := gtime.Now()
// 判断当前用户完成情况,已完成根据任务、用户,任务类型检查是否存在用户任务记录
orm := dao.UserTasks.Ctx(ctx).Where(do.UserTasks{UserId: in.UserId, TaskId: v.TaskID})
if v.GameTaskConfig.TimeType == 1 {
@ -740,12 +741,17 @@ func (s *sTask) GetTaskList(ctx context.Context, in *model.GetTaskListV2In) (out
// 拼装门店奖励数据
if len(result.TaskList[i].Rewards) > 0 {
for _, reward := range result.TaskList[i].Rewards {
var quantity uint64
quantity, err = CalculateNetfeeRewardQuantity(ctx, in.UserId, in.StoreId, &reward, completedTime)
if err != nil {
quantity = reward.GrantQuantity
}
in := do.UserTaskRewards{
RewardId: reward.Id,
UserTaskId: id,
RewardName: reward.Name,
Status: consts.RewardPendingStatus,
IssueQuantity: reward.GrantQuantity,
IssueQuantity: quantity,
Source: 2,
RewardTypeId: reward.RewardTypeId,
}
@ -935,3 +941,95 @@ func (s *sTask) SyncTaskFromGamelife(ctx context.Context) (out *model.SyncTaskOu
wg.Wait()
return
}
func CalculateNetfeeRewardQuantity(ctx context.Context, userId int64, storeId int64, reward *model.SimpleReward, completedTime *gtime.Time) (uint64, error) {
const rewardTypeCode = consts.NetfeeCode
// 判断是否是门店网费奖励
exist, err := dao.RewardTypes.Ctx(ctx).
WherePri(reward.RewardTypeId).
Where(do.RewardTypes{Code: rewardTypeCode}).
Exist()
if err != nil {
return 0, ecode.Fail.Sub("获取奖励类型失败")
}
if !exist {
// 不是网费奖励,返回当前奖励默认值
return reward.GrantQuantity, nil
}
// 获取当前小时 & 星期几0=周日)
hour := completedTime.Hour()
weekday := int(completedTime.Weekday())
// 获取上机记录
areaLevel, err := dao.StoreClientSessions.Ctx(ctx).
Where(do.StoreClientSessions{UserId: userId}).
WhereLTE(dao.StoreClientSessions.Columns().StartTime, completedTime).
Where("end_time IS NULL OR end_time >= ?", completedTime).
Fields("area_name,level_id").
OrderDesc(dao.StoreClientSessions.Columns().StartTime).
One()
if err != nil {
return 0, ecode.Fail.Sub("获取用户上机记录失败")
}
// 获取会员等级ID内部ID
levelId, err := dao.StoreMemberLevels.Ctx(ctx).
Where(do.StoreMemberLevels{LevelId: areaLevel["level_id"].Int64()}).
Fields("id").
Value()
if err != nil {
return 0, ecode.Fail.Sub("获取会员等级失败")
}
if levelId.IsEmpty() {
return reward.GrantQuantity, nil
}
// 获取区域ID
areaId, err := dao.StoreAreas.Ctx(ctx).
Where(do.StoreAreas{AreaName: areaLevel["area_name"].String()}).
Fields("id").
Value()
if err != nil {
return 0, ecode.Fail.Sub("获取区域失败")
}
if areaId.IsEmpty() {
return reward.GrantQuantity, nil
}
// 获取门店该区域、等级、奖励配置
priceDataStr, err := dao.StoreNetfeeAreaLevel.Ctx(ctx).
Where(do.StoreNetfeeAreaLevel{
StoreId: storeId,
AreaId: areaId.Int(),
MemberLevelId: levelId.Int(),
RewardId: reward.Id,
}).
Fields(dao.StoreNetfeeAreaLevel.Columns().PriceData).
Value()
if err != nil {
return 0, ecode.Fail.Sub("获取网费奖励价格配置失败")
}
// 若配置为空,返回默认值
if priceDataStr.IsEmpty() {
return reward.GrantQuantity, nil
}
// 解析 priceData
var priceData [][]int
if err := json.Unmarshal([]byte(priceDataStr.String()), &priceData); err != nil {
return 0, ecode.Fail.Sub("网费价格配置解析失败")
}
// 防止越界
if weekday >= len(priceData) || hour >= len(priceData[weekday]) {
return 0, ecode.Fail.Sub("网费奖励价格配置不完整")
}
grant := uint64(priceData[weekday][hour])
glog.Infof(ctx, "网费奖励金额为 %d来源于门店配置", grant)
return grant, nil
}