playerMange.go 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  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. Item: player.Item,
  147. SinIn: player.SinIn,
  148. DailyTask: player.DailyTask,
  149. AchieveTask: player.AchieveTask,
  150. RankReward: player.RankReward,
  151. Invite: player.Invite,
  152. InviteReward: player.InviteReward,
  153. Roll: player.Roll,
  154. }, nil
  155. }
  156. // 获取玩家中奖记录(默认查询最近三天)
  157. func (a *PlayerManage) RewardList(ctx context.Context, req entity.RewardListReq) ([]*models.ToPlayerRewardBase, int64, error) {
  158. page := req.Page
  159. // 验证参数
  160. if page <= 0 {
  161. page = 1
  162. }
  163. pageSize := req.Size
  164. if pageSize <= 0 {
  165. pageSize = 10
  166. }
  167. // 构建查询条件
  168. filter := bson.M{}
  169. if req.UserName != "" {
  170. filter["userName"] = bson.M{"$regex": escapeRegex(req.UserName), "$options": "i"}
  171. }
  172. filter["source"] = models.SourceDraw
  173. startTime := mhayaTime.Now().Add(-3 * 24 * time.Hour).Unix()
  174. endTime := mhayaTime.Now().Unix()
  175. if req.StartTime > 0 && req.StartTime >= startTime {
  176. if req.StartTime <= req.EndTime || req.EndTime == 0 {
  177. startTime = req.StartTime
  178. }
  179. }
  180. if req.EndTime > 0 && req.EndTime <= endTime {
  181. if req.StartTime <= req.EndTime {
  182. endTime = req.EndTime
  183. }
  184. }
  185. filter["createTime"] = bson.M{
  186. "$gte": startTime,
  187. "$lte": endTime,
  188. }
  189. // 设置分页选项
  190. skip := (page - 1) * pageSize
  191. limit := pageSize
  192. findOptions := options.Find().SetSkip(int64(skip)).SetLimit(int64(limit))
  193. collection := mdb.MDB.Collection(constant.CNamePlayerReward)
  194. // 获取总数total
  195. count, err := collection.CountDocuments(ctx, filter)
  196. if err != nil {
  197. return nil, 0, err
  198. }
  199. // 执行查询
  200. cursor, err := collection.Find(ctx, filter, findOptions)
  201. if err != nil {
  202. return nil, 0, err
  203. }
  204. defer func() {
  205. if closeErr := cursor.Close(ctx); closeErr != nil {
  206. log.Printf("Error closing cursor: %v", closeErr)
  207. }
  208. }()
  209. // 解析结果
  210. results := make([]*models.ToPlayerRewardBase, 0)
  211. for cursor.Next(ctx) {
  212. var result models.PlayerRewardBase
  213. if err := cursor.Decode(&result); err != nil {
  214. return nil, 0, err
  215. }
  216. results = append(results, result.To())
  217. }
  218. if err := cursor.Err(); err != nil {
  219. return nil, 0, err
  220. }
  221. return results, count, nil
  222. }