data_abnormal_rate.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494
  1. package dataStatistics
  2. import (
  3. "context"
  4. "errors"
  5. "github.com/bitly/go-simplejson"
  6. "go.uber.org/zap"
  7. "gorm.io/gorm"
  8. "log-server/global"
  9. "log-server/model/dataStatistics"
  10. "log-server/model/dataStatistics/request"
  11. "log-server/model/dataStatistics/response"
  12. "log-server/model/task"
  13. "log-server/utils"
  14. "strconv"
  15. "strings"
  16. "time"
  17. )
  18. type ServiceDataAbnormalRate struct {
  19. }
  20. type Action struct {
  21. Action string
  22. ActionResult string
  23. }
  24. type XjfTotal struct {
  25. Total int
  26. GameId int
  27. }
  28. //type TencentOrderNum struct {
  29. // TaskId int `json:"task_id"`
  30. // Count int `json:"count"`
  31. //}
  32. // QueryAbnormalRate 获取异常率列表
  33. func (s *ServiceDataAbnormalRate) QueryAbnormalRate(ctx context.Context, api request.InfoDataAbnormalRateRequest, info request.PageInfo, order string, desc bool) (interface{}, int64, error) {
  34. //global.GVA_LOG.Info(api.Date[0])
  35. //global.GVA_LOG.Info(api.Date[1])
  36. //global.GVA_LOG.Info(api.DirectorName)
  37. //global.GVA_LOG.Info(strconv.Itoa(api.TaskId))
  38. //global.GVA_LOG.Info(strconv.Itoa(api.Hour))
  39. db := global.GVA_DB.Model(&dataStatistics.DataAbnormalRate{})
  40. db = db.Select("data_abnormal_rate.task_id,data_abnormal_rate.task_name,data_abnormal_rate.new_date,data_abnormal_rate.num_frozen,data_abnormal_rate.num_pull_account,data_abnormal_rate.num_start_simulator,data_abnormal_rate.num_ip,data_abnormal_rate.num_start_script,data_abnormal_rate.num_start_game," +
  41. "data_abnormal_rate.num_login_success,data_abnormal_rate.num_into_game,data_abnormal_rate.num_new_success,data_abnormal_rate.num_lc_success,data_abnormal_rate.num_pay_success,data_abnormal_rate.rate_all_step,data_abnormal_rate.num_pull_pay," +
  42. "data_abnormal_rate.num_account_lc,data_abnormal_rate.num_could_pay,data_abnormal_rate.num_order_pay,data_abnormal_rate.num_pay,data_abnormal_rate.rate_pay_success,director_name")
  43. //判断是否为今天,今天则取小时数据;若为往日,则取23点数据
  44. if len(api.Date) == 0 {
  45. api.Date = append(api.Date, time.Now().Format("2006-01-02"))
  46. api.Date = append(api.Date, time.Now().Format("2006-01-02"))
  47. }
  48. if api.Date[0] == time.Now().Format("2006-01-02") {
  49. hour := time.Now().Hour()
  50. if time.Now().Minute() <= 30 {
  51. hour = hour - 1
  52. }
  53. db = db.Where("hour = ?", hour)
  54. } else {
  55. db = db.Where("hour = 23")
  56. }
  57. db = db.Where("new_date >= ? and new_date <= ?", api.Date[0], api.Date[1])
  58. if api.TaskId != 0 {
  59. db = db.Where("task_id = ? ", api.TaskId)
  60. }
  61. if api.DirectorName != "" {
  62. db = db.Where("director_name = ? ", api.DirectorName)
  63. }
  64. //if api.TaskId != 0 {
  65. // db = db.Where("rent_computer.pc_num = ?", api.TaskId)
  66. //}
  67. var total int64
  68. err := db.Count(&total).Error
  69. //if err != nil {
  70. // return nil, 0, err
  71. //}
  72. limit := info.PageSize
  73. offset := info.PageSize * (info.Page - 1)
  74. //var statisticsLogs []*log.LogComputer
  75. var dataList []*response.DataAbnormalRateResponse
  76. db = db.Limit(limit).Offset(offset)
  77. if order != "" {
  78. var OrderStr string
  79. // 设置有效排序key 防止sql注入
  80. // 感谢 Tom4t0 提交漏洞信息
  81. orderMap := make(map[string]bool, 3)
  82. orderMap["director_name"] = true
  83. //orderMap["game_id"] = true
  84. //orderMap["operator"] = true
  85. if orderMap[order] {
  86. if desc {
  87. OrderStr = order + " desc"
  88. } else {
  89. OrderStr = order
  90. }
  91. } else { // didn't matched any order key in `orderMap`
  92. global.GVA_LOG.Error("获取失败!", zap.Error(err))
  93. return dataList, total, err
  94. }
  95. err = db.Order(OrderStr).Find(&dataList).Error
  96. } else {
  97. err = db.Order("id").Find(&dataList).Error
  98. }
  99. if err != nil {
  100. return nil, 0, err
  101. }
  102. var responseDataList []*response.DataAbnormalRateResponse
  103. //查询游戏目标
  104. var dataTarget []*task.GameTargetComplete
  105. db2 := global.GVA_DB.Model(&task.GameTargetComplete{})
  106. db2 = db2.Select("task_id", "create_date", "new_target", "pay_target", "retained_target")
  107. db2 = db2.Where("create_date >= ? and create_date <= ?", api.Date[0], api.Date[1])
  108. err = db2.Order("create_date,task_id").Find(&dataTarget).Error
  109. if err != nil {
  110. return nil, 0, err
  111. }
  112. for _, one := range dataList {
  113. temp := new(response.DataAbnormalRateResponse)
  114. //temp.Id = one.Id
  115. //temp.UpdateTime = one.UpdateTime
  116. //temp.CreateTime = one.CreateTime
  117. temp.NewTarget = 0
  118. temp.RetainedTarget = 0
  119. temp.PayTarget = 0
  120. for _, target := range dataTarget {
  121. if target.CreateDate.Format("2006-01-02") == one.NewDate && target.TaskId == one.TaskId {
  122. temp.NewTarget = target.NewTarget
  123. temp.RetainedTarget = target.RetainedTarget
  124. temp.PayTarget = target.PayTarget
  125. break
  126. }
  127. }
  128. temp.TaskId = one.TaskId
  129. temp.TaskName = one.TaskName
  130. temp.DirectorName = one.DirectorName
  131. temp.NewDate = one.NewDate
  132. temp.Hour = one.Hour
  133. temp.NumFrozen = one.NumFrozen
  134. temp.NumPullAccount = one.NumPullAccount
  135. temp.NumStartSimulator = one.NumStartSimulator
  136. temp.NumIp = one.NumIp
  137. temp.NumStartScript = one.NumStartScript
  138. temp.NumStartGame = one.NumStartGame
  139. temp.NumLoginSuccess = one.NumLoginSuccess
  140. temp.NumIntoGame = one.NumIntoGame
  141. temp.NumNewSuccess = one.NumNewSuccess
  142. temp.NumLcSuccess = one.NumLcSuccess
  143. temp.NumPaySuccess = one.NumPaySuccess
  144. temp.RateAllStep = one.RateAllStep
  145. temp.NumPullPay = one.NumPullPay
  146. temp.NumAccountLc = one.NumAccountLc
  147. temp.NumCouldPay = one.NumCouldPay
  148. temp.NumOrderPay = one.NumOrderPay
  149. temp.NumPay = one.NumPay
  150. temp.RatePaySuccess = one.RatePaySuccess
  151. responseDataList = append(responseDataList, temp)
  152. }
  153. return responseDataList, total, err
  154. }
  155. // SyncAbnormalRateByBatch 定时批量更新异常率
  156. func (s *ServiceDataAbnormalRate) SyncAbnormalRateByBatch() {
  157. newDate := time.Now().Format("2006-01-02")
  158. hour := time.Now().Hour()
  159. db := global.GVA_DB.Model(&task.GameTargetComplete{})
  160. db = db.Select("game_target_complete.task_id,b.task_name,b.user,b.login_method")
  161. db = db.Joins("left join game_task b on b.task_id = game_target_complete.task_id")
  162. db = db.Where("game_target_complete.create_date = ?", newDate)
  163. var dataList []*request.TaskInfo1
  164. err := db.Order("game_target_complete.task_id").Find(&dataList).Error
  165. if err != nil {
  166. return
  167. }
  168. if len(dataList) == 0 {
  169. global.GVA_LOG.Warn("定时批量更新异常率执行>>>无任务:" + time.Now().Format("2006-01-02 15:04:05"))
  170. return
  171. }
  172. actions := map[string]Action{
  173. "教程主线_冻结": {Action: "教程主线", ActionResult: "冻结"},
  174. "拉取账号_成功": {Action: "拉取账号", ActionResult: "成功"},
  175. "启动模拟器_成功": {Action: "启动模拟器", ActionResult: "成功"},
  176. "启动游戏_查询IP": {Action: "启动游戏", ActionResult: "查询IP"},
  177. "脚本启动_成功": {Action: "脚本启动", ActionResult: "成功"},
  178. "启动游戏_成功": {Action: "启动游戏", ActionResult: "成功"},
  179. "登陆_成功": {Action: "登陆", ActionResult: "成功"},
  180. "教程主线_进入游戏": {Action: "教程主线", ActionResult: "进入游戏"},
  181. "教程主线_新增成功": {Action: "教程主线", ActionResult: "新增成功"},
  182. "教程主线_留存成功": {Action: "教程主线", ActionResult: "留存成功"},
  183. "付费充值_付费成功": {Action: "付费充值", ActionResult: "付费成功"},
  184. "教程主线_可以付费": {Action: "教程主线", ActionResult: "可以付费"},
  185. "留存账号总数_留存账号总数": {Action: "留存账号总数", ActionResult: "留存账号总数"},
  186. "询问付费_付费": {Action: "询问付费", ActionResult: "付费"},
  187. }
  188. action6 := []string{"小绵羊登录", "小绵羊登陆", "魅族登录", "魅族登陆", "QQ登录", "微信登录", "QQ登陆", "微信登陆", "网易登录", "网易登陆"}
  189. // 查询机房数组,以获取付费成功率
  190. dataXjf, err := s.RequestXjfTaskData()
  191. if err != nil {
  192. global.GVA_LOG.Error("获取机房数据失败RequestXjfTaskData", zap.Error(err))
  193. return
  194. }
  195. xjfJson, err := simplejson.NewJson(dataXjf)
  196. if err != nil {
  197. global.GVA_LOG.Error("Error", zap.Error(err))
  198. return
  199. }
  200. xjfArr, err := xjfJson.Array()
  201. if err != nil {
  202. global.GVA_LOG.Error("Error", zap.Error(err))
  203. return
  204. }
  205. //查询微信扫码订单数
  206. //var num map[string]map[int]int /*创建集合,存储机房查询日志接口返回值 */
  207. num := make(map[string]map[int]int)
  208. for k, v := range actions {
  209. action := v.Action
  210. actionResult := v.ActionResult
  211. var result []byte
  212. //var result2 []interface{}
  213. if k == "登陆_成功" {
  214. arrNum6 := make(map[int]int)
  215. for _, ss := range action6 {
  216. result, err = s.QueryXjfLogByBatch(ss, actionResult)
  217. if err != nil {
  218. return
  219. }
  220. if string(result) != "null" {
  221. dataJson, err := simplejson.NewJson(result)
  222. if err != nil {
  223. global.GVA_LOG.Error("Error", zap.Error(err))
  224. return
  225. }
  226. dataArr, err := dataJson.Array()
  227. if err != nil {
  228. global.GVA_LOG.Error("Error", zap.Error(err))
  229. return
  230. }
  231. for iii, _ := range dataArr {
  232. info := dataJson.GetIndex(iii)
  233. gameId, _ := info.Get("game_id").Int()
  234. if gameId == 0 {
  235. continue
  236. }
  237. total, _ := info.Get("total").Int()
  238. //var arr = XjfTotal{GameId: gameId, Total: total}
  239. //arrTemp = append(arrTemp, arr)
  240. if _, ok := arrNum6[gameId]; ok {
  241. // 存在
  242. arrNum6[gameId] = arrNum6[gameId] + total
  243. } else {
  244. arrNum6[gameId] = total
  245. }
  246. }
  247. //arrNum6 = append(arrNum6, arrTemp...)
  248. }
  249. }
  250. num[k] = arrNum6
  251. } else {
  252. result, err = s.QueryXjfLogByBatch(action, actionResult)
  253. if err != nil {
  254. return
  255. }
  256. if string(result) == "null" {
  257. continue
  258. }
  259. dataJson, err := simplejson.NewJson(result)
  260. if err != nil {
  261. global.GVA_LOG.Error("Error", zap.Error(err))
  262. return
  263. }
  264. dataArr, err := dataJson.Array()
  265. if err != nil {
  266. global.GVA_LOG.Error("Error", zap.Error(err))
  267. return
  268. }
  269. arrTemp := make(map[int]int)
  270. for iii, _ := range dataArr {
  271. info := dataJson.GetIndex(iii)
  272. gameId, err := info.Get("game_id").Int()
  273. global.GVA_LOG.Info(strconv.Itoa(gameId))
  274. if gameId == 0 {
  275. continue
  276. }
  277. if err != nil {
  278. global.GVA_LOG.Error(err.Error())
  279. return
  280. }
  281. total, err := info.Get("total").Int()
  282. global.GVA_LOG.Info(strconv.Itoa(total))
  283. if total == 0 && err != nil {
  284. continue
  285. }
  286. if err != nil {
  287. global.GVA_LOG.Error(err.Error())
  288. return
  289. }
  290. //global.GVA_LOG.Info(strconv.Itoa(gameId))
  291. //global.GVA_LOG.Info(strconv.Itoa(total))
  292. //var arr = XjfTotal{GameId: gameId, Total: total}
  293. //arrTemp = append(arrTemp, arr)
  294. arrTemp[gameId] = total
  295. }
  296. num[k] = arrTemp
  297. }
  298. }
  299. for _, task1 := range dataList {
  300. taskId := task1.TaskId //任务id
  301. taskName := task1.TaskName // 任务名
  302. directorName := task1.User //负责人
  303. numFrozen := 0 //冻结
  304. numPullAccount := 0
  305. numStartSimulator := 0
  306. numIp := 0
  307. numStartScript := 0
  308. numStartGame := 0
  309. numLoginSuccess := 0
  310. numIntoGame := 0
  311. numNewSuccess := 0
  312. numLcSuccess := 0
  313. numPaySuccess := 0
  314. rateAllStep := ""
  315. numCouldPay := 0 // 可以付费的账号
  316. numAccountLc := 0 //留存账号总数
  317. numPullPay := 0 // 下发付费账号
  318. numOrderPay := 0 // 付费订单数
  319. numPay := 0 //付费成功数
  320. ratePaySuccess := "-%" //付费成功率
  321. orderSuccessRate := "0/0/0%"
  322. if _, ok := num["教程主线_冻结"][taskId]; ok {
  323. // 存在
  324. numFrozen = num["教程主线_冻结"][taskId]
  325. }
  326. if _, ok := num["拉取账号_成功"][taskId]; ok {
  327. numPullAccount = num["拉取账号_成功"][taskId]
  328. }
  329. if _, ok := num["启动模拟器_成功"][taskId]; ok {
  330. numStartSimulator = num["启动模拟器_成功"][taskId]
  331. }
  332. if _, ok := num["启动游戏_查询IP"][taskId]; ok {
  333. numIp = num["启动游戏_查询IP"][taskId]
  334. }
  335. if _, ok := num["脚本启动_成功"][taskId]; ok {
  336. numStartScript = num["脚本启动_成功"][taskId]
  337. }
  338. if _, ok := num["启动游戏_成功"][taskId]; ok {
  339. numStartGame = num["启动游戏_成功"][taskId]
  340. }
  341. if _, ok := num["登陆_成功"][taskId]; ok {
  342. numLoginSuccess = num["登陆_成功"][taskId]
  343. }
  344. if _, ok := num["教程主线_进入游戏"][taskId]; ok {
  345. numIntoGame = num["教程主线_进入游戏"][taskId]
  346. }
  347. if _, ok := num["教程主线_新增成功"][taskId]; ok {
  348. numNewSuccess = num["教程主线_新增成功"][taskId]
  349. }
  350. if _, ok := num["教程主线_留存成功"][taskId]; ok {
  351. numLcSuccess = num["教程主线_留存成功"][taskId]
  352. }
  353. if _, ok := num["付费充值_付费成功"][taskId]; ok {
  354. numPaySuccess = num["付费充值_付费成功"][taskId]
  355. }
  356. if _, ok := num["教程主线_可以付费"][taskId]; ok {
  357. numCouldPay = num["教程主线_可以付费"][taskId]
  358. }
  359. if _, ok := num["留存账号总数_留存账号总数"][taskId]; ok {
  360. numAccountLc = num["留存账号总数_留存账号总数"][taskId]
  361. }
  362. if _, ok := num["询问付费_付费"][taskId]; ok {
  363. numPullPay = num["询问付费_付费"][taskId]
  364. }
  365. if numIntoGame != 0 && numStartGame != 0 {
  366. rateAllStep = strconv.Itoa(numIntoGame * numStartGame / 1e6)
  367. }
  368. for iii, _ := range xjfArr {
  369. info := xjfJson.GetIndex(iii)
  370. gameId, err := info.Get("game_id").Int()
  371. if err != nil {
  372. global.GVA_LOG.Error("Error", zap.Error(err))
  373. return
  374. }
  375. if gameId == task1.TaskId {
  376. orderSuccessRate, err = info.Get("order_success_rate").String()
  377. if err != nil {
  378. global.GVA_LOG.Error("Error", zap.Error(err))
  379. return
  380. }
  381. break
  382. }
  383. }
  384. orderSuccessRateArr := strings.Split(orderSuccessRate, "/")
  385. if len(orderSuccessRateArr) == 3 {
  386. numOrderPay, err = strconv.Atoi(orderSuccessRateArr[0]) // 付费订单数
  387. numPay, err = strconv.Atoi(orderSuccessRateArr[1]) // 付费成功数
  388. if err != nil {
  389. global.GVA_LOG.Error("Error", zap.Error(err))
  390. return
  391. }
  392. ratePaySuccess = orderSuccessRateArr[2] //付费成功率
  393. }
  394. var data dataStatistics.DataAbnormalRate
  395. data.CreateTime = time.Now().Format("2006-01-02 15:04:05")
  396. data.UpdateTime = time.Now().Format("2006-01-02 15:04:05")
  397. data.TaskId = taskId
  398. data.TaskName = taskName
  399. data.DirectorName = directorName
  400. data.NewDate = newDate
  401. data.Hour = hour
  402. data.NumFrozen = numFrozen
  403. data.NumPullAccount = numPullAccount
  404. data.NumStartSimulator = numStartSimulator
  405. data.NumIp = numIp
  406. data.NumStartScript = numStartScript
  407. data.NumStartGame = numStartGame
  408. data.NumLoginSuccess = numLoginSuccess
  409. data.NumIntoGame = numIntoGame
  410. data.NumNewSuccess = numNewSuccess
  411. data.NumLcSuccess = numLcSuccess
  412. data.NumPaySuccess = numPaySuccess
  413. data.RateAllStep = rateAllStep
  414. data.NumPullPay = numPullPay
  415. data.NumAccountLc = numAccountLc
  416. data.NumCouldPay = numCouldPay
  417. data.NumOrderPay = numOrderPay
  418. data.NumPay = numPay
  419. data.RatePaySuccess = ratePaySuccess
  420. //global.GVA_LOG.Info(data.TaskName)
  421. if !errors.Is(global.GVA_DB.Model(&dataStatistics.DataAbnormalRate{}).Where("new_date = ? and task_id = ? and hour = ?", newDate, taskId, hour).First(&dataStatistics.DataAbnormalRate{}).Error, gorm.ErrRecordNotFound) {
  422. //已存在,更新
  423. //global.GVA_LOG.Info("已存在,更新")
  424. err = global.GVA_DB.Model(&dataStatistics.DataAbnormalRate{}).Where("new_date = ? and task_id = ? and hour = ?", newDate, taskId, hour).Updates(data).Error
  425. if err != nil {
  426. global.GVA_LOG.Error("Error", zap.Error(err))
  427. return
  428. }
  429. } else {
  430. //不存在,新建
  431. //global.GVA_LOG.Info("不存在,新建")
  432. err = global.GVA_DB.Create(&data).Error
  433. if err != nil {
  434. global.GVA_LOG.Error("Error", zap.Error(err))
  435. return
  436. }
  437. }
  438. }
  439. return
  440. }
  441. // QueryXjfLogByBatch 请求机房任务数据
  442. func (s *ServiceDataAbnormalRate) QueryXjfLogByBatch(action string, actionResult string) (result []byte, err error) {
  443. today := time.Now().Format("2006-01-02")
  444. jfUrl := global.GVA_CONFIG.ExtranetDomain.Control + "/v1/device/get_log_by_game"
  445. jfParams := map[string]string{
  446. "date": today,
  447. "action": action,
  448. "action_result": actionResult,
  449. }
  450. result, err = utils.HttpGet(jfUrl, jfParams)
  451. return
  452. }
  453. // RequestXjfTaskData 请求机房任务数据
  454. func (s *ServiceDataAbnormalRate) RequestXjfTaskData() (result []byte, err error) {
  455. today := time.Now().Format("2006-01-02")
  456. jfurl := global.GVA_CONFIG.ExtranetDomain.Control + "/v1/task_statistics"
  457. jfparams := map[string]string{
  458. "query": "date:" + today + ",type:machine",
  459. }
  460. result, err = utils.HttpGet(jfurl, jfparams)
  461. return
  462. }
  463. // RequestXjfSomeData 请求机房数据接口数据
  464. func (s *ServiceDataAbnormalRate) RequestXjfSomeData() (result []byte, err error) {
  465. today := time.Now().Format("2006-01-02")
  466. jfUrl := "http://xjf.lianyou.fun:8118/data/taskDateLog"
  467. jfParams := map[string]string{
  468. "date": today,
  469. }
  470. result, err = utils.HttpGet(jfUrl, jfParams)
  471. return
  472. }