123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- package jobs
- import (
- "fmt"
- "gadmin/config"
- "gadmin/internal/gorm/model"
- "gadmin/internal/gorm/query"
- "gadmin/utility/player"
- "os"
- "sync"
- "github.com/sirupsen/logrus"
- "gorm.io/gen"
- )
- var LevelOutput = new(jLevelOutput)
- type jLevelOutput struct {
- sync.Mutex
- }
- func (j *jLevelOutput) Run() {
- logrus.Info("LevelOutput Run.....")
- if os.Getenv("GIN_MODE") != "release" && os.Getenv("ADMIN_IS_LOCAL") != "1" {
- logrus.Warnf("测试环境禁止同步")
- return
- }
- j.Lock()
- defer j.Unlock()
- for serverId, _ := range config.GDBGroup {
- j.sync(serverId)
- }
- }
- func (j *jLevelOutput) sync(serverId int) {
- DB, err := player.GetDBByServerID(serverId)
- if err != nil {
- logrus.Warningf("SyncChannel GetDBByServerID err:%v", err)
- return
- }
- var (
- key = fmt.Sprintf("level_output_sync_changed_id_%v", serverId)
- lastId = config.FirstOrCreate(key, "sync")
- newLastId = lastId
- c = query.Use(config.DB).ChangedLog
- results []*model.ChangedLog
- )
- err = c.Select(c.ID, c.Diamond, c.Coin, c.UserID, c.ChannelID).Where(c.ID.Gt(lastId)).Where(c.ServerID.Eq(int32(serverId))).FindInBatches(&results, 500, func(tx gen.Dao, batch int) error {
- for _, result := range results {
- newLastId = result.ID
- if result.Coin <= 0 && result.Diamond <= 0 {
- continue
- }
- //logrus.Warnf("result:%+v", result)
- level := j.getLevel(DB, result.UserID)
- if level == 0 {
- //logrus.Warnf("无等级...")
- continue
- }
- if result.Coin > 0 {
- j.updateOutput(serverId, level, result.ChannelID, "coin", result.Coin)
- }
- if result.Diamond > 0 {
- j.updateOutput(serverId, level, result.ChannelID, "diamond", result.Diamond)
- }
- }
- return nil
- })
- if err != nil {
- logrus.Warnf("LevelOutput sync err:%+v", err)
- return
- }
- if newLastId != lastId {
- config.Save(key, newLastId)
- }
- logrus.Info("LevelOutput sync success..")
- }
- func (j *jLevelOutput) getLevel(DB int, userId int64) int32 {
- var models *model.PlayerAttr
- config.GDBGroup[DB].Select("level").Where("`playerid` = ?", userId).First(&models)
- if models == nil {
- return 0
- }
- return models.Level
- }
- func (j *jLevelOutput) updateOutput(serverId int, level int32, channelId, key string, incVal int64) {
- var (
- l = query.Use(config.DB).ReportLevelOutput
- err error
- )
- first, err := l.Where(l.Level.Eq(int64(level)), l.ChannelID.Eq(channelId), l.ServerID.Eq(int32(serverId))).First()
- if err != nil && err.Error() != "record not found" {
- logrus.Errorf("updateOutput First err :%+v", err)
- return
- }
- // 新增
- if first == nil {
- data := &model.ReportLevelOutput{
- ID: 0,
- ServerID: int32(serverId),
- Level: int64(level),
- ChannelID: channelId,
- Coin: 0,
- Diamond: 0,
- }
- switch key {
- case "coin":
- data.Coin = incVal
- case "diamond":
- data.Diamond = incVal
- default:
- logrus.Warnf("updateOutput 新增 switch key err:%v", key)
- }
- config.DB.Create(data)
- return
- }
- // 更新
- switch key {
- case "coin":
- _, err = l.Where(l.ID.Eq(first.ID)).UpdateSimple(l.Coin.Add(incVal))
- case "diamond":
- _, err = l.Where(l.ID.Eq(first.ID)).UpdateSimple(l.Diamond.Add(incVal))
- default:
- logrus.Warnf("updateOutput 更新 switch key err:%v", key)
- }
- if err != nil {
- logrus.Errorf("updateOutput UpdateSimple err :%+v", err)
- return
- }
- }
|