package smithy import ( "go_dreamfactory/comm" "go_dreamfactory/lego/core" "go_dreamfactory/lego/sys/redis" "go_dreamfactory/modules" "go_dreamfactory/pb" "go_dreamfactory/utils" "time" "go.mongodb.org/mongo-driver/bson/primitive" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/x/bsonx" ) type modelSmithy struct { modules.MCompModel module *Smithy } func (this *modelSmithy) Init(service core.IService, module core.IModule, comp core.IModuleComp, options core.IModuleOptions) (err error) { this.TableName = string(comm.TableSmithy) err = this.MCompModel.Init(service, module, comp, options) this.module = module.(*Smithy) // uid 创建索引 this.DB.CreateIndex(core.SqlTable(this.TableName), mongo.IndexModel{ Keys: bsonx.Doc{{Key: "uid", Value: bsonx.Int32(1)}}, }) return } // 获取铁匠铺信息 func (this *modelSmithy) getSmithyList(uid string) (result *pb.DBSmithy, err error) { result = &pb.DBSmithy{} if err = this.Get(uid, result); err != nil { if redis.RedisNil != err { // 没有数据直接创建新的数据 result.Id = primitive.NewObjectID().Hex() result.Uid = uid result.Skill = make(map[int32]int32, 0) result.StoveLv = 1 // storv 等级默认1级 mapType := this.module.configure.GetSmithyTypeConfigData() // 找类型 for key := range mapType { result.Skill[key] = 1 } if err = this.Add(uid, result); err != nil { this.module.Errorf("err:%v", err) err = nil return } } return } err = nil return result, err } func (this *modelSmithy) modifySmithyDataByObjId(uid string, data map[string]interface{}) error { return this.Change(uid, data) } // 计算订单信息 func (this *modelSmithy) CalculationSmithy(uid string, Smithy *pb.DBSmithy) { var ( bCooking bool costTime int32 curTime int32 ) mapData := make(map[string]interface{}, 0) if Smithy.Clang != nil && Smithy.Clang.ETime > 0 { costTime = int32(time.Now().Unix() - Smithy.Clang.ETime) // 当前过去的时间 if costTime < 0 { // 没有完成 不做处理 return } } if Smithy.Clang == nil { Smithy.Clang = &pb.Clang{} } for _, order := range Smithy.Orders { if order.Count == 0 { continue } foodtype := order.DeskType // 获取技能等级 skillLv := Smithy.Skill[foodtype] // 计算出需要的时间 _skillCfg := this.module.configure.GetSmithyStoveConfigData(skillLv) // 技能配置表 _Smithycfg := this.module.configure.GetSmithyConfigData(foodtype, skillLv) // 美食家配置表 for i := 0; i < int(order.Count); i++ { curTime += _skillCfg.Time // 判断是不是第二天 if Smithy.Clang.ETime == 0 { Smithy.Clang.ETime = time.Now().Unix() } if !utils.IsToday(Smithy.Clang.ETime + int64(curTime)) { // 判断是不是今天 // 跨天了 Smithy.Clang.ETime = Smithy.Clang.ETime + int64(curTime) // 设置下单的时间 Smithy.Clang.STime = Smithy.Clang.ETime - int64(curTime) // 设置下单的时间 Smithy.Ctime = Smithy.Clang.ETime // 设置创建订单时间 Smithy.OrderCostTime = 0 // 清空当天的订单时长 } order.Count-- this.module.configure.GetMultipleDropReward(1, _Smithycfg.Drop, Smithy.Items) // 获取掉落奖励 if curTime > costTime { Smithy.OrderCostTime += int32(curTime - costTime) // 转时间戳 eTimd := time.Now().Unix() + int64(curTime-costTime) Smithy.Clang.DeskType = order.DeskType Smithy.Clang.ETime = eTimd Smithy.Clang.STime = time.Now().Unix() - int64(curTime-costTime) bCooking = true // 记录下订单时间 Smithy.Ctime = time.Now().Unix() mapData["ctime"] = Smithy.Ctime break } Smithy.OrderCostTime += curTime } if bCooking { // 分配了正在製作的食物 break } } if !bCooking { // 经过计算没有烹饪食物的时候 Smithy.Clang = nil } sz := make([]*pb.OrderClang, 0) for _, v := range Smithy.Orders { if v.Count != 0 { sz = append(sz, v) } } Smithy.Orders = sz // 保存信息 mapData["orders"] = Smithy.Orders mapData["orderCostTime"] = Smithy.OrderCostTime mapData["clang"] = Smithy.Clang // 正在做的 this.module.ModifySmithyData(uid, mapData) } // 技能升级 重计算时间消耗 func (this *modelSmithy) CalculationDeskSkillLv(uid string, Smithy *pb.DBSmithy) { mapData := make(map[string]interface{}, 0) mapData["skill"] = Smithy.Skill this.module.ModifySmithyData(uid, mapData) } func (this *modelSmithy) CalculationStoveSkillLv(uid string, Smithy *pb.DBSmithy, stoveSkillLv int32) { mapData := make(map[string]interface{}, 0) for _, v := range Smithy.Orders { if v.Count > 0 { _skillCfg := this.module.configure.GetSmithyStoveConfigData(stoveSkillLv) if _skillCfg != nil { v.NeedTime += _skillCfg.Time * v.Count if v.NeedTime < 0 { // 担心配置错误 为负数情况 所以这里做下判断 v.NeedTime = 0 } mapData["orders"] = Smithy.Orders } } } mapData["stoveLv"] = Smithy.StoveLv this.module.ModifySmithyData(uid, mapData) }