log_statistics.go 62 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712
  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. "log-server/model/task"
  16. "log-server/model/typeManage"
  17. loging2 "log-server/service/log/loging"
  18. "log-server/utils"
  19. "strconv"
  20. "strings"
  21. "time"
  22. )
  23. type ServiceStatisticsLog struct {
  24. loging2.LogicalLog
  25. Person typeManage.ResponsiblePerson
  26. GameTargetComplete task.GameTargetComplete
  27. }
  28. var StatisticsCompletedKey = "%s:StatisticsCompleted"
  29. var taskStatistics = "%s:taskStatistics"
  30. var ComputerNum = "%s:ComputerNum"
  31. var TaskType = []int{0, 1}
  32. func (s *ServiceStatisticsLog) CreateStatisticsLog() {
  33. key := fmt.Sprintf(StatisticsCompletedKey, s.LogicalLog.CurrentDate())
  34. ctx := context.Background()
  35. b, err := s.LogicalLog.ExistsKey(ctx, key)
  36. if err != nil {
  37. global.GVA_LOG.Error("获取redis key失败!"+key, zap.Error(err))
  38. return
  39. }
  40. if b {
  41. global.GVA_LOG.Info("统计数据已完成!"+key, zap.Error(err))
  42. return
  43. }
  44. gameMps, err := s.LogicalLog.GetGameCache(context.Background(), s.YesterdayDate())
  45. if err != nil {
  46. global.GVA_LOG.Error("获取redis game list失败!", zap.Error(err))
  47. return
  48. }
  49. if len(gameMps) == 0 {
  50. global.GVA_LOG.Info("获取redis game list没有数据!")
  51. return
  52. }
  53. var statisticsLogs []*log.StatisticsLog
  54. for gameId, _ := range gameMps {
  55. for _, tt := range TaskType {
  56. gameIdInt, _ := strconv.Atoi(gameId)
  57. statisticsLogNew := new(log.StatisticsLog)
  58. statisticsLog := s.statisticsData(ctx, gameIdInt, tt, s.LogicalLog.YesterdayDate(), statisticsLogNew)
  59. if !errors.Is(global.GVA_DB.Where("create_date = ?", s.LogicalLog.YesterdayDate()).Where("game_id = ?", gameIdInt).First(&log.StatisticsLog{}).Error, gorm.ErrRecordNotFound) {
  60. // 已存在,跳过
  61. err = global.GVA_DB.Where("game_id", gameIdInt).Where("create_date = ?", s.LogicalLog.YesterdayDate()).Where("type = ?", tt).Updates(statisticsLog).Error
  62. if err != nil {
  63. global.GVA_LOG.Error("update StatisticsLogs失败!", zap.Error(err))
  64. continue
  65. }
  66. continue
  67. }
  68. statisticsLogs = append(statisticsLogs, statisticsLog)
  69. }
  70. }
  71. if len(statisticsLogs) == 0 {
  72. global.GVA_LOG.Info("statisticsLogsGameInfo没有数据!", zap.Error(err))
  73. global.GVA_REDIS.Set(ctx, key, 1, 24*time.Hour)
  74. return
  75. }
  76. err = global.GVA_DB.Create(statisticsLogs).Error
  77. if err != nil {
  78. global.GVA_LOG.Error("添加statisticsLogsGameInfo失败!", zap.Error(err))
  79. return
  80. }
  81. global.GVA_REDIS.Set(ctx, key, 1, 24*time.Hour)
  82. return
  83. }
  84. func (s *ServiceStatisticsLog) TodayCreateStatisticsGameInfoLog() {
  85. date := s.LogicalLog.CurrentDate()
  86. ctx := context.Background()
  87. gameMps, err := s.LogicalLog.GetGameCache(context.Background(), date)
  88. if err != nil {
  89. global.GVA_LOG.Error("获取redis game list失败!", zap.Error(err))
  90. return
  91. }
  92. if len(gameMps) == 0 {
  93. global.GVA_LOG.Info("获取redis game list没有数据!")
  94. return
  95. }
  96. completeTaskData, err := s.CompleteTaskData(date)
  97. if err != nil {
  98. global.GVA_LOG.Error("CompleteTaskData get data fail", zap.Error(err))
  99. return
  100. }
  101. var statisticsLogs []*log.StatisticsLog
  102. for gameId, _ := range gameMps {
  103. for _, tt := range TaskType {
  104. gameIdInt, _ := strconv.Atoi(gameId)
  105. statisticsLogNew := new(log.StatisticsLog)
  106. statisticsLog := s.statisticsData(ctx, gameIdInt, tt, date, statisticsLogNew)
  107. if tt == 0 {
  108. statisticsLog.TargetComplete = completeTaskData[gameIdInt].NewComplete + completeTaskData[gameIdInt].HandNewComplete
  109. } else {
  110. statisticsLog.TargetComplete = completeTaskData[gameIdInt].RetainedComplete + completeTaskData[gameIdInt].HandRetainedComplete - completeTaskData[gameIdInt].NewComplete - completeTaskData[gameIdInt].HandNewComplete
  111. }
  112. if !errors.Is(global.GVA_DB.Where("create_date = ?", date).Where("game_id = ?", gameIdInt).First(&log.StatisticsLog{}).Error, gorm.ErrRecordNotFound) {
  113. // 已存在,跳过
  114. err = global.GVA_DB.Where("game_id", gameIdInt).Where("create_date = ?", date).Where("type = ?", tt).Updates(statisticsLog).Error
  115. if err != nil {
  116. global.GVA_LOG.Error("update StatisticsLogs失败!", zap.Error(err))
  117. continue
  118. }
  119. continue
  120. }
  121. statisticsLogs = append(statisticsLogs, statisticsLog)
  122. if len(statisticsLogs) == 100 {
  123. err = global.GVA_DB.Create(statisticsLogs).Error
  124. if err != nil {
  125. global.GVA_LOG.Error("添加statisticsLogs失败!", zap.Error(err))
  126. return
  127. }
  128. statisticsLogs = []*log.StatisticsLog{}
  129. }
  130. }
  131. }
  132. if len(statisticsLogs) == 0 {
  133. global.GVA_LOG.Info("statisticsLogsGameInfo没有数据!", zap.Error(err))
  134. return
  135. }
  136. err = global.GVA_DB.Create(statisticsLogs).Error
  137. if err != nil {
  138. global.GVA_LOG.Error("添加statisticsLogsGameInfo失败!", zap.Error(err))
  139. return
  140. }
  141. return
  142. }
  143. // 获取任务完成数据
  144. func (s *ServiceStatisticsLog) CompleteTaskData(date string) (mps map[int]task.GameTargetComplete, err error) {
  145. db := global.GVA_DB.Table("game_target_complete")
  146. db = db.Where("create_date = ?", date)
  147. var apiList []task.GameTargetComplete
  148. mps = map[int]task.GameTargetComplete{}
  149. err = db.Order("id desc").Find(&apiList).Error
  150. for _, api := range apiList {
  151. mps[api.TaskId] = api
  152. }
  153. return
  154. }
  155. func (s *ServiceStatisticsLog) TodayStatisticsLogList(ctx context.Context, api log.StatisticsLog, info request.PageInfo) (interface{}, int64, error) {
  156. db := global.GVA_DB.Model(&log.StatisticsLog{})
  157. if api.GameId != 0 {
  158. db = db.Where("game_id = ?", api.GameId)
  159. }
  160. db = db.Where("create_date = ?", s.CurrentDate())
  161. var total int64
  162. err := db.Count(&total).Error
  163. if err != nil {
  164. return nil, 0, err
  165. }
  166. limit := info.PageSize
  167. offset := info.PageSize * (info.Page - 1)
  168. var statisticsLogs []*log.StatisticsLog
  169. var statisticsLogs2 []*log.StatisticsLog
  170. db = db.Limit(limit).Offset(offset)
  171. err = db.Order("id").Find(&statisticsLogs).Error
  172. for _, gameInfo := range statisticsLogs {
  173. tt := gameInfo.Type
  174. gameIdInt := gameInfo.GameId
  175. statisticsLogNew := new(log.StatisticsLog)
  176. statisticsLog := s.statisticsData(ctx, gameIdInt, tt, s.LogicalLog.CurrentDate(), statisticsLogNew)
  177. statisticsLogs2 = append(statisticsLogs2, statisticsLog)
  178. }
  179. return statisticsLogs2, total, err
  180. }
  181. func (s *ServiceStatisticsLog) statisticsData(ctx context.Context, gameIdInt, tt int, date string, statisticsLog *log.StatisticsLog) *log.StatisticsLog {
  182. key := fmt.Sprintf(taskStatistics, date)
  183. gameIdStr := strconv.Itoa(gameIdInt)
  184. data, err := global.GVA_REDIS.HGet(ctx, key, gameIdStr).Result()
  185. if err != nil {
  186. if err == redis.Nil {
  187. global.GVA_LOG.Info("添加缓存数据失败TaskStatisticsDataCache", zap.Error(err))
  188. } else {
  189. global.GVA_LOG.Error("添加缓存数据失败TaskStatisticsDataCache", zap.Error(err))
  190. return nil
  191. }
  192. }
  193. var taskStatistics request.TaskStatistics
  194. _ = json.Unmarshal([]byte(data), &taskStatistics)
  195. pullAccountOk, _ := s.LogicalLog.NodeLogGetNum(ctx, date, gameIdInt, "4100000", loging2.OkStatus, tt)
  196. pullAccountFail, _ := s.LogicalLog.NodeLogGetNum(ctx, date, gameIdInt, "4100000", loging2.FailStatus, tt)
  197. ConstituencyFail, _ := s.LogicalLog.TypeLogGetNum(ctx, date, gameIdInt, "4604000", loging2.FailStatus, tt)
  198. ConstituencyOk, _ := s.LogicalLog.TypeLogGetNum(ctx, date, gameIdInt, "4604000", loging2.OkStatus, tt)
  199. StartProxyFail, _ := s.LogicalLog.NodeLogGetNum(ctx, date, gameIdInt, "4200000", loging2.FailStatus, tt)
  200. StartProxyOk, _ := s.LogicalLog.NodeLogGetNum(ctx, date, gameIdInt, "4200000", loging2.OkStatus, tt)
  201. SimulatorStartFail, _ := s.LogicalLog.NodeLogGetNum(ctx, date, gameIdInt, "4300000", loging2.FailStatus, tt)
  202. SimulatorStartOk, _ := s.LogicalLog.NodeLogGetNum(ctx, date, gameIdInt, "4300000", loging2.OkStatus, tt)
  203. NetworkCheckFail, _ := s.LogicalLog.NodeLogGetNum(ctx, date, gameIdInt, "4400000", loging2.FailStatus, tt)
  204. NetworkCheckOk, _ := s.LogicalLog.NodeLogGetNum(ctx, date, gameIdInt, "4400000", loging2.OkStatus, tt)
  205. GameStartFail, _ := s.LogicalLog.NodeLogGetNum(ctx, date, gameIdInt, "4500000", loging2.FailStatus, tt)
  206. GameStartOk, _ := s.LogicalLog.NodeLogGetNum(ctx, date, gameIdInt, "4500000", loging2.OkStatus, tt)
  207. xmyLoginFail, _ := s.LogicalLog.TypeLogGetNum(ctx, date, gameIdInt, "4601000", loging2.FailStatus, tt)
  208. xmyLoginOk, _ := s.LogicalLog.TypeLogGetNum(ctx, date, gameIdInt, "4601000", loging2.OkStatus, tt)
  209. wxLoginFail, _ := s.LogicalLog.TypeLogGetNum(ctx, date, gameIdInt, "4602000", loging2.FailStatus, tt)
  210. wxLoginOk, _ := s.LogicalLog.TypeLogGetNum(ctx, date, gameIdInt, "4602000", loging2.OkStatus, tt)
  211. mzLoginFail, _ := s.LogicalLog.TypeLogGetNum(ctx, date, gameIdInt, "4603000", loging2.FailStatus, tt)
  212. mzLoginOk, _ := s.LogicalLog.TypeLogGetNum(ctx, date, gameIdInt, "4603000", loging2.OkStatus, tt)
  213. LoginFail := xmyLoginFail + wxLoginFail + mzLoginFail
  214. LoginOk := xmyLoginOk + wxLoginOk + mzLoginOk
  215. EnterMainFail, _ := s.LogicalLog.NodeLogGetNum(ctx, date, gameIdInt, "4700000", loging2.FailStatus, tt)
  216. EnterMainOk, _ := s.LogicalLog.NodeLogGetNum(ctx, date, gameIdInt, "4700000", loging2.OkStatus, tt)
  217. FeeFail, _ := s.LogicalLog.NodeLogGetNum(ctx, date, gameIdInt, "4800000", loging2.FailStatus, tt)
  218. FeeOk, _ := s.LogicalLog.NodeLogGetNum(ctx, date, gameIdInt, "4800000", loging2.OkStatus, tt)
  219. ScriptStartFail, _ := s.LogicalLog.NodeLogGetNum(ctx, date, gameIdInt, "4300000", loging2.FailStatus, tt)
  220. ScriptStartOk, _ := s.LogicalLog.NodeLogGetNum(ctx, date, gameIdInt, "4300000", loging2.OkStatus, tt)
  221. EnterGameFail, _ := s.LogicalLog.TypeLogGetNum(ctx, date, gameIdInt, "4605000", loging2.FailStatus, tt)
  222. EnterGameOk, _ := s.LogicalLog.TypeLogGetNum(ctx, date, gameIdInt, "4605000", loging2.OkStatus, tt)
  223. AuthenticationFail, _ := s.LogicalLog.TypeLogGetNum(ctx, date, gameIdInt, "4607000", loging2.FailStatus, tt)
  224. AuthenticationOk, _ := s.LogicalLog.TypeLogGetNum(ctx, date, gameIdInt, "4607000", loging2.OkStatus, tt)
  225. EnterStartGame, _ := s.LogicalLog.CodeLogGetNum(ctx, date, gameIdInt, "4501000", loging2.NoLogStatus, tt)
  226. EnterAuthentication, _ := s.LogicalLog.CodeLogGetNum(ctx, date, gameIdInt, "4607000", loging2.NoLogStatus, tt)
  227. EnterConstituency, _ := s.LogicalLog.CodeLogGetNum(ctx, date, gameIdInt, "4604000", loging2.NoLogStatus, tt)
  228. EnterGame, _ := s.LogicalLog.CodeLogGetNum(ctx, date, gameIdInt, "4605000", loging2.NoLogStatus, tt)
  229. EnterMain, _ := s.LogicalLog.CodeLogGetNum(ctx, date, gameIdInt, "4701000", loging2.NoLogStatus, tt)
  230. EnterFee, _ := s.LogicalLog.CodeLogGetNum(ctx, date, gameIdInt, "4800000", loging2.NoLogStatus, tt)
  231. EnterXmyLogin, _ := s.LogicalLog.CodeLogGetNum(ctx, date, gameIdInt, "4601000", loging2.NoLogStatus, tt)
  232. EnterWxLogin, _ := s.LogicalLog.CodeLogGetNum(ctx, date, gameIdInt, "4602000", loging2.NoLogStatus, tt)
  233. EnterMzLogin, _ := s.LogicalLog.CodeLogGetNum(ctx, date, gameIdInt, "4603000", loging2.NoLogStatus, tt)
  234. BanOff1, _ := s.LogicalLog.CodeLogGetNum(ctx, date, gameIdInt, "4601006", loging2.FailStatus, tt) // 小绵羊登录封号
  235. BanOff2, _ := s.LogicalLog.CodeLogGetNum(ctx, date, gameIdInt, "4602008", loging2.FailStatus, tt) // 微信登录封号
  236. BanOff3, _ := s.LogicalLog.CodeLogGetNum(ctx, date, gameIdInt, "4603006", loging2.FailStatus, tt) // 魅族登录封号
  237. BanOff4, _ := s.LogicalLog.CodeLogGetNum(ctx, date, gameIdInt, "4701003", loging2.FailStatus, tt) // 主线封号
  238. Freeze, _ := s.LogicalLog.CodeLogGetNum(ctx, date, gameIdInt, "4809904", loging2.NoLogStatus, tt) // 冻结
  239. BanOff := BanOff1 + BanOff2 + BanOff3 + BanOff4
  240. EnterLogin := EnterXmyLogin + EnterMzLogin + EnterWxLogin
  241. EnterScanningCode, _ := s.LogicalLog.CodeLogGetNum(ctx, date, gameIdInt, "4608000", loging2.NoLogStatus, tt)
  242. TranscodingFail, _ := s.LogicalLog.CodeLogGetNum(ctx, date, gameIdInt, "4608001", loging2.FailStatus, tt)
  243. ThirdPartyFail, _ := s.LogicalLog.CodeLogGetNum(ctx, date, gameIdInt, "4608002", loging2.FailStatus, tt)
  244. ScanningCodeSuccess, _ := s.LogicalLog.CodeLogGetNum(ctx, date, gameIdInt, "4608099", loging2.OkStatus, tt)
  245. //statisticsLog.NewHaveRole, _ = s.LogicalLog.CodeLogGetNum(ctx, date, gameIdInt, "4604004", loging2.NoLogStatus, tt) // 新增有角色
  246. //statisticsLog.RetainedNotRole, _ = s.LogicalLog.CodeLogGetNum(ctx, date, gameIdInt, "4604003", loging2.NoLogStatus, tt) // 留存无角色
  247. statisticsLog.PullAccountOk = pullAccountOk
  248. statisticsLog.PullAccountFail = pullAccountFail
  249. statisticsLog.StartProxyFail = StartProxyFail
  250. statisticsLog.StartProxyOk = StartProxyOk
  251. statisticsLog.SimulatorStartFail = SimulatorStartFail
  252. statisticsLog.SimulatorStartOk = SimulatorStartOk
  253. statisticsLog.NetworkCheckFail = NetworkCheckFail
  254. statisticsLog.NetworkCheckOk = NetworkCheckOk
  255. statisticsLog.EnterMainFail = EnterMainFail
  256. statisticsLog.EnterMainOk = EnterMainOk
  257. statisticsLog.EnterGameFail = EnterGameFail
  258. statisticsLog.EnterGameOk = EnterGameOk
  259. statisticsLog.GameId = gameIdInt
  260. statisticsLog.ConstituencyFail = ConstituencyFail
  261. statisticsLog.ConstituencyOk = ConstituencyOk
  262. statisticsLog.FeeFail = FeeFail
  263. statisticsLog.FeeOk = FeeOk
  264. statisticsLog.GameStartFail = GameStartFail
  265. statisticsLog.GameStartOk = GameStartOk
  266. statisticsLog.LoginFail = LoginFail
  267. statisticsLog.LoginOk = LoginOk
  268. statisticsLog.XmyLoginFail = xmyLoginFail
  269. statisticsLog.XmyLoginOk = xmyLoginOk
  270. statisticsLog.WxLoginFail = wxLoginFail
  271. statisticsLog.WxLoginOk = wxLoginOk
  272. statisticsLog.MzLoginFail = mzLoginFail
  273. statisticsLog.MzLoginOk = mzLoginOk
  274. statisticsLog.ScriptStartFail = ScriptStartFail
  275. statisticsLog.ScriptStartOk = ScriptStartOk
  276. statisticsLog.AuthenticationFail = AuthenticationFail
  277. statisticsLog.AuthenticationOk = AuthenticationOk
  278. statisticsLog.EnterStartGame = EnterStartGame
  279. statisticsLog.EnterAuthentication = EnterAuthentication
  280. statisticsLog.EnterConstituency = EnterConstituency
  281. statisticsLog.EnterGame = EnterGame
  282. statisticsLog.EnterMain = EnterMain
  283. statisticsLog.EnterFee = EnterFee
  284. statisticsLog.EnterLogin = EnterLogin
  285. statisticsLog.BanOff = BanOff
  286. statisticsLog.Freeze = Freeze
  287. statisticsLog.Type = tt
  288. statisticsLog.CreateTime = time.Now().Format("2006-01-02 15:04:05")
  289. statisticsLog.CreateDate = date
  290. statisticsLog.EnterScanningCode = EnterScanningCode
  291. statisticsLog.ThirdPartyFail = ThirdPartyFail
  292. statisticsLog.TranscodingFail = TranscodingFail
  293. statisticsLog.ScanningCodeSuccess = ScanningCodeSuccess
  294. if tt == 1 {
  295. statisticsLog.NotRole, _ = s.LogicalLog.CodeLogGetNum(ctx, date, gameIdInt, "4609901", loging2.NoLogStatus, tt)
  296. statisticsLog.HasRole = 0
  297. statisticsLog.IssuedAccount = taskStatistics.RetainedPullAccount
  298. statisticsLog.TargetNum = taskStatistics.RetainedTarget
  299. statisticsLog.TargetCompleteNum = taskStatistics.RetainedComplete
  300. //statisticsLog.ScanningSuccessRate = 0
  301. } else {
  302. statisticsLog.NotRole = 0
  303. statisticsLog.HasRole, _ = s.LogicalLog.CodeLogGetNum(ctx, date, gameIdInt, "4609902", loging2.NoLogStatus, tt)
  304. statisticsLog.IssuedAccount = taskStatistics.NewPullAccount
  305. statisticsLog.TargetCompleteNum = taskStatistics.NewComplete
  306. statisticsLog.TargetNum = taskStatistics.NewTarget
  307. statisticsLog.NewScanningCode = taskStatistics.NewScanningCode
  308. //if statisticsLog.NewScanningCode != 0 {
  309. // statisticsLog.ScanningSuccessRate = float64(statisticsLog.TargetNum) / float64(statisticsLog.NewScanningCode) * 100
  310. //}
  311. }
  312. if statisticsLog.ScanningCodeSuccess != 0 && statisticsLog.EnterScanningCode != 0 {
  313. statisticsLog.ScanningSuccessRate, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", float64(statisticsLog.ScanningCodeSuccess)/float64(statisticsLog.EnterScanningCode)*100), 64)
  314. }
  315. statisticsLog.PayComplete = taskStatistics.PayComplete
  316. statisticsLog.PayTarget = taskStatistics.PayTarget
  317. statisticsLog.OrderCreate = taskStatistics.OrderCreate
  318. statisticsLog.OrderSuccess = taskStatistics.OrderSuccess
  319. statisticsLog.RetainedAccountNum = taskStatistics.RetainedAccountNum
  320. statisticsLog.FeeAccountNum = taskStatistics.FeeAccountNum
  321. statisticsLog.Operator = taskStatistics.Remark
  322. statisticsLog.GameName = taskStatistics.GameName
  323. if statisticsLog.IssuedAccount != 0 {
  324. statisticsLog.PullSuccessRate = float64(statisticsLog.PullAccountOk) / float64(statisticsLog.IssuedAccount) * 100
  325. }
  326. if statisticsLog.PullAccountOk != 0 {
  327. statisticsLog.StartSuccessRate = float64(statisticsLog.SimulatorStartOk) / float64(statisticsLog.PullAccountOk) * 100
  328. }
  329. if statisticsLog.GameStartOk != 0 {
  330. statisticsLog.MainSuccessRate = float64(statisticsLog.EnterMain) / float64(statisticsLog.GameStartOk) * 100
  331. }
  332. if statisticsLog.TargetNum != 0 {
  333. statisticsLog.TaskSuccessRate = float64(statisticsLog.EnterMain) / float64(statisticsLog.TargetNum) * 100
  334. }
  335. if statisticsLog.OrderCreate != 0 {
  336. statisticsLog.LocalOrderSuccessRate = float64(statisticsLog.FeeOk) / float64(statisticsLog.OrderCreate) * 100
  337. }
  338. return statisticsLog
  339. }
  340. func (s *ServiceStatisticsLog) OtherStatisticsLogList(ctx context.Context, api log.StatisticsLog, info request.PageInfo, order string, desc bool, gamePortId int) (interface{}, int64, error) {
  341. date := api.CreateDate
  342. if date == "" {
  343. date = s.CurrentDate()
  344. }
  345. db := global.GVA_DB.Table("log_statistics gtc")
  346. db = db.Joins("left join game_task gt on gt.task_id = gtc.game_id")
  347. if api.GameId != 0 {
  348. db = db.Where("gtc.game_id = ?", api.GameId)
  349. }
  350. db = db.Where("gtc.create_date = ?", date)
  351. if gamePortId != 0 {
  352. db = db.Where("gt.game_port_id = ?", gamePortId)
  353. }
  354. var total int64
  355. err := db.Count(&total).Error
  356. db = db.Select("gtc.*")
  357. if err != nil {
  358. return nil, 0, err
  359. }
  360. limit := info.PageSize
  361. offset := info.PageSize * (info.Page - 1)
  362. var statisticsLogs []*log.StatisticsLog
  363. db = db.Limit(limit).Offset(offset)
  364. if order != "" {
  365. var OrderStr string
  366. // 设置有效排序key 防止sql注入
  367. // 感谢 Tom4t0 提交漏洞信息
  368. orderMap := make(map[string]bool, 7)
  369. orderMap["pull_success_rate"] = true
  370. orderMap["start_success_rate"] = true
  371. orderMap["main_success_rate"] = true
  372. orderMap["task_success_rate"] = true
  373. orderMap["scanning_success_rate"] = true
  374. orderMap["local_order_success_rate"] = true
  375. orderMap["game_id"] = true
  376. if orderMap[order] {
  377. if desc {
  378. OrderStr = "gtc." + order + " desc"
  379. } else {
  380. OrderStr = "gtc." + order
  381. }
  382. } else { // didn't matched any order key in `orderMap`
  383. global.GVA_LOG.Error("获取失败!", zap.Error(err))
  384. return statisticsLogs, total, err
  385. }
  386. err = db.Order(OrderStr).Find(&statisticsLogs).Error
  387. } else {
  388. err = db.Order("gtc.id").Find(&statisticsLogs).Error
  389. }
  390. if err != nil {
  391. return nil, 0, err
  392. }
  393. for _, statisticsLog := range statisticsLogs {
  394. statisticsLog.CreateDate = statisticsLog.CreateDate[:10]
  395. }
  396. return statisticsLogs, total, err
  397. }
  398. func (s *ServiceStatisticsLog) StatisticsNodeLogList(ctx context.Context, api log.StatisticsLog, info request.PageInfo, order string, desc bool) (interface{}, int64, error) {
  399. date := api.CreateDate
  400. if date == "" || date == s.CurrentDate() {
  401. apilist, total, err := s.TodayStatisticsLogList(ctx, api, info)
  402. return apilist, total, err
  403. }
  404. db := global.GVA_DB.Model(&log.StatisticsLog{})
  405. if api.GameId != 0 {
  406. db = db.Where("game_id = ?", api.GameId)
  407. }
  408. db = db.Where("create_date = ?", date)
  409. var total int64
  410. err := db.Count(&total).Error
  411. if err != nil {
  412. return nil, 0, err
  413. }
  414. limit := info.PageSize
  415. offset := info.PageSize * (info.Page - 1)
  416. var statisticsLogs []*log.StatisticsLog
  417. db = db.Limit(limit).Offset(offset)
  418. err = db.Order("id").Find(&statisticsLogs).Error
  419. if err != nil {
  420. return nil, 0, err
  421. }
  422. for _, statisticsLog := range statisticsLogs {
  423. statisticsLog.CreateDate = statisticsLog.CreateDate[:10]
  424. }
  425. return statisticsLogs, total, err
  426. }
  427. //func (s *ServiceStatisticsLog) ResetStatisticsLog(ctx context.Context, gameId int, date string) {
  428. // var total int64
  429. // key := date + ":" + strconv.Itoa(gameId) + ":reset"
  430. // global.GVA_REDIS.Set(ctx, key, 1, time.Minute*15)
  431. // db := global.GVA_DB.Table("loging")
  432. // db = db.Where("game_id = ?", gameId)
  433. // err := db.Count(&total).Error
  434. // if err != nil {
  435. // global.GVA_LOG.Error("重置统计数据总数报错", zap.Error(err))
  436. // return
  437. // }
  438. // limit := 100
  439. // num := int(math.Ceil(float64(total) / float64(limit)))
  440. // offset := 0
  441. // err = s.LogicalLog.DelStatisticsNumCache(ctx, date, gameId)
  442. // if err != nil {
  443. // global.GVA_LOG.Error("重置统计数据删除缓存报错", zap.Error(err))
  444. // return
  445. // }
  446. // err = s.LogicalLog.DelUuidCodeCache(ctx, date, gameId)
  447. // if err != nil {
  448. // global.GVA_LOG.Error("重置统计数据删除缓存报错2", zap.Error(err))
  449. // return
  450. // }
  451. // global.GVA_LOG.Info("num = " + strconv.Itoa(num))
  452. // for i := 0; i < num; i++ {
  453. // global.GVA_LOG.Info("offset = " + strconv.Itoa(offset))
  454. // var statisticsLogs []request.AddLogRequest
  455. // db2 := global.GVA_DB.Table("loging")
  456. // db2 = db2.Where("create_date = ?", date)
  457. // db2 = db2.Where("game_id = ?", gameId)
  458. // db2 = db2.Limit(limit).Offset(offset)
  459. // err = db2.Order("id").Find(&statisticsLogs).Error
  460. // for _, statisticsLog := range statisticsLogs {
  461. //
  462. // s.ResetStatisticsCache(ctx, statisticsLog, date)
  463. // }
  464. // offset += limit
  465. // }
  466. // global.GVA_LOG.Info("重置统计数据完成")
  467. //}
  468. //
  469. //func (s *ServiceStatisticsLog) ResetStatisticsCache(c context.Context, api request.AddLogRequest, date string) {
  470. // coding := strconv.Itoa(api.Coding)
  471. // nodeCoding := coding[:3]
  472. // status := coding[5:]
  473. // noLogStatus := coding[3:5]
  474. // var logical ServiceResetLoging
  475. // switch nodeCoding {
  476. // case "410":
  477. // logical = new(loging2.ResetLog)
  478. // break
  479. // case "430":
  480. // logical = new(loging2.ResetLog)
  481. // break
  482. // default:
  483. // logical = new(loging2.ResetOtherLog)
  484. // break
  485. // }
  486. // var err error
  487. // if status == "99" {
  488. // err = logical.SuccessLog(c, api, date)
  489. // } else if noLogStatus == "99" {
  490. // err = logical.NoLogStatusData(c, api, date)
  491. // } else {
  492. // err = logical.FailLog(c, api, date)
  493. // }
  494. // if err != nil {
  495. // global.GVA_LOG.Error("创建失败!", zap.Error(err))
  496. // }
  497. //}
  498. // 每天凌晨reset统计数据
  499. //func (s *ServiceStatisticsLog) EveryDayResetStatisticsCache() {
  500. // date := s.YesterdayDate()
  501. // ctx := context.Background()
  502. // gameMps, err := s.LogicalLog.GetGameCache(ctx, date)
  503. // if err != nil {
  504. // global.GVA_LOG.Error("获取redis game list失败!", zap.Error(err))
  505. // return
  506. // }
  507. // if len(gameMps) == 0 {
  508. // global.GVA_LOG.Info("获取redis game list没有数据!")
  509. // return
  510. // }
  511. // for gameId, _ := range gameMps {
  512. // id, _ := strconv.Atoi(gameId)
  513. // s.ResetStatisticsLog(ctx, id, date)
  514. // }
  515. // global.GVA_LOG.Info("游戏重置缓存完成!")
  516. //}
  517. // 添加和更新电脑指标数据
  518. func (s *ServiceStatisticsLog) CreateComputerStatisticsData() {
  519. ctx := context.Background()
  520. codeMps, err := s.LogicalLog.GetComputerCache(ctx, s.LogicalLog.CurrentDate())
  521. if err != nil {
  522. return
  523. }
  524. if len(codeMps) == 0 {
  525. return
  526. }
  527. key := fmt.Sprintf(taskStatistics, s.LogicalLog.CurrentDate())
  528. onlineComputerMpa, _ := s.LogicalLog.GetOnlineComputerNumCache(ctx, s.LogicalLog.CurrentDate())
  529. var computer log.Computer
  530. computerData, _ := computer.OnlinePcCodeCache()
  531. if computerData == nil {
  532. global.GVA_LOG.Warn("电脑缓存数据获取失败TaskStatisticsDataCache")
  533. return
  534. }
  535. var csReplys []*log.LogComputer
  536. for code, _ := range codeMps {
  537. // 不统计不在电脑列表里的
  538. if _, ok := computerData[code]; !ok {
  539. continue
  540. }
  541. // 负责人为空的不统计
  542. if computerData[code] == "" {
  543. continue
  544. }
  545. accountMps, err := s.LogicalLog.GetComputerPullAccountNumCache(ctx, s.LogicalLog.CurrentDate(), code)
  546. if err != nil {
  547. continue
  548. }
  549. taskMps, err := s.LogicalLog.GetComputerTaskSuccessNumCache(ctx, s.LogicalLog.CurrentDate(), code)
  550. if err != nil {
  551. continue
  552. }
  553. enterMainMps, err := s.LogicalLog.GetComputerEnterMainNumCache(ctx, s.LogicalLog.CurrentDate(), code)
  554. if err != nil {
  555. continue
  556. }
  557. operator := computerData[code]
  558. delete(computerData, code)
  559. for gameId, num := range accountMps {
  560. csReply := new(log.LogComputer)
  561. csReply.PcCode = code
  562. if _, ok := onlineComputerMpa[csReply.PcCode]; ok {
  563. delete(onlineComputerMpa, csReply.PcCode)
  564. }
  565. csReply.Operator = operator
  566. data, err := global.GVA_REDIS.HGet(ctx, key, gameId).Result()
  567. if err != nil {
  568. if err == redis.Nil {
  569. global.GVA_LOG.Info("添加缓存数据失败TaskStatisticsDataCache", zap.Error(err))
  570. } else {
  571. global.GVA_LOG.Error("添加缓存数据失败TaskStatisticsDataCache", zap.Error(err))
  572. return
  573. }
  574. }
  575. var taskStatistics request.TaskStatistics
  576. _ = json.Unmarshal([]byte(data), &taskStatistics)
  577. csReply.GameId, _ = strconv.Atoi(gameId)
  578. csReply.PullAccountNum = num
  579. csReply.TaskSuccessNum = taskMps[gameId]
  580. csReply.EnterMain = enterMainMps[gameId]
  581. csReply.CreateDate = time.Now().Format("2006-01-02")
  582. csReply.TargetNum = taskStatistics.NewTarget + taskStatistics.RetainedTarget
  583. csReply.ComputerFeeRate = s.GetStatisticsPcFeeRate(ctx, csReply.PcCode, csReply.GameId)
  584. csReply.ComputerFreeTime = s.GetStatisticsComputerRate(ctx, csReply.PcCode)
  585. csReply.GameFeeRate = s.GetStatisticsFeeRate(ctx, csReply.GameId)
  586. runTime := time.Now().Hour() + 1 - csReply.ComputerFreeTime
  587. csReply.ComputerHourAverageRate = csReply.TaskSuccessNum / runTime
  588. csReply.Status = 2
  589. global.GVA_DB.Where("create_date = ?", csReply.CreateDate).Where("pc_code = ?", csReply.PcCode).Where("game_id = ?", 0).Delete(&log.LogComputer{})
  590. if !errors.Is(global.GVA_DB.Where("create_date = ?", csReply.CreateDate).Where("pc_code = ?", csReply.PcCode).Where("game_id = ?", gameId).First(&log.LogComputer{}).Error, gorm.ErrRecordNotFound) {
  591. // 已存在,更新
  592. mp := make(map[string]interface{})
  593. if csReply.Operator != "" {
  594. mp["operator"] = csReply.Operator
  595. }
  596. mp["target_num"] = taskStatistics.NewTarget + taskStatistics.RetainedTarget
  597. mp["pull_account_num"] = num
  598. mp["task_success_num"] = taskMps[gameId]
  599. mp["computer_fee_rate"] = csReply.ComputerFeeRate
  600. mp["computer_free_time"] = csReply.ComputerFreeTime
  601. mp["game_fee_rate"] = csReply.GameFeeRate
  602. mp["computer_hour_average_rate"] = csReply.ComputerHourAverageRate
  603. mp["enter_main"] = csReply.EnterMain
  604. err = global.GVA_DB.Table("log_computer").Where("create_date = ?", csReply.CreateDate).Where("pc_code = ?", csReply.PcCode).Where("game_id = ?", gameId).Updates(mp).Error
  605. if err != nil {
  606. global.GVA_LOG.Error("更新数据失败", zap.Error(err))
  607. }
  608. continue
  609. }
  610. csReplys = append(csReplys, csReply)
  611. }
  612. }
  613. if len(csReplys) != 0 {
  614. err = global.GVA_DB.Table("log_computer").Create(csReplys).Error
  615. if err != nil {
  616. global.GVA_LOG.Error("更新数据失败", zap.Error(err))
  617. }
  618. }
  619. // 在线电脑没有跑数据记录
  620. if len(onlineComputerMpa) != 0 {
  621. var onlineComputer []*log.LogComputer
  622. for pcCode, op := range onlineComputerMpa {
  623. delete(computerData, pcCode)
  624. csReply := new(log.LogComputer)
  625. csReply.PcCode = pcCode
  626. csReply.Operator = op
  627. csReply.CreateDate = time.Now().Format("2006-01-02")
  628. csReply.Status = 1
  629. if !errors.Is(global.GVA_DB.Where("create_date = ?", csReply.CreateDate).Where("pc_code = ?", csReply.PcCode).First(&log.LogComputer{}).Error, gorm.ErrRecordNotFound) {
  630. 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) {
  631. err = global.GVA_DB.Table("log_computer").Where("create_date = ?", csReply.CreateDate).Where("pc_code = ?", csReply.PcCode).Update("status", 1).Error
  632. if err != nil {
  633. global.GVA_LOG.Error("更新数据失败onlineComputerMpa", zap.Error(err))
  634. }
  635. }
  636. continue
  637. }
  638. onlineComputer = append(onlineComputer, csReply)
  639. }
  640. if len(onlineComputer) != 0 {
  641. err = global.GVA_DB.Table("log_computer").Create(onlineComputer).Error
  642. if err != nil {
  643. global.GVA_LOG.Error("更新数据失败", zap.Error(err))
  644. }
  645. }
  646. }
  647. // 没记录电脑数据
  648. if len(computerData) != 0 {
  649. var onlineComputer []*log.LogComputer
  650. for pcCode, op := range computerData {
  651. csReply := new(log.LogComputer)
  652. csReply.PcCode = pcCode
  653. csReply.Operator = op
  654. csReply.CreateDate = time.Now().Format("2006-01-02")
  655. csReply.Status = -1
  656. if !errors.Is(global.GVA_DB.Where("create_date = ?", csReply.CreateDate).Where("pc_code = ?", csReply.PcCode).First(&log.LogComputer{}).Error, gorm.ErrRecordNotFound) {
  657. continue
  658. }
  659. onlineComputer = append(onlineComputer, csReply)
  660. }
  661. if len(onlineComputer) != 0 {
  662. err = global.GVA_DB.Table("log_computer").Create(onlineComputer).Error
  663. if err != nil {
  664. global.GVA_LOG.Error("更新数据失败", zap.Error(err))
  665. }
  666. }
  667. }
  668. return
  669. }
  670. func (s *ServiceStatisticsLog) ComputerStatistics(ctx context.Context, api log.LogComputer, info request.PageInfo, order string, desc bool) (statisticsLogsComputer []*response.ComputerStatisticsReply1, total int64, err error) {
  671. date := api.CreateDate
  672. isCurrentDate := false
  673. if date == "" {
  674. date = s.CurrentDate()
  675. isCurrentDate = true
  676. }
  677. db := global.GVA_DB.Model(&log.LogComputer{})
  678. db = db.Where("create_date = ?", date)
  679. if api.Operator != "" {
  680. db = db.Where("operator = ?", api.Operator)
  681. }
  682. if api.PcCode != "" {
  683. db = db.Where("pc_code = ?", api.PcCode)
  684. }
  685. if api.GameId != 0 {
  686. db = db.Where("game_id = ?", api.GameId)
  687. }
  688. err = db.Count(&total).Error
  689. if err != nil {
  690. return nil, 0, err
  691. }
  692. limit := info.PageSize
  693. offset := info.PageSize * (info.Page - 1)
  694. var statisticsLogs []*log.LogComputer
  695. db = db.Limit(limit).Offset(offset)
  696. if order != "" {
  697. var OrderStr string
  698. // 设置有效排序key 防止sql注入
  699. // 感谢 Tom4t0 提交漏洞信息
  700. orderMap := make(map[string]bool, 3)
  701. orderMap["pc_code"] = true
  702. orderMap["game_id"] = true
  703. orderMap["operator"] = true
  704. if orderMap[order] {
  705. if desc {
  706. OrderStr = order + " desc"
  707. } else {
  708. OrderStr = order
  709. }
  710. } else { // didn't matched any order key in `orderMap`
  711. global.GVA_LOG.Error("获取失败!", zap.Error(err))
  712. return statisticsLogsComputer, total, err
  713. }
  714. err = db.Order(OrderStr).Find(&statisticsLogs).Error
  715. } else {
  716. err = db.Order("id").Find(&statisticsLogs).Error
  717. }
  718. if err != nil {
  719. return nil, 0, err
  720. }
  721. for _, statisticsLog := range statisticsLogs {
  722. /*var gameInfo []*response.GameInfo
  723. err = json.Unmarshal([]byte(statisticsLog.GameInfo), &gameInfo)
  724. for i, _ := range gameInfo {
  725. statisticsLogComputer := new(response.ComputerStatisticsReply1)
  726. statisticsLogComputer.GameInfo = gameInfo
  727. statisticsLogComputer.PcCode = statisticsLog.PcCode
  728. statisticsLogComputer.Operator = statisticsLog.Operator
  729. statisticsLogComputer.CreateDate = statisticsLog.CreateDate[:10]
  730. statisticsLogComputer.GameId = gameInfo[i].GameId
  731. statisticsLogComputer.PullAccountNum = gameInfo[i].PullAccountNum
  732. statisticsLogComputer.TaskSuccessNum = gameInfo[i].TaskSuccessNum
  733. statisticsLogsComputer = append(statisticsLogsComputer, statisticsLogComputer)
  734. }*/
  735. //gameIdStr:=strconv.Itoa(statisticsLog.GameId)
  736. //taskStatistics := s.GameTargetInfo(ctx,s.LogicalLog.CurrentDate(),gameIdStr)
  737. statisticsLogComputer := new(response.ComputerStatisticsReply1)
  738. statisticsLogComputer.PcCode = statisticsLog.PcCode
  739. statisticsLogComputer.Operator = statisticsLog.Operator
  740. statisticsLogComputer.CreateDate = statisticsLog.CreateDate[:10]
  741. statisticsLogComputer.GameId = statisticsLog.GameId
  742. statisticsLogComputer.PullAccountNum = statisticsLog.PullAccountNum
  743. statisticsLogComputer.TaskSuccessNum = statisticsLog.TaskSuccessNum
  744. statisticsLogComputer.TargetNum = statisticsLog.TargetNum
  745. statisticsLogComputer.ComputerFreeTime = statisticsLog.ComputerFreeTime
  746. statisticsLogComputer.ComputerFeeRate = statisticsLog.ComputerFeeRate
  747. statisticsLogComputer.EnterMain = statisticsLog.EnterMain
  748. if isCurrentDate {
  749. statisticsLogComputer.ComputerFeeRate = s.GetStatisticsPcFeeRate(ctx, statisticsLog.PcCode, statisticsLog.GameId)
  750. }
  751. statisticsLogComputer.ComputerHourAverageRate = statisticsLog.ComputerHourAverageRate
  752. statisticsLogsComputer = append(statisticsLogsComputer, statisticsLogComputer)
  753. }
  754. return statisticsLogsComputer, total, err
  755. }
  756. // OnlineComputerStatistics 在线电脑
  757. func (s *ServiceStatisticsLog) OnlineComputerStatistics(ctx context.Context, api log.LogComputer, info request.PageInfo, order string, desc bool) ([]*response.ComputerUseLogReply, int64, error) {
  758. date := api.CreateDate
  759. if date == "" {
  760. date = s.CurrentDate()
  761. }
  762. db := global.GVA_DB.Model(&log.LogComputer{})
  763. var total int64
  764. db = db.Select("SUM(pull_account_num) pull_account_total,SUM(enter_main) enter_main_total,operator,pc_code,status,create_date,remarks")
  765. db = db.Where("create_date = ?", date)
  766. if api.Operator != "" {
  767. db = db.Where("operator = ?", api.Operator)
  768. }
  769. if api.PcCode != "" {
  770. db = db.Where("pc_code = ?", api.PcCode)
  771. }
  772. if api.Status != 0 {
  773. db = db.Where("status = ?", api.Status)
  774. }
  775. db = db.Group("pc_code")
  776. err := db.Count(&total).Error
  777. if err != nil {
  778. return nil, 0, err
  779. }
  780. limit := info.PageSize
  781. offset := info.PageSize * (info.Page - 1)
  782. var statisticsLogs []*response.ComputerUseLogReply
  783. db = db.Limit(limit).Offset(offset)
  784. if order != "" {
  785. var OrderStr string
  786. // 设置有效排序key 防止sql注入
  787. // 感谢 Tom4t0 提交漏洞信息
  788. orderMap := make(map[string]bool, 3)
  789. orderMap["pc_code"] = true
  790. orderMap["operator"] = true
  791. if orderMap[order] {
  792. if desc {
  793. OrderStr = order + " desc"
  794. } else {
  795. OrderStr = order
  796. }
  797. } else { // didn't matched any order key in `orderMap`
  798. global.GVA_LOG.Error("获取失败!", zap.Error(err))
  799. return statisticsLogs, total, err
  800. }
  801. err = db.Order(OrderStr).Find(&statisticsLogs).Error
  802. } else {
  803. err = db.Order("id").Find(&statisticsLogs).Error
  804. }
  805. if err != nil {
  806. return nil, 0, err
  807. }
  808. for _, statisticsLog := range statisticsLogs {
  809. statisticsLog.CreateDate = statisticsLog.CreateDate[:10]
  810. }
  811. return statisticsLogs, total, err
  812. }
  813. // GameStatistics 根据游戏id查询数据
  814. func (s *ServiceStatisticsLog) GameStatistics(ctx context.Context, api log.LogComputer, info request.PageInfo) (interface{}, int64, error) {
  815. date := api.CreateDate
  816. isCurrentDate := false
  817. if date == "" {
  818. date = s.CurrentDate()
  819. isCurrentDate = true
  820. }
  821. db := global.GVA_DB.Model(&log.LogComputer{})
  822. var total int64
  823. db = db.Where("create_date = ?", date)
  824. if api.Operator != "" {
  825. db = db.Where("operator = ?", api.Operator)
  826. }
  827. if api.PcCode != "" {
  828. db = db.Where("pc_code = ?", api.PcCode)
  829. }
  830. if api.GameId != 0 {
  831. db = db.Where("game_id = ?", api.GameId)
  832. }
  833. 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")
  834. err := db.Count(&total).Error
  835. if err != nil {
  836. return nil, 0, err
  837. }
  838. limit := info.PageSize
  839. offset := info.PageSize * (info.Page - 1)
  840. var statisticsLogsByGameId []*response.GameIdStatisticsReply
  841. db = db.Limit(limit).Offset(offset)
  842. err = db.Order("id").Find(&statisticsLogsByGameId).Error
  843. if err != nil {
  844. return nil, 0, err
  845. }
  846. for _, statisticsLog := range statisticsLogsByGameId {
  847. statisticsLog.CreateDate = statisticsLog.CreateDate[:10]
  848. statisticsLog.OneComputerAverageNum = statisticsLog.TaskSuccessTotal / statisticsLog.PcCodeTotal
  849. if isCurrentDate {
  850. statisticsLog.GameFeeRate = s.GetStatisticsFeeRate(ctx, statisticsLog.GameId)
  851. }
  852. }
  853. return statisticsLogsByGameId, total, err
  854. }
  855. func (s *ServiceStatisticsLog) GameTargetInfo(ctx context.Context, date string, gameId string) (taskStatistics1 request.TaskStatistics) {
  856. key := fmt.Sprintf(taskStatistics, date)
  857. data, err := global.GVA_REDIS.HGet(ctx, key, gameId).Result()
  858. if err != nil {
  859. if err == redis.Nil {
  860. global.GVA_LOG.Info("TaskStatisticsDataCache"+key+gameId, zap.Error(err))
  861. } else {
  862. global.GVA_LOG.Error("添加缓存数据失败TaskStatisticsDataCache"+key, zap.Error(err))
  863. return
  864. }
  865. }
  866. _ = json.Unmarshal([]byte(data), &taskStatistics1)
  867. return
  868. }
  869. // TaskStatisticsDataCache 同步群控任务数据到缓存
  870. func (s *ServiceStatisticsLog) TaskStatisticsDataCache() {
  871. ctx := context.Background()
  872. key := fmt.Sprintf(taskStatistics, s.LogicalLog.CurrentDate())
  873. data, err := s.LogicalLog.RequestJfRoom()
  874. if err != nil {
  875. global.GVA_LOG.Error("获取机房数据失败TaskStatisticsDataCache", zap.Error(err))
  876. return
  877. }
  878. dataTask, err := s.LogicalLog.RequestTaskData()
  879. if err != nil {
  880. global.GVA_LOG.Error("RequestTaskData", zap.Error(err))
  881. return
  882. }
  883. var taskData []request.TaskData
  884. var taskStatistics []request.TaskStatistics
  885. _ = json.Unmarshal(data, &taskStatistics)
  886. _ = json.Unmarshal(dataTask, &taskData)
  887. mps := map[int]request.TaskData{}
  888. for _, td := range taskData {
  889. mps[td.GameId] = td
  890. }
  891. for _, data := range taskStatistics {
  892. var id int
  893. id = data.GameId
  894. if _, ok := mps[id]; ok {
  895. data.NewScanningCode = mps[id].NewScanningCode
  896. data.RetainedPullAccount = mps[id].RetainedPullAccount
  897. data.NewPullAccount = mps[id].NewPullAccount
  898. data.FeeAccountNum = mps[id].FeeAccountNum
  899. data.RetainedAccountNum = mps[id].RetainedAccountNum
  900. }
  901. bd, _ := json.Marshal(data)
  902. err = global.GVA_REDIS.HSet(ctx, key, id, bd).Err()
  903. if err != nil {
  904. global.GVA_LOG.Error("添加缓存数据失败TaskStatisticsDataCache", zap.Error(err))
  905. return
  906. }
  907. }
  908. }
  909. // TaskStatisticsDataCache1 同步群控任务数据到缓存
  910. func (s *ServiceStatisticsLog) TaskStatisticsDataCache1() {
  911. ctx := context.Background()
  912. key := fmt.Sprintf(taskStatistics, s.LogicalLog.CurrentDate())
  913. data, err := s.LogicalLog.RequestJfRoom()
  914. if err != nil {
  915. global.GVA_LOG.Error("获取机房数据失败TaskStatisticsDataCache", zap.Error(err))
  916. return
  917. }
  918. dataTask, err := s.LogicalLog.RequestTaskData()
  919. if err != nil {
  920. global.GVA_LOG.Error("RequestTaskData", zap.Error(err))
  921. return
  922. }
  923. var taskData []request.TaskData
  924. var taskStatistics []request.TaskStatistics
  925. _ = json.Unmarshal(data, &taskStatistics)
  926. _ = json.Unmarshal(dataTask, &taskData)
  927. mps := map[int]request.TaskData{}
  928. for _, td := range taskData {
  929. mps[td.GameId] = td
  930. }
  931. for _, data := range taskStatistics {
  932. var id int
  933. if data.GameIdXmy != "" {
  934. if data.GameIdXmy == "0" {
  935. id = data.GameId
  936. } else {
  937. id, _ = strconv.Atoi(data.GameIdXmy)
  938. }
  939. } else {
  940. id = data.GameId
  941. }
  942. if _, ok := mps[id]; ok {
  943. data.NewScanningCode = mps[id].NewScanningCode
  944. data.RetainedPullAccount = mps[id].RetainedPullAccount
  945. data.NewPullAccount = mps[id].NewPullAccount
  946. data.FeeAccountNum = mps[id].FeeAccountNum
  947. data.RetainedAccountNum = mps[id].RetainedAccountNum
  948. }
  949. bd, _ := json.Marshal(data)
  950. err = global.GVA_REDIS.HSet(ctx, key, id, bd).Err()
  951. if err != nil {
  952. global.GVA_LOG.Error("添加缓存数据失败TaskStatisticsDataCache", zap.Error(err))
  953. return
  954. }
  955. }
  956. }
  957. // GetComputerNum 同步群控任务数据到缓存
  958. func (s *ServiceStatisticsLog) GetComputerNum(date string) int64 {
  959. var total int64
  960. if date == "" {
  961. date = s.CurrentDate()
  962. }
  963. db := global.GVA_DB.Model(&log.LogComputer{})
  964. db = db.Distinct("pc_code").Where("create_date = ?", date)
  965. _ = db.Count(&total).Error
  966. return total
  967. }
  968. // ComputerHeartbeat 在线电脑接口
  969. func (s *ServiceStatisticsLog) ComputerHeartbeat(c context.Context, onlineComputer request.OnlineComputerRequest) error {
  970. err := s.LogicalLog.SetOnlineComputerNumCache(c, s.LogicalLog.CurrentDate(), onlineComputer.PcCode, onlineComputer.Operator)
  971. if err != nil {
  972. return err
  973. }
  974. s.LogicalLog.SetPcReportingLog(c, onlineComputer.PcCode, onlineComputer.Operator)
  975. return err
  976. }
  977. // ComputerTest 在线电脑接口测试
  978. func (s *ServiceStatisticsLog) ComputerTest(c context.Context) (interface{}, error) {
  979. mps, err := s.LogicalLog.GetOnlineComputerNumCache(c, s.LogicalLog.CurrentDate())
  980. if err != nil {
  981. return mps, err
  982. }
  983. return mps, err
  984. }
  985. // 定时检查电脑情况
  986. func (s *ServiceStatisticsLog) RegularCheckPc() {
  987. ctx := context.Background()
  988. var computer log.Computer
  989. computers, err := computer.OnlinePcCodeCache()
  990. //computersF, err := computer.OnlinePcCodeCache()
  991. if err != nil {
  992. global.GVA_LOG.Error("获取租机表数据失败", zap.Error(err))
  993. return
  994. }
  995. if computers == nil {
  996. global.GVA_LOG.Warn("电脑缓存数据获取失败TaskStatisticsDataCache")
  997. return
  998. }
  999. // 查询两小时内上报的数据
  1000. var computersF = map[string]string{}
  1001. var noReportingPc []string
  1002. for pc, name := range computers {
  1003. computersF[pc] = name
  1004. if strings.Contains(name, "备用") {
  1005. delete(computers, pc)
  1006. continue
  1007. }
  1008. if name == "" {
  1009. delete(computers, pc)
  1010. continue
  1011. }
  1012. num := s.LogicalLog.GetPcReportingLog(ctx, pc)
  1013. delete(computers, pc)
  1014. if num == 0 {
  1015. noReportingPc = append(noReportingPc, pc)
  1016. }
  1017. }
  1018. mpsPerson, _ := s.Person.GetUserInfoData()
  1019. var mobile []string
  1020. var content string
  1021. nameMps := map[string]string{}
  1022. if len(noReportingPc) != 0 {
  1023. content += fmt.Sprintf("一小时内未检测到中控数据<font color=\"warning\">%d台</font>:", len(noReportingPc))
  1024. for _, pc := range noReportingPc {
  1025. content += "\n"
  1026. name := computersF[pc]
  1027. content += name + " : " + pc
  1028. if nameMps[name] == "" {
  1029. nameMps[name] = pc
  1030. } else {
  1031. nameMps[name] += ","
  1032. nameMps[name] += pc
  1033. }
  1034. }
  1035. }
  1036. c := "# 未检测到电脑数据"
  1037. c += "\n"
  1038. if len(nameMps) != 0 {
  1039. for name, ct := range nameMps {
  1040. if _, ok := mpsPerson[name]; ok {
  1041. mobile = append(mobile, mpsPerson[name].MobilePhoneNumber)
  1042. }
  1043. ct = fmt.Sprintf("<font color=\"warning\">%s</font>", ct)
  1044. ct = c + ct
  1045. go s.SendContent(ct, mpsPerson[name].Url)
  1046. }
  1047. }
  1048. if content != "" {
  1049. var sendMsg SendMsg
  1050. sendMsg.MsgType = "markdown"
  1051. sendMsg.Markdown.Content = content
  1052. //c ,_ := json.Marshal(sendMsg)
  1053. url := global.GVA_CONFIG.SendUrl.ComputerSendUrl
  1054. //url := "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=7d095d5b-8240-45fd-a68c-baff3628d83b"
  1055. _, err = s.SendMsgData(url, sendMsg)
  1056. if len(mobile) != 0 {
  1057. var sendTextData SendTextMsg
  1058. sendTextData.MsgType = "text"
  1059. sendTextData.Text.MentionedMobileList = mobile
  1060. _, _ = s.SendMsgData(url, sendTextData)
  1061. }
  1062. }
  1063. }
  1064. type SendTextMsg struct {
  1065. MsgType string `json:"msgtype"`
  1066. Text struct {
  1067. MentionedMobileList []string `json:"mentioned_mobile_list"`
  1068. } `json:"text"`
  1069. }
  1070. type SendMsg struct {
  1071. MsgType string `json:"msgtype"`
  1072. Markdown struct {
  1073. Content string `json:"content"`
  1074. } `json:"markdown"`
  1075. }
  1076. func (s *ServiceStatisticsLog) SendContent(content, url string) {
  1077. var sendMsg SendMsg
  1078. sendMsg.MsgType = "markdown"
  1079. sendMsg.Markdown.Content = content
  1080. _, _ = s.SendMsgData(url, sendMsg)
  1081. }
  1082. func (s *ServiceStatisticsLog) SendMsgData(url string, params interface{}) (result []byte, err error) {
  1083. result, err = utils.HttpPost(url, params)
  1084. return
  1085. }
  1086. var statusMps = map[int]string{
  1087. -1: "未上报",
  1088. 1: "中控上报",
  1089. 2: "任务上报",
  1090. }
  1091. func (exa *ServiceStatisticsLog) ParseInfoList2Excel(infoList []*response.ComputerUseLogReply, filePath string) error {
  1092. excel := excelize.NewFile()
  1093. excel.SetSheetRow("Sheet1", "A1", &[]string{"电脑编号", "使用者", "日期", "拉取账号", "进入主线", "主线成功率", "使用状态", "备注"})
  1094. for i, statisticsLog := range infoList {
  1095. axis := fmt.Sprintf("A%d", i+2)
  1096. var r interface{}
  1097. if statisticsLog.EnterMainTotal != 0 && statisticsLog.PullAccountTotal != 0 {
  1098. r = fmt.Sprintf("%.2f", float64(statisticsLog.EnterMainTotal)/float64(statisticsLog.PullAccountTotal)*100)
  1099. } else {
  1100. r = "0.00"
  1101. }
  1102. excel.SetSheetRow("Sheet1", axis, &[]interface{}{
  1103. statisticsLog.PcCode,
  1104. statisticsLog.Operator,
  1105. statisticsLog.CreateDate[:10],
  1106. statisticsLog.PullAccountTotal,
  1107. statisticsLog.EnterMainTotal,
  1108. r,
  1109. statusMps[statisticsLog.Status],
  1110. statisticsLog.Remarks,
  1111. })
  1112. }
  1113. err := excel.SaveAs(filePath)
  1114. return err
  1115. }
  1116. // 删除两天前的缓存数据
  1117. func (s *ServiceStatisticsLog) RegularDelCheckData() {
  1118. ctx := context.Background()
  1119. date := time.Now().Add(-time.Hour * 48).Format("2006-01-02")
  1120. s.LogicalLog.DelHashUuidKey(ctx, date)
  1121. s.LogicalLog.DelZSetKey(ctx, date)
  1122. s.LogicalLog.DelHashKey(ctx, date)
  1123. s.DelListKey(ctx, date)
  1124. }
  1125. // 删除list缓存数据
  1126. func (s *ServiceStatisticsLog) DelListKey(ctx context.Context, date string) {
  1127. key := fmt.Sprintf(failCacheKey, date)
  1128. global.GVA_REDIS.Del(ctx, key)
  1129. }
  1130. // @author: [piexlmax](https://github.com/piexlmax)
  1131. // @function: UpdatePc
  1132. // @description: 根据id更新pc
  1133. // @param: Computer log.Computer
  1134. // @return: err error
  1135. func (a *ServiceStatisticsLog) UpdateComputerUseLog(c log.ComputerUseRemarks) (err error) {
  1136. if !errors.Is(global.GVA_DB.Where("create_date = ?", c.CreateDate).Where("pc_code = ?", c.PcCode).First(&log.LogComputer{}).Error, gorm.ErrRecordNotFound) {
  1137. var updateInfo = make(map[string]interface{})
  1138. updateInfo["remarks"] = c.Remarks
  1139. updateInfo["remarks_update_time"] = time.Now().Format("2006-01-02 15:04:05")
  1140. err = global.GVA_DB.Table("log_computer").Where("create_date = ?", c.CreateDate).Where("pc_code = ?", c.PcCode).Updates(updateInfo).Error
  1141. }
  1142. return
  1143. }
  1144. // 统计上报的订单
  1145. //@function: GetScanningInfoList
  1146. //@description: 分页获取数据,
  1147. //@param: card card.Card, info request.PageInfo, order string, desc bool
  1148. //@return: list interface{}, total int64, err error
  1149. func (apiService *ServiceStatisticsLog) GetScanningInfoList(api request.LogScanningRequest, info request.PageInfo, order string, desc bool) (list interface{}, total int64, err error) {
  1150. limit := info.PageSize
  1151. offset := info.PageSize * (info.Page - 1)
  1152. db := global.GVA_DB.Model(&log.LogScanningCode{})
  1153. var apiList []log.LogScanningCode
  1154. if api.CreateDate == "" {
  1155. api.CreateDate = time.Now().Format("2006-01-02")
  1156. }
  1157. db = db.Where("create_date = ?", api.CreateDate)
  1158. if api.GameId != 0 {
  1159. db = db.Where("game_id = ?", api.GameId)
  1160. }
  1161. if api.Status != 0 {
  1162. db = db.Where("status = ?", api.Status)
  1163. }
  1164. if api.TaskType != 0 {
  1165. if api.TaskType == -1 {
  1166. db = db.Where("task_type = ?", 0)
  1167. } else {
  1168. db = db.Where("task_type = ?", api.TaskType)
  1169. }
  1170. }
  1171. err = db.Count(&total).Error
  1172. if err != nil {
  1173. return apiList, total, err
  1174. } else {
  1175. db = db.Limit(limit).Offset(offset)
  1176. if order != "" {
  1177. var OrderStr string
  1178. // 设置有效排序key 防止sql注入
  1179. // 感谢 Tom4t0 提交漏洞信息
  1180. orderMap := make(map[string]bool, 4)
  1181. orderMap["id"] = true
  1182. orderMap["create_date"] = true
  1183. orderMap["game_id"] = true
  1184. orderMap["status"] = true
  1185. if orderMap[order] {
  1186. if desc {
  1187. OrderStr = order + " desc"
  1188. } else {
  1189. OrderStr = order
  1190. }
  1191. } else { // didn't matched any order key in `orderMap`
  1192. err = fmt.Errorf("非法的排序字段: %v", order)
  1193. return apiList, total, err
  1194. }
  1195. err = db.Order(OrderStr).Find(&apiList).Error
  1196. } else {
  1197. err = db.Order("id desc").Find(&apiList).Error
  1198. }
  1199. }
  1200. var apisReply []response.LogScanningReply
  1201. if len(apiList) != 0 {
  1202. for _, apiInfo := range apiList {
  1203. var apiReply = response.LogScanningReply{}
  1204. apiReply.Status = apiInfo.Status
  1205. apiReply.TaskType = apiInfo.TaskType
  1206. apiReply.GameId = apiInfo.GameId
  1207. apiReply.Supplier = apiInfo.Supplier
  1208. apiReply.OrderNum = apiInfo.OrderNum
  1209. apiReply.CreateDate = apiInfo.CreateTime.Format("2006-01-02")
  1210. apiReply.CreateTime = apiInfo.CreateTime.Format("2006-01-02 15:04:05")
  1211. apisReply = append(apisReply, apiReply)
  1212. }
  1213. }
  1214. return apisReply, total, err
  1215. }
  1216. func (exa *ServiceStatisticsLog) ComputeRateList2Excel(infoList []*response.ComputerStatisticsReply1, filePath string) error {
  1217. excel := excelize.NewFile()
  1218. excel.SetSheetRow("Sheet1", "A1", &[]string{"电脑编号", "使用者", "日期", "游戏id", "目标数量", "拉取账号", "进入主线", "主线成功", "半小时付费", "任务完成效率", "空闲时间"})
  1219. for i, statisticsLog := range infoList {
  1220. axis := fmt.Sprintf("A%d", i+2)
  1221. excel.SetSheetRow("Sheet1", axis, &[]interface{}{
  1222. statisticsLog.PcCode,
  1223. statisticsLog.Operator,
  1224. statisticsLog.CreateDate[:10],
  1225. statisticsLog.GameId,
  1226. statisticsLog.TargetNum,
  1227. statisticsLog.PullAccountNum,
  1228. statisticsLog.EnterMain,
  1229. statisticsLog.TaskSuccessNum,
  1230. statisticsLog.ComputerFeeRate,
  1231. statisticsLog.ComputerHourAverageRate,
  1232. statisticsLog.ComputerFreeTime,
  1233. })
  1234. }
  1235. err := excel.SaveAs(filePath)
  1236. return err
  1237. }
  1238. // 电脑效率七天数据查询
  1239. func (s *ServiceStatisticsLog) ComputerSevenStatistics(ctx context.Context, api log.LogComputer, info request.PageInfo, order string, desc bool) (statisticsLogsComputer []*response.ComputerStatisticsReply1, total int64, err error) {
  1240. date := api.CreateDate
  1241. endDate := ""
  1242. startDate := ""
  1243. if date == "" {
  1244. endDate = time.Now().Add(-time.Hour * 24).Format("2006-01-02")
  1245. startDate = time.Now().Add(-time.Hour * 24 * 8).Format("2006-01-02")
  1246. } else {
  1247. formatTime, _ := time.Parse("2006-01-02", date)
  1248. endDate = date
  1249. startDate = formatTime.Add(-time.Hour * 24 * 7).Format("2006-01-02")
  1250. }
  1251. db := global.GVA_DB.Model(&log.LogComputer{})
  1252. db = db.Where("create_date >= ? and create_date <= ?", startDate, endDate)
  1253. db = db.Where("pc_code = ?", api.PcCode)
  1254. err = db.Count(&total).Error
  1255. if err != nil {
  1256. return nil, 0, err
  1257. }
  1258. limit := info.PageSize
  1259. offset := info.PageSize * (info.Page - 1)
  1260. var statisticsLogs []*log.LogComputer
  1261. db = db.Limit(limit).Offset(offset)
  1262. db.Group("create_date")
  1263. if order != "" {
  1264. var OrderStr string
  1265. // 设置有效排序key 防止sql注入
  1266. // 感谢 Tom4t0 提交漏洞信息
  1267. orderMap := make(map[string]bool, 3)
  1268. orderMap["pc_code"] = true
  1269. orderMap["game_id"] = true
  1270. orderMap["operator"] = true
  1271. if orderMap[order] {
  1272. if desc {
  1273. OrderStr = order + " desc"
  1274. } else {
  1275. OrderStr = order
  1276. }
  1277. } else { // didn't matched any order key in `orderMap`
  1278. global.GVA_LOG.Error("获取失败!", zap.Error(err))
  1279. return statisticsLogsComputer, total, err
  1280. }
  1281. err = db.Order(OrderStr).Find(&statisticsLogs).Error
  1282. } else {
  1283. err = db.Order("id").Find(&statisticsLogs).Error
  1284. }
  1285. if err != nil {
  1286. return nil, 0, err
  1287. }
  1288. for _, statisticsLog := range statisticsLogs {
  1289. statisticsLogComputer := new(response.ComputerStatisticsReply1)
  1290. statisticsLogComputer.PcCode = statisticsLog.PcCode
  1291. statisticsLogComputer.Operator = statisticsLog.Operator
  1292. statisticsLogComputer.CreateDate = statisticsLog.CreateDate[:10]
  1293. statisticsLogComputer.GameId = statisticsLog.GameId
  1294. statisticsLogComputer.PullAccountNum = statisticsLog.PullAccountNum
  1295. statisticsLogComputer.TaskSuccessNum = statisticsLog.TaskSuccessNum
  1296. statisticsLogComputer.TargetNum = statisticsLog.TargetNum
  1297. statisticsLogComputer.ComputerFreeTime = statisticsLog.ComputerFreeTime
  1298. statisticsLogComputer.ComputerFeeRate = statisticsLog.ComputerFeeRate
  1299. statisticsLogComputer.EnterMain = statisticsLog.EnterMain
  1300. statisticsLogComputer.ComputerFeeRate = statisticsLog.ComputerFeeRate
  1301. statisticsLogComputer.ComputerHourAverageRate = statisticsLog.ComputerHourAverageRate
  1302. statisticsLogsComputer = append(statisticsLogsComputer, statisticsLogComputer)
  1303. }
  1304. return statisticsLogsComputer, total, err
  1305. }
  1306. // 定时统计设备信息
  1307. func (s *ServiceStatisticsLog) DeviceStatistics() {
  1308. date := time.Now().Format("2006-01-02")
  1309. db := global.GVA_DB.Model(&task.GameTask{})
  1310. var apiList []task.GameTask
  1311. db = db.Where("is_del = ?", -1)
  1312. db = db.Where("status = ?", 1)
  1313. db.Order("id desc").Find(&apiList)
  1314. if len(apiList) == 0 {
  1315. return
  1316. }
  1317. retainedDeviceErr := s.DeviceIdStatistics(date, 1)
  1318. newDeviceErr := s.DeviceIdStatistics(date, 2)
  1319. undefinedErr := s.DeviceErrLogStatistics(date, 1)
  1320. DefinedErr := s.DeviceErrLogStatistics(date, 2)
  1321. completeData, _ := s.GameTargetComplete.CompleteTaskData(date)
  1322. ctx := context.Background()
  1323. for _, game := range apiList {
  1324. deviceLog := new(log.DeviceStatistics)
  1325. gameId := game.TaskId
  1326. deviceLog.GameId = gameId
  1327. gameDeviceAccountErrKey := fmt.Sprintf(loging2.GameDeviceAccountErrKey, date, gameId)
  1328. gameDeviceErrKey := fmt.Sprintf(loging2.GameDeviceErrKey, date, gameId)
  1329. deviceLog.AccountErrNum, _ = s.GetCacheNum(ctx, gameDeviceAccountErrKey)
  1330. deviceLog.DeviceErrNum, _ = s.GetCacheNum(ctx, gameDeviceErrKey)
  1331. n, _ := s.LogicalLog.NodeLogGetNum(ctx, date, gameId, "4300000", loging2.OkStatus, 0)
  1332. r, _ := s.LogicalLog.NodeLogGetNum(ctx, date, gameId, "4300000", loging2.OkStatus, 1)
  1333. deviceLog.SimulatorStartNum = n + r
  1334. deviceLog.NewComplete = completeData[gameId].NewComplete
  1335. deviceLog.RetainedComplete = completeData[gameId].RetainedComplete
  1336. if deviceLog.DeviceErrNum != 0 {
  1337. deviceLog.DeviceErrRate = utils.Decimal(float64(deviceLog.DeviceErrNum) / float64(deviceLog.RetainedComplete) * 100)
  1338. }
  1339. if deviceLog.AccountErrNum != 0 {
  1340. deviceLog.AccountErrRate = utils.Decimal(float64(deviceLog.AccountErrNum) / float64(deviceLog.NewComplete) * 100)
  1341. }
  1342. deviceLog.CreateDate = date
  1343. if _, ok := retainedDeviceErr[gameId]; ok {
  1344. if retainedDeviceErr[gameId].Count != 0 {
  1345. deviceLog.RetainedDeviceIdErr = retainedDeviceErr[gameId].Count
  1346. deviceLog.RetainedDeviceIdRate = utils.Decimal(float64(deviceLog.RetainedDeviceIdErr) / float64(deviceLog.RetainedComplete) * 100)
  1347. }
  1348. }
  1349. if _, ok := newDeviceErr[gameId]; ok {
  1350. if newDeviceErr[gameId].Count != 0 {
  1351. deviceLog.NewDeviceIdErr = newDeviceErr[gameId].Count
  1352. deviceLog.NewDeviceIdRate = utils.Decimal(float64(deviceLog.NewDeviceIdErr) / float64(deviceLog.NewComplete) * 100)
  1353. }
  1354. }
  1355. if _, ok := undefinedErr[gameId]; ok {
  1356. if undefinedErr[gameId].Count != 0 {
  1357. deviceLog.UndefinedErr = undefinedErr[gameId].Count
  1358. }
  1359. }
  1360. if _, ok := DefinedErr[gameId]; ok {
  1361. if DefinedErr[gameId].Count != 0 {
  1362. deviceLog.DefinedErr = DefinedErr[gameId].Count
  1363. }
  1364. }
  1365. if !errors.Is(global.GVA_DB.Where("create_date = ?", date).Where("game_id = ?", gameId).First(&log.DeviceStatistics{}).Error, gorm.ErrRecordNotFound) {
  1366. global.GVA_DB.Where("create_date = ?", date).Where("game_id = ?", gameId).Omit("create_date,game_id").Updates(&deviceLog)
  1367. continue
  1368. }
  1369. global.GVA_DB.Create(&deviceLog)
  1370. }
  1371. }
  1372. type DeviceErr struct {
  1373. GameId int `json:"game_id"`
  1374. Count int `json:"count"`
  1375. }
  1376. func (s *ServiceStatisticsLog) DeviceIdStatistics(date string, status int) map[int]DeviceErr {
  1377. var devicesErr []DeviceErr
  1378. db := global.GVA_DB.Model(&log.ScriptDeviceErr{})
  1379. db.Where("create_date = ?", date)
  1380. db.Where("status = ?", status)
  1381. db.Group("current_game_id")
  1382. db.Select("current_game_id game_id, count(*) count")
  1383. db.Find(&devicesErr)
  1384. if len(devicesErr) == 0 {
  1385. return nil
  1386. }
  1387. devicesErrMaps := make(map[int]DeviceErr, len(devicesErr))
  1388. for _, game := range devicesErr {
  1389. devicesErrMaps[game.GameId] = game
  1390. }
  1391. return devicesErrMaps
  1392. }
  1393. func (s *ServiceStatisticsLog) DeviceErrLogStatistics(date string, status int) map[int]DeviceErr {
  1394. var devicesErr []DeviceErr
  1395. db := global.GVA_DB.Model(&log.DeviceErrLog{})
  1396. db.Where("create_date = ?", date)
  1397. db.Where("status = ?", status)
  1398. db.Group("game_id")
  1399. db.Select("game_id, count(*) count")
  1400. db.Find(&devicesErr)
  1401. if len(devicesErr) == 0 {
  1402. return nil
  1403. }
  1404. devicesErrMaps := make(map[int]DeviceErr, len(devicesErr))
  1405. for _, game := range devicesErr {
  1406. devicesErrMaps[game.GameId] = game
  1407. }
  1408. return devicesErrMaps
  1409. }
  1410. func (exa *ServiceStatisticsLog) DeviceErrRateExcel(statistics []*log.DeviceStatisticsReply, filePath string) error {
  1411. excel := excelize.NewFile()
  1412. excel.SetSheetRow("Sheet1", "A1", &[]string{"游戏ID", "负责人", "留存设备异常", "留存设备id异常", "留存完成目标", "留存异常率", "留存设备id异常率", "新增设备异常", "新增设备id异常", "新增完成目标", "新增异常率", "新增设备id异常率", "统计日期"})
  1413. for i, statisticsLog := range statistics {
  1414. axis := fmt.Sprintf("A%d", i+2)
  1415. excel.SetSheetRow("Sheet1", axis, &[]interface{}{
  1416. statisticsLog.GameId,
  1417. statisticsLog.User,
  1418. statisticsLog.DeviceErrNum,
  1419. statisticsLog.RetainedDeviceIdErr,
  1420. statisticsLog.RetainedComplete,
  1421. statisticsLog.DeviceErrRate,
  1422. statisticsLog.RetainedDeviceIdRate,
  1423. statisticsLog.AccountErrNum,
  1424. statisticsLog.NewDeviceIdErr,
  1425. statisticsLog.NewComplete,
  1426. statisticsLog.AccountErrRate,
  1427. statisticsLog.NewDeviceIdRate,
  1428. statisticsLog.CreateDate[:10],
  1429. })
  1430. }
  1431. err := excel.SaveAs(filePath)
  1432. return err
  1433. }
  1434. func (s *ServiceStatisticsLog) GetDeviceStatistics(ctx context.Context, api log.DeviceStatisticsReply, info request.PageInfo, order string, desc bool) (statistics []*log.DeviceStatisticsReply, total int64, err error) {
  1435. if api.CreateDate == "" {
  1436. api.CreateDate = time.Now().Format("2006-01-02")
  1437. }
  1438. db := global.GVA_DB.Table("device_statistics ds")
  1439. db = db.Joins("left join game_task gt on gt.task_id = ds.game_id")
  1440. db = db.Where("ds.create_date = ?", api.CreateDate)
  1441. if api.GameId != 0 {
  1442. db = db.Where("ds.game_id = ?", api.GameId)
  1443. }
  1444. if api.User != "" {
  1445. db = db.Where("gt.user = ?", api.User)
  1446. }
  1447. err = db.Count(&total).Error
  1448. if err != nil {
  1449. return nil, 0, err
  1450. }
  1451. db = db.Select("ds.*,user")
  1452. limit := info.PageSize
  1453. offset := info.PageSize * (info.Page - 1)
  1454. db = db.Limit(limit).Offset(offset)
  1455. if order != "" {
  1456. var OrderStr string
  1457. orderMap := make(map[string]bool, 7)
  1458. orderMap["device_err_num"] = true
  1459. orderMap["game_id"] = true
  1460. orderMap["account_err_num"] = true
  1461. orderMap["device_err_rate"] = true
  1462. orderMap["account_err_rate"] = true
  1463. orderMap["retained_device_id_rate"] = true
  1464. orderMap["new_device_id_rate"] = true
  1465. if orderMap[order] {
  1466. if desc {
  1467. OrderStr = "ds." + order + " desc"
  1468. } else {
  1469. OrderStr = "ds." + order
  1470. }
  1471. } else { // didn't matched any order key in `orderMap`
  1472. global.GVA_LOG.Error("获取失败!", zap.Error(err))
  1473. return statistics, total, err
  1474. }
  1475. err = db.Order(OrderStr).Find(&statistics).Error
  1476. } else {
  1477. err = db.Order("id").Find(&statistics).Error
  1478. }
  1479. for _, statistic := range statistics {
  1480. statistic.CreateDate = api.CreateDate
  1481. }
  1482. return
  1483. }
  1484. func (s *ServiceStatisticsLog) GetDeviceInfo(ctx context.Context, api log.DeviceLog, info request.PageInfo, order string, desc bool) (deviceLogs []*log.DeviceLog, total int64, err error) {
  1485. if api.CreateDate == "" {
  1486. api.CreateDate = time.Now().Format("2006-01-02")
  1487. }
  1488. db := global.GVA_DB.Model(&log.DeviceLog{})
  1489. if api.GameId != 0 {
  1490. db = db.Where("game_id = ?", api.GameId)
  1491. } else {
  1492. return
  1493. }
  1494. db = db.Where("create_date = ?", api.CreateDate)
  1495. if api.IsErr != 0 {
  1496. db = db.Where("is_err = ?", api.IsErr)
  1497. }
  1498. if api.PcCode != "" {
  1499. db = db.Where("pc_code = ?", api.PcCode)
  1500. }
  1501. if api.SimulatorCode != "" {
  1502. db = db.Where("simulator_code = ?", api.SimulatorCode)
  1503. }
  1504. err = db.Count(&total).Error
  1505. if err != nil {
  1506. return nil, 0, err
  1507. }
  1508. limit := info.PageSize
  1509. offset := info.PageSize * (info.Page - 1)
  1510. db = db.Limit(limit).Offset(offset)
  1511. if order != "" {
  1512. var OrderStr string
  1513. // 设置有效排序key 防止sql注入
  1514. // 感谢 Tom4t0 提交漏洞信息
  1515. orderMap := make(map[string]bool, 3)
  1516. orderMap["game_id"] = true
  1517. if orderMap[order] {
  1518. if desc {
  1519. OrderStr = order + " desc"
  1520. } else {
  1521. OrderStr = order
  1522. }
  1523. } else { // didn't matched any order key in `orderMap`
  1524. global.GVA_LOG.Error("获取失败!", zap.Error(err))
  1525. return deviceLogs, total, err
  1526. }
  1527. err = db.Order(OrderStr).Find(&deviceLogs).Error
  1528. } else {
  1529. err = db.Order("id").Find(&deviceLogs).Error
  1530. }
  1531. for _, statistic := range deviceLogs {
  1532. statistic.CreateDate = api.CreateDate
  1533. }
  1534. return
  1535. }
  1536. func (s *ServiceStatisticsLog) GetDeviceIdErr(ctx context.Context, api log.ScriptDeviceErr, info request.PageInfo, order string, desc bool) (deviceLogs []*log.ScriptDeviceErr, total int64, err error) {
  1537. if api.CreateDate == "" {
  1538. api.CreateDate = time.Now().Format("2006-01-02")
  1539. }
  1540. db := global.GVA_DB.Model(&log.ScriptDeviceErr{})
  1541. if api.GameId != 0 {
  1542. db = db.Where("current_game_id = ?", api.GameId)
  1543. }
  1544. if api.Operator != "" {
  1545. db = db.Where("operator = ?", api.Operator)
  1546. }
  1547. if api.Status != 0 {
  1548. db = db.Where("status = ?", api.Status)
  1549. }
  1550. db = db.Where("create_date = ?", api.CreateDate)
  1551. err = db.Count(&total).Error
  1552. if err != nil {
  1553. return nil, 0, err
  1554. }
  1555. limit := info.PageSize
  1556. offset := info.PageSize * (info.Page - 1)
  1557. db = db.Limit(limit).Offset(offset)
  1558. if order != "" {
  1559. var OrderStr string
  1560. // 设置有效排序key 防止sql注入
  1561. // 感谢 Tom4t0 提交漏洞信息
  1562. orderMap := make(map[string]bool, 3)
  1563. orderMap["game_id"] = true
  1564. if orderMap[order] {
  1565. if desc {
  1566. OrderStr = order + " desc"
  1567. } else {
  1568. OrderStr = order
  1569. }
  1570. } else { // didn't matched any order key in `orderMap`
  1571. global.GVA_LOG.Error("获取失败!", zap.Error(err))
  1572. return deviceLogs, total, err
  1573. }
  1574. err = db.Order(OrderStr).Find(&deviceLogs).Error
  1575. } else {
  1576. err = db.Order("id").Find(&deviceLogs).Error
  1577. }
  1578. for _, statistic := range deviceLogs {
  1579. statistic.CreateDate = api.CreateDate
  1580. }
  1581. return
  1582. }
  1583. func (s *ServiceStatisticsLog) GetDeviceContrastInfo(ctx context.Context, api log.DeviceLog) (deviceLogs []log.DeviceLog, err error) {
  1584. db := global.GVA_DB.Model(&log.DeviceLog{})
  1585. var device log.DeviceLog
  1586. err = db.Where("id = ?", api.Id).First(&device).Error
  1587. if err != nil {
  1588. return nil, err
  1589. }
  1590. if device.ErrStatus == 3 {
  1591. err = global.GVA_DB.Where("game_id = ?", device.GameId).Where("account = ?", device.Account).Where("id < ?", device.Id).Order("id desc").First(&deviceLogs).Error
  1592. if err != nil {
  1593. return nil, err
  1594. }
  1595. } else {
  1596. err = global.GVA_DB.Where("create_date = ?", device.CreateDate).Where("game_id = ?", device.GameId).Where("device_hex = ?", device.DeviceHex).Where("id < ?", device.Id).Order("id desc").Limit(10).Find(&deviceLogs).Error
  1597. }
  1598. deviceLogs = append(deviceLogs, device)
  1599. for _, statistic := range deviceLogs {
  1600. statistic.CreateDate = api.CreateDate
  1601. }
  1602. return
  1603. }
  1604. func (s *ServiceStatisticsLog) ComputerUpdateStatus() {
  1605. var computer log.Computer
  1606. logComputers, err := computer.OnlinePcCodeCache()
  1607. if err != nil {
  1608. global.GVA_LOG.Error("ComputerUpdateStatus LogComputer 获取失败!", zap.Error(err))
  1609. return
  1610. }
  1611. date := s.CurrentDate()
  1612. ctx := context.Background()
  1613. for pcCode, _ := range logComputers {
  1614. // 检测5分钟内电脑是否上报了数据
  1615. num := s.LogicalLog.CheckPcReportingLog(ctx, pcCode, 60*1000*8)
  1616. status := -1
  1617. if num != 0 {
  1618. status = 1
  1619. }
  1620. var computerStatus log.ComputerStatus
  1621. result := global.GVA_DB.Where("create_date = ?", date).Where("pc_code = ?", pcCode).First(&computerStatus)
  1622. if result.Error != nil {
  1623. if result.Error == gorm.ErrRecordNotFound {
  1624. // 数据不存在,执行创建操作
  1625. computerStatus.Status = status
  1626. computerStatus.CreateDate = time.Now()
  1627. computerStatus.PcCode = pcCode
  1628. result = global.GVA_DB.Omit("update_time").Create(&computerStatus)
  1629. } else {
  1630. // 其他错误
  1631. global.GVA_LOG.Error("ComputerUpdateStatus computerStatus 获取失败!", zap.Error(err))
  1632. return
  1633. }
  1634. } else {
  1635. global.GVA_DB.Model(&log.ComputerStatus{}).Where("create_date = ?", date).Where("pc_code = ?", pcCode).Omit("update_time").Update("status", status)
  1636. }
  1637. }
  1638. }