123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- package jobs
- import (
- "context"
- "encoding/json"
- "gadmin/config"
- "gadmin/internal/admin/service"
- "gadmin/internal/gorm/model"
- "gadmin/internal/gorm/query"
- "gadmin/utility"
- "gadmin/utility/player"
- "github.com/jinzhu/now"
- "github.com/sirupsen/logrus"
- "gorm.io/gen"
- "os"
- "sync"
- "time"
- )
- var RolesCount = new(jRolesCount)
- type jRolesCount struct {
- ctx context.Context
- }
- func (j *jRolesCount) Run() {
- j.ctx = context.TODO()
- logrus.Info("jRolesCount Run.....")
- if os.Getenv("GIN_MODE") == "release" || os.Getenv("ADMIN_IS_LOCAL") == "1" {
- for serverId, _ := range config.GDBGroup {
- j.RolesCount(serverId)
- }
- } else {
- logrus.Warn("非正式环境无需进行,跳过..")
- }
- }
- var (
- loadRolesLock sync.RWMutex
- )
- func (j *jRolesCount) RolesCount(serverId int) {
- loadRolesLock.RLock()
- defer loadRolesLock.RUnlock()
- DB, err := player.GetDBByServerID(serverId)
- if err != nil {
- logrus.Warningf("RolesCount GetDBByServerID,err:%v", err)
- return
- }
- // 前一天的日期
- yesterday := now.With(time.Now().AddDate(0, 0, -1))
- var (
- allRoles = make(map[string]map[int64]int64)
- date = utility.Format(yesterday.Time)
- endUnix = yesterday.EndOfDay().Unix()
- )
- logrus.Infof("正在统计英雄分布等级,date:%v, Unix:%+v", date, endUnix)
- channelIds, err := service.Channel.Ids()
- if err != nil {
- logrus.Warningf("Channel.Ids,err:%v", err)
- return
- }
- type RolesData struct {
- ID int64
- }
- // 计算渠道玩家
- allRoles["-1"] = make(map[int64]int64)
- for _, channelId := range channelIds {
- if allRoles[channelId] == nil {
- allRoles[channelId] = make(map[int64]int64)
- }
- if channelId == "0" {
- continue
- }
- tmpIds := service.PlayerChannel.PlayerIds(j.ctx, channelId)
- pIds := utility.SpiltInt64BySizeFromInt64(tmpIds, 10000)
- for _, ids := range pIds {
- var results []*model.PlayerMaterial
- u := query.Use(config.GDBGroup[DB]).PlayerMaterial
- err = u.Select(u.ID, u.Roles).Where(u.Playerid.In(ids...)).FindInBatches(&results, 10000, func(tx gen.Dao, batch int) error {
- for _, result := range results {
- var rolesData []RolesData
- if err := json.Unmarshal([]byte(result.Roles), &rolesData); err != nil {
- logrus.Errorf("json.Unmarshal err:%+v", result.Roles)
- continue
- }
- for i := 0; i < len(rolesData); i++ {
- allRoles[channelId][rolesData[i].ID] += 1
- allRoles["-1"][rolesData[i].ID] += 1
- }
- }
- return nil
- })
- if err != nil {
- logrus.Errorf("RolesLog FindInBatches err:%+v", err)
- return
- }
- }
- }
- // 计算自然玩家
- var results []*model.PlayerMaterial
- u := query.Use(config.GDBGroup[DB]).PlayerMaterial
- err = u.Select(u.ID, u.Roles).FindInBatches(&results, 1000, func(tx gen.Dao, batch int) error {
- for _, result := range results {
- var rolesData []RolesData
- if err := json.Unmarshal([]byte(result.Roles), &rolesData); err != nil {
- logrus.Errorf("json.Unmarshal err:%+v", result.Roles)
- continue
- }
- for i := 0; i < len(rolesData); i++ {
- allRoles["0"][rolesData[i].ID] += 1
- }
- }
- return nil
- })
- if err != nil {
- logrus.Errorf("RolesLog FindInBatches err:%+v", err)
- return
- }
- for k, v := range allRoles["-1"] {
- allRoles["0"][k] -= v
- }
- for channelId, collect := range allRoles {
- if channelId == "-1" {
- continue
- }
- str, err := json.Marshal(collect)
- if err != nil {
- logrus.Errorf("RolesLog Save Marshal err:%+v", err)
- return
- }
- reportDao := query.Use(config.DB).RolesLog // 统计表
- arl, _ := reportDao.Where(reportDao.Date.Eq(date), reportDao.ChannelID.Eq(channelId), reportDao.ServerID.Eq(int32(serverId))).FirstOrInit()
- arl.Date = date
- arl.ChannelID = channelId
- arl.ServerID = int32(serverId)
- arl.Collect = string(str)
- if err = reportDao.Save(arl); err != nil {
- logrus.Errorf("RolesLog Save err:%+v", err)
- return
- }
- }
- logrus.Info("统计角色等级完成..")
- }
|