2
0

3 Commits 99bf640a9a ... cb1fcea6a7

Autor SHA1 Mensagem Data
  Alvin cb1fcea6a7 update 完善转盘统计 há 10 meses atrás
  Alvin 1fe329acfe update 新增获取玩家列表、获取玩家详情、获取玩家中奖记录(默认查询最近三天)接口 há 10 meses atrás
  Alvin 03527c4621 update 完善logstash消息处理 há 10 meses atrás

+ 1 - 0
game/game_cluster/internal/mdb/component.go

@@ -83,6 +83,7 @@ func LogstashMigrateTables() {
 	LogstashDB.AutoMigrate(&eventmodels.AssetsEventContent{})
 	LogstashDB.AutoMigrate(&eventmodels.AssetsEventContent{})
 	LogstashDB.AutoMigrate(&eventmodels.InviteEventContent{})
 	LogstashDB.AutoMigrate(&eventmodels.InviteEventContent{})
 	LogstashDB.AutoMigrate(&eventmodels.DiceEventContent{})
 	LogstashDB.AutoMigrate(&eventmodels.DiceEventContent{})
+	LogstashDB.AutoMigrate(&eventmodels.TurntableEventContent{})
 	LogstashDB.AutoMigrate(&eventmodels.JoinChannelEventContent{})
 	LogstashDB.AutoMigrate(&eventmodels.JoinChannelEventContent{})
 	LogstashDB.AutoMigrate(&eventmodels.FollowEventContent{})
 	LogstashDB.AutoMigrate(&eventmodels.FollowEventContent{})
 	LogstashDB.AutoMigrate(&eventmodels.TaskFinishEventContent{})
 	LogstashDB.AutoMigrate(&eventmodels.TaskFinishEventContent{})

+ 2 - 0
game/game_cluster/nodes/logstash/module/event/enent.go

@@ -27,6 +27,7 @@ var (
 	_ Eventer = &eventmodels.AssetsEventContent{}
 	_ Eventer = &eventmodels.AssetsEventContent{}
 	_ Eventer = &eventmodels.InviteEventContent{}
 	_ Eventer = &eventmodels.InviteEventContent{}
 	_ Eventer = &eventmodels.DiceEventContent{}
 	_ Eventer = &eventmodels.DiceEventContent{}
+	_ Eventer = &eventmodels.TurntableEventContent{}
 	_ Eventer = &eventmodels.JoinChannelEventContent{}
 	_ Eventer = &eventmodels.JoinChannelEventContent{}
 	_ Eventer = &eventmodels.FollowEventContent{}
 	_ Eventer = &eventmodels.FollowEventContent{}
 	_ Eventer = &eventmodels.TaskFinishEventContent{}
 	_ Eventer = &eventmodels.TaskFinishEventContent{}
@@ -47,6 +48,7 @@ func init() {
 	instance.AddEvent(new(eventmodels.AssetsEventContent))
 	instance.AddEvent(new(eventmodels.AssetsEventContent))
 	instance.AddEvent(new(eventmodels.InviteEventContent))
 	instance.AddEvent(new(eventmodels.InviteEventContent))
 	instance.AddEvent(new(eventmodels.DiceEventContent))
 	instance.AddEvent(new(eventmodels.DiceEventContent))
+	instance.AddEvent(new(eventmodels.TurntableEventContent))
 	instance.AddEvent(new(eventmodels.JoinChannelEventContent))
 	instance.AddEvent(new(eventmodels.JoinChannelEventContent))
 	instance.AddEvent(new(eventmodels.FollowEventContent))
 	instance.AddEvent(new(eventmodels.FollowEventContent))
 	instance.AddEvent(new(eventmodels.TaskFinishEventContent))
 	instance.AddEvent(new(eventmodels.TaskFinishEventContent))

+ 15 - 1
game/game_cluster/nodes/logstash/module/handlelog/actor_handle_log.go

@@ -2,7 +2,7 @@
  * @Author: Alvin Alvin@qq.com
  * @Author: Alvin Alvin@qq.com
  * @Date: 2024-09-24 18:54:19
  * @Date: 2024-09-24 18:54:19
  * @LastEditors: Alvin Alvin@qq.com
  * @LastEditors: Alvin Alvin@qq.com
- * @LastEditTime: 2024-09-26 11:10:58
+ * @LastEditTime: 2024-09-27 11:02:04
  * @FilePath: \server\game\game_cluster\nodes\logstash\module\handlelog\actor_handle_log.go
  * @FilePath: \server\game\game_cluster\nodes\logstash\module\handlelog\actor_handle_log.go
  * @Description:
  * @Description:
  * 处理其他服务发送的埋点日志
  * 处理其他服务发送的埋点日志
@@ -161,6 +161,20 @@ func (p *HandleLogObject) handlelogContent(req *param.HandleLogReq, e event.Even
 			return code.Error
 			return code.Error
 		}
 		}
 
 
+	case *eventmodels.TurntableEventContent:
+		content := &eventmodels.TurntableEventContent{}
+		err := json.Unmarshal([]byte(req.JsonContent), &content)
+		if err != nil {
+			mhayaLogger.Warnf("handlelog TurntableEventContent Unmarshal err:%v", err)
+			return code.Error
+		}
+
+		err = mdb.LogstashDB.Create(content).Error
+		if err != nil {
+			mhayaLogger.Warnf("handlelog LogstashDB Create TurntableEventContent err:%v", err)
+			return code.Error
+		}
+
 	case *eventmodels.JoinChannelEventContent:
 	case *eventmodels.JoinChannelEventContent:
 		content := &eventmodels.JoinChannelEventContent{}
 		content := &eventmodels.JoinChannelEventContent{}
 		err := json.Unmarshal([]byte(req.JsonContent), &content)
 		err := json.Unmarshal([]byte(req.JsonContent), &content)

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

@@ -0,0 +1,69 @@
+package controller
+
+import (
+	"github.com/gin-gonic/gin"
+	"github.com/mhaya/game/game_cluster/internal/code"
+	"github.com/mhaya/game/game_cluster/nodes/webadmin/common"
+	"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 {
+		common.PackOkResult(ctx, code.ParamError)
+		return
+	}
+	resp, err := w.sev.List(ctx, req)
+	if err != nil {
+		common.PackOkResult(ctx, err.Code)
+		return
+	}
+
+	common.PackOkResult(ctx, code.OK, resp)
+}
+
+// 获取玩家详情
+func (w *PlayerManage) GetPlayerInfo(ctx *gin.Context) {
+	req := entity.PlayerInfoReq{}
+	if err := ctx.ShouldBindJSON(&req); err != nil {
+		common.PackOkResult(ctx, code.ParamError)
+		return
+	}
+
+	resp, err := w.sev.PlayerInfo(ctx, req)
+	if err != nil {
+		common.PackOkResult(ctx, err.Code)
+		return
+	}
+
+	common.PackOkResult(ctx, code.OK, resp)
+}
+
+// 获取玩家中奖记录(默认查询最近三天)
+func (w *PlayerManage) GetRewardList(ctx *gin.Context) {
+	req := entity.RewardListReq{}
+	if err := ctx.ShouldBindJSON(&req); err != nil {
+		common.PackOkResult(ctx, code.ParamError)
+		return
+	}
+
+	resp, err := w.sev.RewardList(ctx, req)
+	if err != nil {
+		common.PackOkResult(ctx, err.Code)
+		return
+	}
+
+	common.PackOkResult(ctx, code.OK, resp)
+}

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

@@ -61,3 +61,100 @@ type AdminUpdateStatusReq struct {
 	Username string `json:"username"`
 	Username string `json:"username"`
 	Status   int    `json:"status"`
 	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 {
+	Details []*PlayerListDetail `json:"details"`
+	Total   int64               `json:"total"`
+}
+
+type PlayerListDetail 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 {
+	Details []*RewardListDetail `json:"details"`
+	Total   int64               `json:"total"`
+}
+
+type RewardListDetail 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:道具名称
+}

+ 15 - 8
game/game_cluster/nodes/webadmin/entity/synthesis.go

@@ -56,10 +56,12 @@ type UserListDetail struct {
 }
 }
 
 
 type TurntableReq struct {
 type TurntableReq struct {
-	Page     int    `json:"page"`
-	Size     int    `json:"size"`
-	UserName string `json:"user_name"` // 用户名
-	OpenId   string `json:"openId"`    // 对应tgid
+	Page      int    `json:"page"`
+	Size      int    `json:"size"`
+	UserName  string `json:"user_name"`  // 用户名
+	OpenId    string `json:"openId"`     // 对应tgid
+	StartTime int64  `json:"start_time"` // 开始时间
+	EndTime   int64  `json:"end_time"`   // 结束时间
 }
 }
 
 
 type TurntableResp struct {
 type TurntableResp struct {
@@ -96,10 +98,15 @@ type AssetsDetail struct {
 }
 }
 
 
 type AssetsRecordReq struct {
 type AssetsRecordReq struct {
-	Page     int    `json:"page"`
-	Size     int    `json:"size"`
-	UserName string `json:"user_name"` // 用户名
-	OpenId   string `json:"openId"`    // 对应tgid
+	Page          int    `json:"page"`
+	Size          int    `json:"size"`
+	UserName      string `json:"user_name"`      // 用户名
+	OpenId        string `json:"openId"`         // 对应tgid
+	OperationType string `json:"operation_type"` // 操作类型 增加:increase;减少:decrease
+	Currency      string `json:"currency"`       // 货币类型
+	Amount        int64  `json:"amount"`         // 变动金额
+	StartTime     int64  `json:"start_time"`     // 开始时间
+	EndTime       int64  `json:"end_time"`       // 结束时间
 }
 }
 
 
 type AssetsRecordResp struct {
 type AssetsRecordResp struct {

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

@@ -53,6 +53,11 @@ func (c *Controller) InitApiRouter(u *gin.RouterGroup) {
 	u.POST("/statistics/user/list", controller.NewSynthesis(nodeId).UserList)
 	u.POST("/statistics/user/list", controller.NewSynthesis(nodeId).UserList)
 	u.POST("/user/log/daily", controller.NewSynthesis(nodeId).FindUserLogDaily)
 	u.POST("/user/log/daily", controller.NewSynthesis(nodeId).FindUserLogDaily)
 
 
+	// 玩家相关信息
+	u.POST("/player/list", controller.NewPlayerManage().GetPlayerlist)
+	u.POST("/player/info", controller.NewPlayerManage().GetPlayerInfo)
+	u.POST("/player/rewardList", controller.NewPlayerManage().GetRewardList)
+
 	// 转盘统计
 	// 转盘统计
 	u.POST("/statistics/turntable", controller.NewSynthesis(nodeId).Turntable)
 	u.POST("/statistics/turntable", controller.NewSynthesis(nodeId).Turntable)
 
 

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

@@ -0,0 +1,251 @@
+package service
+
+import (
+	"context"
+	"time"
+
+	mhayaTime "github.com/mhaya/extend/time"
+	"github.com/mhaya/game/game_cluster/internal/code"
+	"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/common"
+	"github.com/mhaya/game/game_cluster/nodes/webadmin/entity"
+	mhayaLogger "github.com/mhaya/logger"
+	"go.mongodb.org/mongo-driver/bson"
+	"go.mongodb.org/mongo-driver/mongo"
+	"go.mongodb.org/mongo-driver/mongo/options"
+)
+
+type PlayerManage struct {
+	db *mongo.Database
+}
+
+func NewPlayerManage() *PlayerManage {
+	return &PlayerManage{
+		db: mdb.MDB,
+	}
+}
+
+// 获取玩家列表
+func (a *PlayerManage) List(ctx context.Context, req entity.PlayerListReq) (*entity.PlayerListResp, *code.Result) {
+	page, pageSize := checkPageParam(req.Page, req.Size)
+
+	// 构建查询条件
+	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 && 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 := a.db.Collection(constant.CNamePlayer).Find(ctx, filter, findOptions)
+	if err != nil {
+		mhayaLogger.Warnf("List Find error:%v", err)
+		return nil, common.NewResult(code.InternalError)
+	}
+	defer func() {
+		if closeErr := cursor.Close(ctx); closeErr != nil {
+			mhayaLogger.Warnf("Error closing cursor: %v", closeErr)
+		}
+	}()
+
+	// 解析结果
+	details := make([]*entity.PlayerListDetail, 0)
+	for cursor.Next(ctx) {
+		var detail entity.PlayerListDetail
+		if err := cursor.Decode(&detail); err != nil {
+			mhayaLogger.Warnf("List Decode error:%v", err)
+			return nil, common.NewResult(code.InternalError)
+		}
+		details = append(details, &detail)
+	}
+	if err := cursor.Err(); err != nil {
+		mhayaLogger.Warnf("List cursor error:%v", err)
+		return nil, common.NewResult(code.InternalError)
+	}
+
+	count, codeResult := a.GetPlayerTotalCount()
+	if codeResult != nil {
+		mhayaLogger.Warnf("List GetPlayerTotalCount codeResult:%v", codeResult)
+		return nil, codeResult
+	}
+
+	return &entity.PlayerListResp{
+		Details: details,
+		Total:   count,
+	}, nil
+}
+
+func (a *PlayerManage) GetPlayerTotalCount() (int64, *code.Result) {
+	count := 0
+	playerServerLoadStats, codeResult := NewAdmin().GetServerStatus(context.Background())
+	if codeResult != nil {
+		return 0, codeResult
+	}
+
+	for _, v := range playerServerLoadStats {
+		count += int(v.TotalUser)
+	}
+
+	return int64(count), nil
+}
+
+// 获取玩家详情
+func (a *PlayerManage) PlayerInfo(ctx context.Context, req entity.PlayerInfoReq) (*entity.PlayerInfoResp, *code.Result) {
+	var player models.Player
+	err := a.db.Collection(constant.CNamePlayer).FindOne(context.Background(), bson.M{"userName": req.UserName}).Decode(&player)
+	if err != nil {
+		mhayaLogger.Warnf("PlayerInfo cursor error:%v", err)
+		return nil, common.NewResult(code.InternalError)
+	}
+
+	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, *code.Result) {
+	page, pageSize := checkPageParam(req.Page, req.Size)
+
+	// 构建查询条件
+	filter := bson.M{}
+	if req.UserName != "" {
+		filter["userName"] = bson.M{"$regex": escapeRegex(req.UserName), "$options": "i"}
+	}
+
+	startTime := mhayaTime.Now().StartOfDay().Unix()
+	endTime := mhayaTime.Now().EndOfDay().Add(3 * 24 * time.Hour).Unix()
+	if req.StartTime > 0 && req.StartTime < req.EndTime {
+		startTime = req.StartTime
+	}
+
+	if req.EndTime > 0 && req.EndTime <= 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 := a.db.Collection(constant.CNamePlayerReward)
+	// 获取总数total
+	count, err := collection.CountDocuments(ctx, filter)
+	if err != nil {
+		mhayaLogger.Warnf("RewardList count error:%v", err)
+		return nil, common.NewResult(code.InternalError)
+	}
+
+	// 执行查询
+	cursor, err := collection.Find(ctx, filter, findOptions)
+	if err != nil {
+		mhayaLogger.Warnf("RewardList Find error:%v", err)
+		return nil, common.NewResult(code.InternalError)
+	}
+	defer func() {
+		if closeErr := cursor.Close(ctx); closeErr != nil {
+			mhayaLogger.Warnf("Error closing cursor: %v", closeErr)
+		}
+	}()
+
+	// 解析结果
+	results := make([]*entity.RewardListDetail, 0)
+	for cursor.Next(ctx) {
+		var result entity.RewardListDetail
+		if err := cursor.Decode(&result); err != nil {
+			mhayaLogger.Warnf("RewardList Decode error:%v", err)
+			return nil, common.NewResult(code.InternalError)
+		}
+		results = append(results, &result)
+	}
+	if err := cursor.Err(); err != nil {
+		mhayaLogger.Warnf("RewardList cursor error:%v", err)
+		return nil, common.NewResult(code.InternalError)
+	}
+
+	for _, result := range results {
+		for _, v := range result.AddReward {
+			cfg, exist := data.ItemConfig.Get(v.ItemID)
+			if exist {
+				v.ItemName = cfg.ItemKey
+			}
+		}
+	}
+
+	return &entity.RewardListResp{
+		Details: results,
+		Total:   count,
+	}, nil
+}

+ 105 - 133
game/game_cluster/nodes/webadmin/service/synthesis.go

@@ -752,119 +752,92 @@ func (s *Synthesis) RecordList(req entity.RecordListReq) (*entity.RecordListResp
 func (s *Synthesis) Turntable(req entity.TurntableReq) (*entity.TurntableResp, *code.Result) {
 func (s *Synthesis) Turntable(req entity.TurntableReq) (*entity.TurntableResp, *code.Result) {
 	page, pageSize := checkPageParam(req.Page, req.Size)
 	page, pageSize := checkPageParam(req.Page, req.Size)
 
 
-	// 构建查询条件
-	filter := bson.M{}
-	if req.UserName != "" {
-		filter["userName"] = req.UserName
-	}
-	if req.OpenId != "" {
-		filter["openId"] = req.OpenId
-	}
-
-	// 设置分页选项
-	findOptions := options.Find()
-	findOptions.SetSkip(int64((page - 1) * pageSize))
-	findOptions.SetLimit(int64(pageSize))
-	findOptions.SetSort(bson.D{{"createTime", -1}})
-
-	ctx, cancel := context.WithTimeout(context.Background(), 100*time.Second)
-	defer cancel()
+	var records []*eventmodels.TurntableEventContent
 
 
-	collection := mdb.MDB.Collection(constant.CNamePlayer)
-
-	// 查询数据
-	var results []*entity.TurntableDetail
-	cursor, err := collection.Find(ctx, filter, findOptions)
-	if err != nil {
-		mhayaLogger.Warnf("Turntable Find error:%v", err)
-		return nil, common.NewResult(code.InternalError)
+	where := &eventmodels.TurntableEventContent{
+		UserBasic: eventmodels.UserBasic{
+			UserId: req.UserName,
+			TgId:   req.OpenId,
+		},
+		EventBasic: eventmodels.EventBasic{
+			ServerId: s.nodeId,
+		},
 	}
 	}
+	db := mdb.LogstashDB.Model(&eventmodels.TurntableEventContent{}).Where(where).Order("create_at")
 
 
-	defer cursor.Close(ctx)
-	// 解析结果
-	for cursor.Next(ctx) {
-		var result entity.TurntableDetail
-		if err := cursor.Decode(&result); err != nil {
-			mhayaLogger.Warnf("Turntable Decode error:%v", err)
-			return nil, common.NewResult(code.InternalError)
-		}
-
-		results = append(results, &result)
+	if req.StartTime > 0 && req.EndTime > 0 && req.StartTime <= req.EndTime {
+		db = db.Where("create_at >= ? and create_at <= ?", req.StartTime, req.EndTime)
 	}
 	}
 
 
-	if err := cursor.Err(); err != nil {
-		mhayaLogger.Warnf("Turntable cursor error:%v", err)
+	pages := Paginate(db, page, pageSize)
+	err := db.Scopes(pages.Limit).Find(&records).Error
+	if err != nil && err != gorm.ErrRecordNotFound {
+		mhayaLogger.Warnf("Turntable Find error:%v", err)
 		return nil, common.NewResult(code.InternalError)
 		return nil, common.NewResult(code.InternalError)
 	}
 	}
 
 
-	// TODO 转盘统计相关信息
-
-	// TODO 获取总数total
-	var count int64
+	var results []*entity.TurntableDetail
+	for _, v := range records {
+		results = append(results, &entity.TurntableDetail{
+			UserName:               v.UserName,
+			OpenId:                 v.TgId,
+			TurntableExecutionTime: v.CreateAt,
+			PrizeName:              v.PrizeName,
+			PrizeNumber:            v.PrizeNumber,
+		})
+	}
 
 
 	return &entity.TurntableResp{
 	return &entity.TurntableResp{
 		Details: results,
 		Details: results,
-		Total:   count,
+		Total:   pages.Count,
 	}, nil
 	}, nil
 }
 }
 
 
 // 资产统计
 // 资产统计
 func (s *Synthesis) Assets(req entity.AssetsReq) (*entity.AssetsResp, *code.Result) {
 func (s *Synthesis) Assets(req entity.AssetsReq) (*entity.AssetsResp, *code.Result) {
-	page, pageSize := checkPageParam(req.Page, req.Size)
-
-	// 构建查询条件
-	filter := bson.M{}
-	if req.UserName != "" {
-		filter["userName"] = req.UserName
-	}
-	if req.OpenId != "" {
-		filter["openId"] = req.OpenId
-	}
-
-	// 设置分页选项
-	findOptions := options.Find()
-	findOptions.SetSkip(int64((page - 1) * pageSize))
-	findOptions.SetLimit(int64(pageSize))
-	findOptions.SetSort(bson.D{{"createTime", -1}})
-
-	ctx, cancel := context.WithTimeout(context.Background(), 100*time.Second)
-	defer cancel()
-
-	collection := mdb.MDB.Collection(constant.CNamePlayer)
-
-	// 查询数据
-	var results []*entity.AssetsDetail
-	cursor, err := collection.Find(ctx, filter, findOptions)
-	if err != nil {
-		mhayaLogger.Warnf("Assets Find error:%v", err)
-		return nil, common.NewResult(code.InternalError)
-	}
-
-	defer cursor.Close(ctx)
-	// 解析结果
-	for cursor.Next(ctx) {
-		var result entity.AssetsDetail
-		if err := cursor.Decode(&result); err != nil {
-			mhayaLogger.Warnf("Assets Decode error:%v", err)
-			return nil, common.NewResult(code.InternalError)
-		}
-
-		results = append(results, &result)
-	}
-
-	if err := cursor.Err(); err != nil {
-		mhayaLogger.Warnf("Assets cursor error:%v", err)
-		return nil, common.NewResult(code.InternalError)
+	// TODO Assets
+	// page, pageSize := checkPageParam(req.Page, req.Size)
+
+	// var records []*eventmodels.TurntableEventContent
+
+	// where := &eventmodels.TurntableEventContent{
+	// 	UserBasic: eventmodels.UserBasic{
+	// 		UserId: req.UserName,
+	// 		TgId:   req.OpenId,
+	// 	},
+	// 	EventBasic: eventmodels.EventBasic{
+	// 		ServerId: s.nodeId,
+	// 	},
+	// }
+	// db := mdb.LogstashDB.Model(&eventmodels.TurntableEventContent{}).Where(where).Order("create_at")
+
+	// pages := Paginate(db, page, pageSize)
+	// err := db.Scopes(pages.Limit).Find(&records).Error
+	// if err != nil && err != gorm.ErrRecordNotFound {
+	// 	mhayaLogger.Warnf("Turntable Find error:%v", err)
+	// 	return nil, common.NewResult(code.InternalError)
+	// }
+
+	// var results []*entity.TurntableDetail
+	// for _, v := range records {
+	// 	results = append(results, &entity.TurntableDetail{
+	// 		UserName:               v.UserName,
+	// 		OpenId:                 v.TgId,
+	// 		TurntableExecutionTime: v.CreateAt,
+	// 		PrizeName:              v.PrizeName,
+	// 		PrizeNumber:            v.PrizeNumber,
+	// 	})
+	// }
+
+	count, codeResult := NewPlayerManage().GetPlayerTotalCount()
+	if codeResult != nil {
+		mhayaLogger.Warnf("Assets GetPlayerTotalCount codeResult:%v", codeResult)
+		return nil, codeResult
 	}
 	}
 
 
-	// TODO Assets 统计相关信息
-
-	// TODO 获取总数total
-	var count int64
-
 	return &entity.AssetsResp{
 	return &entity.AssetsResp{
-		Details: results,
-		Total:   count,
+		// Details: results,
+		Total: int64(count),
 	}, nil
 	}, nil
 }
 }
 
 
@@ -872,59 +845,58 @@ func (s *Synthesis) Assets(req entity.AssetsReq) (*entity.AssetsResp, *code.Resu
 func (s *Synthesis) AssetsRecord(req entity.AssetsRecordReq) (*entity.AssetsRecordResp, *code.Result) {
 func (s *Synthesis) AssetsRecord(req entity.AssetsRecordReq) (*entity.AssetsRecordResp, *code.Result) {
 	page, pageSize := checkPageParam(req.Page, req.Size)
 	page, pageSize := checkPageParam(req.Page, req.Size)
 
 
-	// 构建查询条件
-	filter := bson.M{}
-	if req.UserName != "" {
-		filter["userName"] = req.UserName
-	}
-	if req.OpenId != "" {
-		filter["openId"] = req.OpenId
+	if !constant.CurrencyValid(req.Currency) {
+		mhayaLogger.Warnf("AssetsRecord unknow currency:%v", req.Currency)
+		return nil, common.NewResult(code.ParamError)
 	}
 	}
 
 
-	// 设置分页选项
-	findOptions := options.Find()
-	findOptions.SetSkip(int64((page - 1) * pageSize))
-	findOptions.SetLimit(int64(pageSize))
-	findOptions.SetSort(bson.D{{"createTime", -1}})
-
-	ctx, cancel := context.WithTimeout(context.Background(), 100*time.Second)
-	defer cancel()
+	if req.OperationType != string(constant.IncreaseOp) && req.OperationType != string(constant.DecreaseOp) {
+		mhayaLogger.Warnf("AssetsRecord unknow OperationType:%v", req.OperationType)
+		return nil, common.NewResult(code.ParamError)
+	}
 
 
-	collection := mdb.MDB.Collection(constant.CNamePlayer)
+	var records []*eventmodels.AssetsEventContent
 
 
-	// 查询数据
-	var results []*entity.AssetsRecordDetail
-	cursor, err := collection.Find(ctx, filter, findOptions)
-	if err != nil {
-		mhayaLogger.Warnf("AssetsRecord Find error:%v", err)
-		return nil, common.NewResult(code.InternalError)
+	where := &eventmodels.AssetsEventContent{
+		UserBasic: eventmodels.UserBasic{
+			UserId: req.UserName,
+			TgId:   req.OpenId,
+		},
+		EventBasic: eventmodels.EventBasic{
+			ServerId: s.nodeId,
+		},
+		OperationType: constant.OperationTypeStr(req.OperationType),
+		Currency:      constant.CurrencyTypeStr(req.Currency),
+		Amount:        req.Amount,
 	}
 	}
+	db := mdb.LogstashDB.Model(&eventmodels.AssetsEventContent{}).Where(where).Order("create_at")
 
 
-	defer cursor.Close(ctx)
-	// 解析结果
-	for cursor.Next(ctx) {
-		var result entity.AssetsRecordDetail
-		if err := cursor.Decode(&result); err != nil {
-			mhayaLogger.Warnf("AssetsRecord Decode error:%v", err)
-			return nil, common.NewResult(code.InternalError)
-		}
-
-		results = append(results, &result)
+	if req.StartTime > 0 && req.EndTime > 0 && req.StartTime <= req.EndTime {
+		db = db.Where("create_at >= ? and create_at <= ?", req.StartTime, req.EndTime)
 	}
 	}
 
 
-	if err := cursor.Err(); err != nil {
-		mhayaLogger.Warnf("AssetsRecord cursor error:%v", err)
+	pages := Paginate(db, page, pageSize)
+	err := db.Scopes(pages.Limit).Find(&records).Error
+	if err != nil && err != gorm.ErrRecordNotFound {
+		mhayaLogger.Warnf("Invite Find error:%v", err)
 		return nil, common.NewResult(code.InternalError)
 		return nil, common.NewResult(code.InternalError)
 	}
 	}
 
 
-	// TODO 资产变动记录相关信息
-
-	// TODO 获取总数total
-	var count int64
+	var results []*entity.AssetsRecordDetail
+	for _, v := range records {
+		results = append(results, &entity.AssetsRecordDetail{
+			UserName:                 v.UserName,
+			OpenId:                   v.TgId,
+			AssetType:                string(v.Currency),
+			AssetsGrowth:             v.Amount,
+			AcquisitionTime:          v.CreateAt,
+			SourceOfAssetAcquisition: v.Reason,
+		})
+	}
 
 
 	return &entity.AssetsRecordResp{
 	return &entity.AssetsRecordResp{
 		Details: results,
 		Details: results,
-		Total:   count,
+		Total:   pages.Count,
 	}, nil
 	}, nil
 }
 }