123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 |
- package jobs
- import (
- "encoding/json"
- "fmt"
- "gadmin/config"
- model2 "gadmin/internal/gorm/model"
- "gadmin/internal/gorm/query"
- "github.com/sirupsen/logrus"
- "gorm.io/gorm"
- )
- var OldGuide = new(jOldGuide)
- type jOldGuide struct{}
- var GuideLimit map[int64][]int64
- func (j *jOldGuide) Run() {
- logrus.Info("OldGuide Run.....")
- j.loadGuideLimit()
- j.screen()
- j.saveGuide()
- }
- func (j *jOldGuide) loadGuideLimit() {
- GuideLimit = make(map[int64][]int64)
- //GuideLimit[1] = []int64{11,21, 31, 71, 51, 81} //
- GuideLimit[2] = []int64{11, 21, 41}
- GuideLimit[3] = []int64{11, 21, 41, 91, 61, 161}
- GuideLimit[4] = []int64{11, 21, 41, 91, 61, 131, 111, 161}
- GuideLimit[5] = []int64{11, 21, 41, 91, 61, 131, 171, 111, 161, 241}
- GuideLimit[6] = []int64{11, 21, 41, 91, 61, 131, 171, 251, 111, 161, 241}
- GuideLimit[7] = []int64{11, 21, 41, 91, 61, 131, 171, 251, 173, 201, 111, 161, 241}
- GuideLimit[8] = []int64{11, 21, 41, 91, 61, 131, 171, 251, 173, 201, 111, 161, 181, 211, 241}
- GuideLimit[9] = []int64{11, 21, 41, 91, 61, 131, 171, 251, 173, 201, 111, 161, 181, 221, 231, 211, 241}
- GuideLimit[10] = []int64{11, 21, 41, 91, 61, 131, 171, 251, 173, 201, 111, 161, 181, 221, 231, 211, 241}
- GuideLimit[11] = []int64{11, 21, 41, 91, 61, 131, 171, 251, 173, 201, 111, 161, 181, 221, 231, 211, 241}
- GuideLimit[12] = []int64{11, 21, 41, 91, 61, 131, 171, 251, 173, 201, 111, 161, 181, 221, 231, 211, 65, 261, 241}
- 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}
- 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}
- 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}
- 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}
- 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}
- 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}
- 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}
- 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}
- }
- // screen 将全表数据整理成倒排规则,再以规则作为条件批量更新
- func (j *jOldGuide) screen() {
- type Getter struct {
- Total int64 `json:"total"`
- Task string `json:"task"`
- }
- var (
- results []*Getter
- levels = []int64{2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20} // 1,
- 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"
- 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'`
- )
- handle := func(level int64, oldTask string) {
- change, task := j.inspect(level, oldTask)
- if !change {
- return
- }
- newSql := fmt.Sprintf(handleSql, task, level, oldTask)
- logrus.Warningf("newSql:%v", newSql)
- db := config.GDB1.Exec(newSql)
- if db.Error != nil {
- logrus.Panicf("screen handle Exec err:%+v", db.Error)
- }
- }
- for _, level := range levels {
- config.GDB1.Raw(levelSql, level).Scan(&results)
- if len(results) > 0 {
- for _, result := range results {
- handle(level, result.Task)
- }
- }
- }
- }
- // saveGuide 遍历更新
- func (j *jOldGuide) saveGuide() {
- type Ret struct {
- Playerid int64 `json:"playerid"`
- Level int64 `json:"level"`
- Task string `json:"task"`
- }
- var (
- results []*Ret
- t = query.Use(config.GDB1).PlayerTask
- )
- config.GDB1.Model(&model2.PlayerTask{}).
- Select("player_task.playerid,player_task.task,player_attr.level").
- Joins("LEFT JOIN player_attr ON player_task.playerid = player_attr.playerid").
- //Where("player_task.playerid = 206").
- FindInBatches(&results, 3000, func(tx *gorm.DB, batch int) error {
- for _, result := range results {
- if result.Level <= 1 || result.Level > 20 {
- continue
- }
- change, task := j.inspect(result.Level, result.Task)
- if !change {
- continue
- }
- if _, err := query.Use(config.GDB1).PlayerTask.
- Where(t.Playerid.Eq(result.Playerid)).
- Updates(&model2.PlayerTask{Task: task}); err != nil {
- panic(err)
- }
- }
- return nil
- })
- logrus.Println("update finished")
- }
- // inspect 检查是否需要更新
- func (j *jOldGuide) inspect(level int64, task string) (bool, string) {
- var (
- guide map[int64]struct{}
- change bool
- err error
- )
- if err = json.Unmarshal([]byte(task), &guide); err != nil {
- panic(err)
- }
- // 获取限制引导
- limits := GuideLimit[level]
- // 检查是否有需要添加的引导
- for _, limit := range limits {
- _, ok := guide[limit]
- if !ok {
- change = true
- guide[limit] = struct{}{}
- }
- }
- if change {
- newTask, err := json.Marshal(guide)
- if err != nil {
- panic(err)
- }
- return change, string(newTask)
- }
- return false, ""
- }
|