playerMange.go 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. package service
  2. import (
  3. "context"
  4. "time"
  5. mhayaTime "github.com/mhaya/extend/time"
  6. "github.com/mhaya/game/game_cluster/internal/code"
  7. "github.com/mhaya/game/game_cluster/internal/constant"
  8. "github.com/mhaya/game/game_cluster/internal/mdb"
  9. "github.com/mhaya/game/game_cluster/internal/mdb/models"
  10. "github.com/mhaya/game/game_cluster/nodes/webadmin/common"
  11. "github.com/mhaya/game/game_cluster/nodes/webadmin/entity"
  12. mhayaLogger "github.com/mhaya/logger"
  13. "go.mongodb.org/mongo-driver/bson"
  14. "go.mongodb.org/mongo-driver/mongo"
  15. "go.mongodb.org/mongo-driver/mongo/options"
  16. )
  17. type PlayerManage struct {
  18. db *mongo.Database
  19. }
  20. func NewPlayerManage() *PlayerManage {
  21. return &PlayerManage{
  22. db: mdb.MDB,
  23. }
  24. }
  25. // 获取玩家列表
  26. func (a *PlayerManage) List(ctx context.Context, req entity.PlayerListReq) (*entity.PlayerListResp, *code.Result) {
  27. page, pageSize := checkPageParam(req.Page, req.Size)
  28. // 构建查询条件
  29. filter := bson.M{}
  30. if req.UserName != "" {
  31. filter["userName"] = bson.M{"$regex": escapeRegex(req.UserName), "$options": "i"}
  32. }
  33. if req.NickName != "" {
  34. filter["nickName"] = bson.M{"$regex": escapeRegex(req.NickName), "$options": "i"}
  35. }
  36. if req.OpenId != "" {
  37. filter["openId"] = req.OpenId
  38. }
  39. if req.Pid != "" {
  40. filter["pid"] = req.Pid
  41. }
  42. if req.XID != "" {
  43. filter["xID"] = req.XID
  44. }
  45. if req.TonWall != "" {
  46. filter["tonWall"] = req.TonWall
  47. }
  48. if req.Email != "" {
  49. filter["email"] = req.Email
  50. }
  51. if req.LevelMin > 0 && req.LevelMax == 0 {
  52. filter["level"] = bson.M{
  53. "$gte": req.LevelMin,
  54. "$lte": 1000, // 等级最大值
  55. }
  56. }
  57. if req.LevelMin > 0 && req.LevelMax > 0 && req.LevelMin <= req.LevelMax {
  58. filter["level"] = bson.M{
  59. "$gte": req.LevelMin,
  60. "$lte": req.LevelMax,
  61. }
  62. }
  63. if req.Status > 0 {
  64. filter["status"] = req.Status
  65. }
  66. if req.LoginIP != "" {
  67. filter["loginIP"] = req.LoginIP
  68. }
  69. if req.JoinTimeMin > 0 && req.JoinTimeMax > 0 && req.JoinTimeMin <= req.JoinTimeMax {
  70. filter["joinTime"] = bson.M{
  71. "$gte": req.JoinTimeMin,
  72. "$lte": req.JoinTimeMax,
  73. }
  74. }
  75. // 设置分页选项
  76. skip := (page - 1) * pageSize
  77. limit := pageSize
  78. findOptions := options.Find().SetSkip(int64(skip)).SetLimit(int64(limit))
  79. // 执行查询
  80. cursor, err := a.db.Collection(constant.CNamePlayer).Find(ctx, filter, findOptions)
  81. if err != nil {
  82. mhayaLogger.Warnf("List Find error:%v", err)
  83. return nil, common.NewResult(code.InternalError)
  84. }
  85. defer func() {
  86. if closeErr := cursor.Close(ctx); closeErr != nil {
  87. mhayaLogger.Warnf("Error closing cursor: %v", closeErr)
  88. }
  89. }()
  90. // 解析结果
  91. details := make([]*entity.PlayerListDetail, 0)
  92. for cursor.Next(ctx) {
  93. var detail entity.PlayerListDetail
  94. if err := cursor.Decode(&detail); err != nil {
  95. mhayaLogger.Warnf("List Decode error:%v", err)
  96. return nil, common.NewResult(code.InternalError)
  97. }
  98. details = append(details, &detail)
  99. }
  100. if err := cursor.Err(); err != nil {
  101. mhayaLogger.Warnf("List cursor error:%v", err)
  102. return nil, common.NewResult(code.InternalError)
  103. }
  104. count, codeResult := a.GetPlayerTotalCount()
  105. if codeResult != nil {
  106. mhayaLogger.Warnf("List GetPlayerTotalCount codeResult:%v", codeResult)
  107. return nil, codeResult
  108. }
  109. return &entity.PlayerListResp{
  110. Details: details,
  111. Total: count,
  112. }, nil
  113. }
  114. func (a *PlayerManage) GetPlayerTotalCount() (int64, *code.Result) {
  115. count := 0
  116. playerServerLoadStats, codeResult := NewAdmin().GetServerStatus(context.Background())
  117. if codeResult != nil {
  118. return 0, codeResult
  119. }
  120. for _, v := range playerServerLoadStats {
  121. count += int(v.TotalUser)
  122. }
  123. return int64(count), nil
  124. }
  125. // 获取玩家详情
  126. func (a *PlayerManage) PlayerInfo(ctx context.Context, req entity.PlayerInfoReq) (*entity.PlayerInfoResp, *code.Result) {
  127. var player models.Player
  128. err := a.db.Collection(constant.CNamePlayer).FindOne(context.Background(), bson.M{"userName": req.UserName}).Decode(&player)
  129. if err != nil {
  130. mhayaLogger.Warnf("PlayerInfo cursor error:%v", err)
  131. return nil, common.NewResult(code.InternalError)
  132. }
  133. return &entity.PlayerInfoResp{
  134. UserName: player.UserName,
  135. OpenId: player.OpenId,
  136. UserNameMaybe: player.UserNameMaybe,
  137. NickName: player.NickName,
  138. Pid: player.Pid,
  139. XID: player.XID,
  140. TonWall: player.TonWall,
  141. Email: player.Email,
  142. Level: player.Level,
  143. Status: player.Status,
  144. LoginTime: player.LoginTime,
  145. LoginIP: player.LoginIP,
  146. JoinIP: player.JoinIP,
  147. JoinTime: player.JoinTime,
  148. Avatar: player.Avatar,
  149. IsRobot: player.IsRobot,
  150. IsLeader: player.IsLeader,
  151. IsVip: player.IsVip,
  152. Successions: player.Successions,
  153. MaxSuccessions: player.MaxSuccessions,
  154. PrevTime: player.PrevTime,
  155. UpdateTime: player.UpdateTime,
  156. IsDrawShare: player.Share.IsDrawShare,
  157. DrawShareTime: player.Share.DrawShareTime,
  158. FirstReward: player.FirstReward,
  159. Item: player.Item,
  160. SinIn: player.SinIn,
  161. DailyTask: player.DailyTask,
  162. AchieveTask: player.AchieveTask,
  163. RankReward: player.RankReward,
  164. Invite: player.Invite,
  165. InviteReward: player.InviteReward,
  166. Roll: player.Roll,
  167. }, nil
  168. }
  169. // 获取玩家中奖记录(默认查询最近三天)
  170. func (a *PlayerManage) RewardList(ctx context.Context, req entity.RewardListReq) (*entity.RewardListResp, *code.Result) {
  171. page, pageSize := checkPageParam(req.Page, req.Size)
  172. // 构建查询条件
  173. filter := bson.M{}
  174. if req.UserName != "" {
  175. filter["userName"] = bson.M{"$regex": escapeRegex(req.UserName), "$options": "i"}
  176. }
  177. filter["source"] = models.SourceDraw
  178. startTime := mhayaTime.Now().Add(-3 * 24 * time.Hour).Unix()
  179. endTime := mhayaTime.Now().Unix()
  180. if req.StartTime > 0 && req.StartTime >= startTime {
  181. if req.StartTime <= req.EndTime || req.EndTime == 0 {
  182. startTime = req.StartTime
  183. }
  184. }
  185. if req.EndTime > 0 && req.EndTime <= endTime {
  186. if req.StartTime <= req.EndTime {
  187. endTime = req.EndTime
  188. }
  189. }
  190. filter["createTime"] = bson.M{
  191. "$gte": startTime,
  192. "$lte": endTime,
  193. }
  194. // 设置分页选项
  195. skip := (page - 1) * pageSize
  196. limit := pageSize
  197. findOptions := options.Find().SetSkip(int64(skip)).SetLimit(int64(limit))
  198. collection := a.db.Collection(constant.CNamePlayerReward)
  199. // 获取总数total
  200. count, err := collection.CountDocuments(ctx, filter)
  201. if err != nil {
  202. mhayaLogger.Warnf("RewardList count error:%v", err)
  203. return nil, common.NewResult(code.InternalError)
  204. }
  205. // 执行查询
  206. cursor, err := collection.Find(ctx, filter, findOptions)
  207. if err != nil {
  208. mhayaLogger.Warnf("RewardList Find error:%v", err)
  209. return nil, common.NewResult(code.InternalError)
  210. }
  211. defer func() {
  212. if closeErr := cursor.Close(ctx); closeErr != nil {
  213. mhayaLogger.Warnf("Error closing cursor: %v", closeErr)
  214. }
  215. }()
  216. // 解析结果
  217. results := make([]*models.ToPlayerRewardBase, 0)
  218. for cursor.Next(ctx) {
  219. var result models.PlayerRewardBase
  220. if err := cursor.Decode(&result); err != nil {
  221. mhayaLogger.Warnf("RewardList Decode error:%v", err)
  222. return nil, common.NewResult(code.InternalError)
  223. }
  224. results = append(results, result.To())
  225. }
  226. if err := cursor.Err(); err != nil {
  227. mhayaLogger.Warnf("RewardList cursor error:%v", err)
  228. return nil, common.NewResult(code.InternalError)
  229. }
  230. return &entity.RewardListResp{
  231. Details: results,
  232. Total: count,
  233. }, nil
  234. }