playerMange.go 7.0 KB

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