172 lines
5.1 KiB
Go
172 lines
5.1 KiB
Go
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--
|
|
|
|
Smithy.Items = this.module.configure.GetMultipleDropReward(1, _Smithycfg.Drop, Smithy.Items) // 获取掉落奖励
|
|
|
|
mapData["items"] = 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)
|
|
}
|