package service import ( "blazing/cool" "blazing/modules/blazing/model" "blazing/modules/dict/service" "context" "strings" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/os/gcache" "github.com/gogf/gf/v2/util/gconv" "github.com/gogf/gf/v2/util/grand" ) // PetFusionMaterialService 宠物融合材料子表Service(对应pet_fusion_material表) type PetFusionMaterialService struct { *cool.Service // 嵌入通用Service(继承基础CRUD方法) } var PetFusionMaterialServiceIns = NewPetFusionMaterialService() // NewPetFusionMaterialService 创建PetFusionMaterialService实例 func NewPetFusionMaterialService() *PetFusionMaterialService { return &PetFusionMaterialService{ &cool.Service{ Model: model.NewPetFusionMaterial(), // 绑定PetFusionMaterial模型(默认参数占位) Cache: gcache.New(), // PageQueryOp: &cool.QueryOp{KeyWordField: []string{"material1", "material2", "material3", "material4"}}, }, } } // 获取融合材料的特性,返回两个值,一个是指定的特性,另一个是如果配方没找到的情况下,默认的配置 func (s *PetFusionMaterialService) Data(Material1 [4]uint32) uint32 { cacheKey := strings.Join(gconv.Strings(Material1[:]), ":") println(cacheKey, "获取融合id") fusions := service.DictInfoServiceS.GetData("fusion") for _, v := range Material1 { _, ok := fusions[v] if !ok { //todo使用了非法材料 return 0 } } ret, _ := s.Cache.GetOrSetFuncLock(context.Background(), cacheKey, func(context.Context) (interface{}, error) { m := cool.DBM(s.Model) var effect *model.PetFusionMaterial //一个特性应该是唯一的,但是我们要获取默认随机特性 condition := g.Map{ "material1": fusions[Material1[0]].ID, "material2": fusions[Material1[1]].ID, "material3": fusions[Material1[2]].ID, "material4": fusions[Material1[3]].ID, "is_enable": 1, } m.Where(condition).Scan(&effect) //这时候有可能效果是空的,那么这时候就再次查询默认的特性,保证每次必会生成一个数据库有的特性 //也许这个时候的特性配方就是随机从数据库中查找一个特性 return effect, nil }, 0) effect := ret.Interface().(*model.PetFusionMaterial) if effect == nil { effect2s := service.DictInfoServiceS.GetData("effect") for _, v := range effect2s { return gconv.Uint32(v.Value) } } r := grand.Intn(4) switch r { case 0: return effect.Trait1Idx case 1: return effect.Trait2Idx case 2: return effect.Trait3Idx case 3: return effect.Trait4Idx } return 0 }