// package 更新任务触发后的数据更新 package rtask import ( "go_dreamfactory/pb" cfg "go_dreamfactory/sys/configure/structs" "time" "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{} if err2 := this.Get(uid, record); err2 != nil { if err2 != mongo.ErrNoDocuments { return errors.Wrapf(err, "获取玩家任务记录 err: %v rtype[%v]", uid, cfg.Id) } else { err = err2 } } if record.Vals == nil { data := &pb.RtaskData{ Rtype: cfg.Type, Data: toMap(vals...), Timestamp: time.Now().Unix(), } record.Vals = map[int32]*pb.RtaskData{ cfg.Id: data, } record.Id = primitive.NewObjectID().Hex() record.Uid = uid if err := this.Add(uid, record); err != nil { return errors.Wrapf(err, "添加玩家任务记录 err: %v rtype[%v]", uid, cfg.Id) } } else { if v, ok := record.Vals[cfg.Id]; ok { m := hasUpdateData(paramLen, v, vals...) if len(m) > 0 { update := map[string]interface{}{ "vals": m, } err = this.Change(uid, update) } } else { data := &pb.RtaskData{ Rtype: cfg.Type, Data: toMap(vals...), Timestamp: time.Now().Unix(), } record.Vals[cfg.Id] = data update := map[string]interface{}{ "vals": record.Vals, } err = this.Change(uid, update) } } return } // 累计更新 - 招募等 func (this *ModelRtaskRecord) addUpdate(uid string, cfg *cfg.GameRdtaskCondiData, vals ...int32) (err error) { record := &pb.DBRtaskRecord{} err = this.Get(uid, record) if err != nil { return errors.Wrapf(err, "获取玩家任务记录 err: %v rtype[%v]", uid, cfg.Id) } if record.Vals == nil { data := &pb.RtaskData{ Data: toMap(vals...), Rtype: cfg.Type, Timestamp: time.Now().Unix(), } record.Vals = map[int32]*pb.RtaskData{ cfg.Id: data, } if err := this.Add(uid, record); err != nil { return errors.Wrapf(err, "添加玩家任务记录 err: %v rtype[%v]", uid, cfg.Id) } } else { //查找任务数据 if v, ok := record.Vals[cfg.Id]; ok { count := v.Data[0] count += vals[0] vals[0] = count v.Data = toMap(vals...) v.Timestamp = time.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: time.Now().Unix(), } update := map[string]interface{}{ "vals": record.Vals, } err = this.Change(uid, update) } } return }