Explorar el Código

增加游戏异常率和微信授权信息功能

倚楼听风雨 hace 3 años
padre
commit
2134c0deb9
Se han modificado 40 ficheros con 1531 adiciones y 24 borrados
  1. 35 0
      api/v1/dataStatistics/data_abnormal_rate.go
  2. 19 0
      api/v1/dataStatistics/enter.go
  3. 33 0
      api/v1/dataStatistics/wechat_scanner_api.go
  4. 33 0
      api/v1/dataStatistics/wechat_scanner_detailed.go
  5. 33 0
      api/v1/dataStatistics/wechat_scanner_ledger.go
  6. 4 0
      api/v1/enter.go
  7. 1 0
      go.mod
  8. 2 0
      go.sum
  9. 9 7
      initialize/redis.go
  10. 5 0
      initialize/router.go
  11. 37 0
      initialize/timer.go
  12. 34 0
      model/dataStatistics/data_abnormal_rate.go
  13. 28 0
      model/dataStatistics/request/common.go
  14. 78 0
      model/dataStatistics/request/data_abnormal_rate.go
  15. 10 0
      model/dataStatistics/request/wechat_scanner_api.go
  16. 10 0
      model/dataStatistics/request/wechat_scanner_detailed.go
  17. 10 0
      model/dataStatistics/request/wechat_scanner_ledger.go
  18. 8 0
      model/dataStatistics/response/common.go
  19. 30 0
      model/dataStatistics/response/data_abnormal_rate.go
  20. 11 0
      model/dataStatistics/response/wechat_scanner_api.go
  21. 12 0
      model/dataStatistics/response/wechat_scanner_detailed.go
  22. 12 0
      model/dataStatistics/response/wechat_scanner_ledger.go
  23. 14 0
      model/dataStatistics/wechat_scanner_api.go
  24. 16 0
      model/dataStatistics/wechat_scanner_detailed.go
  25. 16 0
      model/dataStatistics/wechat_scanner_ledger.go
  26. 8 0
      model/rentComputer/response/rent_computer.go
  27. 17 0
      router/dataStatistics/data_abnormal_rate.go
  28. 10 0
      router/dataStatistics/enter.go
  29. 17 0
      router/dataStatistics/wechat_scanner_api.go
  30. 17 0
      router/dataStatistics/wechat_scanner_detailed.go
  31. 17 0
      router/dataStatistics/wechat_scanner_ledger.go
  32. 9 7
      router/enter.go
  33. 1 1
      router/task/game_task.go
  34. 403 0
      service/dataStatistics/data_abnormal_rate.go
  35. 10 0
      service/dataStatistics/enter.go
  36. 150 0
      service/dataStatistics/wechat_scanner_api.go
  37. 221 0
      service/dataStatistics/wechat_scanner_detailed.go
  38. 85 0
      service/dataStatistics/wechat_scanner_ledger.go
  39. 8 6
      service/enter.go
  40. 58 3
      service/rentComputer/rent_computer.go

+ 35 - 0
api/v1/dataStatistics/data_abnormal_rate.go

@@ -0,0 +1,35 @@
+package dataStatistics
+
+import (
+	"github.com/gin-gonic/gin"
+	"go.uber.org/zap"
+	"log-server/global"
+	"log-server/model/dataStatistics/request"
+	"log-server/model/log/response"
+)
+
+type ApiDataAbnormalRate struct {
+}
+
+// QueryAbnormalRate 获取异常率列表
+func (s *ApiDataAbnormalRate) QueryAbnormalRate(c *gin.Context) {
+	//global.GVA_LOG.Info("api----GetComputerList----strat")
+	var paramsInfo request.GetDataAbnormalRateRequest
+	_ = c.ShouldBindJSON(&paramsInfo)
+	/*if err := utils.Verify(paramsInfo.PageInfo, utils.PageInfoVerify); err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}*/
+	list, total, err := ServiceDataAbnormalRate.QueryAbnormalRate(c, paramsInfo.InfoDataAbnormalRateRequest, paramsInfo.PageInfo, paramsInfo.OrderKey, paramsInfo.Desc)
+	if err != nil {
+		global.GVA_LOG.Error("获取失败!", zap.Error(err))
+		response.FailWithMessage("获取失败", c)
+	} else {
+		response.OkWithDetailed(response.PageResult{
+			List:     list,
+			Total:    total,
+			Page:     paramsInfo.Page,
+			PageSize: paramsInfo.PageSize,
+		}, "获取成功", c)
+	}
+}

+ 19 - 0
api/v1/dataStatistics/enter.go

@@ -0,0 +1,19 @@
+package dataStatistics
+
+import "log-server/service"
+
+type ApiGroup struct {
+	// Code generated by log-server Begin; DO NOT EDIT.
+	ApiDataAbnormalRate
+	ApiWeChatScannerApi
+	ApiWeChatScannerDetailed
+	ApiWeChatScannerLedger
+	// Code generated by log-server End; DO NOT EDIT.
+}
+
+var (
+	ServiceDataAbnormalRate      = service.ServiceGroupApp.DataStatisticsServiceGroup.ServiceDataAbnormalRate
+	ServiceWeChatScannerApi      = service.ServiceGroupApp.DataStatisticsServiceGroup.ServiceWeChatScannerApi
+	ServiceWeChatScannerDetailed = service.ServiceGroupApp.DataStatisticsServiceGroup.ServiceWeChatScannerDetailed
+	ServiceWeChatScannerLedger   = service.ServiceGroupApp.DataStatisticsServiceGroup.ServiceWeChatScannerLedger
+)

+ 33 - 0
api/v1/dataStatistics/wechat_scanner_api.go

@@ -0,0 +1,33 @@
+package dataStatistics
+
+import (
+	"github.com/gin-gonic/gin"
+	"go.uber.org/zap"
+	"log-server/global"
+	"log-server/model/dataStatistics/request"
+	"log-server/model/log/response"
+)
+
+type ApiWeChatScannerApi struct {
+}
+
+func (s *ApiWeChatScannerApi) GetWeChatScannerApiList(c *gin.Context) {
+	var paramsInfo request.WeChatScannerApiRequest
+	_ = c.ShouldBindJSON(&paramsInfo)
+	/*if err := utils.Verify(paramsInfo.PageInfo, utils.PageInfoVerify); err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}*/
+	list, total, err := ServiceWeChatScannerApi.WeChatScannerApiList(c, paramsInfo.WeChatScannerApi, paramsInfo.PageInfo, paramsInfo.OrderKey, paramsInfo.Desc)
+	if err != nil {
+		global.GVA_LOG.Error("获取失败!", zap.Error(err))
+		response.FailWithMessage("获取失败", c)
+	} else {
+		response.OkWithDetailed(response.PageResult{
+			List:     list,
+			Total:    total,
+			Page:     paramsInfo.Page,
+			PageSize: paramsInfo.PageSize,
+		}, "获取成功", c)
+	}
+}

+ 33 - 0
api/v1/dataStatistics/wechat_scanner_detailed.go

@@ -0,0 +1,33 @@
+package dataStatistics
+
+import (
+	"github.com/gin-gonic/gin"
+	"go.uber.org/zap"
+	"log-server/global"
+	"log-server/model/dataStatistics/request"
+	"log-server/model/log/response"
+)
+
+type ApiWeChatScannerDetailed struct {
+}
+
+func (s *ApiWeChatScannerDetailed) GetWeChatScannerDetailedList(c *gin.Context) {
+	var paramsInfo request.WeChatScannerDetailedRequest
+	_ = c.ShouldBindJSON(&paramsInfo)
+	/*if err := utils.Verify(paramsInfo.PageInfo, utils.PageInfoVerify); err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}*/
+	list, total, err := ServiceWeChatScannerDetailed.WeChatScannerDetailedList(c, paramsInfo.WeChatScannerDetailed, paramsInfo.PageInfo, paramsInfo.OrderKey, paramsInfo.Desc)
+	if err != nil {
+		global.GVA_LOG.Error("获取失败!", zap.Error(err))
+		response.FailWithMessage("获取失败", c)
+	} else {
+		response.OkWithDetailed(response.PageResult{
+			List:     list,
+			Total:    total,
+			Page:     paramsInfo.Page,
+			PageSize: paramsInfo.PageSize,
+		}, "获取成功", c)
+	}
+}

+ 33 - 0
api/v1/dataStatistics/wechat_scanner_ledger.go

@@ -0,0 +1,33 @@
+package dataStatistics
+
+import (
+	"github.com/gin-gonic/gin"
+	"go.uber.org/zap"
+	"log-server/global"
+	"log-server/model/dataStatistics/request"
+	"log-server/model/log/response"
+)
+
+type ApiWeChatScannerLedger struct {
+}
+
+func (s *ApiWeChatScannerLedger) GetWeChatScannerLedgerList(c *gin.Context) {
+	var paramsInfo request.WeChatScannerLedgerRequest
+	_ = c.ShouldBindJSON(&paramsInfo)
+	/*if err := utils.Verify(paramsInfo.PageInfo, utils.PageInfoVerify); err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}*/
+	list, total, err := ServiceWeChatScannerLedger.WeChatScannerLedgerList(c, paramsInfo.WeChatScannerLedger, paramsInfo.PageInfo, paramsInfo.OrderKey, paramsInfo.Desc)
+	if err != nil {
+		global.GVA_LOG.Error("获取失败!", zap.Error(err))
+		response.FailWithMessage("获取失败", c)
+	} else {
+		response.OkWithDetailed(response.PageResult{
+			List:     list,
+			Total:    total,
+			Page:     paramsInfo.Page,
+			PageSize: paramsInfo.PageSize,
+		}, "获取成功", c)
+	}
+}

+ 4 - 0
api/v1/enter.go

@@ -1,10 +1,12 @@
 package v1
 
 import (
+	"log-server/api/v1/dataStatistics"
 	"log-server/api/v1/example"
 	"log-server/api/v1/log"
 	"log-server/api/v1/rentComputer"
 	"log-server/api/v1/system"
+	"log-server/api/v1/task"
 	"log-server/api/v1/typeManage"
 )
 
@@ -13,7 +15,9 @@ type ApiGroup struct {
 	ExampleApiGroup      example.ApiGroup
 	LogApiGroup          log.GroupLog
 	TypeApiGroup         typeManage.ApiGroup
+	GroupTask            task.GroupTask
 	RentComputerApiGroup rentComputer.ApiGroup
+	DataStatisticsGroup  dataStatistics.ApiGroup
 }
 
 var ApiGroupApp = new(ApiGroup)

+ 1 - 0
go.mod

@@ -7,6 +7,7 @@ require (
 	github.com/aliyun/aliyun-oss-go-sdk v2.1.6+incompatible
 	github.com/aws/aws-sdk-go v1.42.27
 	github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f // indirect
+	github.com/bitly/go-simplejson v0.5.0 // indirect
 	github.com/casbin/casbin/v2 v2.11.0
 	github.com/casbin/gorm-adapter/v3 v3.0.2
 	github.com/flipped-aurora/ws v1.0.2

+ 2 - 0
go.sum

@@ -44,6 +44,8 @@ github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod
 github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
 github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
+github.com/bitly/go-simplejson v0.5.0 h1:6IH+V8/tVMab511d5bn4M7EwGXZf9Hj6i2xSwkNEM+Y=
+github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA=
 github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
 github.com/casbin/casbin/v2 v2.2.2/go.mod h1:XXtYGrs/0zlOsJMeRteEdVi/FsB0ph7KgNfjoCoJUD8=
 github.com/casbin/casbin/v2 v2.11.0 h1:6M/sWT9gh2pUcL541be/rllWEVxcEV6wdg1t7MN6fHQ=

+ 9 - 7
initialize/redis.go

@@ -1,6 +1,8 @@
 package initialize
 
 import (
+	"context"
+	"go.uber.org/zap"
 	"log-server/global"
 
 	"github.com/go-redis/redis/v8"
@@ -14,11 +16,11 @@ func Redis() {
 		DB:       redisCfg.DB,       // use default DB
 	})
 	global.GVA_LOG.Info(client.String())
-	//pong, err := client.Ping(context.Background()).Result()
-	//if err != nil {
-	//	global.GVA_LOG.Error("redis connect ping failed, err:", zap.Error(err))
-	//} else {
-	//	global.GVA_LOG.Info("redis connect ping response:", zap.String("pong", pong))
-	//	global.GVA_REDIS = client
-	//}
+	pong, err := client.Ping(context.Background()).Result()
+	if err != nil {
+		global.GVA_LOG.Error("redis connect ping failed, err:", zap.Error(err))
+	} else {
+		global.GVA_LOG.Info("redis connect ping response:", zap.String("pong", pong))
+		global.GVA_REDIS = client
+	}
 }

+ 5 - 0
initialize/router.go

@@ -24,6 +24,7 @@ func Routers() *gin.Engine {
 
 	typeManageRouter := router.RouterGroupApp.TypeManage
 	rentComputerRouter := router.RouterGroupApp.RentComputer
+	dataStatisticsRouter := router.RouterGroupApp.DataStatistics
 	// 如果想要不使用nginx代理前端网页,可以修改 web/.env.production 下的
 	// VUE_APP_BASE_API = /
 	// VUE_APP_BASE_PATH = http://localhost
@@ -66,6 +67,10 @@ func Routers() *gin.Engine {
 		rentComputerRouter.InitRentComputerRouter(PublicGroup)     //租机管理
 		rentComputerRouter.InitRentComputerShopRouter(PublicGroup) // 租机供应商管理
 		rentComputerRouter.InitRentSetMealRouter(PublicGroup)
+		dataStatisticsRouter.InitDataAbnormalRateRouter(PublicGroup)      //数据统计
+		dataStatisticsRouter.InitWeChatScannerApiRouter(PublicGroup)      //数据统计
+		dataStatisticsRouter.InitWeChatScannerDetailedRouter(PublicGroup) //数据统计
+		dataStatisticsRouter.InitWeChatScannerLedgerRouter(PublicGroup)   //数据统计
 	}
 	PrivateGroup := Router.Group("")
 	PrivateGroup.Use(middleware.JWTAuth()).Use(middleware.CasbinHandler())

+ 37 - 0
initialize/timer.go

@@ -2,7 +2,9 @@ package initialize
 
 import (
 	"fmt"
+	"log-server/service/dataStatistics"
 	"log-server/service/log"
+	"log-server/service/rentComputer"
 	"log-server/service/task"
 
 	"log-server/config"
@@ -13,6 +15,10 @@ import (
 var serviceStatisticsLog = new(log.ServiceStatisticsLog)
 var ServiceLogList = new(log.ServiceLogList)
 var syncData = new(task.SyncData)
+var serviceRentComputer = new(rentComputer.ServiceRentComputer)
+var serviceWeChatScannerApi = new(dataStatistics.ServiceWeChatScannerApi)
+var serviceDataAbnormalRate = new(dataStatistics.ServiceDataAbnormalRate)
+var ServiceWeChatScannerDetailed = new(dataStatistics.ServiceWeChatScannerDetailed)
 
 func Timer() {
 	if global.GVA_CONFIG.Timer.Start {
@@ -36,6 +42,7 @@ func Timer() {
 	if err != nil {
 		fmt.Println("add taskCode timer error:", err)
 	}
+
 	// 定时同步电脑相关的统计数据
 	//_, err = global.GVA_Timer.AddTaskByFunc("CreateComputerStatisticsData", "40 0/9 7-23 * * * ", serviceStatisticsLog.CreateComputerStatisticsData)
 	//if err != nil {
@@ -81,4 +88,34 @@ func Timer() {
 	//if err != nil {
 	//	fmt.Println("add SyncTaskData timer error:", err)
 	//}
+
+	// 定时检查是否有电脑到期,修改租机状态@every 1s
+	//_, err = global.GVA_Timer.AddTaskByFunc("CheckIsExpire", "0/59 0/5 * * * *", serviceRentComputer.CheckIsExpire)
+	//if err != nil {
+	//	fmt.Println("add CheckIsExpire timer error:", err)
+	//}
+
+	//定时获取扫码平台余额,每小时执行一次
+	_, err = global.GVA_Timer.AddTaskByFunc("SyncGetWeChatScannerBalance", "0 58 * * * *", serviceWeChatScannerApi.SyncGetWeChatScannerBalance)
+	if err != nil {
+		fmt.Println("add SyncGetWeChatScannerBalance timer error:", err)
+	}
+	//定时更新异常率
+	_, err = global.GVA_Timer.AddTaskByFunc("SyncAbnormalRateByBatch", "0 1,31 * * * *", serviceDataAbnormalRate.SyncAbnormalRateByBatch)
+	if err != nil {
+		fmt.Println("add SyncAbnormalRateByBatch timer error:", err)
+	}
+
+	//定时更新当日微信扫码订单列表
+	_, err = global.GVA_Timer.AddTaskByFunc("SyncTodayWeChatScannerDetailed", "0 3,33 * * * *", ServiceWeChatScannerDetailed.SyncTodayWeChatScannerDetailed)
+	if err != nil {
+		fmt.Println("add SyncTodayWeChatScannerDetailed timer error:", err)
+	}
+
+	//0点更新昨日微信扫码订单列表
+	_, err = global.GVA_Timer.AddTaskByFunc("SyncYesterdayWeChatScannerDetailed", "1 1 0 * * *", ServiceWeChatScannerDetailed.SyncYesterdayWeChatScannerDetailed)
+	if err != nil {
+		fmt.Println("add SyncYesterdayWeChatScannerDetailed timer error:", err)
+	}
+
 }

+ 34 - 0
model/dataStatistics/data_abnormal_rate.go

@@ -0,0 +1,34 @@
+package dataStatistics
+
+type DataAbnormalRate struct {
+	Id                uint   `json:"id"`
+	UpdateTime        string `json:"update_time"`         // 更新时间
+	CreateTime        string `json:"create_time"`         // 创建时间
+	TaskId            int    `json:"task_id"`             //任务id
+	TaskName          string `json:"task_name"`           //任务名
+	DirectorName      string `json:"director_name"`       //负责人id
+	NewDate           string `json:"new_date"`            // 日期
+	Hour              int    `json:"hour"`                //小时
+	NumFrozen         int    `json:"num_frozen"`          //游戏封号数
+	NumPullAccount    int    `json:"num_pull_account"`    //拉取账号数
+	NumStartSimulator int    `json:"num_start_simulator"` //启动模拟器成功数
+	NumIp             int    `json:"num_ip"`              //上传ip数
+	NumStartScript    int    `json:"num_start_script"`    //脚本启动成功数
+	NumStartGame      int    `json:"num_start_game"`      //启动游戏成功数
+	NumLoginSuccess   int    `json:"num_login_success"`   //账号登录成功数
+	NumIntoGame       int    `json:"num_into_game"`       //进入游戏成功数
+	NumNewSuccess     int    `json:"num_new_success"`     //新增成功数
+	NumLcSuccess      int    `json:"num_lc_success"`      //留存成功数
+	NumPaySuccess     int    `json:"num_pay_success"`     //付费成功数
+	RateAllStep       string `json:"rate_all_step"`       //完整率
+	NumPullPay        int    `json:"num_pull_pay"`        //下发付费账号数
+	NumAccountLc      int    `json:"num_account_lc"`      //留存账号总数
+	NumCouldPay       int    `json:"num_could_pay"`       //可以付费账号
+	NumOrderPay       int    `json:"num_order_pay"`       // 付费订单数
+	NumPay            int    `json:"num_pay"`             //付费成功数
+	RatePaySuccess    string `json:"rate_pay_success"`    //付费成功率
+}
+
+func (DataAbnormalRate) TableName() string {
+	return "data_abnormal_rate"
+}

+ 28 - 0
model/dataStatistics/request/common.go

@@ -0,0 +1,28 @@
+package request
+
+// PageInfo Paging common input parameter structure
+type PageInfo struct {
+	Page     int    `json:"page" form:"page"`         // 页码
+	PageSize int    `json:"pageSize" form:"pageSize"` // 每页大小
+	Keyword  string `json:"keyword" form:"keyword"`   //关键字
+}
+
+// GetById Find by id structure
+type GetById struct {
+	ID int `json:"id" form:"id"` // 主键ID
+}
+
+func (r *GetById) Uint() uint {
+	return uint(r.ID)
+}
+
+type IdsReq struct {
+	Ids []int `json:"ids" form:"ids"`
+}
+
+// GetAuthorityId Get role by id structure
+type GetAuthorityId struct {
+	AuthorityId uint `json:"authorityId" form:"authorityId"` // 角色ID
+}
+
+type Empty struct{}

+ 78 - 0
model/dataStatistics/request/data_abnormal_rate.go

@@ -0,0 +1,78 @@
+package request
+
+type GetDataAbnormalRateRequest struct {
+	InfoDataAbnormalRateRequest
+	PageInfo
+	OrderKey string `json:"orderKey"` // 排序
+	Desc     bool   `json:"desc"`     // 排序方式:升序false(默认)|降序true
+}
+type DataAbnormalRateRequest struct {
+	Id                uint   `json:"id"`
+	UpdateTime        string `json:"update_time"`         // 更新时间
+	CreateTime        string `json:"create_time"`         // 创建时间
+	TaskId            int    `json:"task_id"`             //任务id
+	TaskName          string `json:"task_name"`           //任务名
+	DirectorName      string `json:"director_name"`       //负责人id
+	NewDate           string `json:"new_date"`            // 日期
+	Hour              int    `json:"hour"`                //小时
+	NumFrozen         int    `json:"num_frozen"`          //游戏封号数
+	NumPullAccount    int    `json:"num_pull_account"`    //拉取账号数
+	NumStartSimulator int    `json:"num_start_simulator"` //启动模拟器成功数
+	NumIp             int    `json:"num_ip"`              //上传ip数
+	NumStartScript    int    `json:"num_start_script"`    //脚本启动成功数
+	NumStartGame      int    `json:"num_start_game"`      //启动游戏成功数
+	NumLoginSuccess   int    `json:"num_login_success"`   //账号登录成功数
+	NumIntoGame       int    `json:"num_into_game"`       //进入游戏成功数
+	NumNewSuccess     int    `json:"num_new_success"`     //新增成功数
+	NumLcSuccess      int    `json:"num_lc_success"`      //留存成功数
+	NumPaySuccess     int    `json:"num_pay_success"`     //付费成功数
+	RateAllStep       string `json:"rate_all_step"`       //完整率
+	NumPullPay        int    `json:"num_pull_pay"`        //下发付费账号数
+	NumAccountLc      int    `json:"num_account_lc"`      //留存账号总数
+	NumCouldPay       int    `json:"num_could_pay"`       //可以付费账号
+	NumOrderPay       int    `json:"num_order_pay"`       // 付费订单数
+	NumPay            int    `json:"num_pay"`             //付费成功数
+	RatePaySuccess    string `json:"rate_pay_success"`    //付费成功率
+}
+
+type InfoDataAbnormalRateRequest struct {
+	TaskId       int      `json:"task_id"`       //任务id
+	TaskName     string   `json:"task_name"`     //任务名
+	DirectorName string   `json:"director_name"` //负责人
+	Date         []string `json:"date"`          // 日期数组
+	Hour         int      `json:"hour"`          //小时
+}
+
+type TaskInfo1 struct {
+	TaskId      int    `json:"task_id"`      //任务id
+	TaskName    string `json:"task_name"`    //任务名
+	User        string `json:"user"`         //负责人
+	LoginMethod int    `json:"login_method"` //登录方式
+	NewDate     string `json:"new_date"`     // 日期
+}
+
+type TaskStatistics struct {
+	GameId                int    `json:"game_id"`
+	GameName              string `json:"game_name"`
+	GameIdXmy             string `json:"game_id_xmy"`
+	NewComplete           int    `json:"new_complete"`
+	RetainedComplete      int    `json:"retained_complete"`
+	PayComplete           int    `json:"pay_complete"`
+	NewCompleteLocal      int    `json:"new_complete_local"`
+	RetainedCompleteLocal int    `json:"retained_complete_local"`
+	PayCompleteLocal      int    `json:"pay_complete_local"`
+	NewTarget             int    `json:"new_target"`         // 目标新增
+	RetainedTarget        int    `json:"retained_target"`    // 目标留存
+	PayTarget             int    `json:"pay_target"`         // 目标付费
+	OrderSuccessRate      string `json:"order_success_rate"` // 订单成功率
+	OrderSuccess          int    `json:"order_success"`      //小绵羊成功付费数
+	OrderCreate           int    `json:"order_create"`       // 小绵羊创建付费订单数
+	NewPullAccount        int    `json:"new_pull_account"`
+	RetainedPullAccount   int    `json:"retained_pull_account"`
+	NewScanningCode       int    `json:"new_scanning_code"`
+	RetainedScanningCode  int    `json:"retained_scanning_code"`
+	RetainedAccountNum    int    `json:"retained_account_num"` // 留存账号
+	FeeAccountNum         int    `json:"fee_account_num"`      // 付费账号
+	Remark                string `json:"remark"`               //负责人
+	GameRate              string `json:"game_rate"`            // 游戏效率
+}

+ 10 - 0
model/dataStatistics/request/wechat_scanner_api.go

@@ -0,0 +1,10 @@
+package request
+
+import "log-server/model/dataStatistics"
+
+type WeChatScannerApiRequest struct {
+	dataStatistics.WeChatScannerApi
+	PageInfo
+	OrderKey string `json:"orderKey"` // 排序
+	Desc     bool   `json:"desc"`     // 排序方式:升序false(默认)|降序true
+}

+ 10 - 0
model/dataStatistics/request/wechat_scanner_detailed.go

@@ -0,0 +1,10 @@
+package request
+
+import "log-server/model/dataStatistics"
+
+type WeChatScannerDetailedRequest struct {
+	dataStatistics.WeChatScannerDetailed
+	PageInfo
+	OrderKey string `json:"orderKey"` // 排序
+	Desc     bool   `json:"desc"`     // 排序方式:升序false(默认)|降序true
+}

+ 10 - 0
model/dataStatistics/request/wechat_scanner_ledger.go

@@ -0,0 +1,10 @@
+package request
+
+import "log-server/model/dataStatistics"
+
+type WeChatScannerLedgerRequest struct {
+	dataStatistics.WeChatScannerLedger
+	PageInfo
+	OrderKey string `json:"orderKey"` // 排序
+	Desc     bool   `json:"desc"`     // 排序方式:升序false(默认)|降序true
+}

+ 8 - 0
model/dataStatistics/response/common.go

@@ -0,0 +1,8 @@
+package response
+
+type PageResult struct {
+	List     interface{} `json:"list"`
+	Total    int64       `json:"total"`
+	Page     int         `json:"page"`
+	PageSize int         `json:"pageSize"`
+}

+ 30 - 0
model/dataStatistics/response/data_abnormal_rate.go

@@ -0,0 +1,30 @@
+package response
+
+type DataAbnormalRateResponse struct {
+	Id                uint   `json:"id"`
+	UpdateTime        string `json:"update_time"`         // 更新时间
+	CreateTime        string `json:"create_time"`         // 创建时间
+	TaskId            int    `json:"task_id"`             //任务id
+	TaskName          string `json:"task_name"`           //任务名
+	DirectorName      string `json:"director_name"`       //负责人id
+	NewDate           string `json:"new_date"`            // 日期
+	Hour              int    `json:"hour"`                //小时
+	NumFrozen         int    `json:"num_frozen"`          //游戏封号数
+	NumPullAccount    int    `json:"num_pull_account"`    //拉取账号数
+	NumStartSimulator int    `json:"num_start_simulator"` //启动模拟器成功数
+	NumIp             int    `json:"num_ip"`              //上传ip数
+	NumStartScript    int    `json:"num_start_script"`    //脚本启动成功数
+	NumStartGame      int    `json:"num_start_game"`      //启动游戏成功数
+	NumLoginSuccess   int    `json:"num_login_success"`   //账号登录成功数
+	NumIntoGame       int    `json:"num_into_game"`       //进入游戏成功数
+	NumNewSuccess     int    `json:"num_new_success"`     //新增成功数
+	NumLcSuccess      int    `json:"num_lc_success"`      //留存成功数
+	NumPaySuccess     int    `json:"num_pay_success"`     //付费成功数
+	RateAllStep       string `json:"rate_all_step"`       //完整率
+	NumPullPay        int    `json:"num_pull_pay"`        //下发付费账号数
+	NumAccountLc      int    `json:"num_account_lc"`      //留存账号总数
+	NumCouldPay       int    `json:"num_could_pay"`       //可以付费账号
+	NumOrderPay       int    `json:"num_order_pay"`       // 付费订单数
+	NumPay            int    `json:"num_pay"`             //付费成功数
+	RatePaySuccess    string `json:"rate_pay_success"`    //付费成功率
+}

+ 11 - 0
model/dataStatistics/response/wechat_scanner_api.go

@@ -0,0 +1,11 @@
+package response
+
+type WeChatScannerApiResponse struct {
+	Id         uint   `json:"id"`
+	UpdateTime string `json:"update_time"` // 更新时间
+	CreateTime string `json:"create_time"` // 创建时间
+	Name       string `json:"name"`        // 平台名
+	Balance    string `json:"balance"`     // 平台余额
+	NewDate    string `json:"new_date"`    // 日期
+
+}

+ 12 - 0
model/dataStatistics/response/wechat_scanner_detailed.go

@@ -0,0 +1,12 @@
+package response
+
+type WeChatScannerDetailedResponse struct {
+	Id                uint   `json:"id"`
+	NewDate           string `json:"new_date"`           //日期
+	OrderId           string `json:"order_id"`           //微信订单号
+	Platform          string `json:"platform"`           //平台名
+	AuthorizationTime string `json:"authorization_time"` //授权时间
+	TaskId            int    `json:"task_id"`            //任务id
+	TaskName          string `json:"task_name"`          //任务名
+	NewRetained       int    `json:"new_retained"`       //留存天数(1:新增,2:2留)
+}

+ 12 - 0
model/dataStatistics/response/wechat_scanner_ledger.go

@@ -0,0 +1,12 @@
+package response
+
+type WeChatScannerLedgerResponse struct {
+	Id             uint   `json:"id"`
+	NewDate        string `json:"new_date"`        //日期
+	TaskId         int    `json:"task_id"`         //任务id
+	TaskName       string `json:"task_name"`       //任务名
+	Platform       string `json:"platform"`        //平台名
+	Ledger         string `json:"ledger"`          //总消耗
+	LedgerNew      string `json:"ledger_new"`      //新增消耗
+	LedgerRetained string `json:"ledger_retained"` //留存消耗
+}

+ 14 - 0
model/dataStatistics/wechat_scanner_api.go

@@ -0,0 +1,14 @@
+package dataStatistics
+
+type WeChatScannerApi struct {
+	Id         uint   `json:"id"`
+	UpdateTime string `json:"update_time"` // 更新时间
+	CreateTime string `json:"create_time"` // 创建时间
+	Name       string `json:"name"`        // 平台名
+	Balance    string `json:"balance"`     // 平台余额
+	NewDate    string `json:"new_date"`    // 日期
+}
+
+func (WeChatScannerApi) TableName() string {
+	return "wechat_scanner_api"
+}

+ 16 - 0
model/dataStatistics/wechat_scanner_detailed.go

@@ -0,0 +1,16 @@
+package dataStatistics
+
+type WeChatScannerDetailed struct {
+	Id                uint   `json:"id"`
+	NewDate           string `json:"new_date"`           //日期
+	OrderId           string `json:"order_id"`           //微信订单号
+	Platform          string `json:"platform"`           //平台名
+	AuthorizationTime string `json:"authorization_time"` //授权时间
+	TaskId            int    `json:"task_id"`            //任务id
+	TaskName          string `json:"task_name"`          //任务名
+	NewRetained       int    `json:"new_retained"`       //留存天数(1:新增,2:2留)
+}
+
+func (WeChatScannerDetailed) TableName() string {
+	return "wechat_scanner_detailed"
+}

+ 16 - 0
model/dataStatistics/wechat_scanner_ledger.go

@@ -0,0 +1,16 @@
+package dataStatistics
+
+type WeChatScannerLedger struct {
+	Id             uint   `json:"id"`
+	NewDate        string `json:"new_date"`        //日期
+	TaskId         int    `json:"task_id"`         //任务id
+	TaskName       string `json:"task_name"`       //任务名
+	Platform       string `json:"platform"`        //平台名
+	Ledger         string `json:"ledger"`          //总消耗
+	LedgerNew      string `json:"ledger_new"`      //新增消耗
+	LedgerRetained string `json:"ledger_retained"` //留存消耗
+}
+
+func (WeChatScannerLedger) TableName() string {
+	return "wechat_scanner_ledger"
+}

+ 8 - 0
model/rentComputer/response/rent_computer.go

@@ -25,3 +25,11 @@ type ComputerStatisticsReply2 struct {
 	ShopName          string  `json:"shop_name"`          //供应商名
 	SetMealName       string  `json:"set_meal_name"`      //套餐名
 }
+
+type ComputerIsExpire struct {
+	Id       uint   `json:"id"`
+	PcNum    string `json:"pc_num"`    //电脑编号
+	ShopId   uint   `json:"shop_id"`   //供应商ID
+	RentEnd  string `json:"rent_end"`  //到期时间
+	IsExpire int    `json:"is_expire"` //是否到期 0:否 1:是 2:明日到期
+}

+ 17 - 0
router/dataStatistics/data_abnormal_rate.go

@@ -0,0 +1,17 @@
+package dataStatistics
+
+import (
+	"github.com/gin-gonic/gin"
+	v1 "log-server/api/v1"
+)
+
+type DataAbnormalRateRouter struct {
+}
+
+func (e *DataAbnormalRateRouter) InitDataAbnormalRateRouter(Router *gin.RouterGroup) {
+	excelRouter := Router.Group("dataStatistics")
+	rentComputerApi := v1.ApiGroupApp.DataStatisticsGroup.ApiDataAbnormalRate
+	{
+		excelRouter.POST("queryAbnormalRate", rentComputerApi.QueryAbnormalRate) //查询记录
+	}
+}

+ 10 - 0
router/dataStatistics/enter.go

@@ -0,0 +1,10 @@
+package dataStatistics
+
+type RouterGroup struct {
+	// Code generated by log-server Begin; DO NOT EDIT.
+	DataAbnormalRateRouter
+	WeChatScannerApiRouter
+	WeChatScannerDetailedRouter
+	WeChatScannerLedgerRouter
+	// Code generated by log-server End; DO NOT EDIT.
+}

+ 17 - 0
router/dataStatistics/wechat_scanner_api.go

@@ -0,0 +1,17 @@
+package dataStatistics
+
+import (
+	"github.com/gin-gonic/gin"
+	v1 "log-server/api/v1"
+)
+
+type WeChatScannerApiRouter struct {
+}
+
+func (e *WeChatScannerApiRouter) InitWeChatScannerApiRouter(Router *gin.RouterGroup) {
+	excelRouter := Router.Group("dataStatistics")
+	api := v1.ApiGroupApp.DataStatisticsGroup.ApiWeChatScannerApi
+	{
+		excelRouter.POST("getWeChatScannerApiList", api.GetWeChatScannerApiList) //查询记录
+	}
+}

+ 17 - 0
router/dataStatistics/wechat_scanner_detailed.go

@@ -0,0 +1,17 @@
+package dataStatistics
+
+import (
+	"github.com/gin-gonic/gin"
+	v1 "log-server/api/v1"
+)
+
+type WeChatScannerDetailedRouter struct {
+}
+
+func (e *WeChatScannerDetailedRouter) InitWeChatScannerDetailedRouter(Router *gin.RouterGroup) {
+	excelRouter := Router.Group("dataStatistics")
+	api := v1.ApiGroupApp.DataStatisticsGroup.ApiWeChatScannerDetailed
+	{
+		excelRouter.POST("getWeChatScannerDetailedList", api.GetWeChatScannerDetailedList) //查询记录
+	}
+}

+ 17 - 0
router/dataStatistics/wechat_scanner_ledger.go

@@ -0,0 +1,17 @@
+package dataStatistics
+
+import (
+	"github.com/gin-gonic/gin"
+	v1 "log-server/api/v1"
+)
+
+type WeChatScannerLedgerRouter struct {
+}
+
+func (e *WeChatScannerLedgerRouter) InitWeChatScannerLedgerRouter(Router *gin.RouterGroup) {
+	excelRouter := Router.Group("dataStatistics")
+	api := v1.ApiGroupApp.DataStatisticsGroup.ApiWeChatScannerLedger
+	{
+		excelRouter.POST("getWeChatScannerLedgerList", api.GetWeChatScannerLedgerList) //查询记录
+	}
+}

+ 9 - 7
router/enter.go

@@ -1,6 +1,7 @@
 package router
 
 import (
+	"log-server/router/dataStatistics"
 	"log-server/router/example"
 	"log-server/router/log"
 	"log-server/router/rentComputer"
@@ -10,13 +11,14 @@ import (
 )
 
 type RouterGroup struct {
-	System       system.RouterGroup
-	Example      example.RouterGroup
-	Loging       log.RouterGroup
-	Computer     log.ComputerRouter
-	TypeManage   typeManage.RouterGroup
-	Task         task.GameTaskRouter
-	RentComputer rentComputer.RouterGroup
+	System         system.RouterGroup
+	Example        example.RouterGroup
+	Loging         log.RouterGroup
+	Computer       log.ComputerRouter
+	TypeManage     typeManage.RouterGroup
+	Task           task.GameTaskRouter
+	RentComputer   rentComputer.RouterGroup
+	DataStatistics dataStatistics.RouterGroup
 }
 
 var RouterGroupApp = new(RouterGroup)

+ 1 - 1
router/task/game_task.go

@@ -10,7 +10,7 @@ type GameTaskRouter struct {
 
 func (e *GameTaskRouter) InitGameTaskRouter(Router *gin.RouterGroup) {
 	GameTaskRouter := Router.Group("gameTask")
-	GameTaskApi := v1.ApiGroupApp.TaskApiGroup.GameTaskApi
+	GameTaskApi := v1.ApiGroupApp.GroupTask.GameTaskApi
 	{
 		GameTaskRouter.POST("create", GameTaskApi.CreateGameTask)
 		GameTaskRouter.POST("getGameTaskList", GameTaskApi.GetGameTaskList)

+ 403 - 0
service/dataStatistics/data_abnormal_rate.go

@@ -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
+}

+ 10 - 0
service/dataStatistics/enter.go

@@ -0,0 +1,10 @@
+package dataStatistics
+
+type ServiceGroup struct {
+	// Code generated by log-server Begin; DO NOT EDIT.
+	ServiceDataAbnormalRate
+	ServiceWeChatScannerApi
+	ServiceWeChatScannerDetailed
+	ServiceWeChatScannerLedger
+	// Code generated by log-server End; DO NOT EDIT.
+}

+ 150 - 0
service/dataStatistics/wechat_scanner_api.go

@@ -0,0 +1,150 @@
+package dataStatistics
+
+import (
+	"context"
+	"github.com/bitly/go-simplejson"
+	_ "github.com/bitly/go-simplejson"
+	"go.uber.org/zap"
+	"log-server/global"
+	"log-server/model/dataStatistics"
+	"log-server/model/dataStatistics/request"
+	"log-server/model/dataStatistics/response"
+	"log-server/utils"
+	"strings"
+	"time"
+	//"time"
+)
+
+type ServiceWeChatScannerApi struct {
+}
+
+func (s *ServiceWeChatScannerApi) WeChatScannerApiList(ctx context.Context, api dataStatistics.WeChatScannerApi, info request.PageInfo, order string, desc bool) (interface{}, int64, error) {
+
+	db := global.GVA_DB.Model(&dataStatistics.WeChatScannerApi{})
+
+	//global.GVA_LOG.Info(api.NewDate)
+	if api.Name != "" {
+		db = db.Where("name = ?", api.Name)
+	}
+	if api.NewDate != "" {
+		db = db.Where("new_date = ?", api.NewDate)
+	}
+	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 apiList []dataStatistics.WeChatScannerApi
+	db = db.Limit(limit).Offset(offset)
+	if order != "" {
+		var OrderStr string
+		// 设置有效排序key 防止sql注入
+		// 感谢 Tom4t0 提交漏洞信息
+		orderMap := make(map[string]bool, 3)
+		orderMap["id"] = true
+		//orderMap["game_id"] = true
+		//orderMap["operator"] = true
+		if orderMap[order] {
+			if desc {
+				OrderStr = order + " desc"
+			} else {
+				OrderStr = order + " desc"
+			}
+		} else { // didn't matched any order key in `orderMap`
+			global.GVA_LOG.Error("获取失败!", zap.Error(err))
+			return apiList, total, err
+		}
+		err = db.Order(OrderStr).Find(&apiList).Error
+	} else {
+		err = db.Order("id").Find(&apiList).Error
+	}
+	if err != nil {
+		return nil, 0, err
+	}
+	var arrayResponse []*response.WeChatScannerApiResponse
+	for _, e := range apiList {
+		oneResponse := new(response.WeChatScannerApiResponse)
+		oneResponse.Id = e.Id
+		oneResponse.UpdateTime = e.UpdateTime
+		oneResponse.CreateTime = e.CreateTime
+		oneResponse.Name = e.Name
+		oneResponse.Balance = e.Balance
+		oneResponse.NewDate = e.NewDate
+
+		arrayResponse = append(arrayResponse, oneResponse)
+	}
+	return arrayResponse, total, err
+}
+
+// SyncGetWeChatScannerBalance 定时获取扫码平台余额
+func (s *ServiceWeChatScannerApi) SyncGetWeChatScannerBalance() {
+	const (
+		ZWNBSP = '\uFEFF'
+		empty  = ""
+	)
+	newDate := time.Now().Format("2006-01-02")
+	//浪潮===============================================================
+	lc := s.GetLangchaoInfo()
+	dataLc, _ := simplejson.NewJson(lc)
+	code, _ := dataLc.Get("code").Int()
+	balanceLc := "0"
+	if code == 20000 {
+		balanceLc, _ = dataLc.Get("data").Get("balance").String()
+	}
+	//global.GVA_LOG.Info("浪潮扫码平台余额:" + balanceLc)
+	one := new(dataStatistics.WeChatScannerApi)
+	one.Name = "浪潮"
+	one.UpdateTime = time.Now().Format("2006-01-02 15:04:05")
+	one.CreateTime = time.Now().Format("2006-01-02 15:04:05")
+	one.Balance = balanceLc
+	one.NewDate = newDate
+	_ = global.GVA_DB.Create(&one).Error
+	//海马==========================================================================
+	hm := s.GetHaimaInfo()
+	//global.GVA_LOG.Info("1:" + string(hm))
+	//hm2 := strings.Trim(string(hm), "")
+	hm2 := strings.Replace(string(hm), string(ZWNBSP), empty, -1)
+	hm = []byte(hm2)
+	dataHm, _ := simplejson.NewJson(hm)
+	//global.GVA_LOG.Info("2:" + dataHm)
+	code, _ = dataHm.Get("code").Int()
+
+	balanceHm := "0"
+	if code == 1 {
+		balanceHm, _ = dataHm.Get("data").String()
+	}
+	//global.GVA_LOG.Info("海马扫码平台余额:" + balanceHm)
+	one = new(dataStatistics.WeChatScannerApi)
+	one.Name = "海马"
+	one.Balance = balanceHm
+	one.NewDate = newDate
+	one.UpdateTime = time.Now().Format("2006-01-02 15:04:05")
+	one.CreateTime = time.Now().Format("2006-01-02 15:04:05")
+	_ = global.GVA_DB.Create(&one).Error
+	return
+}
+
+// getLangchaoInfo 获取浪潮
+func (s *ServiceWeChatScannerApi) GetLangchaoInfo() (result []byte) {
+	jfUrl := "http://202.189.7.240:8082/api/userInfo"
+	jfParams := map[string]string{
+		"username": "513022",
+		"password": "kfzsygdl",
+	}
+	result, _ = utils.HttpGet(jfUrl, jfParams)
+	return
+}
+
+// getHaimaInfo 获取海马
+func (s *ServiceWeChatScannerApi) GetHaimaInfo() (result []byte) {
+	jfUrl := "https://api.yundiani.com/api/openav/checkUserBalance"
+	jfParams := map[string]string{
+		"uname":    "513022",
+		"password": "b52fca684535d924fb0147b9afbff681",
+	}
+	result, _ = utils.HttpGet(jfUrl, jfParams)
+	return
+}

+ 221 - 0
service/dataStatistics/wechat_scanner_detailed.go

@@ -0,0 +1,221 @@
+package dataStatistics
+
+import (
+	"context"
+	"errors"
+	"github.com/bitly/go-simplejson"
+	_ "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/utils"
+	"strconv"
+	"strings"
+	"time"
+	//"time"
+)
+
+type ServiceWeChatScannerDetailed struct {
+}
+
+type WeChatGameInfo struct {
+	GameName        string
+	LcPriceNew      float64
+	LcPriceRetained float64
+	HmPriceNew      float64
+	HmPriceRetained float64
+}
+
+type PlatformNum struct {
+	Platform string `json:"platform"`
+	Count    int    `json:"count"`
+}
+
+func (s *ServiceWeChatScannerDetailed) WeChatScannerDetailedList(ctx context.Context, api dataStatistics.WeChatScannerDetailed, info request.PageInfo, order string, desc bool) (interface{}, int64, error) {
+
+	db := global.GVA_DB.Model(&dataStatistics.WeChatScannerDetailed{})
+	//global.GVA_LOG.Info(api.NewDate)
+	if api.Platform != "" {
+		db = db.Where("platform = ?", api.Platform)
+	}
+	if api.NewDate != "" {
+		db = db.Where("new_date = ?", api.NewDate)
+	}
+	if api.TaskId != 0 {
+		db = db.Where("task_id = ?", api.TaskId)
+	}
+	if api.NewRetained != 0 {
+		if api.NewRetained == 1 {
+			db = db.Where("new_retained = ?", api.NewRetained)
+		} else {
+			db = db.Where("new_retained >= ?", api.NewRetained)
+		}
+	}
+	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 apiList []dataStatistics.WeChatScannerDetailed
+	db = db.Limit(limit).Offset(offset)
+	if order != "" {
+		var OrderStr string
+		// 设置有效排序key 防止sql注入
+		// 感谢 Tom4t0 提交漏洞信息
+		orderMap := make(map[string]bool, 3)
+		orderMap["id"] = true
+		//orderMap["game_id"] = true
+		//orderMap["operator"] = true
+		if orderMap[order] {
+			if desc {
+				OrderStr = order + " desc"
+			} else {
+				OrderStr = order + " desc"
+			}
+		} else { // didn't matched any order key in `orderMap`
+			global.GVA_LOG.Error("获取失败!", zap.Error(err))
+			return apiList, total, err
+		}
+		err = db.Order(OrderStr).Find(&apiList).Error
+	} else {
+		err = db.Order("id").Find(&apiList).Error
+	}
+	if err != nil {
+		return nil, 0, err
+	}
+	var arrayResponse []*response.WeChatScannerDetailedResponse
+	for _, e := range apiList {
+		oneResponse := new(response.WeChatScannerDetailedResponse)
+		oneResponse.Id = e.Id
+		oneResponse.NewDate = e.NewDate
+		oneResponse.OrderId = e.OrderId
+		oneResponse.Platform = e.Platform
+		oneResponse.AuthorizationTime = e.AuthorizationTime
+		oneResponse.TaskId = e.TaskId
+		oneResponse.TaskName = e.TaskName
+		oneResponse.NewRetained = e.NewRetained
+
+		arrayResponse = append(arrayResponse, oneResponse)
+	}
+	return arrayResponse, total, err
+}
+
+// SyncTodayWeChatScannerDetailed 同步今日
+func (s *ServiceWeChatScannerDetailed) SyncTodayWeChatScannerDetailed() {
+	today := time.Now().Format("2006-01-02")
+	s.SyncWeChatScannerDetailed(today)
+}
+
+// SyncYesterdayWeChatScannerDetailed 0点同步昨日数据,确保数据完整性
+func (s *ServiceWeChatScannerDetailed) SyncYesterdayWeChatScannerDetailed() {
+	today := time.Now()
+	yesterday := today.AddDate(0, 0, -1).Format("2006-01-02")
+	s.SyncWeChatScannerDetailed(yesterday)
+}
+
+// SyncWeChatScannerDetailed 定时批量同步微信扫码订单号明细,先将微信扫码的游戏写死
+func (s *ServiceWeChatScannerDetailed) SyncWeChatScannerDetailed(today string) {
+	tencentTasks := map[int]WeChatGameInfo{
+		10101:    {GameName: "坦克前线", LcPriceNew: 0.35, LcPriceRetained: 0.01, HmPriceNew: 0.4, HmPriceRetained: 0.01},
+		10360903: {GameName: "原始传奇-10360903", LcPriceNew: 0.35, LcPriceRetained: 0.01, HmPriceNew: 0.4, HmPriceRetained: 0.01},
+		10361913: {GameName: "原始传奇-10361913", LcPriceNew: 0.35, LcPriceRetained: 0.01, HmPriceNew: 0.4, HmPriceRetained: 0.01},
+		10363822: {GameName: "原始传奇-10363822", LcPriceNew: 0.35, LcPriceRetained: 0.01, HmPriceNew: 0.4, HmPriceRetained: 0.01},
+		6543:     {GameName: "创造与魔法10361913", LcPriceNew: 0.4, LcPriceRetained: 0.01, HmPriceNew: 0.4, HmPriceRetained: 0.01},
+		8767:     {GameName: "奶块10361913", LcPriceNew: 0.35, LcPriceRetained: 0.01, HmPriceNew: 0.4, HmPriceRetained: 0.01},
+		888811:   {GameName: "热血合击tx-10360903 ", LcPriceNew: 0.35, LcPriceRetained: 0.01, HmPriceNew: 0.4, HmPriceRetained: 0.01},
+	}
+	for k, v := range tencentTasks {
+		result := s.getJfWechatOrder(k, today)
+		dataJson, _ := simplejson.NewJson(result)
+		dataArr, _ := dataJson.Array()
+
+		for index, _ := range dataArr {
+			info := dataJson.GetIndex(index)
+			//GameId, _ := info.Get("GameId").Int()
+			WeChatOrder, _ := info.Get("WeChatOrder").String()
+			Retained, _ := info.Get("Retained").Int()
+			Time, _ := info.Get("Time").String()
+
+			orderArr := strings.Split(WeChatOrder, "|")
+			orderId := orderArr[0]
+			platform := orderArr[1]
+			var data dataStatistics.WeChatScannerDetailed
+			data.NewDate = today
+			data.TaskId = k
+			data.Platform = platform
+			data.OrderId = orderId
+			data.NewRetained = Retained
+			data.AuthorizationTime = Time
+			data.TaskName = v.GameName
+			if errors.Is(global.GVA_DB.Model(&dataStatistics.WeChatScannerDetailed{}).Where("new_date = ? and task_id = ? and order_id = ?", today, k, orderId).First(&dataStatistics.WeChatScannerDetailed{}).Error, gorm.ErrRecordNotFound) {
+				_ = global.GVA_DB.Create(&data).Error
+			}
+		}
+		//计算微信扫码消耗
+		//SELECT platform, COUNT(*) FROM wechat_scanner_detailed WHERE new_date = '2023-02-07' AND  task_id = 888811 AND new_retained =  1 GROUP BY platform
+		arrPlatform := []string{"海马", "浪潮"}
+		for _, platform := range arrPlatform {
+			var db1Ledger dataStatistics.WeChatScannerLedger
+			db1Ledger.TaskId = k
+			db1Ledger.TaskName = v.GameName
+			db1Ledger.NewDate = today
+			db1Ledger.Platform = platform
+			var listNum []PlatformNum
+			PriceNew := 0.00
+			PriceRetained := 0.00
+			_ = global.GVA_DB.Model(&dataStatistics.WeChatScannerDetailed{}).Select("platform", "COUNT(*) AS count").Where("new_date = ? and task_id = ? and platform = ? and new_retained = 1", today, k, platform).First(&listNum).Error
+			for _, e := range listNum {
+				if e.Platform == "海马" {
+					PriceNew = v.HmPriceNew * float64(e.Count)
+				} else if e.Platform == "浪潮" {
+					//global.GVA_LOG.Info(strconv.Itoa(e.Count))
+					PriceNew = v.LcPriceNew * float64(e.Count)
+					//global.GVA_LOG.Info(strconv.FormatFloat(PriceNew, 'f', 2, 64))
+				}
+			}
+			var listNum2 []PlatformNum
+			_ = global.GVA_DB.Model(&dataStatistics.WeChatScannerDetailed{}).Select("platform", "COUNT(*) AS count").Where("new_date = ? and task_id = ? and platform = ? and new_retained >= 2", today, k, platform).First(&listNum2).Error
+			for _, e := range listNum2 {
+				if e.Platform == "海马" {
+					PriceRetained = v.HmPriceRetained * float64(e.Count)
+				} else if e.Platform == "浪潮" {
+					PriceRetained = v.LcPriceRetained * float64(e.Count)
+				}
+			}
+			db1Ledger.LedgerNew = strconv.FormatFloat(PriceNew, 'f', 2, 64)
+			db1Ledger.LedgerRetained = strconv.FormatFloat(PriceRetained, 'f', 2, 64)
+			db1Ledger.Ledger = strconv.FormatFloat(PriceNew+PriceRetained, 'f', 2, 64)
+			//global.GVA_LOG.Info(strconv.Itoa(db1Ledger.TaskId))
+			//global.GVA_LOG.Info(db1Ledger.TaskName)
+			//global.GVA_LOG.Info(db1Ledger.LedgerNew)
+			//global.GVA_LOG.Info(db1Ledger.LedgerRetained)
+			//global.GVA_LOG.Info(db1Ledger.Ledger)
+			if !errors.Is(global.GVA_DB.Model(&dataStatistics.WeChatScannerLedger{}).Where("new_date = ? and task_id = ? and platform = ?", today, k, platform).First(&dataStatistics.WeChatScannerLedger{}).Error, gorm.ErrRecordNotFound) {
+				_ = global.GVA_DB.Model(&dataStatistics.WeChatScannerLedger{}).Where("new_date = ? and task_id = ? and platform = ?", today, k, platform).Updates(db1Ledger).Error
+			} else {
+				_ = global.GVA_DB.Create(&db1Ledger).Error
+			}
+
+		}
+
+	}
+}
+
+// SyncGetWeChatScannerBalance 定时获取扫码平台余额
+//
+// getJfWechatOrder 获取机房后台微信订单列表信息
+func (s *ServiceWeChatScannerDetailed) getJfWechatOrder(gameId int, date string) (result []byte) {
+	jfUrl := "http://xjf.lianyou.fun:8099/v1/account/get_wechat_order"
+	jfParams := map[string]string{
+		"game_id": strconv.Itoa(gameId),
+		"date":    date,
+	}
+	result, _ = utils.HttpGet(jfUrl, jfParams)
+	return
+}

+ 85 - 0
service/dataStatistics/wechat_scanner_ledger.go

@@ -0,0 +1,85 @@
+package dataStatistics
+
+import (
+	"context"
+	_ "github.com/bitly/go-simplejson"
+	"go.uber.org/zap"
+	"log-server/global"
+	"log-server/model/dataStatistics"
+	"log-server/model/dataStatistics/request"
+	"log-server/model/dataStatistics/response"
+	//"time"
+)
+
+type ServiceWeChatScannerLedger struct {
+}
+
+//type WeChatGameInfo struct {
+//	GameName        string
+//	LcPriceNew      float64
+//	LcPriceRetained float64
+//	HmPriceNew      float64
+//	HmPriceRetained float64
+//}
+
+func (s *ServiceWeChatScannerLedger) WeChatScannerLedgerList(ctx context.Context, api dataStatistics.WeChatScannerLedger, info request.PageInfo, order string, desc bool) (interface{}, int64, error) {
+
+	db := global.GVA_DB.Model(&dataStatistics.WeChatScannerLedger{})
+	//global.GVA_LOG.Info(api.NewDate)
+	if api.NewDate != "" {
+		db = db.Where("new_date = ?", api.NewDate)
+	}
+	if api.Platform != "" {
+		db = db.Where("platform = ?", api.Platform)
+	}
+	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 apiList []dataStatistics.WeChatScannerLedger
+	db = db.Limit(limit).Offset(offset)
+	if order != "" {
+		var OrderStr string
+		// 设置有效排序key 防止sql注入
+		// 感谢 Tom4t0 提交漏洞信息
+		orderMap := make(map[string]bool, 3)
+		orderMap["task_name"] = true
+		//orderMap["game_id"] = true
+		//orderMap["operator"] = true
+		if orderMap[order] {
+			if desc {
+				OrderStr = order + " desc"
+			} else {
+				OrderStr = order + " desc"
+			}
+		} else { // didn't matched any order key in `orderMap`
+			global.GVA_LOG.Error("获取失败!", zap.Error(err))
+			return apiList, total, err
+		}
+		err = db.Order(OrderStr).Find(&apiList).Error
+	} else {
+		err = db.Order("task_name").Find(&apiList).Error
+	}
+	if err != nil {
+		return nil, 0, err
+	}
+	var arrayResponse []*response.WeChatScannerLedgerResponse
+	for _, e := range apiList {
+		oneResponse := new(response.WeChatScannerLedgerResponse)
+		oneResponse.Id = e.Id
+		oneResponse.NewDate = e.NewDate
+		oneResponse.Platform = e.Platform
+		oneResponse.TaskId = e.TaskId
+		oneResponse.TaskName = e.TaskName
+		oneResponse.Ledger = e.Ledger
+		oneResponse.LedgerNew = e.LedgerNew
+		oneResponse.LedgerRetained = e.LedgerRetained
+
+		arrayResponse = append(arrayResponse, oneResponse)
+	}
+	return arrayResponse, total, err
+}

+ 8 - 6
service/enter.go

@@ -1,6 +1,7 @@
 package service
 
 import (
+	"log-server/service/dataStatistics"
 	"log-server/service/example"
 	"log-server/service/log"
 	"log-server/service/rentComputer"
@@ -10,12 +11,13 @@ import (
 )
 
 type ServiceGroup struct {
-	SystemServiceGroup       system.ServiceGroup
-	ExampleServiceGroup      example.ServiceGroup
-	LogServiceGroup          log.ServiceGroup
-	TypeServiceGroup         typeManage.ServiceGroup
-	TaskServiceGroup         task.ServiceGroup
-	RentComputerServiceGroup rentComputer.ServiceGroup
+	SystemServiceGroup         system.ServiceGroup
+	ExampleServiceGroup        example.ServiceGroup
+	LogServiceGroup            log.ServiceGroup
+	TypeServiceGroup           typeManage.ServiceGroup
+	TaskServiceGroup           task.ServiceGroup
+	RentComputerServiceGroup   rentComputer.ServiceGroup
+	DataStatisticsServiceGroup dataStatistics.ServiceGroup
 }
 
 var ServiceGroupApp = new(ServiceGroup)

+ 58 - 3
service/rentComputer/rent_computer.go

@@ -38,8 +38,8 @@ func (s *ServiceRentComputer) RentComputerList(ctx context.Context, api rentComp
 	if api.SetMealId != 0 {
 		db = db.Where("rent_computer.set_meal_id = ?", api.SetMealId)
 	}
-	global.GVA_LOG.Info(strconv.Itoa(int(api.IsOffShelf)))
-	global.GVA_LOG.Info(strconv.Itoa(int(api.IsExpire)))
+	//global.GVA_LOG.Info(strconv.Itoa(int(api.IsOffShelf)))
+	//global.GVA_LOG.Info(strconv.Itoa(int(api.IsExpire)))
 	if api.IsOffShelf != -1 {
 		db = db.Where("rent_computer.is_off_shelf = ?", api.IsOffShelf)
 	}
@@ -356,7 +356,62 @@ func (exa *ServiceRentComputer) compareStrSlice(a, b []string) bool {
 	return true
 }
 
-// 计算日期相差多少天
+// CheckIsExpire 定时检查是否有电脑到期,修改租机状态/*
+func (s *ServiceRentComputer) CheckIsExpire() {
+	global.GVA_LOG.Info("检查是否有电脑到期开始执行:" + time.Now().Format("2006-01-02 15:04:05"))
+	db := global.GVA_DB.Model(&rentComputer.RentComputer{})
+	//SELECT pc_num,rent_start,rent_end,is_expire FROM shuyou_rent_computer
+	db = db.Where("is_off_shelf = 0")
+	var computers []*rentComputer.RentComputer
+	err := db.Order("id").Find(&computers).Error
+	if err != nil {
+		global.GVA_LOG.Error("检查是否有电脑到期执行失败:" + time.Now().Format("2006-01-02 15:04:05"))
+		return
+	}
+	const overtime = 24 * 60 * 60
+	nowUnix := time.Now().Unix()
+
+	//global.GVA_LOG.Info(strconv.FormatInt(nowUnix, 10))
+	//global.GVA_LOG.Info("---------------------------------------------------------------------------------")
+	computer := new(rentComputer.RentComputer)
+	for _, c := range computers {
+		endUnix, _ := time.ParseInLocation("2006-01-02 15:04:05", c.RentEnd, time.Local)
+		//global.GVA_LOG.Info(strconv.FormatInt(endUnix.Unix(), 10))
+		if endUnix.Unix() < nowUnix {
+			computer.IsExpire = 1
+		} else if endUnix.Unix()-nowUnix <= overtime {
+			computer.IsExpire = 2
+		} else {
+			computer.IsExpire = 0
+		}
+		if c.IsExpire == computer.IsExpire {
+			continue
+		}
+		computer.Id = c.Id
+		computer.UpdateTime = c.UpdateTime
+		computer.CreateTime = c.CreateTime
+		computer.PcNum = c.PcNum
+		computer.PcName = c.PcName
+		computer.ShopId = c.ShopId
+		computer.RentStart = c.RentStart
+		computer.RentDuration = c.RentDuration
+		computer.RentEnd = c.RentEnd
+		computer.Remark = c.Remark
+		computer.TodeskId = c.TodeskId
+		computer.TodeskPassword = c.TodeskPassword
+		computer.SunflowerId = c.SunflowerId
+		computer.SunflowerPassword = c.SunflowerPassword
+		computer.RentPriceUsed = c.RentPriceUsed
+		computer.SetMealId = c.SetMealId
+		computer.IsOffShelf = c.IsOffShelf
+
+		err = global.GVA_DB.Save(computer).Error
+	}
+	global.GVA_LOG.Info("检查是否有电脑到期执行成功:" + time.Now().Format("2006-01-02 15:04:05"))
+	return
+}
+
+// SubDays 计算日期相差多少天
 // 返回值day>0, t1晚于t2; day<0, t1早于t2
 func SubDays(t1, t2 time.Time) (day int) {
 	swap := false