old_guide.go 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. package jobs
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "gadmin/config"
  6. model2 "gadmin/internal/gorm/model"
  7. "gadmin/internal/gorm/query"
  8. "github.com/sirupsen/logrus"
  9. "gorm.io/gorm"
  10. )
  11. var OldGuide = new(jOldGuide)
  12. type jOldGuide struct{}
  13. var GuideLimit map[int64][]int64
  14. func (j *jOldGuide) Run() {
  15. logrus.Info("OldGuide Run.....")
  16. j.loadGuideLimit()
  17. j.screen()
  18. j.saveGuide()
  19. }
  20. func (j *jOldGuide) loadGuideLimit() {
  21. GuideLimit = make(map[int64][]int64)
  22. //GuideLimit[1] = []int64{11,21, 31, 71, 51, 81} //
  23. GuideLimit[2] = []int64{11, 21, 41}
  24. GuideLimit[3] = []int64{11, 21, 41, 91, 61, 161}
  25. GuideLimit[4] = []int64{11, 21, 41, 91, 61, 131, 111, 161}
  26. GuideLimit[5] = []int64{11, 21, 41, 91, 61, 131, 171, 111, 161, 241}
  27. GuideLimit[6] = []int64{11, 21, 41, 91, 61, 131, 171, 251, 111, 161, 241}
  28. GuideLimit[7] = []int64{11, 21, 41, 91, 61, 131, 171, 251, 173, 201, 111, 161, 241}
  29. GuideLimit[8] = []int64{11, 21, 41, 91, 61, 131, 171, 251, 173, 201, 111, 161, 181, 211, 241}
  30. GuideLimit[9] = []int64{11, 21, 41, 91, 61, 131, 171, 251, 173, 201, 111, 161, 181, 221, 231, 211, 241}
  31. GuideLimit[10] = []int64{11, 21, 41, 91, 61, 131, 171, 251, 173, 201, 111, 161, 181, 221, 231, 211, 241}
  32. GuideLimit[11] = []int64{11, 21, 41, 91, 61, 131, 171, 251, 173, 201, 111, 161, 181, 221, 231, 211, 241}
  33. GuideLimit[12] = []int64{11, 21, 41, 91, 61, 131, 171, 251, 173, 201, 111, 161, 181, 221, 231, 211, 65, 261, 241}
  34. GuideLimit[13] = []int64{11, 21, 41, 91, 61, 131, 171, 251, 173, 201, 111, 161, 181, 221, 231, 151, 370, 211, 65, 261, 241, 271}
  35. GuideLimit[14] = []int64{11, 21, 41, 91, 61, 131, 171, 251, 173, 201, 111, 161, 181, 221, 231, 151, 370, 211, 65, 261, 241, 271}
  36. GuideLimit[15] = []int64{11, 21, 41, 91, 61, 131, 171, 251, 173, 201, 111, 161, 181, 221, 231, 151, 370, 211, 64, 291, 65, 261, 241, 271}
  37. GuideLimit[16] = []int64{11, 21, 41, 91, 61, 131, 171, 251, 173, 201, 111, 161, 181, 221, 231, 151, 370, 211, 64, 291, 65, 261, 241, 271}
  38. GuideLimit[17] = []int64{11, 21, 41, 91, 61, 131, 171, 251, 173, 201, 111, 161, 181, 221, 231, 151, 370, 211, 64, 291, 65, 261, 241, 271}
  39. GuideLimit[18] = []int64{11, 21, 41, 91, 61, 131, 171, 251, 173, 201, 111, 161, 181, 221, 231, 151, 370, 211, 64, 291, 65, 261, 241, 271}
  40. GuideLimit[19] = []int64{11, 21, 41, 91, 61, 131, 171, 251, 173, 201, 111, 161, 181, 221, 231, 151, 370, 211, 64, 291, 65, 261, 241, 271}
  41. GuideLimit[20] = []int64{11, 21, 41, 91, 61, 131, 171, 251, 173, 201, 111, 161, 181, 221, 231, 151, 370, 211, 64, 291, 65, 261, 241, 271}
  42. }
  43. // screen 将全表数据整理成倒排规则,再以规则作为条件批量更新
  44. func (j *jOldGuide) screen() {
  45. type Getter struct {
  46. Total int64 `json:"total"`
  47. Task string `json:"task"`
  48. }
  49. var (
  50. results []*Getter
  51. levels = []int64{2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20} // 1,
  52. levelSql = "SELECT COUNT(*) AS `total`, `task` FROM `player_task` LEFT JOIN player_attr ON player_task.playerid = player_attr.playerid WHERE player_attr.level = ? GROUP BY `task` ORDER BY `total` DESC"
  53. handleSql = `update player_task t, player_attr a set t.task = '%s' where t.playerid = a.playerid and a.level = %d and t.task = '%s'`
  54. )
  55. handle := func(level int64, oldTask string) {
  56. change, task := j.inspect(level, oldTask)
  57. if !change {
  58. return
  59. }
  60. newSql := fmt.Sprintf(handleSql, task, level, oldTask)
  61. logrus.Warningf("newSql:%v", newSql)
  62. db := config.GDB1.Exec(newSql)
  63. if db.Error != nil {
  64. logrus.Panicf("screen handle Exec err:%+v", db.Error)
  65. }
  66. }
  67. for _, level := range levels {
  68. config.GDB1.Raw(levelSql, level).Scan(&results)
  69. if len(results) > 0 {
  70. for _, result := range results {
  71. handle(level, result.Task)
  72. }
  73. }
  74. }
  75. }
  76. // saveGuide 遍历更新
  77. func (j *jOldGuide) saveGuide() {
  78. type Ret struct {
  79. Playerid int64 `json:"playerid"`
  80. Level int64 `json:"level"`
  81. Task string `json:"task"`
  82. }
  83. var (
  84. results []*Ret
  85. t = query.Use(config.GDB1).PlayerTask
  86. )
  87. config.GDB1.Model(&model2.PlayerTask{}).
  88. Select("player_task.playerid,player_task.task,player_attr.level").
  89. Joins("LEFT JOIN player_attr ON player_task.playerid = player_attr.playerid").
  90. //Where("player_task.playerid = 206").
  91. FindInBatches(&results, 3000, func(tx *gorm.DB, batch int) error {
  92. for _, result := range results {
  93. if result.Level <= 1 || result.Level > 20 {
  94. continue
  95. }
  96. change, task := j.inspect(result.Level, result.Task)
  97. if !change {
  98. continue
  99. }
  100. if _, err := query.Use(config.GDB1).PlayerTask.
  101. Where(t.Playerid.Eq(result.Playerid)).
  102. Updates(&model2.PlayerTask{Task: task}); err != nil {
  103. panic(err)
  104. }
  105. }
  106. return nil
  107. })
  108. logrus.Println("update finished")
  109. }
  110. // inspect 检查是否需要更新
  111. func (j *jOldGuide) inspect(level int64, task string) (bool, string) {
  112. var (
  113. guide map[int64]struct{}
  114. change bool
  115. err error
  116. )
  117. if err = json.Unmarshal([]byte(task), &guide); err != nil {
  118. panic(err)
  119. }
  120. // 获取限制引导
  121. limits := GuideLimit[level]
  122. // 检查是否有需要添加的引导
  123. for _, limit := range limits {
  124. _, ok := guide[limit]
  125. if !ok {
  126. change = true
  127. guide[limit] = struct{}{}
  128. }
  129. }
  130. if change {
  131. newTask, err := json.Marshal(guide)
  132. if err != nil {
  133. panic(err)
  134. }
  135. return change, string(newTask)
  136. }
  137. return false, ""
  138. }