game_sync/statistics/task/task/rechargeoffline.go

63 lines
1.6 KiB
Go

package task
import (
"context"
"fmt"
"go.mongodb.org/mongo-driver/mongo/options"
"go.mongodb.org/mongo-driver/bson"
"mongo.games.com/game/common"
mymongo "mongo.games.com/goserver/core/mongox"
)
type RechargeOfflineData struct {
Snid int32
Coin int64
}
func OfflineCoin(plt string, startTime, endTime string) (res []*RechargeOfflineData, err error) {
s, e := common.StrRFC3339TimeToTime(startTime), common.StrRFC3339TimeToTime(endTime)
if s.IsZero() || e.IsZero() {
return nil, fmt.Errorf("time format error")
}
c, err := mymongo.GetLogCollection(plt, "log_dbshop")
if err != nil {
return nil, err
}
cur, err := c.Find(context.TODO(), bson.M{"ts": bson.M{"$gte": s.Unix(), "$lt": e.Unix()}, "consume": 3, "state": 1})
if err != nil {
return nil, err
}
defer cur.Close(context.Background())
var list []struct{ Snid int32 }
if err = cur.All(context.Background(), &list); err != nil {
return nil, err
}
snids := map[int32]struct{}{}
for _, v := range list {
if _, ok := snids[v.Snid]; ok {
continue
}
snids[v.Snid] = struct{}{}
// 最后金币数量
c, err := mymongo.GetLogCollection(plt, "log_coinex")
if err != nil {
return nil, err
}
one := c.FindOne(context.TODO(), bson.M{"snid": v.Snid, "cointype": 0, "ts": bson.M{"$lt": e.Unix()}}, options.FindOne().SetSort(bson.M{"ts": -1}))
if one.Err() != nil {
return nil, one.Err()
}
var data struct{ Restcount int64 }
if err = one.Decode(&data); err != nil {
return nil, err
}
res = append(res, &RechargeOfflineData{Snid: v.Snid, Coin: data.Restcount})
}
return
}