All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
feat(fight): 使用专用函数构建战斗结束数据包 为战斗结束消息创建专用的构建函数, 统一处理战斗结束信息的数据包构建逻辑, 提高代码的一致性和可维护性。 fix(config): 优化数据库查询语句以提高性能 将数组包含操作(@>)替换为 ANY 操作符, 在 Egg、MapPit、PetFusion 等服务中使用更高效 的查询方式
134 lines
3.1 KiB
Go
134 lines
3.1 KiB
Go
package service
|
|
|
|
import (
|
|
"blazing/cool"
|
|
"blazing/modules/player/model"
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/gogf/gf/v2/frame/g"
|
|
)
|
|
|
|
type DoneService struct {
|
|
BaseService
|
|
}
|
|
|
|
func NewDoneService(id uint32) *DoneService {
|
|
return &DoneService{
|
|
|
|
BaseService: BaseService{userid: id,
|
|
|
|
Service: &cool.Service{Model: model.NewMilestone(), UniqueKey: map[string]string{
|
|
"player_id": "角色名称不能重复",
|
|
}},
|
|
},
|
|
}
|
|
|
|
}
|
|
|
|
// ID
|
|
// 击杀-捕捉
|
|
func (s *DoneService) UpdatePet(ptye model.PetInfo, res ...uint32) {
|
|
|
|
//属性->属性值->ID 击杀-捕捉-炫彩击杀-炫彩捕捉 雄性 雌性
|
|
args := []uint32{ptye.ID}
|
|
r1 := s.get(model.MilestoneMode.Pet, args)
|
|
results := make([]uint32, len(res))
|
|
if r1 != nil {
|
|
results = r1.Results
|
|
|
|
}
|
|
|
|
for i, v := range res {
|
|
results[i] += v
|
|
|
|
}
|
|
s.update(model.MilestoneMode.Pet, args, results)
|
|
|
|
}
|
|
func (s *DoneService) UpdateRoom(res ...uint32) {
|
|
args := []uint32{0}
|
|
r1 := s.get(model.MilestoneMode.Room, args)
|
|
results := make([]uint32, len(res))
|
|
if r1 != nil {
|
|
results = r1.Results
|
|
|
|
}
|
|
for i, v := range res {
|
|
results[i] += v
|
|
|
|
}
|
|
s.update(model.MilestoneMode.Room, args, results)
|
|
|
|
}
|
|
|
|
// 内部方法,实现更新
|
|
func (s *DoneService) update(ptye model.EnumMilestone, args []uint32, results []uint32) {
|
|
|
|
if cool.Config.ServerInfo.IsVip != 0 {
|
|
|
|
return
|
|
}
|
|
whereArgs, whereParams := buildJSONBArrayAnyCondition("args", args)
|
|
if t, _ := s.dbm_fix(s.Model).Where("done_type", ptye).Wheref(whereArgs, whereParams...).
|
|
Wheref(`jsonb_typeof(args) = ?`, "array").Exist(); t {
|
|
s.dbm_fix(s.Model).Where("done_type", ptye).Wheref(whereArgs, whereParams...).
|
|
Wheref(`jsonb_typeof(args) = ?`, "array").Data(
|
|
g.Map{
|
|
"results": results,
|
|
},
|
|
).Update()
|
|
|
|
} else {
|
|
|
|
r := g.Map{
|
|
"player_id": s.userid,
|
|
"done_type": ptye,
|
|
"args": args,
|
|
"results": results,
|
|
}
|
|
|
|
s.dbm_fix(s.Model).Data(r).Insert()
|
|
}
|
|
|
|
}
|
|
|
|
func (s *DoneService) get(ptye model.EnumMilestone, args []uint32) *model.Milestone {
|
|
var Barges *model.Milestone
|
|
whereArgs, whereParams := buildJSONBArrayAnyCondition("args", args)
|
|
s.dbm_fix(s.Model).Where("done_type", ptye).Wheref(whereArgs, whereParams...).
|
|
Wheref(`jsonb_typeof(args) = ?`, "array").Scan(&Barges)
|
|
return Barges
|
|
|
|
}
|
|
|
|
func buildJSONBArrayAnyCondition(column string, values []uint32) (string, []any) {
|
|
if len(values) == 0 {
|
|
return "FALSE", nil
|
|
}
|
|
|
|
clauses := make([]string, 0, len(values)+1)
|
|
params := make([]any, 0, len(values)+1)
|
|
for _, value := range values {
|
|
clauses = append(clauses, fmt.Sprintf(`CAST(? AS text) = ANY(ARRAY(SELECT jsonb_array_elements_text(%s)))`, column))
|
|
params = append(params, value)
|
|
}
|
|
|
|
clauses = append(clauses, fmt.Sprintf(`jsonb_array_length(%s) = ?`, column))
|
|
params = append(params, len(values))
|
|
|
|
return strings.Join(clauses, " AND "), params
|
|
}
|
|
|
|
func (s *DoneService) PetBarge(start, end uint32) []model.Milestone {
|
|
var Barges []model.Milestone
|
|
|
|
s.dbm_fix(s.Model).Where("done_type", model.MilestoneMode.Pet).
|
|
Wheref(`jsonb_typeof(args) = ?`, "array").
|
|
Wheref(`jsonb_typeof(args) != ?`, "'[]'::jsonb").
|
|
Wheref(`(args->> 0)::int BETWEEN ? AND ?`, start, end).
|
|
Scan(&Barges)
|
|
return Barges
|
|
|
|
}
|