log_statistics.go 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107
  1. package log
  2. import (
  3. "context"
  4. "encoding/json"
  5. "errors"
  6. "fmt"
  7. "github.com/go-redis/redis/v8"
  8. "github.com/xuri/excelize/v2"
  9. "go.uber.org/zap"
  10. "gorm.io/gorm"
  11. "log-server/global"
  12. "log-server/model/log"
  13. "log-server/model/log/request"
  14. "log-server/model/log/response"
  15. loging2 "log-server/service/log/loging"
  16. "log-server/utils"
  17. "math"
  18. "strconv"
  19. "time"
  20. )
  21. type ServiceStatisticsLog struct {
  22. loging2.LogicalLog
  23. }
  24. var StatisticsCompletedKey = "%s:StatisticsCompleted"
  25. var taskStatistics = "%s:taskStatistics"
  26. var ComputerNum = "%s:ComputerNum"
  27. var TaskType = []int{0, 1}
  28. func (s *ServiceStatisticsLog) CreateStatisticsLog() {
  29. key := fmt.Sprintf(StatisticsCompletedKey, s.LogicalLog.CurrentDate())
  30. ctx := context.Background()
  31. b, err := s.LogicalLog.ExistsKey(ctx, key)
  32. if err != nil {
  33. global.GVA_LOG.Error("获取redis key失败!"+key, zap.Error(err))
  34. return
  35. }
  36. if b {
  37. global.GVA_LOG.Info("统计数据已完成!"+key, zap.Error(err))
  38. return
  39. }
  40. gameMps, err := s.LogicalLog.GetGameCache(context.Background(), s.YesterdayDate())
  41. if err != nil {
  42. global.GVA_LOG.Error("获取redis game list失败!", zap.Error(err))
  43. return
  44. }
  45. if len(gameMps) == 0 {
  46. global.GVA_LOG.Info("获取redis game list没有数据!")
  47. return
  48. }
  49. var statisticsLogs []*log.StatisticsLog
  50. for gameId, _ := range gameMps {
  51. for _, tt := range TaskType {
  52. gameIdInt, _ := strconv.Atoi(gameId)
  53. statisticsLogNew := new(log.StatisticsLog)
  54. statisticsLog := s.statisticsData(ctx, gameIdInt, tt, s.LogicalLog.YesterdayDate(), statisticsLogNew)
  55. if !errors.Is(global.GVA_DB.Where("create_date = ?", s.LogicalLog.YesterdayDate()).Where("game_id = ?", gameIdInt).First(&log.StatisticsLog{}).Error, gorm.ErrRecordNotFound) {
  56. // 已存在,跳过
  57. err = global.GVA_DB.Where("game_id", gameIdInt).Where("create_date = ?", s.LogicalLog.YesterdayDate()).Where("type = ?", tt).Updates(statisticsLog).Error
  58. if err != nil {
  59. global.GVA_LOG.Error("update StatisticsLogs失败!", zap.Error(err))
  60. continue
  61. }
  62. continue
  63. }
  64. statisticsLogs = append(statisticsLogs, statisticsLog)
  65. }
  66. }
  67. if len(statisticsLogs) == 0 {
  68. global.GVA_LOG.Info("statisticsLogsGameInfo没有数据!", zap.Error(err))
  69. global.GVA_REDIS.Set(ctx, key, 1, 24*time.Hour)
  70. return
  71. }
  72. err = global.GVA_DB.Create(statisticsLogs).Error
  73. if err != nil {
  74. global.GVA_LOG.Error("添加statisticsLogsGameInfo失败!", zap.Error(err))
  75. return
  76. }
  77. global.GVA_REDIS.Set(ctx, key, 1, 24*time.Hour)
  78. return
  79. }
  80. func (s *ServiceStatisticsLog) TodayCreateStatisticsGameInfoLog() {
  81. date := s.LogicalLog.CurrentDate()
  82. ctx := context.Background()
  83. gameMps, err := s.LogicalLog.GetGameCache(context.Background(), date)
  84. if err != nil {
  85. global.GVA_LOG.Error("获取redis game list失败!", zap.Error(err))
  86. return
  87. }
  88. if len(gameMps) == 0 {
  89. global.GVA_LOG.Info("获取redis game list没有数据!")
  90. return
  91. }
  92. var statisticsLogs []*log.StatisticsLog
  93. for gameId, _ := range gameMps {
  94. for _, tt := range TaskType {
  95. gameIdInt, _ := strconv.Atoi(gameId)
  96. statisticsLogNew := new(log.StatisticsLog)
  97. statisticsLog := s.statisticsData(ctx, gameIdInt, tt, date, statisticsLogNew)
  98. if !errors.Is(global.GVA_DB.Where("create_date = ?", date).Where("game_id = ?", gameIdInt).First(&log.StatisticsLog{}).Error, gorm.ErrRecordNotFound) {
  99. // 已存在,跳过
  100. err = global.GVA_DB.Where("game_id", gameIdInt).Where("create_date = ?", date).Where("type = ?", tt).Updates(statisticsLog).Error
  101. if err != nil {
  102. global.GVA_LOG.Error("update StatisticsLogs失败!", zap.Error(err))
  103. continue
  104. }
  105. continue
  106. }
  107. statisticsLogs = append(statisticsLogs, statisticsLog)
  108. if len(statisticsLogs) == 100 {
  109. err = global.GVA_DB.Create(statisticsLogs).Error
  110. if err != nil {
  111. global.GVA_LOG.Error("添加statisticsLogs失败!", zap.Error(err))
  112. return
  113. }
  114. statisticsLogs = []*log.StatisticsLog{}
  115. }
  116. }
  117. }
  118. if len(statisticsLogs) == 0 {
  119. global.GVA_LOG.Info("statisticsLogsGameInfo没有数据!", zap.Error(err))
  120. return
  121. }
  122. err = global.GVA_DB.Create(statisticsLogs).Error
  123. if err != nil {
  124. global.GVA_LOG.Error("添加statisticsLogsGameInfo失败!", zap.Error(err))
  125. return
  126. }
  127. return
  128. }
  129. func (s *ServiceStatisticsLog) TodayStatisticsLogList(ctx context.Context, api log.StatisticsLog, info request.PageInfo) (interface{}, int64, error) {
  130. db := global.GVA_DB.Model(&log.StatisticsLog{})
  131. if api.GameId != 0 {
  132. db = db.Where("game_id = ?", api.GameId)
  133. }
  134. db = db.Where("create_date = ?", s.CurrentDate())
  135. var total int64
  136. err := db.Count(&total).Error
  137. if err != nil {
  138. return nil, 0, err
  139. }
  140. limit := info.PageSize
  141. offset := info.PageSize * (info.Page - 1)
  142. var statisticsLogs []*log.StatisticsLog
  143. var statisticsLogs2 []*log.StatisticsLog
  144. db = db.Limit(limit).Offset(offset)
  145. err = db.Order("id").Find(&statisticsLogs).Error
  146. for _, gameInfo := range statisticsLogs {
  147. tt := gameInfo.Type
  148. gameIdInt := gameInfo.GameId
  149. statisticsLogNew := new(log.StatisticsLog)
  150. statisticsLog := s.statisticsData(ctx, gameIdInt, tt, s.LogicalLog.CurrentDate(), statisticsLogNew)
  151. statisticsLogs2 = append(statisticsLogs2, statisticsLog)
  152. }
  153. return statisticsLogs2, total, err
  154. }
  155. func (s *ServiceStatisticsLog) statisticsData(ctx context.Context, gameIdInt, tt int, date string, statisticsLog *log.StatisticsLog) *log.StatisticsLog {
  156. key := fmt.Sprintf(taskStatistics, date)
  157. gameIdStr := strconv.Itoa(gameIdInt)
  158. data, err := global.GVA_REDIS.HGet(ctx, key, gameIdStr).Result()
  159. if err != nil {
  160. if err == redis.Nil {
  161. global.GVA_LOG.Info("添加缓存数据失败TaskStatisticsDataCache", zap.Error(err))
  162. } else {
  163. global.GVA_LOG.Error("添加缓存数据失败TaskStatisticsDataCache", zap.Error(err))
  164. return nil
  165. }
  166. }
  167. var taskStatistics request.TaskStatistics
  168. _ = json.Unmarshal([]byte(data), &taskStatistics)
  169. pullAccountOk, _ := s.LogicalLog.NodeLogGetNum(ctx, date, gameIdInt, "4100000", loging2.OkStatus, tt)
  170. pullAccountFail, _ := s.LogicalLog.NodeLogGetNum(ctx, date, gameIdInt, "4100000", loging2.FailStatus, tt)
  171. ConstituencyFail, _ := s.LogicalLog.TypeLogGetNum(ctx, date, gameIdInt, "4604000", loging2.FailStatus, tt)
  172. ConstituencyOk, _ := s.LogicalLog.TypeLogGetNum(ctx, date, gameIdInt, "4604000", loging2.OkStatus, tt)
  173. StartProxyFail, _ := s.LogicalLog.NodeLogGetNum(ctx, date, gameIdInt, "4200000", loging2.FailStatus, tt)
  174. StartProxyOk, _ := s.LogicalLog.NodeLogGetNum(ctx, date, gameIdInt, "4200000", loging2.OkStatus, tt)
  175. SimulatorStartFail, _ := s.LogicalLog.NodeLogGetNum(ctx, date, gameIdInt, "4300000", loging2.FailStatus, tt)
  176. SimulatorStartOk, _ := s.LogicalLog.NodeLogGetNum(ctx, date, gameIdInt, "4300000", loging2.OkStatus, tt)
  177. NetworkCheckFail, _ := s.LogicalLog.NodeLogGetNum(ctx, date, gameIdInt, "4400000", loging2.FailStatus, tt)
  178. NetworkCheckOk, _ := s.LogicalLog.NodeLogGetNum(ctx, date, gameIdInt, "4400000", loging2.OkStatus, tt)
  179. GameStartFail, _ := s.LogicalLog.NodeLogGetNum(ctx, date, gameIdInt, "4500000", loging2.FailStatus, tt)
  180. GameStartOk, _ := s.LogicalLog.NodeLogGetNum(ctx, date, gameIdInt, "4500000", loging2.OkStatus, tt)
  181. xmyLoginFail, _ := s.LogicalLog.TypeLogGetNum(ctx, date, gameIdInt, "4601000", loging2.FailStatus, tt)
  182. xmyLoginOk, _ := s.LogicalLog.TypeLogGetNum(ctx, date, gameIdInt, "4601000", loging2.OkStatus, tt)
  183. wxLoginFail, _ := s.LogicalLog.TypeLogGetNum(ctx, date, gameIdInt, "4602000", loging2.FailStatus, tt)
  184. wxLoginOk, _ := s.LogicalLog.TypeLogGetNum(ctx, date, gameIdInt, "4602000", loging2.OkStatus, tt)
  185. mzLoginFail, _ := s.LogicalLog.TypeLogGetNum(ctx, date, gameIdInt, "4603000", loging2.FailStatus, tt)
  186. mzLoginOk, _ := s.LogicalLog.TypeLogGetNum(ctx, date, gameIdInt, "4603000", loging2.OkStatus, tt)
  187. LoginFail := xmyLoginFail + wxLoginFail + mzLoginFail
  188. LoginOk := xmyLoginOk + wxLoginOk + mzLoginOk
  189. EnterMainFail, _ := s.LogicalLog.NodeLogGetNum(ctx, date, gameIdInt, "4700000", loging2.FailStatus, tt)
  190. EnterMainOk, _ := s.LogicalLog.NodeLogGetNum(ctx, date, gameIdInt, "4700000", loging2.OkStatus, tt)
  191. FeeFail, _ := s.LogicalLog.NodeLogGetNum(ctx, date, gameIdInt, "4800000", loging2.FailStatus, tt)
  192. FeeOk, _ := s.LogicalLog.NodeLogGetNum(ctx, date, gameIdInt, "4800000", loging2.OkStatus, tt)
  193. ScriptStartFail, _ := s.LogicalLog.NodeLogGetNum(ctx, date, gameIdInt, "4300000", loging2.FailStatus, tt)
  194. ScriptStartOk, _ := s.LogicalLog.NodeLogGetNum(ctx, date, gameIdInt, "4300000", loging2.OkStatus, tt)
  195. EnterGameFail, _ := s.LogicalLog.TypeLogGetNum(ctx, date, gameIdInt, "4605000", loging2.FailStatus, tt)
  196. EnterGameOk, _ := s.LogicalLog.TypeLogGetNum(ctx, date, gameIdInt, "4605000", loging2.OkStatus, tt)
  197. AuthenticationFail, _ := s.LogicalLog.TypeLogGetNum(ctx, date, gameIdInt, "4607000", loging2.FailStatus, tt)
  198. AuthenticationOk, _ := s.LogicalLog.TypeLogGetNum(ctx, date, gameIdInt, "4607000", loging2.OkStatus, tt)
  199. EnterStartGame, _ := s.LogicalLog.CodeLogGetNum(ctx, date, gameIdInt, "4501000", loging2.NoLogStatus, tt)
  200. EnterAuthentication, _ := s.LogicalLog.CodeLogGetNum(ctx, date, gameIdInt, "4607000", loging2.NoLogStatus, tt)
  201. EnterConstituency, _ := s.LogicalLog.CodeLogGetNum(ctx, date, gameIdInt, "4604000", loging2.NoLogStatus, tt)
  202. EnterGame, _ := s.LogicalLog.CodeLogGetNum(ctx, date, gameIdInt, "4605000", loging2.NoLogStatus, tt)
  203. EnterMain, _ := s.LogicalLog.CodeLogGetNum(ctx, date, gameIdInt, "4701000", loging2.NoLogStatus, tt)
  204. EnterFee, _ := s.LogicalLog.CodeLogGetNum(ctx, date, gameIdInt, "4800000", loging2.NoLogStatus, tt)
  205. EnterXmyLogin, _ := s.LogicalLog.CodeLogGetNum(ctx, date, gameIdInt, "4601000", loging2.NoLogStatus, tt)
  206. EnterWxLogin, _ := s.LogicalLog.CodeLogGetNum(ctx, date, gameIdInt, "4602000", loging2.NoLogStatus, tt)
  207. EnterMzLogin, _ := s.LogicalLog.CodeLogGetNum(ctx, date, gameIdInt, "4603000", loging2.NoLogStatus, tt)
  208. BanOff1, _ := s.LogicalLog.CodeLogGetNum(ctx, date, gameIdInt, "4601006", loging2.FailStatus, tt) // 小绵羊登录封号
  209. BanOff2, _ := s.LogicalLog.CodeLogGetNum(ctx, date, gameIdInt, "4602008", loging2.FailStatus, tt) // 微信登录封号
  210. BanOff3, _ := s.LogicalLog.CodeLogGetNum(ctx, date, gameIdInt, "4603006", loging2.FailStatus, tt) // 魅族登录封号
  211. BanOff4, _ := s.LogicalLog.CodeLogGetNum(ctx, date, gameIdInt, "4701003", loging2.FailStatus, tt) // 主线封号
  212. Freeze, _ := s.LogicalLog.CodeLogGetNum(ctx, date, gameIdInt, "4809904", loging2.NoLogStatus, tt) // 冻结
  213. BanOff := BanOff1 + BanOff2 + BanOff3 + BanOff4
  214. EnterLogin := EnterXmyLogin + EnterMzLogin + EnterWxLogin
  215. //statisticsLog.NewHaveRole, _ = s.LogicalLog.CodeLogGetNum(ctx, date, gameIdInt, "4604004", loging2.NoLogStatus, tt) // 新增有角色
  216. //statisticsLog.RetainedNotRole, _ = s.LogicalLog.CodeLogGetNum(ctx, date, gameIdInt, "4604003", loging2.NoLogStatus, tt) // 留存无角色
  217. statisticsLog.PullAccountOk = pullAccountOk
  218. statisticsLog.PullAccountFail = pullAccountFail
  219. statisticsLog.StartProxyFail = StartProxyFail
  220. statisticsLog.StartProxyOk = StartProxyOk
  221. statisticsLog.SimulatorStartFail = SimulatorStartFail
  222. statisticsLog.SimulatorStartOk = SimulatorStartOk
  223. statisticsLog.NetworkCheckFail = NetworkCheckFail
  224. statisticsLog.NetworkCheckOk = NetworkCheckOk
  225. statisticsLog.EnterMainFail = EnterMainFail
  226. statisticsLog.EnterMainOk = EnterMainOk
  227. statisticsLog.EnterGameFail = EnterGameFail
  228. statisticsLog.EnterGameOk = EnterGameOk
  229. statisticsLog.GameId = gameIdInt
  230. statisticsLog.ConstituencyFail = ConstituencyFail
  231. statisticsLog.ConstituencyOk = ConstituencyOk
  232. statisticsLog.FeeFail = FeeFail
  233. statisticsLog.FeeOk = FeeOk
  234. statisticsLog.GameStartFail = GameStartFail
  235. statisticsLog.GameStartOk = GameStartOk
  236. statisticsLog.LoginFail = LoginFail
  237. statisticsLog.LoginOk = LoginOk
  238. statisticsLog.XmyLoginFail = xmyLoginFail
  239. statisticsLog.XmyLoginOk = xmyLoginOk
  240. statisticsLog.WxLoginFail = wxLoginFail
  241. statisticsLog.WxLoginOk = wxLoginOk
  242. statisticsLog.MzLoginFail = mzLoginFail
  243. statisticsLog.MzLoginOk = mzLoginOk
  244. statisticsLog.ScriptStartFail = ScriptStartFail
  245. statisticsLog.ScriptStartOk = ScriptStartOk
  246. statisticsLog.AuthenticationFail = AuthenticationFail
  247. statisticsLog.AuthenticationOk = AuthenticationOk
  248. statisticsLog.EnterStartGame = EnterStartGame
  249. statisticsLog.EnterAuthentication = EnterAuthentication
  250. statisticsLog.EnterConstituency = EnterConstituency
  251. statisticsLog.EnterGame = EnterGame
  252. statisticsLog.EnterMain = EnterMain
  253. statisticsLog.EnterFee = EnterFee
  254. statisticsLog.EnterLogin = EnterLogin
  255. statisticsLog.BanOff = BanOff
  256. statisticsLog.Freeze = Freeze
  257. statisticsLog.Type = tt
  258. statisticsLog.CreateTime = time.Now().Format("2006-01-02 15:04:05")
  259. statisticsLog.CreateDate = date
  260. if tt == 1 {
  261. statisticsLog.NotRole, _ = s.LogicalLog.CodeLogGetNum(ctx, date, gameIdInt, "4609901", loging2.NoLogStatus, tt)
  262. statisticsLog.HasRole = 0
  263. statisticsLog.IssuedAccount = taskStatistics.RetainedPullAccount
  264. statisticsLog.TargetNum = taskStatistics.RetainedTarget
  265. statisticsLog.TargetCompleteNum = taskStatistics.RetainedComplete
  266. statisticsLog.ScanningSuccessRate = 0
  267. } else {
  268. statisticsLog.NotRole = 0
  269. statisticsLog.HasRole, _ = s.LogicalLog.CodeLogGetNum(ctx, date, gameIdInt, "4609902", loging2.NoLogStatus, tt)
  270. statisticsLog.IssuedAccount = taskStatistics.NewPullAccount
  271. statisticsLog.TargetCompleteNum = taskStatistics.NewComplete
  272. statisticsLog.TargetNum = taskStatistics.NewTarget
  273. statisticsLog.NewScanningCode = taskStatistics.NewScanningCode
  274. if statisticsLog.NewScanningCode != 0 {
  275. statisticsLog.ScanningSuccessRate = float64(statisticsLog.TargetNum) / float64(statisticsLog.NewScanningCode) * 100
  276. }
  277. }
  278. statisticsLog.PayComplete = taskStatistics.PayComplete
  279. statisticsLog.PayTarget = taskStatistics.PayTarget
  280. statisticsLog.OrderCreate = taskStatistics.OrderCreate
  281. statisticsLog.OrderSuccess = taskStatistics.OrderSuccess
  282. statisticsLog.RetainedAccountNum = taskStatistics.RetainedAccountNum
  283. statisticsLog.FeeAccountNum = taskStatistics.FeeAccountNum
  284. statisticsLog.Operator = taskStatistics.Remark
  285. statisticsLog.GameName = taskStatistics.GameName
  286. if statisticsLog.IssuedAccount != 0 {
  287. statisticsLog.PullSuccessRate = float64(statisticsLog.PullAccountOk) / float64(statisticsLog.IssuedAccount) * 100
  288. }
  289. if statisticsLog.PullAccountOk != 0 {
  290. statisticsLog.StartSuccessRate = float64(statisticsLog.SimulatorStartOk) / float64(statisticsLog.PullAccountOk) * 100
  291. }
  292. if statisticsLog.GameStartOk != 0 {
  293. statisticsLog.MainSuccessRate = float64(statisticsLog.EnterMain) / float64(statisticsLog.GameStartOk) * 100
  294. }
  295. if statisticsLog.TargetNum != 0 {
  296. statisticsLog.TaskSuccessRate = float64(statisticsLog.EnterMain) / float64(statisticsLog.TargetNum) * 100
  297. }
  298. if statisticsLog.OrderCreate != 0 {
  299. statisticsLog.LocalOrderSuccessRate = float64(statisticsLog.FeeOk) / float64(statisticsLog.OrderCreate) * 100
  300. }
  301. return statisticsLog
  302. }
  303. func (s *ServiceStatisticsLog) OtherStatisticsLogList(ctx context.Context, api log.StatisticsLog, info request.PageInfo, order string, desc bool) (interface{}, int64, error) {
  304. date := api.CreateDate
  305. if date == "" {
  306. date = s.CurrentDate()
  307. }
  308. db := global.GVA_DB.Model(&log.StatisticsLog{})
  309. if api.GameId != 0 {
  310. db = db.Where("game_id = ?", api.GameId)
  311. }
  312. db = db.Where("create_date = ?", date)
  313. var total int64
  314. err := db.Count(&total).Error
  315. if err != nil {
  316. return nil, 0, err
  317. }
  318. limit := info.PageSize
  319. offset := info.PageSize * (info.Page - 1)
  320. var statisticsLogs []*log.StatisticsLog
  321. db = db.Limit(limit).Offset(offset)
  322. if order != "" {
  323. var OrderStr string
  324. // 设置有效排序key 防止sql注入
  325. // 感谢 Tom4t0 提交漏洞信息
  326. orderMap := make(map[string]bool, 7)
  327. orderMap["pull_success_rate"] = true
  328. orderMap["start_success_rate"] = true
  329. orderMap["main_success_rate"] = true
  330. orderMap["task_success_rate"] = true
  331. orderMap["scanning_success_rate"] = true
  332. orderMap["local_order_success_rate"] = true
  333. orderMap["game_id"] = true
  334. if orderMap[order] {
  335. if desc {
  336. OrderStr = order + " desc"
  337. } else {
  338. OrderStr = order
  339. }
  340. } else { // didn't matched any order key in `orderMap`
  341. global.GVA_LOG.Error("获取失败!", zap.Error(err))
  342. return statisticsLogs, total, err
  343. }
  344. err = db.Order(OrderStr).Find(&statisticsLogs).Error
  345. } else {
  346. err = db.Order("id").Find(&statisticsLogs).Error
  347. }
  348. if err != nil {
  349. return nil, 0, err
  350. }
  351. for _, statisticsLog := range statisticsLogs {
  352. statisticsLog.CreateDate = statisticsLog.CreateDate[:10]
  353. }
  354. return statisticsLogs, total, err
  355. }
  356. func (s *ServiceStatisticsLog) StatisticsNodeLogList(ctx context.Context, api log.StatisticsLog, info request.PageInfo, order string, desc bool) (interface{}, int64, error) {
  357. date := api.CreateDate
  358. if date == "" || date == s.CurrentDate() {
  359. apilist, total, err := s.TodayStatisticsLogList(ctx, api, info)
  360. return apilist, total, err
  361. }
  362. db := global.GVA_DB.Model(&log.StatisticsLog{})
  363. if api.GameId != 0 {
  364. db = db.Where("game_id = ?", api.GameId)
  365. }
  366. db = db.Where("create_date = ?", date)
  367. var total int64
  368. err := db.Count(&total).Error
  369. if err != nil {
  370. return nil, 0, err
  371. }
  372. limit := info.PageSize
  373. offset := info.PageSize * (info.Page - 1)
  374. var statisticsLogs []*log.StatisticsLog
  375. db = db.Limit(limit).Offset(offset)
  376. err = db.Order("id").Find(&statisticsLogs).Error
  377. if err != nil {
  378. return nil, 0, err
  379. }
  380. for _, statisticsLog := range statisticsLogs {
  381. statisticsLog.CreateDate = statisticsLog.CreateDate[:10]
  382. }
  383. return statisticsLogs, total, err
  384. }
  385. func (s *ServiceStatisticsLog) ResetStatisticsLog(ctx context.Context, gameId int, date string) {
  386. var total int64
  387. key := date + ":" + strconv.Itoa(gameId) + ":reset"
  388. global.GVA_REDIS.Set(ctx, key, 1, time.Minute*15)
  389. db := global.GVA_DB.Table("loging")
  390. db = db.Where("game_id = ?", gameId)
  391. err := db.Count(&total).Error
  392. if err != nil {
  393. global.GVA_LOG.Error("重置统计数据总数报错", zap.Error(err))
  394. return
  395. }
  396. limit := 100
  397. num := int(math.Ceil(float64(total) / float64(limit)))
  398. offset := 0
  399. err = s.LogicalLog.DelStatisticsNumCache(ctx, date, gameId)
  400. if err != nil {
  401. global.GVA_LOG.Error("重置统计数据删除缓存报错", zap.Error(err))
  402. return
  403. }
  404. err = s.LogicalLog.DelUuidCodeCache(ctx, date, gameId)
  405. if err != nil {
  406. global.GVA_LOG.Error("重置统计数据删除缓存报错2", zap.Error(err))
  407. return
  408. }
  409. global.GVA_LOG.Info("num = " + strconv.Itoa(num))
  410. for i := 0; i < num; i++ {
  411. global.GVA_LOG.Info("offset = " + strconv.Itoa(offset))
  412. var statisticsLogs []request.AddLogRequest
  413. db2 := global.GVA_DB.Table("loging")
  414. db2 = db2.Where("create_date = ?", date)
  415. db2 = db2.Where("game_id = ?", gameId)
  416. db2 = db2.Limit(limit).Offset(offset)
  417. err = db2.Order("id").Find(&statisticsLogs).Error
  418. for _, statisticsLog := range statisticsLogs {
  419. s.ResetStatisticsCache(ctx, statisticsLog, date)
  420. }
  421. offset += limit
  422. }
  423. global.GVA_LOG.Info("重置统计数据完成")
  424. }
  425. func (s *ServiceStatisticsLog) ResetStatisticsCache(c context.Context, api request.AddLogRequest, date string) {
  426. coding := strconv.Itoa(api.Coding)
  427. nodeCoding := coding[:3]
  428. status := coding[5:]
  429. noLogStatus := coding[3:5]
  430. var logical ServiceResetLoging
  431. switch nodeCoding {
  432. case "410":
  433. logical = new(loging2.ResetLog)
  434. break
  435. case "430":
  436. logical = new(loging2.ResetLog)
  437. break
  438. default:
  439. logical = new(loging2.ResetOtherLog)
  440. break
  441. }
  442. var err error
  443. if status == "99" {
  444. err = logical.SuccessLog(c, api, date)
  445. } else if noLogStatus == "99" {
  446. err = logical.NoLogStatusData(c, api, date)
  447. } else {
  448. err = logical.FailLog(c, api, date)
  449. }
  450. if err != nil {
  451. global.GVA_LOG.Error("创建失败!", zap.Error(err))
  452. }
  453. }
  454. // 每天凌晨reset统计数据
  455. func (s *ServiceStatisticsLog) EveryDayResetStatisticsCache() {
  456. date := s.YesterdayDate()
  457. ctx := context.Background()
  458. gameMps, err := s.LogicalLog.GetGameCache(ctx, date)
  459. if err != nil {
  460. global.GVA_LOG.Error("获取redis game list失败!", zap.Error(err))
  461. return
  462. }
  463. if len(gameMps) == 0 {
  464. global.GVA_LOG.Info("获取redis game list没有数据!")
  465. return
  466. }
  467. for gameId, _ := range gameMps {
  468. id, _ := strconv.Atoi(gameId)
  469. s.ResetStatisticsLog(ctx, id, date)
  470. }
  471. global.GVA_LOG.Info("游戏重置缓存完成!")
  472. }
  473. // 添加和更新电脑指标数据
  474. func (s *ServiceStatisticsLog) CreateComputerStatisticsData() {
  475. ctx := context.Background()
  476. codeMps, err := s.LogicalLog.GetComputerCache(ctx, s.LogicalLog.CurrentDate())
  477. if err != nil {
  478. return
  479. }
  480. if len(codeMps) == 0 {
  481. return
  482. }
  483. key := fmt.Sprintf(taskStatistics, s.LogicalLog.CurrentDate())
  484. onlineComputerMpa, _ := s.LogicalLog.GetOnlineComputerNumCache(ctx, s.LogicalLog.CurrentDate())
  485. var computer log.Computer
  486. computerData, _ := computer.OnlinePcCodeCache()
  487. var csReplys []*log.LogComputer
  488. for code, r := range codeMps {
  489. accountMps, err := s.LogicalLog.GetComputerPullAccountNumCache(ctx, s.LogicalLog.CurrentDate(), code)
  490. if err != nil {
  491. continue
  492. }
  493. taskMps, err := s.LogicalLog.GetComputerTaskSuccessNumCache(ctx, s.LogicalLog.CurrentDate(), code)
  494. if err != nil {
  495. continue
  496. }
  497. enterMainMps, err := s.LogicalLog.GetComputerEnterMainNumCache(ctx, s.LogicalLog.CurrentDate(), code)
  498. if err != nil {
  499. continue
  500. }
  501. delete(computerData, code)
  502. for gameId, num := range accountMps {
  503. csReply := new(log.LogComputer)
  504. csReply.PcCode = code
  505. if _, ok := onlineComputerMpa[csReply.PcCode]; ok {
  506. delete(onlineComputerMpa, csReply.PcCode)
  507. }
  508. csReply.Operator = r
  509. data, err := global.GVA_REDIS.HGet(ctx, key, gameId).Result()
  510. if err != nil {
  511. if err == redis.Nil {
  512. global.GVA_LOG.Info("添加缓存数据失败TaskStatisticsDataCache", zap.Error(err))
  513. } else {
  514. global.GVA_LOG.Error("添加缓存数据失败TaskStatisticsDataCache", zap.Error(err))
  515. return
  516. }
  517. }
  518. var taskStatistics request.TaskStatistics
  519. _ = json.Unmarshal([]byte(data), &taskStatistics)
  520. csReply.GameId, _ = strconv.Atoi(gameId)
  521. csReply.PullAccountNum = num
  522. csReply.TaskSuccessNum = taskMps[gameId]
  523. csReply.EnterMain = enterMainMps[gameId]
  524. csReply.CreateDate = time.Now().Format("2006-01-02")
  525. csReply.TargetNum = taskStatistics.NewTarget + taskStatistics.RetainedTarget
  526. csReply.ComputerFeeRate = s.GetStatisticsPcFeeRate(ctx, csReply.PcCode, csReply.GameId)
  527. csReply.ComputerFreeTime = s.GetStatisticsComputerRate(ctx, csReply.PcCode)
  528. csReply.GameFeeRate = s.GetStatisticsFeeRate(ctx, csReply.GameId)
  529. runTime := time.Now().Hour() + 1 - csReply.ComputerFreeTime
  530. csReply.ComputerHourAverageRate = csReply.TaskSuccessNum / runTime
  531. csReply.Status = 2
  532. global.GVA_DB.Where("create_date = ?", csReply.CreateDate).Where("pc_code = ?", csReply.PcCode).Where("game_id = ?", 0).Delete(&log.LogComputer{})
  533. if !errors.Is(global.GVA_DB.Where("create_date = ?", csReply.CreateDate).Where("pc_code = ?", csReply.PcCode).First(&log.LogComputer{}).Error, gorm.ErrRecordNotFound) {
  534. // 已存在,更新
  535. mp := make(map[string]interface{})
  536. if csReply.Operator != "" {
  537. mp["operator"] = csReply.Operator
  538. }
  539. mp["target_num"] = taskStatistics.NewTarget + taskStatistics.RetainedTarget
  540. mp["pull_account_num"] = num
  541. mp["task_success_num"] = taskMps[gameId]
  542. mp["computer_fee_rate"] = csReply.ComputerFeeRate
  543. mp["computer_free_time"] = csReply.ComputerFreeTime
  544. mp["game_fee_rate"] = csReply.GameFeeRate
  545. mp["computer_hour_average_rate"] = csReply.ComputerHourAverageRate
  546. mp["enter_main"] = csReply.EnterMain
  547. err = global.GVA_DB.Table("log_computer").Where("create_date = ?", csReply.CreateDate).Where("pc_code = ?", csReply.PcCode).Updates(mp).Error
  548. if err != nil {
  549. global.GVA_LOG.Error("更新数据失败", zap.Error(err))
  550. }
  551. continue
  552. }
  553. csReplys = append(csReplys, csReply)
  554. }
  555. }
  556. if len(csReplys) != 0 {
  557. err = global.GVA_DB.Table("log_computer").Create(csReplys).Error
  558. if err != nil {
  559. global.GVA_LOG.Error("更新数据失败", zap.Error(err))
  560. }
  561. }
  562. // 在线电脑没有跑数据记录
  563. if len(onlineComputerMpa) != 0 {
  564. var onlineComputer []*log.LogComputer
  565. for pcCode, op := range onlineComputerMpa {
  566. delete(computerData, pcCode)
  567. csReply := new(log.LogComputer)
  568. csReply.PcCode = pcCode
  569. csReply.Operator = op
  570. csReply.CreateDate = time.Now().Format("2006-01-02")
  571. csReply.Status = 1
  572. if !errors.Is(global.GVA_DB.Where("create_date = ?", csReply.CreateDate).Where("pc_code = ?", csReply.PcCode).First(&log.LogComputer{}).Error, gorm.ErrRecordNotFound) {
  573. if !errors.Is(global.GVA_DB.Where("create_date = ?", csReply.CreateDate).Where("pc_code = ?", csReply.PcCode).Where("status = ?", -1).First(&log.LogComputer{}).Error, gorm.ErrRecordNotFound) {
  574. err = global.GVA_DB.Table("log_computer").Where("create_date = ?", csReply.CreateDate).Where("pc_code = ?", csReply.PcCode).Update("status", 1).Error
  575. if err != nil {
  576. global.GVA_LOG.Error("更新数据失败onlineComputerMpa", zap.Error(err))
  577. }
  578. }
  579. continue
  580. }
  581. onlineComputer = append(onlineComputer, csReply)
  582. }
  583. if len(onlineComputer) != 0 {
  584. err = global.GVA_DB.Table("log_computer").Create(onlineComputer).Error
  585. if err != nil {
  586. global.GVA_LOG.Error("更新数据失败", zap.Error(err))
  587. }
  588. }
  589. }
  590. // 没记录电脑数据
  591. if len(computerData) != 0 {
  592. var onlineComputer []*log.LogComputer
  593. for pcCode, op := range computerData {
  594. csReply := new(log.LogComputer)
  595. csReply.PcCode = pcCode
  596. csReply.Operator = op
  597. csReply.CreateDate = time.Now().Format("2006-01-02")
  598. csReply.Status = -1
  599. if !errors.Is(global.GVA_DB.Where("create_date = ?", csReply.CreateDate).Where("pc_code = ?", csReply.PcCode).First(&log.LogComputer{}).Error, gorm.ErrRecordNotFound) {
  600. continue
  601. }
  602. onlineComputer = append(onlineComputer, csReply)
  603. }
  604. if len(onlineComputer) != 0 {
  605. err = global.GVA_DB.Table("log_computer").Create(onlineComputer).Error
  606. if err != nil {
  607. global.GVA_LOG.Error("更新数据失败", zap.Error(err))
  608. }
  609. }
  610. }
  611. return
  612. }
  613. func (s *ServiceStatisticsLog) ComputerStatistics(ctx context.Context, api log.LogComputer, info request.PageInfo, order string, desc bool) (interface{}, int64, error) {
  614. date := api.CreateDate
  615. isCurrentDate := false
  616. if date == "" {
  617. date = s.CurrentDate()
  618. isCurrentDate = true
  619. }
  620. db := global.GVA_DB.Model(&log.LogComputer{})
  621. var total int64
  622. db = db.Where("create_date = ?", date)
  623. if api.Operator != "" {
  624. db = db.Where("operator = ?", api.Operator)
  625. }
  626. if api.PcCode != "" {
  627. db = db.Where("pc_code = ?", api.PcCode)
  628. }
  629. if api.GameId != 0 {
  630. db = db.Where("game_id = ?", api.GameId)
  631. }
  632. err := db.Count(&total).Error
  633. if err != nil {
  634. return nil, 0, err
  635. }
  636. limit := info.PageSize
  637. offset := info.PageSize * (info.Page - 1)
  638. var statisticsLogs []*log.LogComputer
  639. db = db.Limit(limit).Offset(offset)
  640. if order != "" {
  641. var OrderStr string
  642. // 设置有效排序key 防止sql注入
  643. // 感谢 Tom4t0 提交漏洞信息
  644. orderMap := make(map[string]bool, 3)
  645. orderMap["pc_code"] = true
  646. orderMap["game_id"] = true
  647. orderMap["operator"] = true
  648. if orderMap[order] {
  649. if desc {
  650. OrderStr = order + " desc"
  651. } else {
  652. OrderStr = order
  653. }
  654. } else { // didn't matched any order key in `orderMap`
  655. global.GVA_LOG.Error("获取失败!", zap.Error(err))
  656. return statisticsLogs, total, err
  657. }
  658. err = db.Order(OrderStr).Find(&statisticsLogs).Error
  659. } else {
  660. err = db.Order("id").Find(&statisticsLogs).Error
  661. }
  662. if err != nil {
  663. return nil, 0, err
  664. }
  665. var statisticsLogsComputer []*response.ComputerStatisticsReply1
  666. for _, statisticsLog := range statisticsLogs {
  667. /*var gameInfo []*response.GameInfo
  668. err = json.Unmarshal([]byte(statisticsLog.GameInfo), &gameInfo)
  669. for i, _ := range gameInfo {
  670. statisticsLogComputer := new(response.ComputerStatisticsReply1)
  671. statisticsLogComputer.GameInfo = gameInfo
  672. statisticsLogComputer.PcCode = statisticsLog.PcCode
  673. statisticsLogComputer.Operator = statisticsLog.Operator
  674. statisticsLogComputer.CreateDate = statisticsLog.CreateDate[:10]
  675. statisticsLogComputer.GameId = gameInfo[i].GameId
  676. statisticsLogComputer.PullAccountNum = gameInfo[i].PullAccountNum
  677. statisticsLogComputer.TaskSuccessNum = gameInfo[i].TaskSuccessNum
  678. statisticsLogsComputer = append(statisticsLogsComputer, statisticsLogComputer)
  679. }*/
  680. //gameIdStr:=strconv.Itoa(statisticsLog.GameId)
  681. //taskStatistics := s.GameTargetInfo(ctx,s.LogicalLog.CurrentDate(),gameIdStr)
  682. statisticsLogComputer := new(response.ComputerStatisticsReply1)
  683. statisticsLogComputer.PcCode = statisticsLog.PcCode
  684. statisticsLogComputer.Operator = statisticsLog.Operator
  685. statisticsLogComputer.CreateDate = statisticsLog.CreateDate[:10]
  686. statisticsLogComputer.GameId = statisticsLog.GameId
  687. statisticsLogComputer.PullAccountNum = statisticsLog.PullAccountNum
  688. statisticsLogComputer.TaskSuccessNum = statisticsLog.TaskSuccessNum
  689. statisticsLogComputer.TargetNum = statisticsLog.TargetNum
  690. statisticsLogComputer.ComputerFreeTime = statisticsLog.ComputerFreeTime
  691. statisticsLogComputer.ComputerFeeRate = statisticsLog.ComputerFeeRate
  692. statisticsLogComputer.EnterMain = statisticsLog.EnterMain
  693. if isCurrentDate {
  694. statisticsLogComputer.ComputerFeeRate = s.GetStatisticsPcFeeRate(ctx, statisticsLog.PcCode, statisticsLog.GameId)
  695. }
  696. statisticsLogComputer.ComputerHourAverageRate = statisticsLog.ComputerHourAverageRate
  697. statisticsLogsComputer = append(statisticsLogsComputer, statisticsLogComputer)
  698. }
  699. return statisticsLogsComputer, total, err
  700. }
  701. // 在线电脑
  702. func (s *ServiceStatisticsLog) OnlineComputerStatistics(ctx context.Context, api log.LogComputer, info request.PageInfo, order string, desc bool) ([]*response.ComputerUseLogReply, int64, error) {
  703. date := api.CreateDate
  704. if date == "" {
  705. date = s.CurrentDate()
  706. }
  707. db := global.GVA_DB.Model(&log.LogComputer{})
  708. var total int64
  709. db = db.Select("SUM(pull_account_num) pull_account_total,SUM(enter_main) enter_main_total,operator,pc_code,status,create_date")
  710. db = db.Where("create_date = ?", date)
  711. if api.Operator != "" {
  712. db = db.Where("operator = ?", api.Operator)
  713. }
  714. if api.PcCode != "" {
  715. db = db.Where("pc_code = ?", api.PcCode)
  716. }
  717. if api.Status != 0 {
  718. db = db.Where("status = ?", api.Status)
  719. }
  720. db = db.Group("pc_code")
  721. err := db.Count(&total).Error
  722. if err != nil {
  723. return nil, 0, err
  724. }
  725. limit := info.PageSize
  726. offset := info.PageSize * (info.Page - 1)
  727. var statisticsLogs []*response.ComputerUseLogReply
  728. db = db.Limit(limit).Offset(offset)
  729. if order != "" {
  730. var OrderStr string
  731. // 设置有效排序key 防止sql注入
  732. // 感谢 Tom4t0 提交漏洞信息
  733. orderMap := make(map[string]bool, 3)
  734. orderMap["pc_code"] = true
  735. orderMap["operator"] = true
  736. if orderMap[order] {
  737. if desc {
  738. OrderStr = order + " desc"
  739. } else {
  740. OrderStr = order
  741. }
  742. } else { // didn't matched any order key in `orderMap`
  743. global.GVA_LOG.Error("获取失败!", zap.Error(err))
  744. return statisticsLogs, total, err
  745. }
  746. err = db.Order(OrderStr).Find(&statisticsLogs).Error
  747. } else {
  748. err = db.Order("id").Find(&statisticsLogs).Error
  749. }
  750. if err != nil {
  751. return nil, 0, err
  752. }
  753. for _, statisticsLog := range statisticsLogs {
  754. statisticsLog.CreateDate = statisticsLog.CreateDate[:10]
  755. }
  756. return statisticsLogs, total, err
  757. }
  758. //根据游戏id查询数据
  759. func (s *ServiceStatisticsLog) GameStatistics(ctx context.Context, api log.LogComputer, info request.PageInfo) (interface{}, int64, error) {
  760. date := api.CreateDate
  761. isCurrentDate := false
  762. if date == "" {
  763. date = s.CurrentDate()
  764. isCurrentDate = true
  765. }
  766. db := global.GVA_DB.Model(&log.LogComputer{})
  767. var total int64
  768. db = db.Where("create_date = ?", date)
  769. if api.Operator != "" {
  770. db = db.Where("operator = ?", api.Operator)
  771. }
  772. if api.PcCode != "" {
  773. db = db.Where("pc_code = ?", api.PcCode)
  774. }
  775. if api.GameId != 0 {
  776. db = db.Where("game_id = ?", api.GameId)
  777. }
  778. db = db.Select("SUM(task_success_num) task_success_total,count(pc_code) pc_code_total,game_id,create_date,SUM(computer_free_time) computer_free_time_total,SUM(computer_hour_average_rate) computer_hour_average_total,SUM(enter_main) enter_main_total,game_fee_rate,target_num").Group("game_id")
  779. err := db.Count(&total).Error
  780. if err != nil {
  781. return nil, 0, err
  782. }
  783. limit := info.PageSize
  784. offset := info.PageSize * (info.Page - 1)
  785. var statisticsLogsByGameId []*response.GameIdStatisticsReply
  786. db = db.Limit(limit).Offset(offset)
  787. err = db.Order("id").Find(&statisticsLogsByGameId).Error
  788. if err != nil {
  789. return nil, 0, err
  790. }
  791. for _, statisticsLog := range statisticsLogsByGameId {
  792. statisticsLog.CreateDate = statisticsLog.CreateDate[:10]
  793. statisticsLog.OneComputerAverageNum = statisticsLog.TaskSuccessTotal / statisticsLog.PcCodeTotal
  794. if isCurrentDate {
  795. statisticsLog.GameFeeRate = s.GetStatisticsFeeRate(ctx, statisticsLog.GameId)
  796. }
  797. }
  798. return statisticsLogsByGameId, total, err
  799. }
  800. func (s *ServiceStatisticsLog) GameTargetInfo(ctx context.Context, date string, gameId string) (taskStatistics1 request.TaskStatistics) {
  801. key := fmt.Sprintf(taskStatistics, date)
  802. data, err := global.GVA_REDIS.HGet(ctx, key, gameId).Result()
  803. if err != nil {
  804. if err == redis.Nil {
  805. global.GVA_LOG.Info("TaskStatisticsDataCache"+key+gameId, zap.Error(err))
  806. } else {
  807. global.GVA_LOG.Error("添加缓存数据失败TaskStatisticsDataCache"+key, zap.Error(err))
  808. return
  809. }
  810. }
  811. _ = json.Unmarshal([]byte(data), &taskStatistics1)
  812. return
  813. }
  814. // 同步群控任务数据到缓存
  815. func (s *ServiceStatisticsLog) TaskStatisticsDataCache() {
  816. ctx := context.Background()
  817. key := fmt.Sprintf(taskStatistics, s.LogicalLog.CurrentDate())
  818. data, err := s.LogicalLog.RequestJfRoom()
  819. if err != nil {
  820. global.GVA_LOG.Error("获取机房数据失败TaskStatisticsDataCache", zap.Error(err))
  821. return
  822. }
  823. dataTask, err := s.LogicalLog.RequestTaskData()
  824. if err != nil {
  825. global.GVA_LOG.Error("RequestTaskData", zap.Error(err))
  826. return
  827. }
  828. var taskData []request.TaskData
  829. var taskStatistics []request.TaskStatistics
  830. _ = json.Unmarshal(data, &taskStatistics)
  831. _ = json.Unmarshal(dataTask, &taskData)
  832. mps := map[int]request.TaskData{}
  833. for _, td := range taskData {
  834. mps[td.GameId] = td
  835. }
  836. for _, data := range taskStatistics {
  837. var id int
  838. id = data.GameId
  839. if _, ok := mps[id]; ok {
  840. data.NewScanningCode = mps[id].NewScanningCode
  841. data.RetainedPullAccount = mps[id].RetainedPullAccount
  842. data.NewPullAccount = mps[id].NewPullAccount
  843. data.FeeAccountNum = mps[id].FeeAccountNum
  844. data.RetainedAccountNum = mps[id].RetainedAccountNum
  845. }
  846. bd, _ := json.Marshal(data)
  847. err = global.GVA_REDIS.HSet(ctx, key, id, bd).Err()
  848. if err != nil {
  849. global.GVA_LOG.Error("添加缓存数据失败TaskStatisticsDataCache", zap.Error(err))
  850. return
  851. }
  852. }
  853. }
  854. // 同步群控任务数据到缓存
  855. func (s *ServiceStatisticsLog) TaskStatisticsDataCache1() {
  856. ctx := context.Background()
  857. key := fmt.Sprintf(taskStatistics, s.LogicalLog.CurrentDate())
  858. data, err := s.LogicalLog.RequestJfRoom()
  859. if err != nil {
  860. global.GVA_LOG.Error("获取机房数据失败TaskStatisticsDataCache", zap.Error(err))
  861. return
  862. }
  863. dataTask, err := s.LogicalLog.RequestTaskData()
  864. if err != nil {
  865. global.GVA_LOG.Error("RequestTaskData", zap.Error(err))
  866. return
  867. }
  868. var taskData []request.TaskData
  869. var taskStatistics []request.TaskStatistics
  870. _ = json.Unmarshal(data, &taskStatistics)
  871. _ = json.Unmarshal(dataTask, &taskData)
  872. mps := map[int]request.TaskData{}
  873. for _, td := range taskData {
  874. mps[td.GameId] = td
  875. }
  876. for _, data := range taskStatistics {
  877. var id int
  878. if data.GameIdXmy != "" {
  879. if data.GameIdXmy == "0" {
  880. id = data.GameId
  881. } else {
  882. id, _ = strconv.Atoi(data.GameIdXmy)
  883. }
  884. } else {
  885. id = data.GameId
  886. }
  887. if _, ok := mps[id]; ok {
  888. data.NewScanningCode = mps[id].NewScanningCode
  889. data.RetainedPullAccount = mps[id].RetainedPullAccount
  890. data.NewPullAccount = mps[id].NewPullAccount
  891. data.FeeAccountNum = mps[id].FeeAccountNum
  892. data.RetainedAccountNum = mps[id].RetainedAccountNum
  893. }
  894. bd, _ := json.Marshal(data)
  895. err = global.GVA_REDIS.HSet(ctx, key, id, bd).Err()
  896. if err != nil {
  897. global.GVA_LOG.Error("添加缓存数据失败TaskStatisticsDataCache", zap.Error(err))
  898. return
  899. }
  900. }
  901. }
  902. // 同步群控任务数据到缓存
  903. func (s *ServiceStatisticsLog) GetComputerNum(date string) int64 {
  904. var total int64
  905. if date == "" {
  906. date = s.CurrentDate()
  907. }
  908. db := global.GVA_DB.Model(&log.LogComputer{})
  909. db = db.Distinct("pc_code").Where("create_date = ?", date)
  910. _ = db.Count(&total).Error
  911. return total
  912. }
  913. // 在线电脑接口
  914. func (s *ServiceStatisticsLog) ComputerHeartbeat(c context.Context, onlineComputer request.OnlineComputerRequest) error {
  915. err := s.LogicalLog.SetOnlineComputerNumCache(c, s.LogicalLog.CurrentDate(), onlineComputer.PcCode, onlineComputer.Operator)
  916. if err != nil {
  917. return err
  918. }
  919. s.LogicalLog.SetPcReportingLog(c, onlineComputer.PcCode, onlineComputer.Operator)
  920. return err
  921. }
  922. // 在线电脑接口测试
  923. func (s *ServiceStatisticsLog) ComputerTest(c context.Context) (interface{}, error) {
  924. mps, err := s.LogicalLog.GetOnlineComputerNumCache(c, s.LogicalLog.CurrentDate())
  925. if err != nil {
  926. return mps, err
  927. }
  928. return mps, err
  929. }
  930. // 定时检查电脑情况
  931. func (s *ServiceStatisticsLog) RegularCheckPc1() {
  932. ctx := context.Background()
  933. date := s.LogicalLog.CurrentDate()
  934. // 获取当天已上报的电脑数据
  935. onlineComputerMpa, _ := s.LogicalLog.GetOnlineComputerNumCache(ctx, date)
  936. // 获取数据库的数据
  937. var computer log.Computer
  938. computers, err := computer.OnlinePcCodeCache()
  939. if err != nil {
  940. global.GVA_LOG.Error("获取租机表数据失败", zap.Error(err))
  941. }
  942. // 查询两小时内上报的数据
  943. var noReportingPc []string
  944. for pc, _ := range onlineComputerMpa {
  945. num := s.LogicalLog.GetPcReportingLog(ctx, pc)
  946. delete(computers, pc)
  947. if num == 0 {
  948. noReportingPc = append(noReportingPc, pc)
  949. }
  950. }
  951. // 未上报逻辑
  952. var errReportingPc []string
  953. for pc, name := range computers {
  954. if name == "备用" {
  955. continue
  956. }
  957. errReportingPc = append(errReportingPc, pc)
  958. }
  959. var content string
  960. if len(errReportingPc) != 0 {
  961. // 发信息数据群里
  962. content += fmt.Sprintf("异常租机数据<font color=\"warning\">%d台</font>: %s", len(errReportingPc), errReportingPc)
  963. }
  964. if len(noReportingPc) != 0 {
  965. // 发信息数据群里
  966. content += "\n"
  967. content += fmt.Sprintf("两小时内未检测到中控数据<font color=\"warning\">%d台</font>: %s", len(noReportingPc), noReportingPc)
  968. }
  969. if content != "" {
  970. var sendMsg SendMsg
  971. sendMsg.MsgType = "markdown"
  972. sendMsg.Markdown.Content = content
  973. //c ,_ := json.Marshal(sendMsg)
  974. url := global.GVA_CONFIG.SendUrl.ComputerSendUrl
  975. //url := "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=7d095d5b-8240-45fd-a68c-baff3628d83b"
  976. _, err = s.SendMsgData(url, sendMsg)
  977. }
  978. }
  979. // 定时检查电脑情况
  980. func (s *ServiceStatisticsLog) RegularCheckPc() {
  981. ctx := context.Background()
  982. var computer log.Computer
  983. computers, err := computer.OnlinePcCodeCache()
  984. //computersF, err := computer.OnlinePcCodeCache()
  985. if err != nil {
  986. global.GVA_LOG.Error("获取租机表数据失败", zap.Error(err))
  987. }
  988. // 查询两小时内上报的数据
  989. var computersF = map[string]string{}
  990. var noReportingPc []string
  991. for pc, name := range computers {
  992. computersF[pc] = name
  993. if name == "备用" {
  994. delete(computers, pc)
  995. continue
  996. }
  997. num := s.LogicalLog.GetPcReportingLog(ctx, pc)
  998. delete(computers, pc)
  999. if num == 0 {
  1000. noReportingPc = append(noReportingPc, pc)
  1001. }
  1002. }
  1003. var content string
  1004. if len(noReportingPc) != 0 {
  1005. content += fmt.Sprintf("两小时内未检测到中控数据<font color=\"warning\">%d台</font>:", len(noReportingPc))
  1006. for _, pc := range noReportingPc {
  1007. content += "\n"
  1008. name := computersF[pc]
  1009. content += name + " : " + pc
  1010. }
  1011. }
  1012. if content != "" {
  1013. var sendMsg SendMsg
  1014. sendMsg.MsgType = "markdown"
  1015. sendMsg.Markdown.Content = content
  1016. //c ,_ := json.Marshal(sendMsg)
  1017. url := global.GVA_CONFIG.SendUrl.ComputerSendUrl
  1018. //url := "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=7d095d5b-8240-45fd-a68c-baff3628d83b"
  1019. _, err = s.SendMsgData(url, sendMsg)
  1020. }
  1021. }
  1022. type SendMsg struct {
  1023. MsgType string `json:"msgtype"`
  1024. Markdown struct {
  1025. Content string `json:"content"`
  1026. } `json:"markdown"`
  1027. }
  1028. func (s *ServiceStatisticsLog) SendMsgData(url string, params interface{}) (result []byte, err error) {
  1029. result, err = utils.HttpPost(url, params)
  1030. return
  1031. }
  1032. var statusMps = map[int]string{
  1033. -1: "未上报",
  1034. 1: "中控上报",
  1035. 2: "任务上报",
  1036. }
  1037. func (exa *ServiceStatisticsLog) ParseInfoList2Excel(infoList []*response.ComputerUseLogReply, filePath string) error {
  1038. excel := excelize.NewFile()
  1039. excel.SetSheetRow("Sheet1", "A1", &[]string{"电脑编号", "使用者", "日期", "拉取账号", "进入主线", "主线成功率", "使用状态"})
  1040. for i, statisticsLog := range infoList {
  1041. axis := fmt.Sprintf("A%d", i+2)
  1042. var r interface{}
  1043. if statisticsLog.EnterMainTotal != 0 && statisticsLog.PullAccountTotal != 0 {
  1044. r = fmt.Sprintf("%.2f", float64(statisticsLog.EnterMainTotal)/float64(statisticsLog.PullAccountTotal)*100)
  1045. } else {
  1046. r = "0.00"
  1047. }
  1048. excel.SetSheetRow("Sheet1", axis, &[]interface{}{
  1049. statisticsLog.PcCode,
  1050. statisticsLog.Operator,
  1051. statisticsLog.CreateDate[:10],
  1052. statisticsLog.PullAccountTotal,
  1053. statisticsLog.EnterMainTotal,
  1054. r,
  1055. statusMps[statisticsLog.Status],
  1056. })
  1057. }
  1058. err := excel.SaveAs(filePath)
  1059. return err
  1060. }