Explorar o código

Merge remote-tracking branch 'refs/remotes/origin/dev_origin'

# Conflicts:
#	game/config/data/weeklySignInConfig.json
#	game/game_cluster/nodes/game/module/player/invite.go
#	game/game_cluster/nodes/web/controller/controller.go
#	game/game_cluster/nodes/web/controller/invite.go
#	game/game_cluster/nodes/webadmin/router/router.go
zhengtao hai 8 meses
pai
achega
bd1e498a01

+ 31 - 31
game/config/data/weeklySignInConfig.json

@@ -1,32 +1,32 @@
 [
-  {"ID":0,"Reward":[{"itemBaseType":1,"itemID":5,"amount":5000}]},
-  {"ID":1,"Reward":[{"itemBaseType":1,"itemID":5,"amount":50000}]},
-  {"ID":2,"Reward":[{"itemBaseType":1,"itemID":5,"amount":200000}]},
-  {"ID":3,"Reward":[{"itemBaseType":1,"itemID":5,"amount":500000}]},
-  {"ID":4,"Reward":[{"itemBaseType":1,"itemID":5,"amount":1000000}]},
-  {"ID":5,"Reward":[{"itemBaseType":1,"itemID":5,"amount":2000000}]},
-  {"ID":6,"Reward":[{"itemBaseType":1,"itemID":5,"amount":3000000}]},
-  {"ID":7,"Reward":[{"itemBaseType":1,"itemID":5,"amount":4000000}]},
-  {"ID":8,"Reward":[{"itemBaseType":1,"itemID":5,"amount":5000000}]},
-  {"ID":9,"Reward":[{"itemBaseType":1,"itemID":5,"amount":5500000}]},
-  {"ID":10,"Reward":[{"itemBaseType":1,"itemID":5,"amount":6000000}]},
-  {"ID":11,"Reward":[{"itemBaseType":1,"itemID":5,"amount":8000000}]},
-  {"ID":12,"Reward":[{"itemBaseType":1,"itemID":5,"amount":10000000}]},
-  {"ID":13,"Reward":[{"itemBaseType":1,"itemID":5,"amount":15000000}]},
-  {"ID":14,"Reward":[{"itemBaseType":1,"itemID":5,"amount":30000000}]},
-  {"ID":15,"Reward":[{"itemBaseType":1,"itemID":5,"amount":35000000}]},
-  {"ID":16,"Reward":[{"itemBaseType":1,"itemID":5,"amount":40000000}]},
-  {"ID":17,"Reward":[{"itemBaseType":1,"itemID":5,"amount":50000000}]},
-  {"ID":18,"Reward":[{"itemBaseType":1,"itemID":5,"amount":60000000}]},
-  {"ID":19,"Reward":[{"itemBaseType":1,"itemID":5,"amount":100000000}]},
-  {"ID":20,"Reward":[{"itemBaseType":1,"itemID":5,"amount":130000000}]},
-  {"ID":21,"Reward":[{"itemBaseType":1,"itemID":5,"amount":140000000}]},
-  {"ID":22,"Reward":[{"itemBaseType":1,"itemID":5,"amount":150000000}]},
-  {"ID":23,"Reward":[{"itemBaseType":1,"itemID":5,"amount":200000000}]},
-  {"ID":24,"Reward":[{"itemBaseType":1,"itemID":5,"amount":220000000}]},
-  {"ID":25,"Reward":[{"itemBaseType":1,"itemID":5,"amount":250000000}]},
-  {"ID":26,"Reward":[{"itemBaseType":1,"itemID":5,"amount":300000000}]},
-  {"ID":27,"Reward":[{"itemBaseType":1,"itemID":5,"amount":350000000}]},
-  {"ID":28,"Reward":[{"itemBaseType":1,"itemID":5,"amount":400000000}]},
-  {"ID":29,"Reward":[{"itemBaseType":1,"itemID":5,"amount":500000000}]}
-]
+		{"ID":0,"Reward":[{"itemBaseType":1,"itemID":5,"amount":5000}]},
+		{"ID":1,"Reward":[{"itemBaseType":1,"itemID":5,"amount":50000}]},
+		{"ID":2,"Reward":[{"itemBaseType":1,"itemID":5,"amount":200000}]},
+		{"ID":3,"Reward":[{"itemBaseType":1,"itemID":5,"amount":500000}]},
+		{"ID":4,"Reward":[{"itemBaseType":1,"itemID":5,"amount":1000000}]},
+		{"ID":5,"Reward":[{"itemBaseType":1,"itemID":5,"amount":2000000}]},
+		{"ID":6,"Reward":[{"itemBaseType":1,"itemID":5,"amount":3000000}]},
+		{"ID":7,"Reward":[{"itemBaseType":1,"itemID":5,"amount":4000000}]},
+		{"ID":8,"Reward":[{"itemBaseType":1,"itemID":5,"amount":5000000}]},
+		{"ID":9,"Reward":[{"itemBaseType":1,"itemID":5,"amount":5500000}]},
+		{"ID":10,"Reward":[{"itemBaseType":1,"itemID":5,"amount":6000000}]},
+		{"ID":11,"Reward":[{"itemBaseType":1,"itemID":5,"amount":8000000}]},
+		{"ID":12,"Reward":[{"itemBaseType":1,"itemID":5,"amount":10000000}]},
+		{"ID":13,"Reward":[{"itemBaseType":1,"itemID":5,"amount":15000000}]},
+		{"ID":14,"Reward":[{"itemBaseType":1,"itemID":5,"amount":30000000}]},
+		{"ID":15,"Reward":[{"itemBaseType":1,"itemID":5,"amount":35000000}]},
+		{"ID":16,"Reward":[{"itemBaseType":1,"itemID":5,"amount":40000000}]},
+		{"ID":17,"Reward":[{"itemBaseType":1,"itemID":5,"amount":50000000}]},
+		{"ID":18,"Reward":[{"itemBaseType":1,"itemID":5,"amount":60000000}]},
+		{"ID":19,"Reward":[{"itemBaseType":1,"itemID":5,"amount":100000000}]},
+		{"ID":20,"Reward":[{"itemBaseType":1,"itemID":5,"amount":130000000}]},
+		{"ID":21,"Reward":[{"itemBaseType":1,"itemID":5,"amount":140000000}]},
+		{"ID":22,"Reward":[{"itemBaseType":1,"itemID":5,"amount":150000000}]},
+		{"ID":23,"Reward":[{"itemBaseType":1,"itemID":5,"amount":200000000}]},
+		{"ID":24,"Reward":[{"itemBaseType":1,"itemID":5,"amount":220000000}]},
+		{"ID":25,"Reward":[{"itemBaseType":1,"itemID":5,"amount":250000000}]},
+		{"ID":26,"Reward":[{"itemBaseType":1,"itemID":5,"amount":300000000}]},
+		{"ID":27,"Reward":[{"itemBaseType":1,"itemID":5,"amount":350000000}]},
+		{"ID":28,"Reward":[{"itemBaseType":1,"itemID":5,"amount":400000000}]},
+		{"ID":29,"Reward":[{"itemBaseType":1,"itemID":5,"amount":500000000}]}
+]

+ 1 - 1
game/game_cluster/internal/mdb/models/player.go

@@ -309,7 +309,7 @@ func (p *Player) FinishAchieveTaskByType1(id int) bool {
 			} else {
 				p.AchieveTask[id].Validate = 0 //验证成功
 				p.AchieveTask[id].Status = 0
-				mhayaLogger.Warnf("FinishAchieveTaskByType1 验证失败 username :%v,  id : v%", p.UserName, id)
+				mhayaLogger.Warnf("FinishAchieveTaskByType1 验证失败 username :%v,  id : %v", p.UserName, id)
 				return false
 			}
 

+ 2 - 2
game/game_cluster/nodes/game/module/player/invite.go

@@ -22,8 +22,7 @@ func (p *actorPlayer) invite() {
 	}
 	p.Player.Pid = pid
 	p.Player.SetInvite(pid)
-	//添加日志
-	clog.Infof("player invite,playerName:%v, inviteName:%v", p.Player.UserName, pid)
+clog.Infof("player invite,playerName:%v, inviteName:%v", p.Player.UserName, pid)
 }
 
 func (p *actorPlayer) inviteRecord() (*param.WeeklyRankConfigResp, int32) {
@@ -137,3 +136,4 @@ func (p *actorPlayer) inviteClaimRatio() int32 {
 	mdb.RDB.Del(context.Background(), key)
 	return code.OK
 }
+

+ 1 - 0
game/game_cluster/nodes/web/controller/controller.go

@@ -78,6 +78,7 @@ func (p *Controller) Init() {
 	group.POST("/inviteRewardRatio", p.inviteRewardRatio)
 	group.POST("/inviteClaimRatio", p.inviteClaimRatio)
 
+	//group.POST("/invite", p.invite)
 	group.POST("/share", p.share)
 	group.POST("/claim", p.claim)
 

+ 2 - 0
game/game_cluster/nodes/web/controller/invite.go

@@ -34,12 +34,14 @@ func (p *Controller) invite(c *mhayaGin.Context) {
 func (p *Controller) inviteRewardRatio(c *mhayaGin.Context) {
 
 	token, err := p.Auth(c)
+	_, err := p.Auth(c)
 	if code.IsFail(err) {
 		mhayaLogger.Warnf("if inviteRewardRatio token err {. params=%s", c.GetHeader(constant.Token))
 		code.RenderResult(c, code.AccountTokenValidateFail)
 		return
 	}
 
+	code.RenderResult(c, code.OK)
 	ctl, ok := p.GetChildActor(token.PlayerID)
 	if !ok {
 		code.RenderResult(c, code.Error)

+ 91 - 0
game/game_cluster/nodes/webadmin/controller/player.go

@@ -0,0 +1,91 @@
+package controller
+
+import (
+	"github.com/gin-gonic/gin"
+	"github.com/mhaya/game/game_cluster/nodes/webadmin/entity"
+	"github.com/mhaya/game/game_cluster/nodes/webadmin/service"
+)
+
+type PlayerManage struct {
+	sev *service.PlayerManage
+}
+
+func NewPlayerManage() *PlayerManage {
+	return &PlayerManage{
+		sev: service.NewPlayerManage(),
+	}
+}
+
+func (w *PlayerManage) GetPlayerlist(ctx *gin.Context) {
+	req := entity.PlayerListReq{}
+	if err := ctx.ShouldBindJSON(&req); err != nil {
+		ctx.JSON(200, gin.H{
+			"code": 400,
+			"msg":  err.Error(),
+		})
+		return
+	}
+	resp, total, err := w.sev.List(ctx, req)
+	if err != nil {
+		ctx.JSON(200, gin.H{
+			"code": 400,
+			"msg":  err.Error(),
+		})
+		return
+	}
+	ctx.JSON(200, gin.H{
+		"code":  200,
+		"data":  resp,
+		"msg":   "success",
+		"total": total,
+	})
+}
+
+func (w *PlayerManage) GetPlayerInfo(ctx *gin.Context) {
+	req := entity.PlayerInfoReq{}
+	if err := ctx.ShouldBindJSON(&req); err != nil {
+		ctx.JSON(200, gin.H{
+			"code": 400,
+			"msg":  err.Error(),
+		})
+		return
+	}
+	resp, err := w.sev.PlayerInfo(ctx, req)
+	if err != nil {
+		ctx.JSON(200, gin.H{
+			"code": 400,
+			"msg":  err.Error(),
+		})
+		return
+	}
+	ctx.JSON(200, gin.H{
+		"code": 200,
+		"data": resp,
+		"msg":  "success",
+	})
+}
+
+func (w *PlayerManage) GetRewardList(ctx *gin.Context) {
+	req := entity.RewardListReq{}
+	if err := ctx.ShouldBindJSON(&req); err != nil {
+		ctx.JSON(200, gin.H{
+			"code": 400,
+			"msg":  err.Error(),
+		})
+		return
+	}
+	resp, total, err := w.sev.RewardList(ctx, req)
+	if err != nil {
+		ctx.JSON(200, gin.H{
+			"code": 400,
+			"msg":  err.Error(),
+		})
+		return
+	}
+	ctx.JSON(200, gin.H{
+		"code":  200,
+		"data":  resp,
+		"msg":   "success",
+		"total": total,
+	})
+}

+ 87 - 0
game/game_cluster/nodes/webadmin/entity/admin.go

@@ -61,3 +61,90 @@ type AdminUpdateStatusReq struct {
 	Username string `json:"username"`
 	Status   int    `json:"status"`
 }
+
+type PlayerListReq struct {
+	Page        int    `json:"page" binding:"required"`
+	Size        int    `json:"size" binding:"required"`
+	UserName    string `json:"userName"`                    // 用户名
+	NickName    string `json:"nickName" bson:"nickName"`    // 昵称
+	OpenId      string `json:"openId" bson:"openId"`        // 对应tgid
+	Pid         string `json:"pid" bson:"pid"`              // 上级ID
+	XID         string `json:"xID" bson:"xID"`              // 绑定推特ID
+	TonWall     string `json:"tonWall" bson:"tonWall"`      // 绑定钱包地址
+	Email       string `json:"email" bson:"email"`          // 邮箱
+	LevelMin    int    `json:"levelMin" bson:"level"`       // 等级最小值
+	LevelMax    int    `json:"levelMax" bson:"level"`       // 等级最大值
+	Status      int    `json:"status" bson:"status"`        // 状态 1:有效 2:禁用
+	LoginIP     string `json:"loginIP" bson:"loginIP"`      // 登录IP
+	JoinTimeMin int64  `json:"joinTimeMin" bson:"joinTime"` // 注册时间最小值
+	JoinTimeMax int64  `json:"joinTimeMax" bson:"joinTime"` // 注册时间最大值
+}
+
+type PlayerListResp struct {
+	UserName      string `json:"userName" bson:"userName"`           // 用户名
+	OpenId        string `json:"openId" bson:"openId"`               // 对应tgid
+	UserNameMaybe string `json:"userNameMaybe" bson:"userNameMaybe"` // 昵称
+	NickName      string `json:"nickName" bson:"nickName"`           // 昵称
+	Pid           string `json:"pid" bson:"pid"`                     // 上级ID
+	XID           string `json:"xID" bson:"xID"`                     // 绑定推特ID
+	TonWall       string `json:"tonWall" bson:"tonWall"`             // 绑定钱包地址
+	Email         string `json:"email" bson:"email"`                 // 邮箱
+	Level         int    `json:"level" bson:"level"`                 // 等级
+	Status        int    `json:"status" bson:"status"`               // 状态  1:有效 2:禁用
+	LoginTime     int64  `json:"loginTime" bson:"loginTime"`         // 登陆时间
+	LoginIP       string `json:"loginIP" bson:"loginIP"`             // 登录IP
+	JoinIP        string `json:"joinIP" bson:"joinIP"`               // 注册IP
+	JoinTime      int64  `json:"joinTime" bson:"joinTime"`           // 注册时间
+}
+
+type PlayerInfoReq struct {
+	UserName string `json:"userName" binding:"required"` // 用户名
+}
+
+type PlayerInfoResp struct {
+	UserName       string `json:"userName" bson:"userName"`             // 用户名
+	OpenId         string `json:"openId" bson:"openId"`                 // 对应tgid
+	UserNameMaybe  string `json:"userNameMaybe" bson:"userNameMaybe"`   // 昵称
+	NickName       string `json:"nickName" bson:"nickName"`             // 昵称
+	Pid            string `json:"pid" bson:"pid"`                       // 上级ID
+	XID            string `json:"xID" bson:"xID"`                       // 绑定推特ID
+	TonWall        string `json:"tonWall" bson:"tonWall"`               // 绑定钱包地址
+	Email          string `json:"email" bson:"email"`                   // 邮箱
+	Level          int    `json:"level" bson:"level"`                   // 等级
+	Status         int    `json:"status" bson:"status"`                 // 状态  1:有效 2:禁用
+	LoginTime      int64  `json:"loginTime" bson:"loginTime"`           // 登陆时间
+	LoginIP        string `json:"loginIP" bson:"loginIP"`               // 登录IP
+	JoinIP         string `json:"joinIP" bson:"joinIP"`                 // 注册IP
+	JoinTime       int64  `json:"joinTime" bson:"joinTime"`             // 注册时间
+	Avatar         string `json:"avatar" bson:"avatar"`                 // 头像
+	IsRobot        int    `json:"isRobot" bson:"isRobot"`               // 是否为机器人
+	IsLeader       int    `json:"isLeader" bson:"isLeader"`             // 是否是社区长
+	IsVip          int    `json:"isVip" bson:"isVip"`                   // 是否为VIP
+	Successions    int    `json:"successions" bson:"successions"`       // 连续登陆天数
+	MaxSuccessions int    `json:"maxSuccessions" bson:"maxSuccessions"` // 最大连续等级天数
+	PrevTime       int64  `json:"prevTime" bson:"prevTime"`             // 上次登陆时间
+	UpdateTime     int64  `json:"updateTime" bson:"updateTime"`         // 更新时间
+	IsDrawShare    int    `json:"isDrawShare" bson:"isDrawShare"`       // 0未领取,1已领取
+	DrawShareTime  int64  `json:"drawShareTime" bson:"drawShareTime"`   // 领取时间
+	FirstReward    int    `json:"firstReward" bson:"firstReward"`       // 是否已领取首次登陆奖励
+}
+
+type RewardListReq struct {
+	Page      int    `json:"page" binding:"required"`
+	Size      int    `json:"size" binding:"required"`
+	UserName  string `json:"userName"`   // 用户名
+	StartTime int64  `json:"start_time"` // 开始时间
+	EndTime   int64  `json:"end_time"`   // 结束时间
+}
+
+type RewardListResp struct {
+	UserName   string        `json:"userName" bson:"userName"` // 用户名
+	AddReward  []*ItemReward `json:"AddReward" bson:"addReward"`
+	CreateTime int64         `json:"createTime" bson:"createTime"`
+}
+
+type ItemReward struct {
+	ItemID   int    // itemID:道具ID
+	Amount   int    // amount:数量
+	ItemName string // itemName:道具名称
+}

+ 3 - 0
game/game_cluster/nodes/webadmin/router/router.go

@@ -101,6 +101,9 @@ func (c *Controller) InitApiRouter(u *gin.RouterGroup) {
 	u.POST("/whitelist/add", controller.NewWhitelist().AddWhitelist)
 	u.POST("/whitelist/remove", controller.NewWhitelist().RemoveWhitelist)
 	u.POST("/whitelist/list", controller.NewWhitelist().GetWhitelist)
+	u.POST("/player/list", controller.NewPlayerManage().GetPlayerlist)
+	u.POST("/player/info", controller.NewPlayerManage().GetPlayerInfo)
+	u.POST("/player/rewardList", controller.NewPlayerManage().GetRewardList)
 
 	// 风控
 	u.POST("/riskControl/multipleFingerprintInIp", controller.NewRiskControl().MultipleFingerprintInIp)

+ 247 - 0
game/game_cluster/nodes/webadmin/service/playerMange.go

@@ -0,0 +1,247 @@
+package service
+
+import (
+	"context"
+	"log"
+	"time"
+
+	mhayaTime "github.com/mhaya/extend/time"
+	"github.com/mhaya/game/game_cluster/internal/constant"
+	"github.com/mhaya/game/game_cluster/internal/data"
+	"github.com/mhaya/game/game_cluster/internal/mdb"
+	"github.com/mhaya/game/game_cluster/internal/mdb/models"
+	"github.com/mhaya/game/game_cluster/nodes/webadmin/entity"
+	"go.mongodb.org/mongo-driver/bson"
+	"go.mongodb.org/mongo-driver/mongo/options"
+)
+
+type PlayerManage struct {
+}
+
+func NewPlayerManage() *PlayerManage {
+	return &PlayerManage{}
+}
+
+// 获取玩家列表
+func (a *PlayerManage) List(ctx context.Context, req entity.PlayerListReq) ([]*entity.PlayerListResp, int64, error) {
+	page := req.Page
+	// 验证参数
+	if page <= 0 {
+		page = 1
+	}
+	pageSize := req.Size
+	if pageSize <= 0 {
+		pageSize = 10
+	}
+
+	// 构建查询条件
+	filter := bson.M{}
+	if req.UserName != "" {
+		filter["userName"] = bson.M{"$regex": escapeRegex(req.UserName), "$options": "i"}
+	}
+	if req.NickName != "" {
+		filter["nickName"] = bson.M{"$regex": escapeRegex(req.NickName), "$options": "i"}
+	}
+	if req.OpenId != "" {
+		filter["openId"] = req.OpenId
+	}
+	if req.Pid != "" {
+		filter["pid"] = req.Pid
+	}
+	if req.XID != "" {
+		filter["xID"] = req.XID
+	}
+	if req.TonWall != "" {
+		filter["tonWall"] = req.TonWall
+	}
+	if req.Email != "" {
+		filter["email"] = req.Email
+	}
+	if req.LevelMin > 0 && req.LevelMax == 0 {
+		filter["level"] = bson.M{
+			"$gte": req.LevelMin,
+			"$lte": 1000, // 等级最大值
+		}
+	}
+	if req.LevelMin >= 0 && req.LevelMax > 0 && req.LevelMin <= req.LevelMax {
+		filter["level"] = bson.M{
+			"$gte": req.LevelMin,
+			"$lte": req.LevelMax,
+		}
+	}
+	if req.Status > 0 {
+		filter["status"] = req.Status
+	}
+	if req.LoginIP != "" {
+		filter["loginIP"] = req.LoginIP
+	}
+	if req.JoinTimeMin > 0 && req.JoinTimeMax > 0 && req.JoinTimeMin <= req.JoinTimeMax {
+		filter["joinTime"] = bson.M{
+			"$gte": req.JoinTimeMin,
+			"$lte": req.JoinTimeMax,
+		}
+	}
+
+	// 设置分页选项
+	skip := (page - 1) * pageSize
+	limit := pageSize
+	findOptions := options.Find().SetSkip(int64(skip)).SetLimit(int64(limit))
+
+	// 执行查询
+	cursor, err := mdb.MDB.Collection(constant.CNamePlayer).Find(ctx, filter, findOptions)
+	if err != nil {
+		return nil, 0, err
+	}
+	defer func() {
+		if closeErr := cursor.Close(ctx); closeErr != nil {
+			log.Printf("Error closing cursor: %v", closeErr)
+		}
+	}()
+
+	// 解析结果
+	results := make([]*entity.PlayerListResp, 0)
+	for cursor.Next(ctx) {
+		var result entity.PlayerListResp
+		if err := cursor.Decode(&result); err != nil {
+			return nil, 0, err
+		}
+		results = append(results, &result)
+	}
+	if err := cursor.Err(); err != nil {
+		return nil, 0, err
+	}
+
+	count := 0
+	playerServerLoadStats, err := NewAdmin().GetServerStatus(ctx)
+	if err != nil {
+		return nil, 0, err
+	}
+
+	for _, v := range playerServerLoadStats {
+		count += int(v.TotalUser)
+	}
+
+	return results, int64(count), nil
+}
+
+// 获取玩家详情
+func (a *PlayerManage) PlayerInfo(ctx context.Context, req entity.PlayerInfoReq) (*entity.PlayerInfoResp, error) {
+	var player models.Player
+	err := mdb.MDB.Collection(constant.CNamePlayer).FindOne(context.Background(), bson.M{"userName": req.UserName}).Decode(&player)
+	if err != nil {
+		return nil, err
+	}
+
+	return &entity.PlayerInfoResp{
+		UserName:       player.UserName,
+		OpenId:         player.OpenId,
+		UserNameMaybe:  player.UserNameMaybe,
+		NickName:       player.NickName,
+		Pid:            player.Pid,
+		XID:            player.XID,
+		TonWall:        player.TonWall,
+		Email:          player.Email,
+		Level:          player.Level,
+		Status:         player.Status,
+		LoginTime:      player.LoginTime,
+		LoginIP:        player.LoginIP,
+		JoinIP:         player.JoinIP,
+		JoinTime:       player.JoinTime,
+		Avatar:         player.Avatar,
+		IsRobot:        player.IsRobot,
+		IsLeader:       player.IsLeader,
+		IsVip:          player.IsVip,
+		Successions:    player.Successions,
+		MaxSuccessions: player.MaxSuccessions,
+		PrevTime:       player.PrevTime,
+		UpdateTime:     player.UpdateTime,
+		IsDrawShare:    player.Share.IsDrawShare,
+		DrawShareTime:  player.Share.DrawShareTime,
+		FirstReward:    player.FirstReward,
+	}, nil
+}
+
+// 获取玩家中奖记录(默认查询最近三天)
+func (a *PlayerManage) RewardList(ctx context.Context, req entity.RewardListReq) ([]*entity.RewardListResp, int64, error) {
+	page := req.Page
+	// 验证参数
+	if page <= 0 {
+		page = 1
+	}
+	pageSize := req.Size
+	if pageSize <= 0 {
+		pageSize = 10
+	}
+
+	// 构建查询条件
+	filter := bson.M{}
+	if req.UserName != "" {
+		filter["userName"] = bson.M{"$regex": escapeRegex(req.UserName), "$options": "i"}
+	}
+
+	startTime := mhayaTime.Now().Add(-3 * 24 * time.Hour).Unix()
+	endTime := mhayaTime.Now().Unix()
+	if req.StartTime > 0 && req.StartTime >= startTime {
+		if req.StartTime <= req.EndTime || req.EndTime == 0 {
+			startTime = req.StartTime
+		}
+	}
+
+	if req.EndTime > 0 && req.EndTime <= endTime {
+		if req.StartTime <= req.EndTime {
+			endTime = req.EndTime
+		}
+	}
+
+	filter["createTime"] = bson.M{
+		"$gte": startTime,
+		"$lte": endTime,
+	}
+
+	// 设置分页选项
+	skip := (page - 1) * pageSize
+	limit := pageSize
+	findOptions := options.Find().SetSkip(int64(skip)).SetLimit(int64(limit))
+
+	collection := mdb.MDB.Collection(constant.CNamePlayerReward)
+	// 获取总数total
+	count, err := collection.CountDocuments(ctx, filter)
+	if err != nil {
+		return nil, 0, err
+	}
+
+	// 执行查询
+	cursor, err := collection.Find(ctx, filter, findOptions)
+	if err != nil {
+		return nil, 0, err
+	}
+	defer func() {
+		if closeErr := cursor.Close(ctx); closeErr != nil {
+			log.Printf("Error closing cursor: %v", closeErr)
+		}
+	}()
+
+	// 解析结果
+	results := make([]*entity.RewardListResp, 0)
+	for cursor.Next(ctx) {
+		var result entity.RewardListResp
+		if err := cursor.Decode(&result); err != nil {
+			return nil, 0, err
+		}
+		results = append(results, &result)
+	}
+	if err := cursor.Err(); err != nil {
+		return nil, 0, err
+	}
+
+	for _, result := range results {
+		for _, v := range result.AddReward {
+			cfg, exist := data.ItemConfig.Get(v.ItemID)
+			if exist {
+				v.ItemName = cfg.ItemKey
+			}
+		}
+	}
+
+	return results, count, nil
+}