| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494 |
- 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
- }
- //type TencentOrderNum struct {
- // TaskId int `json:"task_id"`
- // Count int `json:"count"`
- //}
- // 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
- //查询游戏目标
- var dataTarget []*task.GameTargetComplete
- db2 := global.GVA_DB.Model(&task.GameTargetComplete{})
- db2 = db2.Select("task_id", "create_date", "new_target", "pay_target", "retained_target")
- db2 = db2.Where("create_date >= ? and create_date <= ?", api.Date[0], api.Date[1])
- err = db2.Order("create_date,task_id").Find(&dataTarget).Error
- if err != nil {
- return nil, 0, err
- }
- for _, one := range dataList {
- temp := new(response.DataAbnormalRateResponse)
- //temp.Id = one.Id
- //temp.UpdateTime = one.UpdateTime
- //temp.CreateTime = one.CreateTime
- temp.NewTarget = 0
- temp.RetainedTarget = 0
- temp.PayTarget = 0
- for _, target := range dataTarget {
- if target.CreateDate.Format("2006-01-02") == one.NewDate && target.TaskId == one.TaskId {
- temp.NewTarget = target.NewTarget
- temp.RetainedTarget = target.RetainedTarget
- temp.PayTarget = target.PayTarget
- break
- }
- }
- 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, err := simplejson.NewJson(dataXjf)
- if err != nil {
- global.GVA_LOG.Error("Error", zap.Error(err))
- return
- }
- xjfArr, err := xjfJson.Array()
- if err != nil {
- global.GVA_LOG.Error("Error", zap.Error(err))
- return
- }
- //查询微信扫码订单数
- //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, err = s.QueryXjfLogByBatch(ss, actionResult)
- if err != nil {
- return
- }
- if string(result) != "null" {
- dataJson, err := simplejson.NewJson(result)
- if err != nil {
- global.GVA_LOG.Error("Error", zap.Error(err))
- return
- }
- dataArr, err := dataJson.Array()
- if err != nil {
- global.GVA_LOG.Error("Error", zap.Error(err))
- return
- }
- for iii, _ := range dataArr {
- info := dataJson.GetIndex(iii)
- gameId, _ := info.Get("game_id").Int()
- if gameId == 0 {
- continue
- }
- 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, err = s.QueryXjfLogByBatch(action, actionResult)
- if err != nil {
- return
- }
- if string(result) == "null" {
- continue
- }
- dataJson, err := simplejson.NewJson(result)
- if err != nil {
- global.GVA_LOG.Error("Error", zap.Error(err))
- return
- }
- dataArr, err := dataJson.Array()
- if err != nil {
- global.GVA_LOG.Error("Error", zap.Error(err))
- return
- }
- arrTemp := make(map[int]int)
- for iii, _ := range dataArr {
- info := dataJson.GetIndex(iii)
- gameId, err := info.Get("game_id").Int()
- global.GVA_LOG.Info(strconv.Itoa(gameId))
- if gameId == 0 {
- continue
- }
- if err != nil {
- global.GVA_LOG.Error(err.Error())
- return
- }
- total, err := info.Get("total").Int()
- global.GVA_LOG.Info(strconv.Itoa(total))
- if total == 0 && err != nil {
- continue
- }
- if err != nil {
- global.GVA_LOG.Error(err.Error())
- return
- }
- //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 _, task1 := range dataList {
- taskId := task1.TaskId //任务id
- taskName := task1.TaskName // 任务名
- directorName := task1.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, err := info.Get("game_id").Int()
- if err != nil {
- global.GVA_LOG.Error("Error", zap.Error(err))
- return
- }
- if gameId == task1.TaskId {
- orderSuccessRate, err = info.Get("order_success_rate").String()
- if err != nil {
- global.GVA_LOG.Error("Error", zap.Error(err))
- return
- }
- break
- }
- }
- orderSuccessRateArr := strings.Split(orderSuccessRate, "/")
- if len(orderSuccessRateArr) == 3 {
- numOrderPay, err = strconv.Atoi(orderSuccessRateArr[0]) // 付费订单数
- numPay, err = strconv.Atoi(orderSuccessRateArr[1]) // 付费成功数
- if err != nil {
- global.GVA_LOG.Error("Error", zap.Error(err))
- return
- }
- 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("已存在,更新")
- err = global.GVA_DB.Model(&dataStatistics.DataAbnormalRate{}).Where("new_date = ? and task_id = ? and hour = ?", newDate, taskId, hour).Updates(data).Error
- if err != nil {
- global.GVA_LOG.Error("Error", zap.Error(err))
- return
- }
- } else {
- //不存在,新建
- //global.GVA_LOG.Info("不存在,新建")
- err = global.GVA_DB.Create(&data).Error
- if err != nil {
- global.GVA_LOG.Error("Error", zap.Error(err))
- return
- }
- }
- }
- return
- }
- // QueryXjfLogByBatch 请求机房任务数据
- func (s *ServiceDataAbnormalRate) QueryXjfLogByBatch(action string, actionResult string) (result []byte, err error) {
- today := time.Now().Format("2006-01-02")
- jfUrl := global.GVA_CONFIG.ExtranetDomain.Control + "/v1/device/get_log_by_game"
- jfParams := map[string]string{
- "date": today,
- "action": action,
- "action_result": actionResult,
- }
- result, err = utils.HttpGet(jfUrl, jfParams)
- return
- }
- // RequestXjfTaskData 请求机房任务数据
- func (s *ServiceDataAbnormalRate) RequestXjfTaskData() (result []byte, err error) {
- today := time.Now().Format("2006-01-02")
- jfurl := global.GVA_CONFIG.ExtranetDomain.Control + "/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
- }
|