package task import ( "context" "errors" "github.com/shopspring/decimal" "github.com/spf13/cast" "github.com/zeromicro/go-zero/core/stores/sqlx" "nova_task/internal/consts" "nova_task/internal/model" "nova_task/internal/pkg/errs" "nova_task/internal/pkg/utils" "time" "nova_task/internal/svc" "nova_task/internal/types" "github.com/zeromicro/go-zero/core/logx" ) // GetTaskRewardLogic v领取任务奖励 type GetTaskRewardLogic struct { logx.Logger ctx context.Context svcCtx *svc.ServiceContext } func NewGetTaskRewardLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetTaskRewardLogic { return &GetTaskRewardLogic{ Logger: logx.WithContext(ctx), ctx: ctx, svcCtx: svcCtx, } } func (l *GetTaskRewardLogic) GetTaskReward(req *types.TaskIdPath) (*types.GetTaskRewardResp, error) { //uid := cast.ToStringMapInt(l.ctx.Value("data"))["id"] uid := utils.GetUid(l.ctx) task, err := l.svcCtx.TaskModel.FindOne(l.ctx, req.ID) if err != nil { if errors.Is(err, model.ErrNotFound) { return nil, errs.New(errs.ErrTaskNotFound, "task not found") } return nil, errs.New(errs.ErrDatabaseOperate, err) } var taskSeq int if task.Type == model.TASKTYPE_DAILY_PAY || task.Type == model.TASKTYPE_AMBASSADOR_TASK { taskSeq = cast.ToInt(time.Now().Format("20060102")) } tp, err := l.svcCtx.TaskProgressModel.FindOneByUidTaskIdTaskSeq(l.ctx, uid, task.Id, taskSeq) if err != nil { if !errors.Is(err, model.ErrNotFound) { l.Errorw("find task progress error", logx.Field("err", err)) return nil, errs.New(errs.ErrDatabaseOperate, err) } return nil, errs.New(errs.ErrTaskNotFinished, "task not finished") } switch { case tp.Stage < model.TASK_PROGRESS_WAIT_REWARD: return nil, errs.New(errs.ErrTaskNotFinished, "task not finished") case tp.Stage > model.TASK_PROGRESS_WAIT_REWARD: return nil, errs.New(errs.ErrTaskAlreadyReward, "task already reward") } // 修改状态,增加积分和记录都在事物中执行 err = l.svcCtx.DBConn.TransactCtx(l.ctx, func(ctx context.Context, session sqlx.Session) error { // 修改状态 tp.Stage = model.TASK_PROGRESS_REWARDED err = l.svcCtx.TaskProgressModel.WithSession(session).Update(l.ctx, tp) if err != nil { return err } // 给予用户奖励 err = l.svcCtx.AddUserAssetWithSession(l.ctx, session, uint(uid), consts.AssetType_Points, decimal.NewFromInt(int64(task.Points)), "完成任务:"+task.Title, uint64(task.Id), 0, true) //err = l.svcCtx.TaskAssetModel.WithSession(session).AddPoint(l.ctx, uint(uid), decimal.NewFromInt(int64(task.Points))) //if err != nil { // return err //} //// 记录用户获奖记录 //_, err = l.svcCtx.TaskAssetRecordModel.Insert(l.ctx, &model.NhTaskAssetRecord{ // Uid: uid, // EventId: uint64(task.Id), // AssetField: "points", // Count: float64(task.Points), // Remark: "完成任务:" + task.Title, // CreateTime: int(time.Now().Unix()), //}) return err }) if err != nil { l.Errorw("给予用户奖励实物执行失败", logx.Field("err", err), logx.Field("task", task.Id), logx.Field("uid", uid)) return nil, errs.New(errs.ErrDatabaseOperate, err) } return &types.GetTaskRewardResp{Points: task.Points}, nil }