roles_count.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. package jobs
  2. import (
  3. "context"
  4. "encoding/json"
  5. "gadmin/config"
  6. "gadmin/internal/admin/service"
  7. "gadmin/internal/gorm/model"
  8. "gadmin/internal/gorm/query"
  9. "gadmin/utility"
  10. "gadmin/utility/player"
  11. "github.com/jinzhu/now"
  12. "github.com/sirupsen/logrus"
  13. "gorm.io/gen"
  14. "os"
  15. "sync"
  16. "time"
  17. )
  18. var RolesCount = new(jRolesCount)
  19. type jRolesCount struct {
  20. ctx context.Context
  21. }
  22. func (j *jRolesCount) Run() {
  23. j.ctx = context.TODO()
  24. logrus.Info("jRolesCount Run.....")
  25. if os.Getenv("GIN_MODE") == "release" || os.Getenv("ADMIN_IS_LOCAL") == "1" {
  26. for serverId, _ := range config.GDBGroup {
  27. j.RolesCount(serverId)
  28. }
  29. } else {
  30. logrus.Warn("非正式环境无需进行,跳过..")
  31. }
  32. }
  33. var (
  34. loadRolesLock sync.RWMutex
  35. )
  36. func (j *jRolesCount) RolesCount(serverId int) {
  37. loadRolesLock.RLock()
  38. defer loadRolesLock.RUnlock()
  39. DB, err := player.GetDBByServerID(serverId)
  40. if err != nil {
  41. logrus.Warningf("RolesCount GetDBByServerID,err:%v", err)
  42. return
  43. }
  44. // 前一天的日期
  45. yesterday := now.With(time.Now().AddDate(0, 0, -1))
  46. var (
  47. allRoles = make(map[string]map[int64]int64)
  48. date = utility.Format(yesterday.Time)
  49. endUnix = yesterday.EndOfDay().Unix()
  50. )
  51. logrus.Infof("正在统计英雄分布等级,date:%v, Unix:%+v", date, endUnix)
  52. channelIds, err := service.Channel.Ids()
  53. if err != nil {
  54. logrus.Warningf("Channel.Ids,err:%v", err)
  55. return
  56. }
  57. type RolesData struct {
  58. ID int64
  59. }
  60. // 计算渠道玩家
  61. allRoles["-1"] = make(map[int64]int64)
  62. for _, channelId := range channelIds {
  63. if allRoles[channelId] == nil {
  64. allRoles[channelId] = make(map[int64]int64)
  65. }
  66. if channelId == "0" {
  67. continue
  68. }
  69. tmpIds := service.PlayerChannel.PlayerIds(j.ctx, channelId)
  70. pIds := utility.SpiltInt64BySizeFromInt64(tmpIds, 10000)
  71. for _, ids := range pIds {
  72. var results []*model.PlayerMaterial
  73. u := query.Use(config.GDBGroup[DB]).PlayerMaterial
  74. err = u.Select(u.ID, u.Roles).Where(u.Playerid.In(ids...)).FindInBatches(&results, 10000, func(tx gen.Dao, batch int) error {
  75. for _, result := range results {
  76. var rolesData []RolesData
  77. if err := json.Unmarshal([]byte(result.Roles), &rolesData); err != nil {
  78. logrus.Errorf("json.Unmarshal err:%+v", result.Roles)
  79. continue
  80. }
  81. for i := 0; i < len(rolesData); i++ {
  82. allRoles[channelId][rolesData[i].ID] += 1
  83. allRoles["-1"][rolesData[i].ID] += 1
  84. }
  85. }
  86. return nil
  87. })
  88. if err != nil {
  89. logrus.Errorf("RolesLog FindInBatches err:%+v", err)
  90. return
  91. }
  92. }
  93. }
  94. // 计算自然玩家
  95. var results []*model.PlayerMaterial
  96. u := query.Use(config.GDBGroup[DB]).PlayerMaterial
  97. err = u.Select(u.ID, u.Roles).FindInBatches(&results, 1000, func(tx gen.Dao, batch int) error {
  98. for _, result := range results {
  99. var rolesData []RolesData
  100. if err := json.Unmarshal([]byte(result.Roles), &rolesData); err != nil {
  101. logrus.Errorf("json.Unmarshal err:%+v", result.Roles)
  102. continue
  103. }
  104. for i := 0; i < len(rolesData); i++ {
  105. allRoles["0"][rolesData[i].ID] += 1
  106. }
  107. }
  108. return nil
  109. })
  110. if err != nil {
  111. logrus.Errorf("RolesLog FindInBatches err:%+v", err)
  112. return
  113. }
  114. for k, v := range allRoles["-1"] {
  115. allRoles["0"][k] -= v
  116. }
  117. for channelId, collect := range allRoles {
  118. if channelId == "-1" {
  119. continue
  120. }
  121. str, err := json.Marshal(collect)
  122. if err != nil {
  123. logrus.Errorf("RolesLog Save Marshal err:%+v", err)
  124. return
  125. }
  126. reportDao := query.Use(config.DB).RolesLog // 统计表
  127. arl, _ := reportDao.Where(reportDao.Date.Eq(date), reportDao.ChannelID.Eq(channelId), reportDao.ServerID.Eq(int32(serverId))).FirstOrInit()
  128. arl.Date = date
  129. arl.ChannelID = channelId
  130. arl.ServerID = int32(serverId)
  131. arl.Collect = string(str)
  132. if err = reportDao.Save(arl); err != nil {
  133. logrus.Errorf("RolesLog Save err:%+v", err)
  134. return
  135. }
  136. }
  137. logrus.Info("统计角色等级完成..")
  138. }