refactor: 重构任务服务读写逻辑
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed

This commit is contained in:
xinian
2026-04-09 22:59:28 +08:00
parent d0abb08d5b
commit b327398448
3 changed files with 65 additions and 38 deletions

View File

@@ -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
}

View File

@@ -9,7 +9,7 @@ const TableNameTask = "player_task"
// Task mapped from table <task>
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(),
}
}

View File

@@ -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 {