package service import ( "blazing/cool" "blazing/modules/player/model" "errors" "strings" "github.com/pointernil/bitset32" ) func (s *TaskService) CanShop() bool { return s.ShopRequirementError() == nil } func (s *TaskService) ShopRequirementError() error { var gg *model.Task s.dbm(s.Model).Where("task_id", 500).Scan(&gg) if gg == nil || !bitset32.From(gg.Data).Test(80) { return errors.New("请先完成勇者任务80") } var ggg *model.Task s.dbm(s.Model).Where("task_id", 600).Scan(&ggg) if ggg == nil || !bitset32.From(ggg.Data).Test(50) { return errors.New("请先完成试炼任务50") } return nil } 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 } if task == nil { task = model.NewTask() task.PlayerID = uint64(s.userid) task.TaskID = id } 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 { BaseService } func NewTaskService(id uint32) *TaskService { return &TaskService{ BaseService: BaseService{userid: id, Service: &cool.Service{Model: model.NewTask()}, }, } }