diff --git a/internal/consts/callback.go b/internal/consts/callback.go new file mode 100644 index 0000000..8add9d2 --- /dev/null +++ b/internal/consts/callback.go @@ -0,0 +1,20 @@ +package consts + +const ( + SignErr = 252151000 + iota + UserDayLimit + UserTotalLimit + BatchDayLimit + BatchTotalLimit + BatchOutDate +) + +const ( + SuccessMSG = "成功" + SignErrMSG = "签名错误" + UserDayLimitMSG = "达到用户个人日限" + UserTotalLimitMSG = "达到用户个人总限" + BatchDayLimitMSG = "达到该批次日限制" + BatchTotalLimitMSG = "达到该批次总限制" + BatchOutDateMSG = "批次、活动已过期" +) diff --git a/internal/controller/reward/reward_v1_callback.go b/internal/controller/reward/reward_v1_callback.go index ffe6760..5373f20 100644 --- a/internal/controller/reward/reward_v1_callback.go +++ b/internal/controller/reward/reward_v1_callback.go @@ -4,12 +4,14 @@ import ( "context" "crypto/md5" "encoding/hex" + "encoding/json" "fmt" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/os/glog" "server/api/reward/v1" "server/internal/model" "server/internal/service" + "server/utility/ecode" "strings" ) @@ -48,13 +50,19 @@ func (c *ControllerV1) Callback(ctx context.Context, req *v1.CallbackReq) (res * return nil, err } - return &v1.CallbackRes{ - AppId: appid, - Datas: out.Datas, - Errcode: out.Errcode, - Errmsg: out.Errmsg, - OrderId: out.OrderId, - }, nil + //return &v1.CallbackRes{ + // AppId: appid, + // Datas: out.Datas, + // Errcode: out.Errcode, + // Errmsg: out.Errmsg, + // OrderId: out.OrderId, + //}, nil + marshal, err := json.Marshal(out) + if err != nil { + return nil, ecode.Fail.Sub("序列化 json 数据出现异常") + } + g.RequestFromCtx(ctx).Response.Write(marshal) + return nil, nil //return &v1.CallbackRes{Errcode: 0, OrderId: req.OrderId, Datas: []v1.CallbackData{{PrizeCode: req.OrderId}}}, err } diff --git a/internal/dao/internal/rewards.go b/internal/dao/internal/rewards.go index 1f3bc3b..49bc364 100644 --- a/internal/dao/internal/rewards.go +++ b/internal/dao/internal/rewards.go @@ -43,6 +43,7 @@ type RewardsColumns struct { CreatedAt string // 创建时间 UpdatedAt string // 更新时间 DeletedAt string // 删除时间(软删除) + PrizeId string // 券 id } // rewardsColumns holds the columns for the table rewards. @@ -69,6 +70,7 @@ var rewardsColumns = RewardsColumns{ CreatedAt: "created_at", UpdatedAt: "updated_at", DeletedAt: "deleted_at", + PrizeId: "prize_id", } // NewRewardsDao creates and returns a new DAO object for table data access. diff --git a/internal/logic/reward/reward.go b/internal/logic/reward/reward.go index 3012b27..a6f6469 100644 --- a/internal/logic/reward/reward.go +++ b/internal/logic/reward/reward.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "fmt" + "github.com/gogf/gf/v2/os/gtime" "server/internal/consts" "server/internal/dao" "server/internal/model" @@ -412,7 +413,24 @@ func (s *sReward) GetLift(ctx context.Context, in *model.GetRewardIn) (out *mode // 根据 result判断 if item.Result == 1 { // 奖励发放成功,修改状态,扣除数量 - dao.UserTaskRewards.Ctx(ctx).Where(do.UserTaskRewards{ExternalOrderId: item.Water.OrderId}).Update(consts.RewardSuccessStatus) + _, err := dao.UserTaskRewards.Ctx(ctx).Where(do.UserTaskRewards{ExternalOrderId: item.Water.OrderId}).Update(consts.RewardSuccessStatus) + if err != nil { + return nil, ecode.Fail.Sub("修改奖励领取记录状态异常") + } + + value, err := dao.UserTaskRewards.Ctx(ctx).Where(do.UserTaskRewards{ExternalOrderId: item.Water.OrderId}).Value(dao.UserTaskRewards.Columns().RewardId) + if err != nil { + return nil, ecode.Fail.Sub("获取奖励领取记录异常") + } + if value.IsEmpty() { + return nil, ecode.Fail.Sub("获取奖励领取记录异常") + } + // 扣除数量 + _, err = dao.Rewards.Ctx(ctx).Where(do.Rewards{Id: value.Int()}).One() + if err != nil { + return nil, ecode.Fail.Sub("获取奖励记录异常") + } + } else if item.Result == 2 || item.Result == 3 { // 发放背包成功,修改状态 } else if item.Result == 4 { @@ -530,10 +548,61 @@ func (s *sReward) CallBack(ctx context.Context, in *model.RewardCallbackIn) (out return nil, ecode.Fail.Sub("存储奖励回调数据异常") } - return &model.RewardCallbackOut{ - OrderId: in.OrderId, - AppId: in.AppId, - Errcode: 0, - Errmsg: "成功", - }, nil + var reward *model.Reward + // 查询奖励,修改状态,扣除数量 + err = dao.Rewards.Ctx(ctx).Where(do.Rewards{PrizeId: in.PrizeId}).Scan(&reward) + if err != nil { + return nil, ecode.Fail.Sub("查询奖励异常") + } + + if reward == nil { + return nil, ecode.Params.Sub("查询奖励为空") + } + + // 判断是否过期 + if reward.ExpireType == 1 { + //时间段过期 + if reward.ValidTo.Before(gtime.Now()) { + out.Errcode = consts.BatchOutDate + out.Errmsg = consts.BatchOutDateMSG + } + } + + // 判断是否达到用户日限制 + // 查先询用户当日已领取 + var dailyGetNum int + dao.Users.Ctx(ctx).Where(do.Users{}) + if int(reward.UserDailyLimit) <= dailyGetNum { + out.Errcode = consts.UserDayLimit + out.Errmsg = consts.UserDayLimitMSG + } + + // 判断是否达到用户总限制 + // 查先询用户总共已领取 + var dailyTotalNum int + if int(reward.UserTotalLimit) <= dailyTotalNum { + out.Errcode = consts.UserTotalLimit + out.Errmsg = consts.UserTotalLimitMSG + } + + // 判断是否达到该批次日限制 + // 查先询该批次当日已领取 + var batchDailyGetNum int + if int(reward.DailyTotalLimit) <= batchDailyGetNum { + out.Errcode = consts.BatchDayLimit + out.Errmsg = consts.BatchDayLimitMSG + } + + // 判断是否达到该批次总共限制 + // 查先询该批次总共已领取 + var batchTotalGetNum int + if int(reward.TotalLimit) <= batchTotalGetNum { + out.Errcode = consts.BatchTotalLimit + out.Errmsg = consts.BatchTotalLimitMSG + } + + // 回调成功, + out.OrderId = in.OrderId + out.AppId = in.AppId + return out, err } diff --git a/internal/model/do/rewards.go b/internal/model/do/rewards.go index e565a19..15fa89b 100644 --- a/internal/model/do/rewards.go +++ b/internal/model/do/rewards.go @@ -34,4 +34,5 @@ type Rewards struct { CreatedAt *gtime.Time // 创建时间 UpdatedAt *gtime.Time // 更新时间 DeletedAt *gtime.Time // 删除时间(软删除) + PrizeId interface{} // 券 id } diff --git a/internal/model/entity/rewards.go b/internal/model/entity/rewards.go index 9ce56fe..fdf5e20 100644 --- a/internal/model/entity/rewards.go +++ b/internal/model/entity/rewards.go @@ -32,4 +32,5 @@ type Rewards struct { CreatedAt *gtime.Time `json:"createdAt" orm:"created_at" description:"创建时间"` // 创建时间 UpdatedAt *gtime.Time `json:"updatedAt" orm:"updated_at" description:"更新时间"` // 更新时间 DeletedAt *gtime.Time `json:"deletedAt" orm:"deleted_at" description:"删除时间(软删除)"` // 删除时间(软删除) + PrizeId string `json:"prizeId" orm:"prize_id" description:"券 id"` // 券 id }