sync_chapter.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. package jobs
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "gadmin/config"
  6. "gadmin/internal/gorm/model"
  7. "gadmin/internal/gorm/query"
  8. "os"
  9. "sync"
  10. "time"
  11. "github.com/sirupsen/logrus"
  12. )
  13. var SyncChapter = new(jSyncChapter)
  14. type jSyncChapter struct {
  15. sync.Mutex
  16. }
  17. type chapterItem struct {
  18. Id int64 `json:"id"`
  19. UserId int64 `json:"user_id"`
  20. ChapterId int32 `json:"chapter_id"`
  21. Extra string `json:"extra"`
  22. EventAt int64 `json:"event_at"`
  23. ServerID int32 `json:"server_id"` // 服务器ID
  24. Difficulty int32 `json:"difficulty"`
  25. }
  26. // Run
  27. // 目前只统计100~103活动章节
  28. func (j *jSyncChapter) Run() {
  29. logrus.Info("jSyncChapter Run.....")
  30. if os.Getenv("GIN_MODE") != "release" && os.Getenv("ADMIN_IS_LOCAL") != "1" {
  31. logrus.Warnf("测试环境禁止同步")
  32. return
  33. }
  34. j.Lock()
  35. defer j.Unlock()
  36. chapterIds := []int64{100, 101, 102, 103}
  37. var difficultys = []int32{0, 1, 2}
  38. for serverId := range config.GDBGroup {
  39. for _, chapterId := range chapterIds {
  40. if chapterId == 103 {
  41. j.syncChapter(serverId, chapterId, 0)
  42. continue
  43. }
  44. for _, difficulty := range difficultys {
  45. j.syncChapter(serverId, chapterId, difficulty)
  46. }
  47. }
  48. }
  49. }
  50. func (j *jSyncChapter) syncChapter(serverId int, chapterId int64, difficulty int32) {
  51. logrus.Infof("load SyncChapter:%v, difficulty:%v", chapterId, difficulty)
  52. lastSyncInfo, err := j.getLastId(serverId, chapterId, difficulty)
  53. if err != nil {
  54. logrus.Warnf("getLastId err . %v", err)
  55. return
  56. }
  57. var (
  58. sql = ""
  59. chapterLst []chapterItem
  60. )
  61. sql = fmt.Sprintf("SELECT id,user_id,chapter_id,extra,event_at,server_id,difficulty FROM `chapter_logs_%d` WHERE `id` > %d and server_id = %v and difficulty = %v",
  62. chapterId, lastSyncInfo.LastID, serverId, difficulty) +
  63. " AND `user_id` > 0 AND `event_id` = 11" // AND (JSON_CONTAINS(extra, '\"type\"') = 1)
  64. config.DB.Raw(sql).Scan(&chapterLst)
  65. if len(chapterLst) == 0 {
  66. logrus.Warnf("没有需要同步的章节信息")
  67. return
  68. }
  69. for _, chapter := range chapterLst {
  70. if err = j.saveChapter(chapter); err != nil {
  71. logrus.Warnf("saveChapter err :%+v", err)
  72. }
  73. }
  74. if err = j.setLastId(serverId, chapterId, difficulty, chapterLst[len(chapterLst)-1], lastSyncInfo.ID); err != nil {
  75. logrus.Warnf("setLastId err :%+v", err)
  76. }
  77. }
  78. func (j *jSyncChapter) saveChapter(data chapterItem) (err error) {
  79. var (
  80. models model.Chapter
  81. q = query.Use(config.DB).Chapter
  82. suc int32 = 0
  83. fail int32 = 0
  84. t = time.Now()
  85. )
  86. if j.playerPass(data.Extra) {
  87. suc = 1
  88. } else {
  89. fail = 1
  90. }
  91. if err = q.Where(q.PlayerID.Eq(data.UserId), q.ChapterID.Eq(data.ChapterId), q.Difficulty.Eq(data.Difficulty)).Scan(&models); err != nil {
  92. return err
  93. }
  94. if models.ID > 0 {
  95. if _, err = query.Use(config.DB).Chapter.Where(q.ID.Eq(models.ID)).UpdateSimple(q.ClearanceCount.Add(suc), q.FailCount.Add(fail), q.UpdatedAt.Value(t)); err != nil {
  96. return err
  97. }
  98. return nil
  99. } else {
  100. return query.Use(config.DB).Chapter.Create(&model.Chapter{
  101. ServerID: data.ServerID,
  102. PlayerID: data.UserId,
  103. ChapterID: data.ChapterId,
  104. Difficulty: data.Difficulty,
  105. ClearanceCount: suc,
  106. FailCount: fail,
  107. CreatedAt: t,
  108. UpdatedAt: t,
  109. })
  110. }
  111. }
  112. func (j *jSyncChapter) playerPass(extraInfo string) bool {
  113. type passType struct {
  114. Type int `json:"type"` //-1死亡结算;主动退出结算 1通关结算
  115. }
  116. var passTypeTemp passType
  117. json.Unmarshal([]byte(extraInfo), &passTypeTemp)
  118. return passTypeTemp.Type == 1
  119. }
  120. func (j *jSyncChapter) getLastId(serverId int, chapterId int64, difficulty int32) (res model.ChapterSync, err error) {
  121. var (
  122. q = query.Use(config.DB).ChapterSync
  123. models model.ChapterSync
  124. )
  125. if err = q.Where(q.ChapterID.Eq(chapterId), q.ServerID.Eq(int32(serverId)), q.Difficulty.Eq(difficulty)).Scan(&models); err != nil {
  126. return
  127. }
  128. return models, nil
  129. }
  130. func (j *jSyncChapter) setLastId(serverId int, chapterId int64, difficulty int32, data chapterItem, lastSyncInfoId int64) (err error) {
  131. var (
  132. q = query.Use(config.DB).ChapterSync
  133. )
  134. syncData := &model.ChapterSync{
  135. ChapterID: chapterId,
  136. ServerID: int32(serverId),
  137. Difficulty: difficulty,
  138. LastID: data.Id,
  139. LastSyncTime: time.Unix(data.EventAt, 0),
  140. UpdatedAt: time.Now(),
  141. }
  142. if lastSyncInfoId != 0 {
  143. syncData.ID = lastSyncInfoId
  144. }
  145. if err = q.Where(q.ChapterID.Eq(chapterId), q.ServerID.Eq(int32(serverId)), q.Difficulty.Eq(difficulty)).Save(syncData); err != nil {
  146. return err
  147. }
  148. return
  149. }