have_roles.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. package jobs
  2. import (
  3. "context"
  4. "encoding/json"
  5. "fmt"
  6. "gadmin/config"
  7. "gadmin/internal/admin/service"
  8. "gadmin/internal/gorm/query"
  9. "gadmin/utility"
  10. "gadmin/utility/player"
  11. "github.com/jinzhu/now"
  12. "github.com/sirupsen/logrus"
  13. "os"
  14. "strings"
  15. "sync"
  16. "time"
  17. )
  18. var (
  19. HaveRoles = new(jHaveRoles)
  20. )
  21. type jHaveRoles struct {
  22. ctx context.Context
  23. sync.RWMutex
  24. }
  25. type HaveRolesNums struct {
  26. RoleNums int64 `json:"role_nums"`
  27. Count int64 `json:"count"`
  28. }
  29. func (j *jHaveRoles) Run() {
  30. j.ctx = context.TODO()
  31. logrus.Info("jHaveRoles Run.....")
  32. if os.Getenv("GIN_MODE") == "release" || os.Getenv("ADMIN_IS_LOCAL") == "1" {
  33. yesterday := now.With(time.Now().AddDate(0, 0, -1))
  34. for serverId, _ := range config.GDBGroup {
  35. j.haveRoles(serverId, yesterday)
  36. }
  37. } else {
  38. logrus.Warn("非正式环境无需进行,跳过..")
  39. }
  40. }
  41. func (j *jHaveRoles) RunWithDate(date *now.Now) {
  42. j.ctx = context.TODO()
  43. logrus.Info("jHaveRoles RunWithDate.....")
  44. if os.Getenv("GIN_MODE") == "release" || os.Getenv("ADMIN_IS_LOCAL") == "1" {
  45. for serverId, _ := range config.GDBGroup {
  46. j.haveRoles(serverId, date)
  47. }
  48. } else {
  49. logrus.Warn("非正式环境无需进行,跳过..")
  50. }
  51. }
  52. func (j *jHaveRoles) haveRoles(serverId int, yesterday *now.Now) {
  53. j.RLock()
  54. defer j.RUnlock()
  55. DB, err := player.GetDBByServerID(serverId)
  56. if err != nil {
  57. logrus.Warningf("haveRoles GetDBByServerID,err:%v", err)
  58. return
  59. }
  60. var (
  61. allHaveRoles = make(map[string]map[int64]int64)
  62. date = utility.Format(yesterday.Time)
  63. endUnix = yesterday.EndOfDay().Unix()
  64. )
  65. logrus.Infof("统计拥有角色数据,date:%v, Unix:%+v", date, endUnix)
  66. channelIds, err := service.Channel.Ids()
  67. if err != nil {
  68. logrus.Warningf("Channel.Ids,err:%v", err)
  69. return
  70. }
  71. allHaveRoles["-1"] = make(map[int64]int64)
  72. for _, channelId := range channelIds {
  73. if allHaveRoles[channelId] == nil {
  74. allHaveRoles[channelId] = make(map[int64]int64)
  75. }
  76. if channelId == "0" {
  77. continue
  78. }
  79. tmpIds := service.PlayerChannel.PlayerIds(j.ctx, channelId)
  80. pIds := utility.SpiltInt64BySizeFromInt64(tmpIds, 10000)
  81. for _, ids := range pIds {
  82. roleNums, err := j.GetRoleNums(DB, ids, endUnix)
  83. if err != nil {
  84. logrus.Warningf("GetRoleNums,err:%v", err)
  85. return
  86. }
  87. if len(roleNums) == 0 {
  88. continue
  89. }
  90. for _, roleNum := range roleNums {
  91. allHaveRoles[channelId][roleNum.RoleNums] += roleNum.Count
  92. allHaveRoles["-1"][roleNum.RoleNums] += roleNum.Count
  93. }
  94. }
  95. }
  96. allRoleNums, err := j.GetRoleNums(DB, []int64{}, endUnix)
  97. if err != nil {
  98. logrus.Warningf("GetRoleNums all,err:%v", err)
  99. return
  100. }
  101. if len(allRoleNums) == 0 {
  102. // 设置默认值
  103. allHaveRoles["0"][1] = 0
  104. } else {
  105. for _, roleNum := range allRoleNums {
  106. allHaveRoles["0"][roleNum.RoleNums] += roleNum.Count - allHaveRoles["-1"][roleNum.RoleNums]
  107. }
  108. }
  109. for channelId, haveRoles := range allHaveRoles {
  110. if channelId == "-1" {
  111. continue
  112. }
  113. str, err := json.Marshal(haveRoles)
  114. if err != nil {
  115. logrus.Errorf("ReportDayHaveRole Save Marshal err:%+v", err)
  116. return
  117. }
  118. reportDao := query.Use(config.DB).ReportDayHaveRole // 统计表
  119. arl, _ := reportDao.Where(reportDao.Date.Eq(date), reportDao.ChannelID.Eq(channelId), reportDao.ServerID.Eq(int32(serverId))).FirstOrInit()
  120. arl.Date = date
  121. arl.ChannelID = channelId
  122. arl.ServerID = int32(serverId)
  123. arl.Data = string(str)
  124. if err = reportDao.Save(arl); err != nil {
  125. logrus.Errorf("ReportDayHaveRole Save err:%+v", err)
  126. return
  127. }
  128. }
  129. logrus.Info("统计拥有角色数据完成..")
  130. }
  131. func (j *jHaveRoles) GetRoleNums(DB int, ids []int64, endStamp int64) (result []*HaveRolesNums, err error) {
  132. if endStamp <= 0 {
  133. endStamp = now.With(time.Now().AddDate(0, 0, -1)).EndOfDay().Unix()
  134. }
  135. endStr := time.Unix(endStamp, 0).Format("2006-01-02 15:04:05")
  136. // 存在条件
  137. if len(ids) > 0 {
  138. idStr := strings.Trim(strings.Replace(fmt.Sprint(ids), " ", ",", -1), "[]")
  139. tx := config.GDBGroup[DB].
  140. Raw(fmt.Sprintf("select b.role_nums, count(1) as count from (SELECT ua.playerid, floor(length(pm.roles)/27) as role_nums FROM player_attr ua left join player_material pm on ua.playerid = pm.playerid where ua.playerid in (%v) and ua.create_time <= '%v' and pm.roles is not null) b group by b.role_nums",
  141. idStr, endStr))
  142. if err = tx.Scan(&result).Error; err != nil {
  143. return nil, err
  144. }
  145. return
  146. }
  147. tx := config.GDBGroup[DB].
  148. Raw(fmt.Sprintf("select b.role_nums, count(1) as count from (SELECT ua.playerid, floor(length(pm.roles)/27) as role_nums FROM player_attr ua left join player_material pm on ua.playerid = pm.playerid where ua.create_time <= '%v' and pm.roles is not null) b group by b.role_nums", endStr))
  149. if err = tx.Scan(&result).Error; err != nil {
  150. return nil, err
  151. }
  152. return
  153. }