|
|
@@ -0,0 +1,403 @@
|
|
|
+package dataStatistics
|
|
|
+
|
|
|
+import (
|
|
|
+ "context"
|
|
|
+ "errors"
|
|
|
+ "github.com/bitly/go-simplejson"
|
|
|
+ "go.uber.org/zap"
|
|
|
+ "gorm.io/gorm"
|
|
|
+ "log-server/global"
|
|
|
+ "log-server/model/dataStatistics"
|
|
|
+ "log-server/model/dataStatistics/request"
|
|
|
+ "log-server/model/dataStatistics/response"
|
|
|
+ "log-server/model/task"
|
|
|
+ "log-server/utils"
|
|
|
+ "strconv"
|
|
|
+ "strings"
|
|
|
+ "time"
|
|
|
+)
|
|
|
+
|
|
|
+type ServiceDataAbnormalRate struct {
|
|
|
+}
|
|
|
+type Action struct {
|
|
|
+ Action string
|
|
|
+ ActionResult string
|
|
|
+}
|
|
|
+type XjfTotal struct {
|
|
|
+ Total int
|
|
|
+ GameId int
|
|
|
+}
|
|
|
+
|
|
|
+// QueryAbnormalRate 获取异常率列表
|
|
|
+func (s *ServiceDataAbnormalRate) QueryAbnormalRate(ctx context.Context, api request.InfoDataAbnormalRateRequest, info request.PageInfo, order string, desc bool) (interface{}, int64, error) {
|
|
|
+
|
|
|
+ //global.GVA_LOG.Info(api.Date[0])
|
|
|
+ //global.GVA_LOG.Info(api.Date[1])
|
|
|
+ //global.GVA_LOG.Info(api.DirectorName)
|
|
|
+ //global.GVA_LOG.Info(strconv.Itoa(api.TaskId))
|
|
|
+ //global.GVA_LOG.Info(strconv.Itoa(api.Hour))
|
|
|
+ db := global.GVA_DB.Model(&dataStatistics.DataAbnormalRate{})
|
|
|
+ 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," +
|
|
|
+ "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," +
|
|
|
+ "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")
|
|
|
+ //判断是否为今天,今天则取小时数据;若为往日,则取23点数据
|
|
|
+ if len(api.Date) == 0 {
|
|
|
+ api.Date = append(api.Date, time.Now().Format("2006-01-02"))
|
|
|
+ api.Date = append(api.Date, time.Now().Format("2006-01-02"))
|
|
|
+ }
|
|
|
+ if api.Date[0] == time.Now().Format("2006-01-02") {
|
|
|
+ hour := time.Now().Hour()
|
|
|
+ if time.Now().Minute() <= 30 {
|
|
|
+ hour = hour - 1
|
|
|
+ }
|
|
|
+ db = db.Where("hour = ?", hour)
|
|
|
+ } else {
|
|
|
+ db = db.Where("hour = 23")
|
|
|
+ }
|
|
|
+ db = db.Where("new_date >= ? and new_date <= ?", api.Date[0], api.Date[1])
|
|
|
+ if api.TaskId != 0 {
|
|
|
+ db = db.Where("task_id = ? ", api.TaskId)
|
|
|
+ }
|
|
|
+ if api.DirectorName != "" {
|
|
|
+ db = db.Where("director_name = ? ", api.DirectorName)
|
|
|
+ }
|
|
|
+
|
|
|
+ //if api.TaskId != 0 {
|
|
|
+ // db = db.Where("rent_computer.pc_num = ?", api.TaskId)
|
|
|
+ //}
|
|
|
+
|
|
|
+ var total int64
|
|
|
+ err := db.Count(&total).Error
|
|
|
+ //if err != nil {
|
|
|
+ // return nil, 0, err
|
|
|
+ //}
|
|
|
+ limit := info.PageSize
|
|
|
+ offset := info.PageSize * (info.Page - 1)
|
|
|
+ //var statisticsLogs []*log.LogComputer
|
|
|
+ var dataList []*response.DataAbnormalRateResponse
|
|
|
+ db = db.Limit(limit).Offset(offset)
|
|
|
+ if order != "" {
|
|
|
+ var OrderStr string
|
|
|
+ // 设置有效排序key 防止sql注入
|
|
|
+ // 感谢 Tom4t0 提交漏洞信息
|
|
|
+ orderMap := make(map[string]bool, 3)
|
|
|
+ orderMap["director_name"] = true
|
|
|
+ //orderMap["game_id"] = true
|
|
|
+ //orderMap["operator"] = true
|
|
|
+ if orderMap[order] {
|
|
|
+ if desc {
|
|
|
+ OrderStr = order + " desc"
|
|
|
+ } else {
|
|
|
+ OrderStr = order
|
|
|
+ }
|
|
|
+ } else { // didn't matched any order key in `orderMap`
|
|
|
+ global.GVA_LOG.Error("获取失败!", zap.Error(err))
|
|
|
+ return dataList, total, err
|
|
|
+ }
|
|
|
+ err = db.Order(OrderStr).Find(&dataList).Error
|
|
|
+ } else {
|
|
|
+ err = db.Order("id").Find(&dataList).Error
|
|
|
+ }
|
|
|
+ if err != nil {
|
|
|
+ return nil, 0, err
|
|
|
+ }
|
|
|
+ var responseDataList []*response.DataAbnormalRateResponse
|
|
|
+
|
|
|
+ for _, one := range dataList {
|
|
|
+
|
|
|
+ temp := new(response.DataAbnormalRateResponse)
|
|
|
+ //temp.Id = one.Id
|
|
|
+ //temp.UpdateTime = one.UpdateTime
|
|
|
+ //temp.CreateTime = one.CreateTime
|
|
|
+ temp.TaskId = one.TaskId
|
|
|
+ temp.TaskName = one.TaskName
|
|
|
+ temp.DirectorName = one.DirectorName
|
|
|
+ temp.NewDate = one.NewDate
|
|
|
+ temp.Hour = one.Hour
|
|
|
+ temp.NumFrozen = one.NumFrozen
|
|
|
+ temp.NumPullAccount = one.NumPullAccount
|
|
|
+ temp.NumStartSimulator = one.NumStartSimulator
|
|
|
+ temp.NumIp = one.NumIp
|
|
|
+ temp.NumStartScript = one.NumStartScript
|
|
|
+ temp.NumStartGame = one.NumStartGame
|
|
|
+ temp.NumLoginSuccess = one.NumLoginSuccess
|
|
|
+ temp.NumIntoGame = one.NumIntoGame
|
|
|
+ temp.NumNewSuccess = one.NumNewSuccess
|
|
|
+ temp.NumLcSuccess = one.NumLcSuccess
|
|
|
+ temp.NumPaySuccess = one.NumPaySuccess
|
|
|
+ temp.RateAllStep = one.RateAllStep
|
|
|
+ temp.NumPullPay = one.NumPullPay
|
|
|
+ temp.NumAccountLc = one.NumAccountLc
|
|
|
+ temp.NumCouldPay = one.NumCouldPay
|
|
|
+ temp.NumOrderPay = one.NumOrderPay
|
|
|
+ temp.NumPay = one.NumPay
|
|
|
+ temp.RatePaySuccess = one.RatePaySuccess
|
|
|
+ responseDataList = append(responseDataList, temp)
|
|
|
+ }
|
|
|
+ return responseDataList, total, err
|
|
|
+}
|
|
|
+
|
|
|
+// SyncAbnormalRateByBatch 定时批量更新异常率
|
|
|
+func (s *ServiceDataAbnormalRate) SyncAbnormalRateByBatch() {
|
|
|
+ newDate := time.Now().Format("2006-01-02")
|
|
|
+ hour := time.Now().Hour()
|
|
|
+ db := global.GVA_DB.Model(&task.GameTargetComplete{})
|
|
|
+ db = db.Select("game_target_complete.task_id,b.task_name,b.user,b.login_method")
|
|
|
+ db = db.Joins("left join game_task b on b.task_id = game_target_complete.task_id")
|
|
|
+ db = db.Where("game_target_complete.create_date = ?", newDate)
|
|
|
+ var dataList []*request.TaskInfo1
|
|
|
+ err := db.Order("game_target_complete.task_id").Find(&dataList).Error
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if len(dataList) == 0 {
|
|
|
+ global.GVA_LOG.Warn("定时批量更新异常率执行>>>无任务:" + time.Now().Format("2006-01-02 15:04:05"))
|
|
|
+ return
|
|
|
+ }
|
|
|
+ actions := map[string]Action{
|
|
|
+ "教程主线_冻结": {Action: "教程主线", ActionResult: "冻结"},
|
|
|
+ "拉取账号_成功": {Action: "拉取账号", ActionResult: "成功"},
|
|
|
+ "启动模拟器_成功": {Action: "启动模拟器", ActionResult: "成功"},
|
|
|
+ "启动游戏_查询IP": {Action: "启动游戏", ActionResult: "查询IP"},
|
|
|
+ "脚本启动_成功": {Action: "脚本启动", ActionResult: "成功"},
|
|
|
+ "启动游戏_成功": {Action: "启动游戏", ActionResult: "成功"},
|
|
|
+ "登陆_成功": {Action: "登陆", ActionResult: "成功"},
|
|
|
+ "教程主线_进入游戏": {Action: "教程主线", ActionResult: "进入游戏"},
|
|
|
+ "教程主线_新增成功": {Action: "教程主线", ActionResult: "新增成功"},
|
|
|
+ "教程主线_留存成功": {Action: "教程主线", ActionResult: "留存成功"},
|
|
|
+ "付费充值_付费成功": {Action: "付费充值", ActionResult: "付费成功"},
|
|
|
+ "教程主线_可以付费": {Action: "教程主线", ActionResult: "可以付费"},
|
|
|
+ "留存账号总数_留存账号总数": {Action: "留存账号总数", ActionResult: "留存账号总数"},
|
|
|
+ "询问付费_付费": {Action: "询问付费", ActionResult: "付费"},
|
|
|
+ }
|
|
|
+ action6 := []string{"小绵羊登录", "小绵羊登陆", "魅族登录", "魅族登陆", "QQ登录", "微信登录", "QQ登陆", "微信登陆", "网易登录", "网易登陆"}
|
|
|
+
|
|
|
+ // 查询机房数组,以获取付费成功率
|
|
|
+ dataXjf, err := s.RequestXjfTaskData()
|
|
|
+ if err != nil {
|
|
|
+ global.GVA_LOG.Error("获取机房数据失败RequestXjfTaskData", zap.Error(err))
|
|
|
+ return
|
|
|
+ }
|
|
|
+ xjfJson, _ := simplejson.NewJson(dataXjf)
|
|
|
+ xjfArr, _ := xjfJson.Array()
|
|
|
+ //var num map[string][]XjfTotal /*创建集合,存储机房查询日志接口返回值 */
|
|
|
+ //num = make(map[string][]XjfTotal)
|
|
|
+
|
|
|
+ //var xjfMap map[int][]int
|
|
|
+ //xjfMap = make(map[int][]int)
|
|
|
+
|
|
|
+ //var num map[string]map[int]int /*创建集合,存储机房查询日志接口返回值 */
|
|
|
+ num := make(map[string]map[int]int)
|
|
|
+
|
|
|
+ for k, v := range actions {
|
|
|
+ action := v.Action
|
|
|
+ actionResult := v.ActionResult
|
|
|
+ var result []byte
|
|
|
+ //var result2 []interface{}
|
|
|
+ if k == "登陆_成功" {
|
|
|
+ arrNum6 := make(map[int]int)
|
|
|
+ for _, ss := range action6 {
|
|
|
+ result = s.QueryXjfLogByBatch(ss, actionResult)
|
|
|
+ if string(result) != "null" {
|
|
|
+ dataJson, _ := simplejson.NewJson(result)
|
|
|
+ dataArr, _ := dataJson.Array()
|
|
|
+ for iii, _ := range dataArr {
|
|
|
+ info := dataJson.GetIndex(iii)
|
|
|
+ gameId, _ := info.Get("game_id").Int()
|
|
|
+ total, _ := info.Get("total").Int()
|
|
|
+ //var arr = XjfTotal{GameId: gameId, Total: total}
|
|
|
+ //arrTemp = append(arrTemp, arr)
|
|
|
+ if _, ok := arrNum6[gameId]; ok {
|
|
|
+ // 存在
|
|
|
+ arrNum6[gameId] = arrNum6[gameId] + total
|
|
|
+ } else {
|
|
|
+ arrNum6[gameId] = total
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //arrNum6 = append(arrNum6, arrTemp...)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ num[k] = arrNum6
|
|
|
+ } else {
|
|
|
+ result = s.QueryXjfLogByBatch(action, actionResult)
|
|
|
+ if string(result) == "null" {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ dataJson, _ := simplejson.NewJson(result)
|
|
|
+ dataArr, _ := dataJson.Array()
|
|
|
+ arrTemp := make(map[int]int)
|
|
|
+ for iii, _ := range dataArr {
|
|
|
+ info := dataJson.GetIndex(iii)
|
|
|
+ gameId, _ := info.Get("game_id").Int()
|
|
|
+ total, _ := info.Get("total").Int()
|
|
|
+ //global.GVA_LOG.Info(strconv.Itoa(gameId))
|
|
|
+ //global.GVA_LOG.Info(strconv.Itoa(total))
|
|
|
+ //var arr = XjfTotal{GameId: gameId, Total: total}
|
|
|
+ //arrTemp = append(arrTemp, arr)
|
|
|
+ arrTemp[gameId] = total
|
|
|
+ }
|
|
|
+ num[k] = arrTemp
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ for _, task := range dataList {
|
|
|
+ taskId := task.TaskId //任务id
|
|
|
+ taskName := task.TaskName // 任务名
|
|
|
+ directorName := task.User //负责人
|
|
|
+ numFrozen := 0 //冻结
|
|
|
+ numPullAccount := 0
|
|
|
+ numStartSimulator := 0
|
|
|
+ numIp := 0
|
|
|
+ numStartScript := 0
|
|
|
+ numStartGame := 0
|
|
|
+ numLoginSuccess := 0
|
|
|
+ numIntoGame := 0
|
|
|
+ numNewSuccess := 0
|
|
|
+ numLcSuccess := 0
|
|
|
+ numPaySuccess := 0
|
|
|
+ rateAllStep := ""
|
|
|
+ numCouldPay := 0 // 可以付费的账号
|
|
|
+ numAccountLc := 0 //留存账号总数
|
|
|
+ numPullPay := 0 // 下发付费账号
|
|
|
+ numOrderPay := 0 // 付费订单数
|
|
|
+ numPay := 0 //付费成功数
|
|
|
+ ratePaySuccess := "-%" //付费成功率
|
|
|
+ orderSuccessRate := "0/0/0%"
|
|
|
+ if _, ok := num["教程主线_冻结"][taskId]; ok {
|
|
|
+ // 存在
|
|
|
+ numFrozen = num["教程主线_冻结"][taskId]
|
|
|
+ }
|
|
|
+ if _, ok := num["拉取账号_成功"][taskId]; ok {
|
|
|
+ numPullAccount = num["拉取账号_成功"][taskId]
|
|
|
+ }
|
|
|
+ if _, ok := num["启动模拟器_成功"][taskId]; ok {
|
|
|
+ numStartSimulator = num["启动模拟器_成功"][taskId]
|
|
|
+ }
|
|
|
+ if _, ok := num["启动游戏_查询IP"][taskId]; ok {
|
|
|
+ numIp = num["启动游戏_查询IP"][taskId]
|
|
|
+ }
|
|
|
+ if _, ok := num["脚本启动_成功"][taskId]; ok {
|
|
|
+ numStartScript = num["脚本启动_成功"][taskId]
|
|
|
+ }
|
|
|
+ if _, ok := num["启动游戏_成功"][taskId]; ok {
|
|
|
+ numStartGame = num["启动游戏_成功"][taskId]
|
|
|
+ }
|
|
|
+ if _, ok := num["登陆_成功"][taskId]; ok {
|
|
|
+ numLoginSuccess = num["登陆_成功"][taskId]
|
|
|
+ }
|
|
|
+ if _, ok := num["教程主线_进入游戏"][taskId]; ok {
|
|
|
+ numIntoGame = num["教程主线_进入游戏"][taskId]
|
|
|
+ }
|
|
|
+ if _, ok := num["教程主线_新增成功"][taskId]; ok {
|
|
|
+ numNewSuccess = num["教程主线_新增成功"][taskId]
|
|
|
+ }
|
|
|
+ if _, ok := num["教程主线_留存成功"][taskId]; ok {
|
|
|
+ numLcSuccess = num["教程主线_留存成功"][taskId]
|
|
|
+ }
|
|
|
+ if _, ok := num["付费充值_付费成功"][taskId]; ok {
|
|
|
+ numPaySuccess = num["付费充值_付费成功"][taskId]
|
|
|
+ }
|
|
|
+ if _, ok := num["教程主线_可以付费"][taskId]; ok {
|
|
|
+ numCouldPay = num["教程主线_可以付费"][taskId]
|
|
|
+ }
|
|
|
+ if _, ok := num["留存账号总数_留存账号总数"][taskId]; ok {
|
|
|
+ numAccountLc = num["留存账号总数_留存账号总数"][taskId]
|
|
|
+ }
|
|
|
+ if _, ok := num["询问付费_付费"][taskId]; ok {
|
|
|
+ numPullPay = num["询问付费_付费"][taskId]
|
|
|
+ }
|
|
|
+ if numIntoGame != 0 && numStartGame != 0 {
|
|
|
+ rateAllStep = strconv.Itoa(numIntoGame * numStartGame / 1e6)
|
|
|
+ }
|
|
|
+
|
|
|
+ for iii, _ := range xjfArr {
|
|
|
+ info := xjfJson.GetIndex(iii)
|
|
|
+ gameId, _ := info.Get("game_id").Int()
|
|
|
+ if gameId == task.TaskId {
|
|
|
+ orderSuccessRate, _ = info.Get("order_success_rate").String()
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ orderSuccessRateArr := strings.Split(orderSuccessRate, "/")
|
|
|
+ numOrderPay, _ = strconv.Atoi(orderSuccessRateArr[0]) // 付费订单数
|
|
|
+ numPay, _ = strconv.Atoi(orderSuccessRateArr[1]) // 付费成功数
|
|
|
+ ratePaySuccess = orderSuccessRateArr[2] //付费成功率
|
|
|
+
|
|
|
+ var data dataStatistics.DataAbnormalRate
|
|
|
+ data.CreateTime = time.Now().Format("2006-01-02 15:04:05")
|
|
|
+ data.UpdateTime = time.Now().Format("2006-01-02 15:04:05")
|
|
|
+ data.TaskId = taskId
|
|
|
+ data.TaskName = taskName
|
|
|
+ data.DirectorName = directorName
|
|
|
+ data.NewDate = newDate
|
|
|
+ data.Hour = hour
|
|
|
+ data.NumFrozen = numFrozen
|
|
|
+ data.NumPullAccount = numPullAccount
|
|
|
+ data.NumStartSimulator = numStartSimulator
|
|
|
+ data.NumIp = numIp
|
|
|
+ data.NumStartScript = numStartScript
|
|
|
+ data.NumStartGame = numStartGame
|
|
|
+ data.NumLoginSuccess = numLoginSuccess
|
|
|
+ data.NumIntoGame = numIntoGame
|
|
|
+ data.NumNewSuccess = numNewSuccess
|
|
|
+ data.NumLcSuccess = numLcSuccess
|
|
|
+ data.NumPaySuccess = numPaySuccess
|
|
|
+ data.RateAllStep = rateAllStep
|
|
|
+ data.NumPullPay = numPullPay
|
|
|
+ data.NumAccountLc = numAccountLc
|
|
|
+ data.NumCouldPay = numCouldPay
|
|
|
+ data.NumOrderPay = numOrderPay
|
|
|
+ data.NumPay = numPay
|
|
|
+ data.RatePaySuccess = ratePaySuccess
|
|
|
+
|
|
|
+ global.GVA_LOG.Info(data.TaskName)
|
|
|
+
|
|
|
+ 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) {
|
|
|
+ //已存在,更新
|
|
|
+ //global.GVA_LOG.Info("已存在,更新")
|
|
|
+ _ = global.GVA_DB.Model(&dataStatistics.DataAbnormalRate{}).Where("new_date = ? and task_id = ? and hour = ?", newDate, taskId, hour).Updates(data).Error
|
|
|
+ } else {
|
|
|
+ //不存在,新建
|
|
|
+ //global.GVA_LOG.Info("不存在,新建")
|
|
|
+ _ = global.GVA_DB.Create(&data).Error
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// QueryXjfLogByBatch 请求机房任务数据
|
|
|
+func (s *ServiceDataAbnormalRate) QueryXjfLogByBatch(action string, actionResult string) (result []byte) {
|
|
|
+ today := time.Now().Format("2006-01-02")
|
|
|
+ jfUrl := "http://xjf.lianyou.fun:8099/v1/device/get_log_by_game"
|
|
|
+ jfParams := map[string]string{
|
|
|
+ "date": today,
|
|
|
+ "action": action,
|
|
|
+ "action_result": actionResult,
|
|
|
+ }
|
|
|
+ result, _ = utils.HttpGet(jfUrl, jfParams)
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// RequestXjfTaskData 请求机房任务数据
|
|
|
+func (s *ServiceDataAbnormalRate) RequestXjfTaskData() (result []byte, err error) {
|
|
|
+ today := time.Now().Format("2006-01-02")
|
|
|
+ jfurl := "http://xjf.lianyou.fun:8099/v1/task_statistics"
|
|
|
+ jfparams := map[string]string{
|
|
|
+ "query": "date:" + today + ",type:machine",
|
|
|
+ }
|
|
|
+ result, err = utils.HttpGet(jfurl, jfparams)
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// RequestXjfSomeData 请求机房数据接口数据
|
|
|
+func (s *ServiceDataAbnormalRate) RequestXjfSomeData() (result []byte, err error) {
|
|
|
+ today := time.Now().Format("2006-01-02")
|
|
|
+ jfUrl := "http://xjf.lianyou.fun:8118/data/taskDateLog"
|
|
|
+ jfParams := map[string]string{
|
|
|
+ "date": today,
|
|
|
+ }
|
|
|
+ result, err = utils.HttpGet(jfUrl, jfParams)
|
|
|
+ return
|
|
|
+}
|