package statordermod import ( "fmt" "time" "91porn-server/common" "91porn-server/common/db" "91porn-server/common/log" "91porn-server/models" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) var mdb *db.MongoDB const table = models.OrderStat func coll(t *db.MongoTool) *db.MongoTool { if t == nil { return mdb.Coll(table) } return t.Coll(table) } // initIndex 初始化索引 func initIndex() { many := []mongo.IndexModel{ { Keys: bson.D{{Key: "sumDate", Value: -1}}, }, { Keys: bson.D{{Key: "channel", Value: 1}, {Key: "type", Value: 1}}, }, { Keys: bson.D{{Key: "sumDate", Value: -1}, {Key: "channel", Value: 1}, {Key: "type", Value: 1}}, Options: options.Index().SetUnique(true), }, } if _, err := coll(nil).CreateIndex(many); err != nil { panic(fmt.Sprintf("%s model set index err ==>[%+v]", table, err)) } } func ChangeRechargeStatTrans(trans *db.MongoTool, sumDate, recordTime time.Time, stateMap RecOrderStateMap) error { writes := make([]mongo.WriteModel, len(stateMap)) i := 0 for channel, statDoc := range stateMap { model, err := toMgoModel(sumDate, recordTime, channel, Recharge, statDoc.RechargeOrderStateIncDoc, statDoc.RechargeOrderStateSetDoc) if err != nil { return err } writes[i] = model i++ } if len(writes) == 0 { return nil } //bulkWrite 不是原子操作 不具备事务性 opt := (&options.BulkWriteOptions{}).SetOrdered(false) //设为无序,触发并行写,提升写效率 _, err := coll(trans).Bulk(writes, opt) return err } func ChangeWithDrawStatTrans(trans *db.MongoTool, sumDate, recordTime time.Time, stateMap WitOrderStateMap) error { writes := make([]mongo.WriteModel, len(stateMap)) i := 0 for channel, statDoc := range stateMap { model, err := toMgoModel(sumDate, recordTime, channel, WithDraw, statDoc.WithDrawOrderStateIncDoc, statDoc.WithDrawOrderStateSetDoc) if err != nil { return err } writes[i] = model i++ } if len(writes) == 0 { return nil } //bulkWrite 不是原子操作 不具备事务性 opt := (&options.BulkWriteOptions{}).SetOrdered(false) //设为无序,触发并行写,提升写效率 _, err := coll(trans).Bulk(writes, opt) return err } func toMgoModel(sumDate, recordTime time.Time, channel string, typ OrderType, inc orderStateIncDoc, set orderStateSetDoc) (mongo.WriteModel, error) { filter := M{ "sumDate": sumDate, "channel": channel, "type": typ, } setM, err := common.ToBsonM(set) if err != nil { return nil, err } setM["recordAt"] = recordTime setM["updatedAt"] = time.Now() incM, err := common.ToBsonM(inc) if err != nil { return nil, err } update := M{ "$setOnInsert": M{ "sumDate": sumDate, "channel": channel, "type": typ, "createdAt": time.Now(), }, } if len(incM) != 0 { update["$inc"] = incM } if len(setM) != 0 { update["$set"] = setM } model := mongo.NewUpdateOneModel(). SetFilter(filter). SetUpdate(update). SetUpsert(true) log.Debug(fmt.Sprintf("sumDate:%s table:%s [ typ:%s channel:%s filter:%+v update:%+v ]\n", sumDate, table, typ.String(), channel, filter, update)) return model, nil }