playerMange.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643
  1. package service
  2. import (
  3. "context"
  4. cutils "github.com/mhaya/extend/utils"
  5. "github.com/mhaya/game/game_cluster/internal/code"
  6. "github.com/mhaya/game/game_cluster/internal/constant"
  7. "github.com/mhaya/game/game_cluster/internal/data"
  8. "github.com/mhaya/game/game_cluster/internal/mdb"
  9. "github.com/mhaya/game/game_cluster/internal/mdb/eventmodels"
  10. "github.com/mhaya/game/game_cluster/internal/mdb/models"
  11. "github.com/mhaya/game/game_cluster/nodes/webadmin/common"
  12. "github.com/mhaya/game/game_cluster/nodes/webadmin/entity"
  13. mhayaLogger "github.com/mhaya/logger"
  14. "go.mongodb.org/mongo-driver/mongo"
  15. "gorm.io/gorm"
  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. var registerRecords []*eventmodels.UserRegisterEventContent
  29. where := &eventmodels.UserRegisterEventContent{
  30. UserBasic: eventmodels.UserBasic{
  31. UserId: req.UserName,
  32. TgId: req.OpenId,
  33. XId: req.XID,
  34. ParentUserId: req.Pid,
  35. TonWall: req.TonWall,
  36. Email: req.Email,
  37. UserStatus: req.Status,
  38. },
  39. }
  40. db := mdb.LogstashDB.Model(&eventmodels.UserRegisterEventContent{}).Where(where).Order("create_at")
  41. if req.LevelMin > 0 && req.LevelMax == 0 {
  42. db = db.Where("level >= ? and level <= ?", req.LevelMin, 1000) // 等级最大值 暂定1000
  43. }
  44. if req.LevelMin > 0 && req.LevelMax > 0 && req.LevelMin <= req.LevelMax {
  45. db = db.Where("level >= ? and level <= ?", req.LevelMin, req.LevelMax)
  46. }
  47. if req.JoinTimeMin > 0 && req.JoinTimeMax > 0 && req.JoinTimeMin <= req.JoinTimeMax {
  48. db = db.Where("create_at >= ? and create_at <= ?", req.JoinTimeMin, req.JoinTimeMax)
  49. }
  50. pages := Paginate(db, page, pageSize)
  51. err := db.Scopes(pages.Limit).Find(&registerRecords).Error
  52. if err != nil && err != gorm.ErrRecordNotFound {
  53. mhayaLogger.Warnf("List Find error:%v", err)
  54. return nil, common.NewResult(code.InternalError)
  55. }
  56. var results []*entity.PlayerListDetail
  57. for _, v := range registerRecords {
  58. updateRecord, codeResult := a.GetPlayerLastestUpdateRecord(v.UserName)
  59. if codeResult != nil {
  60. mhayaLogger.Warnf("List GetPlayerLastestUpdateRecord error:%v", codeResult)
  61. return nil, codeResult
  62. }
  63. loginRecord, codeResult := a.GetPlayerLastestLoginRecord(v.UserName)
  64. if codeResult != nil {
  65. mhayaLogger.Warnf("List GetPlayerLastestLoginRecord error:%v", codeResult)
  66. return nil, codeResult
  67. }
  68. results = append(results, &entity.PlayerListDetail{
  69. UserName: v.UserId,
  70. OpenId: func() string {
  71. if updateRecord == nil {
  72. return v.TgId
  73. }
  74. return updateRecord.TgId
  75. }(),
  76. NickName: func() string {
  77. if updateRecord == nil {
  78. return v.UserName
  79. }
  80. return updateRecord.UserName
  81. }(),
  82. Pid: func() string {
  83. if updateRecord == nil {
  84. return v.ParentUserId
  85. }
  86. return updateRecord.ParentUserId
  87. }(),
  88. XID: func() string {
  89. if updateRecord == nil {
  90. return v.XId
  91. }
  92. return updateRecord.XId
  93. }(),
  94. TonWall: func() string {
  95. if updateRecord == nil {
  96. return v.TonWall
  97. }
  98. return updateRecord.TonWall
  99. }(),
  100. Email: func() string {
  101. if updateRecord == nil {
  102. return v.Email
  103. }
  104. return updateRecord.Email
  105. }(),
  106. Level: func() int {
  107. if updateRecord == nil {
  108. return v.Level
  109. }
  110. return updateRecord.Level
  111. }(),
  112. Status: func() int {
  113. if updateRecord == nil {
  114. return v.UserStatus
  115. }
  116. return updateRecord.UserStatus
  117. }(),
  118. LoginTime: func() int64 {
  119. if loginRecord != nil {
  120. return loginRecord.CreateAt
  121. }
  122. return 0
  123. }(),
  124. LoginIP: func() string {
  125. if loginRecord != nil {
  126. return loginRecord.Ip
  127. }
  128. return ""
  129. }(),
  130. JoinIP: v.Ip,
  131. JoinTime: v.CreateAt,
  132. })
  133. }
  134. return &entity.PlayerListResp{
  135. Details: results,
  136. Total: pages.Count,
  137. }, nil
  138. }
  139. // 获取累计登录次数
  140. func (a *PlayerManage) GetMaxSuccessions(userName string) (int64, *code.Result) {
  141. loginWhere := &eventmodels.UserLoginEventContent{
  142. UserBasic: eventmodels.UserBasic{
  143. UserId: userName,
  144. },
  145. }
  146. loginDb := mdb.LogstashDB.Model(&eventmodels.UserLoginEventContent{}).Where(loginWhere).Order("create_at")
  147. var loginCount int64
  148. err := loginDb.Count(&loginCount).Error
  149. if err != nil {
  150. mhayaLogger.Warnf("GetMaxSuccessions loginCount error:%v", err)
  151. return 0, common.NewResult(code.InternalError)
  152. }
  153. return loginCount, nil
  154. }
  155. // 获取转盘实际抽奖次数
  156. func (a *PlayerManage) GetTurntableRuns(userName string) (int64, *code.Result) {
  157. turntableWhere := &eventmodels.TurntableEventContent{
  158. UserBasic: eventmodels.UserBasic{
  159. UserId: userName,
  160. },
  161. }
  162. turntableDb := mdb.LogstashDB.Model(&eventmodels.TurntableEventContent{}).Where(turntableWhere).Order("create_at")
  163. var turntableRuns int64
  164. err := turntableDb.Count(&turntableRuns).Error
  165. if err != nil {
  166. mhayaLogger.Warnf("GetTurntableRuns turntableRuns error:%v", err)
  167. return 0, common.NewResult(code.InternalError)
  168. }
  169. return turntableRuns, nil
  170. }
  171. // 获取邀请成功人数 status:查询的事件状态
  172. func (a *PlayerManage) GetSuccessfulInvitations(userName string, status int) (int64, *code.Result) {
  173. inviteWhere := &eventmodels.InviteEventContent{
  174. UserBasic: eventmodels.UserBasic{
  175. UserId: userName,
  176. },
  177. EventBasic: eventmodels.EventBasic{
  178. Status: status,
  179. },
  180. }
  181. inviteDb := mdb.LogstashDB.Model(&eventmodels.InviteEventContent{}).Where(inviteWhere).Order("create_at")
  182. var successfulInvitations int64
  183. err := inviteDb.Count(&successfulInvitations).Error
  184. if err != nil {
  185. mhayaLogger.Warnf("GetSuccessfulInvitations successfulInvitations error:%v", err)
  186. return 0, common.NewResult(code.InternalError)
  187. }
  188. return successfulInvitations, nil
  189. }
  190. // 获取提现次数 status:查询的事件状态
  191. func (a *PlayerManage) GetWithdrawalCount(userName string, status int) (int64, *code.Result) {
  192. withdrawalWhere := &eventmodels.UserWithdrawEventContent{
  193. UserBasic: eventmodels.UserBasic{
  194. UserId: userName,
  195. },
  196. EventBasic: eventmodels.EventBasic{
  197. Status: status,
  198. },
  199. }
  200. withdrawalDb := mdb.LogstashDB.Model(&eventmodels.UserWithdrawEventContent{}).Where(withdrawalWhere).Order("create_at")
  201. var withdrawals int64
  202. err := withdrawalDb.Count(&withdrawals).Error
  203. if err != nil {
  204. mhayaLogger.Warnf("GetWithdrawalCount withdrawals error:%v", err)
  205. return 0, common.NewResult(code.InternalError)
  206. }
  207. return withdrawals, nil
  208. }
  209. // 获取累计提现金额 currency:货币类型 status:查询的事件状态
  210. func (a *PlayerManage) GetCumulativeWithdrawalAmount(userName, currency string, status int) (int64, *code.Result) {
  211. withdrawalAmountWhere := &eventmodels.UserWithdrawEventContent{
  212. UserBasic: eventmodels.UserBasic{
  213. UserId: userName,
  214. },
  215. EventBasic: eventmodels.EventBasic{
  216. Status: status,
  217. },
  218. Currency: currency,
  219. }
  220. var cumulativeWithdrawalAmount int64
  221. err := mdb.LogstashDB.Model(&eventmodels.UserWithdrawEventContent{}).Where(withdrawalAmountWhere).Pluck("SUM(amount) as total_amount", &cumulativeWithdrawalAmount).Error
  222. if err != nil {
  223. mhayaLogger.Warnf("GetCumulativeWithdrawalAmount Pluck currency error:%v", err)
  224. return 0, common.NewResult(code.InternalError)
  225. }
  226. return cumulativeWithdrawalAmount, nil
  227. }
  228. // 获取的是注册的总人数
  229. func (a *PlayerManage) GetPlayerTotalCount() (int64, *code.Result) {
  230. where := &eventmodels.UserRegisterEventContent{
  231. EventBasic: eventmodels.EventBasic{
  232. Status: 0,
  233. },
  234. }
  235. db := mdb.LogstashDB.Model(&eventmodels.UserRegisterEventContent{}).Where(where).Order("create_at")
  236. var count int64
  237. err := db.Count(&count).Error
  238. if err != nil {
  239. mhayaLogger.Warnf("GetPlayerTotalCount Count error:%v", err)
  240. return 0, common.NewResult(code.InternalError)
  241. }
  242. return count, nil
  243. }
  244. // 获取的是登录过的总人数 根据user_id去重
  245. func (a *PlayerManage) GetLoginedPlayerTotalCount() (int64, *code.Result) {
  246. where := &eventmodels.UserLoginEventContent{
  247. EventBasic: eventmodels.EventBasic{
  248. Status: 0,
  249. },
  250. }
  251. db := mdb.LogstashDB.Model(&eventmodels.UserLoginEventContent{}).Distinct("user_id").Where(where)
  252. var count int64
  253. err := db.Count(&count).Error
  254. if err != nil {
  255. mhayaLogger.Warnf("GetLoginedPlayerTotalCount Count error:%v", err)
  256. return 0, common.NewResult(code.InternalError)
  257. }
  258. return count, nil
  259. }
  260. // 获取最新的用户信息更新记录
  261. func (a *PlayerManage) GetPlayerLastestUpdateRecord(userName string) (*eventmodels.UserUpdateInfoEventContent, *code.Result) {
  262. var updateRecord *eventmodels.UserUpdateInfoEventContent
  263. updateWhere := &eventmodels.UserUpdateInfoEventContent{
  264. UserBasic: eventmodels.UserBasic{UserId: userName},
  265. }
  266. err := mdb.LogstashDB.Model(&eventmodels.UserUpdateInfoEventContent{}).Where(updateWhere).Order("create_at desc").First(&updateRecord).Error
  267. if err != nil && err != gorm.ErrRecordNotFound {
  268. mhayaLogger.Warnf("GetPlayerLastestUpdateRecord First updateRecord error:%v", err)
  269. return nil, common.NewResult(code.InternalError)
  270. }
  271. return updateRecord, nil
  272. }
  273. // 获取最新的用户登录记录
  274. func (a *PlayerManage) GetPlayerLastestLoginRecord(userName string) (*eventmodels.UserLoginEventContent, *code.Result) {
  275. var loginRecord *eventmodels.UserLoginEventContent
  276. loginWhere := &eventmodels.UserLoginEventContent{
  277. UserBasic: eventmodels.UserBasic{UserId: userName},
  278. }
  279. err := mdb.LogstashDB.Model(&eventmodels.UserLoginEventContent{}).Where(loginWhere).Order("create_at desc").First(&loginRecord).Error
  280. if err != nil && err != gorm.ErrRecordNotFound {
  281. mhayaLogger.Warnf("GetPlayerLastestLoginRecord First loginRecord error:%v", err)
  282. return nil, common.NewResult(code.InternalError)
  283. }
  284. return loginRecord, nil
  285. }
  286. // 获取用户的注册记录
  287. func (a *PlayerManage) GetPlayerRegisterRecord(userName string) (*eventmodels.UserRegisterEventContent, *code.Result) {
  288. var registerRecord *eventmodels.UserRegisterEventContent
  289. where := &eventmodels.UserRegisterEventContent{
  290. UserBasic: eventmodels.UserBasic{UserId: userName},
  291. }
  292. err := mdb.LogstashDB.Model(&eventmodels.UserRegisterEventContent{}).Where(where).First(&registerRecord).Error
  293. if err != nil && err != gorm.ErrRecordNotFound {
  294. mhayaLogger.Warnf("GetPlayerRegisterRecord First registerRecord error:%v", err)
  295. return nil, common.NewResult(code.InternalError)
  296. }
  297. return registerRecord, nil
  298. }
  299. // 获取玩家详情
  300. func (a *PlayerManage) PlayerInfo(ctx context.Context, req entity.PlayerInfoReq) (*entity.PlayerInfoResp, *code.Result) {
  301. updateRecord, codeResult := a.GetPlayerLastestUpdateRecord(req.UserName)
  302. if codeResult != nil {
  303. mhayaLogger.Warnf("PlayerInfo GetPlayerLastestUpdateRecord error:%v", codeResult)
  304. return nil, codeResult
  305. }
  306. var registerRecord *eventmodels.UserRegisterEventContent
  307. if updateRecord == nil {
  308. record, codeResult := a.GetPlayerRegisterRecord(req.UserName)
  309. if codeResult != nil {
  310. mhayaLogger.Warnf("PlayerInfo GetPlayerRegisterRecord error:%v", codeResult)
  311. return nil, codeResult
  312. }
  313. registerRecord = record
  314. }
  315. loginRecord, codeResult := a.GetPlayerLastestLoginRecord(req.UserName)
  316. if codeResult != nil {
  317. mhayaLogger.Warnf("PlayerInfo GetPlayerLastestLoginRecord error:%v", codeResult)
  318. return nil, codeResult
  319. }
  320. return &entity.PlayerInfoResp{
  321. UserName: func() string {
  322. if updateRecord != nil {
  323. return updateRecord.UserId
  324. }
  325. if registerRecord != nil {
  326. return registerRecord.UserId
  327. }
  328. return ""
  329. }(),
  330. OpenId: func() string {
  331. if updateRecord != nil {
  332. return updateRecord.TgId
  333. }
  334. if registerRecord != nil {
  335. return registerRecord.TgId
  336. }
  337. return ""
  338. }(),
  339. NickName: func() string {
  340. if updateRecord != nil {
  341. return updateRecord.UserName
  342. }
  343. if registerRecord != nil {
  344. return registerRecord.UserName
  345. }
  346. return ""
  347. }(),
  348. Pid: func() string {
  349. if updateRecord != nil {
  350. return updateRecord.ParentUserId
  351. }
  352. if registerRecord != nil {
  353. return registerRecord.ParentUserId
  354. }
  355. return ""
  356. }(),
  357. XID: func() string {
  358. if updateRecord != nil {
  359. return updateRecord.XId
  360. }
  361. if registerRecord != nil {
  362. return registerRecord.XId
  363. }
  364. return ""
  365. }(),
  366. TonWall: func() string {
  367. if updateRecord != nil {
  368. return updateRecord.TonWall
  369. }
  370. if registerRecord != nil {
  371. return registerRecord.TonWall
  372. }
  373. return ""
  374. }(),
  375. Email: func() string {
  376. if updateRecord != nil {
  377. return updateRecord.Email
  378. }
  379. if registerRecord != nil {
  380. return registerRecord.Email
  381. }
  382. return ""
  383. }(),
  384. Level: func() int {
  385. if updateRecord != nil {
  386. return updateRecord.Level
  387. }
  388. if registerRecord != nil {
  389. return registerRecord.Level
  390. }
  391. return 0
  392. }(),
  393. Status: func() int {
  394. if updateRecord != nil {
  395. return updateRecord.UserStatus
  396. }
  397. if registerRecord != nil {
  398. return registerRecord.UserStatus
  399. }
  400. return 0
  401. }(),
  402. LoginTime: func() int64 {
  403. if loginRecord != nil {
  404. return loginRecord.CreateAt
  405. }
  406. return 0
  407. }(),
  408. LoginIP: func() string {
  409. if loginRecord != nil {
  410. return loginRecord.Ip
  411. }
  412. return ""
  413. }(),
  414. JoinIP: func() string {
  415. if registerRecord != nil {
  416. return registerRecord.Ip
  417. }
  418. return ""
  419. }(),
  420. JoinTime: func() int64 {
  421. if registerRecord != nil {
  422. return registerRecord.CreateAt
  423. }
  424. return 0
  425. }(),
  426. Avatar: "",
  427. IsRobot: func() int {
  428. if updateRecord != nil && updateRecord.IsRobot {
  429. return 1
  430. }
  431. if registerRecord != nil && registerRecord.IsRobot {
  432. return 1
  433. }
  434. return 0
  435. }(),
  436. IsLeader: func() int {
  437. if updateRecord != nil && updateRecord.IsLeader {
  438. return 1
  439. }
  440. return 0
  441. }(),
  442. IsVip: func() int {
  443. if updateRecord != nil && updateRecord.IsVip {
  444. return 1
  445. }
  446. return 0
  447. }(),
  448. Successions: loginRecord.ContinuousDays,
  449. MaxSuccessions: loginRecord.ContinuousDaysMax,
  450. PrevTime: func() int64 {
  451. if loginRecord != nil {
  452. return loginRecord.CreateAt
  453. }
  454. return 0
  455. }(),
  456. UpdateTime: func() int64 {
  457. if updateRecord != nil {
  458. return updateRecord.CreateAt
  459. }
  460. return 0
  461. }(),
  462. IsDrawShare: 0, // TODO
  463. DrawShareTime: 0, // TODO
  464. FirstReward: 0, // TODO
  465. // TODO 其他玩家信息
  466. }, nil
  467. }
  468. // 获取玩家中奖记录
  469. func (a *PlayerManage) RewardList(ctx context.Context, req entity.RewardListReq) (*entity.RewardListResp, *code.Result) {
  470. page, pageSize := checkPageParam(req.Page, req.Size)
  471. var rewardRecords []*eventmodels.UserRewardEventContent
  472. where := &eventmodels.UserRewardEventContent{
  473. UserBasic: eventmodels.UserBasic{
  474. UserId: req.UserName,
  475. },
  476. Source: models.SourceDraw,
  477. }
  478. db := mdb.LogstashDB.Model(&eventmodels.UserRewardEventContent{}).Where(where).Order("create_at")
  479. if req.StartTime > 0 && req.EndTime > 0 && req.StartTime <= req.EndTime {
  480. db = db.Where("create_at >= ? and create_at <= ?", req.StartTime, req.EndTime)
  481. }
  482. pages := Paginate(db, page, pageSize)
  483. err := db.Scopes(pages.Limit).Find(&rewardRecords).Error
  484. if err != nil && err != gorm.ErrRecordNotFound {
  485. mhayaLogger.Warnf("RewardList Find error:%v", err)
  486. return nil, common.NewResult(code.InternalError)
  487. }
  488. var results []*entity.RewardListDetail
  489. for _, v := range rewardRecords {
  490. results = append(results, &entity.RewardListDetail{
  491. UserName: v.UserId,
  492. AddReward: func() []*entity.ShowItemReward {
  493. if len(v.AddReward) == 0 {
  494. return nil
  495. }
  496. ret := make([]*entity.ShowItemReward, 0, 8)
  497. for _, item := range v.AddReward {
  498. ret = append(ret, a.packItemReward(item))
  499. }
  500. return ret
  501. }(),
  502. Desc: func() *entity.Desc {
  503. if v.Desc == nil {
  504. return nil
  505. }
  506. param, ok := v.Desc.(eventmodels.DescDraw)
  507. if ok {
  508. return &entity.Desc{
  509. ID: param.ID,
  510. CurID: param.CurID,
  511. Reward: func() []*entity.ShowItemReward {
  512. if len(param.Reward) == 0 {
  513. return nil
  514. }
  515. ret := make([]*entity.ShowItemReward, 0, 8)
  516. for _, item := range param.Reward {
  517. ret = append(ret, a.packItemReward(item))
  518. }
  519. return ret
  520. }(),
  521. }
  522. }
  523. return nil
  524. }(),
  525. CreateTime: v.CreateAt,
  526. })
  527. }
  528. return &entity.RewardListResp{
  529. Details: results,
  530. Total: pages.Count,
  531. }, nil
  532. }
  533. func (a *PlayerManage) packItemReward(reward eventmodels.ItemReward) *entity.ShowItemReward {
  534. itemName := ""
  535. cfg, exist := data.ItemConfig.Get(reward.ItemID)
  536. if exist {
  537. itemName = cfg.ItemKey
  538. }
  539. return &entity.ShowItemReward{
  540. ItemBaseType: reward.ItemBaseType,
  541. ItemID: reward.ItemID,
  542. ItemName: itemName,
  543. Amount: func() float64 {
  544. if itemName == "u" || itemName == "ton" {
  545. return cutils.QuoInt64ByRatioToFloat64(int64(reward.Amount), constant.MoneyRatio)
  546. }
  547. return float64(reward.Amount)
  548. }(),
  549. }
  550. }