diff --git a/logic/controller/user_task.go b/logic/controller/user_task.go index 061a4a317..97ff8aa62 100644 --- a/logic/controller/user_task.go +++ b/logic/controller/user_task.go @@ -28,12 +28,15 @@ func (h Controller) AcceptTask(data *AcceptTaskInboundInfo, c *player.Player) (r } c.Info.SetTask(int(data.TaskId), model.Accepted) - c.Service.Task.Exec(uint32(data.TaskId), func(t *model.Task) bool { - t.Data = []uint32{} + taskData, taskErr := c.Service.Task.GetTask(uint32(data.TaskId)) + if taskErr != nil { + return nil, errorcode.ErrorCodes.ErrSystemError + } + taskData.Data = []uint32{} + if taskErr = c.Service.Task.SetTask(taskData); taskErr != nil { + return nil, errorcode.ErrorCodes.ErrSystemError + } - return true - - }) result = &task.AcceptTaskOutboundInfo{} result.TaskId = data.TaskId return result, 0 @@ -48,10 +51,14 @@ func (h Controller) AddTaskBuf(data *AddTaskBufInboundInfo, c *player.Player) (r if c.Info.GetTask(int(data.TaskId)) != model.Accepted { return result, errorcode.ErrorCodes.ErrAwardAlreadyClaimed } - c.Service.Task.Exec(data.TaskId, func(taskEx *model.Task) bool { - taskEx.Data = data.TaskList - return true - }) + taskData, taskErr := c.Service.Task.GetTask(data.TaskId) + if taskErr != nil { + return nil, errorcode.ErrorCodes.ErrSystemError + } + taskData.Data = data.TaskList + if taskErr = c.Service.Task.SetTask(taskData); taskErr != nil { + return nil, errorcode.ErrorCodes.ErrSystemError + } return result, 0 } @@ -105,11 +112,12 @@ func (h Controller) GetTaskBuf(data *GetTaskBufInboundInfo, c *player.Player) (r result = &task.GetTaskBufOutboundInfo{ TaskId: data.TaskId, } - c.Service.Task.Exec(data.TaskId, func(te *model.Task) bool { - result.TaskList = te.Data - return false - }) + taskData, taskErr := c.Service.Task.GetTask(data.TaskId) + if taskErr != nil { + return nil, errorcode.ErrorCodes.ErrSystemError + } + result.TaskList = taskData.Data return result, 0 } diff --git a/modules/player/model/task.go b/modules/player/model/task.go index 76ea83b9c..1ce0596db 100644 --- a/modules/player/model/task.go +++ b/modules/player/model/task.go @@ -9,7 +9,7 @@ const TableNameTask = "player_task" // Task mapped from table type Task struct { - Base + *cool.Model PlayerID uint64 `gorm:"not null;index:idx_task_by_player_id;comment:'所属玩家ID'" json:"player_id"` TaskID uint32 `gorm:"not null;comment:'任务ID'" json:"task_id"` Data []uint32 `struc:"[20]byte" gorm:"type:jsonb;not null;default:'[]';comment:'全部数据'" json:"data"` @@ -30,7 +30,7 @@ func (*Task) GroupName() string { // NewPlayerInfo create a new PlayerInfo func NewTask() *Task { return &Task{ - Base: *NewBase(), + Model: cool.NewModel(), } } diff --git a/modules/player/service/task.go b/modules/player/service/task.go index 60a3347c8..a786d569f 100644 --- a/modules/player/service/task.go +++ b/modules/player/service/task.go @@ -3,8 +3,8 @@ package service import ( "blazing/cool" "blazing/modules/player/model" - "context" "errors" + "strings" "github.com/pointernil/bitset32" ) @@ -30,32 +30,51 @@ func (s *TaskService) ShopRequirementError() error { return nil } -// 获取任务信息 -func (s *TaskService) Exec(id uint32, t func(*model.Task) bool) { - var gg model.Task - - m1 := s.dbm(s.Model).Where("task_id", id) - - m1.Scan(&gg) - if gg.Data == nil { - gg.Data = make([]uint32, 0) +func (s *TaskService) GetTask(id uint32) (*model.Task, error) { + var task *model.Task + if err := s.dbm(s.Model).Where("task_id", id).Scan(&task); err != nil { + return nil, err } - tre := t(&gg) - - if !tre { //不需要更新 - return + if task == nil { + task = model.NewTask() + task.PlayerID = uint64(s.userid) + task.TaskID = id } - if cool.Config.ServerInfo.IsVip != 0 { - - return - } - gg.PlayerID = uint64(s.userid) - gg.TaskID = id - _, err := m1.Save(gg) - if err != nil { - cool.Logger.Error(context.TODO(), "task save failed", s.userid, id, err) + if task.Data == nil { + task.Data = make([]uint32, 0) } + return task, nil +} + +func (s *TaskService) SetTask(task *model.Task) error { + if task == nil { + return errors.New("task is nil") + } + + task.PlayerID = uint64(s.userid) + if task.Data == nil { + task.Data = make([]uint32, 0) + } + + if task.ID == 0 { + _, err := s.dbm_fix(s.Model). + Data("player_id", task.PlayerID, "task_id", task.TaskID, "data", task.Data). + Insert() + if err == nil { + return nil + } + if !strings.Contains(err.Error(), "duplicate key value violates unique constraint") { + return err + } + } + + _, err := s.dbm_fix(s.Model). + Where("player_id", task.PlayerID). + Where("task_id", task.TaskID). + Data("data", task.Data). + Update() + return err } type TaskService struct {