package task import ( "context" "errors" "github.com/spf13/cast" "nova_task/internal/model" "nova_task/internal/pkg/errs" "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) (resp *types.GetTaskRewardResp, err error) { uid := cast.ToInt(l.ctx.Value("uid")) task, err := l.svcCtx.TaskModel.FindOne(l.ctx, req.ID) if err != nil { if errors.Is(err, model.ErrNotFound) { return nil, errs.BadRequest(errs.ErrTaskNotFound, "task not found") } return nil, errs.InternalServer(errs.ErrDatabaseOperate, err) } var taskSeq int if task.Type == model.TASKTYPE_DAILY_PAY { 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.InternalServer(errs.ErrDatabaseOperate, err) } return nil, errs.BadRequest(errs.ErrTaskNotFinished, "task not finished") } switch { case tp.Stage < model.TASK_PROGRESS_WAIT_REWARD: return nil, errs.BadRequest(errs.ErrTaskNotFinished, "task not finished") case tp.Stage > model.TASK_PROGRESS_WAIT_REWARD: return nil, errs.BadRequest(errs.ErrTaskAlreadyReward, "task already reward") } // 给予用户奖励 err = l.svcCtx.TaskAssetModel.AddUserPoint(l.ctx, uid, task.Points) if err != nil { l.Errorw("add user point error", logx.Field("err", err)) return nil, errs.InternalServer(errs.ErrDatabaseOperate, 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 }