// package 更新任务触发后的数据更新 package rtask import ( "go_dreamfactory/comm" "go_dreamfactory/lego/sys/log" "go_dreamfactory/modules/task" "go_dreamfactory/pb" "go_dreamfactory/sys/configure" cfg "go_dreamfactory/sys/configure/structs" "github.com/pkg/errors" "go.mongodb.org/mongo-driver/bson/primitive" "go.mongodb.org/mongo-driver/mongo" ) // 覆盖更新 func (this *ModelRtaskRecord) overrideUpdate(uid string, cfg *cfg.GameRdtaskCondiData, vals ...int32) (err error) { var paramLen int if paramLen, err = lenParam(cfg, vals...); err != nil { return err } record := &pb.DBRtaskRecord{Uid: uid} if err := this.Get(uid, record); err != nil { if err == mongo.ErrNoDocuments { record.Id = primitive.NewObjectID().Hex() if err := this.Add(uid, record); err != nil { return errors.Wrapf(err, "创建玩家任务记录 err: %v rtype[%v]", uid, cfg.Id) } } else { return errors.Wrapf(err, "获取玩家任务记录 err: %v rtype[%v]", uid, cfg.Id) } } if record.Vals == nil { record.Vals = make(map[int32]*pb.RtaskData) } if v, ok := record.Vals[cfg.Id]; ok { v.Data = hasUpdateData(paramLen, v, vals...) if len(v.Data) > 0 { update := map[string]interface{}{ "vals": v, } if err = this.Change(uid, update); err != nil { return } } } else { data := &pb.RtaskData{ Rtype: cfg.Type, Data: toMap(vals...), Timestamp: configure.Now().Unix(), } record.Vals[cfg.Id] = data update := map[string]interface{}{ "vals": record.Vals, } if err = this.Change(uid, update); err != nil { return } } // log.Debug("覆盖数值更新", log.Fields{"uid": uid, "condiId": cfg.Id, "params": vals, "updated": record.Vals[cfg.Id]}) // this.listenTask(uid, cfg.Id) return } // 累计更新 - 招募等 func (this *ModelRtaskRecord) addUpdate(uid string, cfg *cfg.GameRdtaskCondiData, vals ...int32) (err error) { record := &pb.DBRtaskRecord{Uid: uid} err = this.Get(uid, record) if err != nil { if err == mongo.ErrNoDocuments { record.Id = primitive.NewObjectID().Hex() if err := this.Add(uid, record); err != nil { return errors.Wrapf(err, "创建玩家任务记录 err: %v rtype[%v]", uid, cfg.Id) } } else { return errors.Wrapf(err, "获取玩家任务记录 err: %v rtype[%v]", uid, cfg.Id) } } if record.Vals == nil { record.Vals = make(map[int32]*pb.RtaskData) } //查找任务数据 if v, ok := record.Vals[cfg.Id]; ok { newArr := make([]int32, len(vals)) copy(newArr, vals) srcCount := v.Data[0] newArr[0] = srcCount + vals[0] v.Data = toMap(newArr...) v.Timestamp = configure.Now().Unix() update := map[string]interface{}{ "vals": record.Vals, } err = this.Change(uid, update) } else { record.Vals[cfg.Id] = &pb.RtaskData{ Data: toMap(vals...), Rtype: cfg.Type, Timestamp: configure.Now().Unix(), } update := map[string]interface{}{ "vals": record.Vals, } err = this.Change(uid, update) } log.Debug("累计次数更新", log.Field{Key: "uid", Value: uid}, log.Field{Key: "condiId", Value: cfg.Id}, log.Field{Key: "params", Value: vals}, log.Field{Key: "updated", Value: record.Vals[cfg.Id]}, ) // this.listenTask(uid, cfg.Id) return } func (this *ModelRtaskRecord) listenTask(uid string, cfgId int32) { //日/周/成就任务监听触发 tl := new(task.TaskListen) tl.Uid = uid tl.TaskType = comm.TaskType(cfgId) if im, err := this.service.GetModule(comm.ModuleTask); err == nil { if mt, ok := im.(*task.ModuleTask); ok { mt.GetEventApp().Dispatch(comm.EventTaskChanged, tl) } } else { this.moduleRtask.Printf("get ModuleTask err: %v", err) } }