log_statistics.go 66 KB

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