playerMange.go 5.8 KB

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