12 İşlemeler 556c0f614a ... 85c9b70570

Yazar SHA1 Mesaj Tarih
  www 85c9b70570 接口更新 1 yıl önce
  www 07162c84d9 接口更新 1 yıl önce
  www f52305c36e Merge remote-tracking branch 'origin/master' 1 yıl önce
  www 4344fd939f Merge remote-tracking branch 'origin/master' 2 yıl önce
  www 9cb2e60d5c 更新接口 2 yıl önce
  wangbin 6360ac656c 付费推送服务接口迁移到数优后端 2 yıl önce
  wangbin 57ef030ae3 优化 2 yıl önce
  wangbin be1ec03ee2 Merge remote-tracking branch 'origin/master' 2 yıl önce
  wangbin fdf4f1bd43 百度账号更新 2 yıl önce
  wangbin c5cd02bc84 上传等级接口 2 yıl önce
  wangbin 8e8b42cce1 Merge remote-tracking branch 'origin/master' 2 yıl önce
  wangbin c7b38a8ed0 设备信息更新 2 yıl önce
55 değiştirilmiş dosya ile 1731 ekleme ve 379 silme
  1. 18 2
      api/v1/levelMonitor/image_record.go
  2. 7 11
      api/v1/log/log_ip.go
  3. 27 1
      api/v1/log/loging.go
  4. 17 18
      api/v1/task/central_control_conf.go
  5. 83 1
      api/v1/task/game_task.go
  6. 52 17
      api/v1/task/urgent_task_conf.go
  7. 1 0
      compile.bat
  8. 6 2
      config.yaml
  9. 2 1
      config/extranet_domain.go
  10. 3 29
      initialize/gorm.go
  11. 203 172
      initialize/timer.go
  12. 7 5
      main.go
  13. 1 4
      middleware/operation.go
  14. 169 0
      model/levelMonitor/baidu_account.go
  15. 6 0
      model/levelMonitor/request/search_image_record_params.go
  16. 16 0
      model/log/game_character.go
  17. 36 0
      model/log/ip_lib.go
  18. 10 8
      model/log/log_ip.go
  19. 5 0
      model/log/request/common.go
  20. 6 0
      model/log/response/loging.go
  21. 19 0
      model/log/seal_ip.go
  22. 5 0
      model/task/central_control_conf.go
  23. 14 0
      model/task/control/request.go
  24. 19 0
      model/task/game_retention_ratio.go
  25. 1 0
      model/task/game_task.go
  26. 38 0
      model/task/request/game_task.go
  27. 1 2
      model/task/request/search_central_control_conf_params.go
  28. 1 0
      model/task/response/game_task.go
  29. 13 0
      model/task/sheep_pay.go
  30. 1 0
      model/task/task_conf.go
  31. 18 6
      model/task/urgent_task_conf.go
  32. 5 4
      router/levelMonitor/image_record.go
  33. 1 0
      router/log/loging.go
  34. 21 16
      router/task/game_task.go
  35. 1 0
      router/task/urgent_task_conf.go
  36. 1 0
      service/cache/cache.go
  37. 2 2
      service/dataStatistics/data_abnormal_rate.go
  38. 1 1
      service/dataStatistics/wechat_scanner_detailed.go
  39. 8 2
      service/fileManager/download_url.go
  40. 1 1
      service/fileManager/file_qiniu.go
  41. 114 19
      service/levelMonitor/image_record.go
  42. 2 2
      service/log/log_ip.go
  43. 140 5
      service/log/log_statistics.go
  44. 6 1
      service/log/loging/enter_main_log.go
  45. 97 7
      service/log/loging/logical_log.go
  46. 1 0
      service/log/loging/login_log.go
  47. 2 2
      service/system/sys_robot.go
  48. 7 8
      service/task/central_control_conf.go
  49. 46 2
      service/task/common.go
  50. 193 2
      service/task/game_task.go
  51. 227 6
      service/task/sync_data.go
  52. 9 11
      service/task/task_conf.go
  53. 17 9
      service/task/urgent_task_conf.go
  54. 1 0
      utils/request.go
  55. 23 0
      utils/requst_http.go

+ 18 - 2
api/v1/levelMonitor/image_record.go

@@ -9,6 +9,7 @@ import (
 	"log-server/model/levelMonitor"
 	"log-server/model/levelMonitor/request"
 	"log-server/utils"
+	"strconv"
 )
 
 type ImageRecordApi struct {
@@ -23,8 +24,22 @@ func (a *ImageRecordApi) CreateImageRecord(c *gin.Context) {
 		return
 	}
 	if err := imageRecordService.CreateImageRecord(record); err != nil {
-		global.GVA_LOG.Error("创建失败!" + err.Error(), zap.Error(err))
-		response.FailWithMessage("创建失败" + err.Error(), c)
+		global.GVA_LOG.Error("创建失败!"+err.Error(), zap.Error(err))
+		response.FailWithMessage("创建失败"+err.Error(), c)
+	} else {
+		response.OkWithMessage("创建成功", c)
+	}
+}
+
+func (a *ImageRecordApi) UpLevel(c *gin.Context) {
+	var record request.CreateLevelRequest
+	_ = c.ShouldBindJSON(&record)
+	if err := utils.Verify(record, utils.ImageRecordVerify); err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+	if err := imageRecordService.CreateLevel(record); err != nil {
+		response.FailWithMessage("创建失败"+err.Error(), c)
 	} else {
 		response.OkWithMessage("创建成功", c)
 	}
@@ -36,6 +51,7 @@ func (a *ImageRecordApi) UploadOrNot(c *gin.Context) {
 	if record.TaskId == 0 {
 		response.FailWithMessage("任务id不能为空", c)
 	}
+	global.GVA_LOG.Info("gameId = " + strconv.Itoa(record.TaskId) + "account = " + record.Account)
 	if err := imageRecordService.UploadOrNot(record); err != nil {
 		response.FailWithMessage("不用上传", c)
 	} else {

+ 7 - 11
api/v1/log/log_ip.go

@@ -12,7 +12,6 @@ import (
 )
 
 type ApiIpLog struct {
-
 }
 
 // @Tags loging
@@ -66,9 +65,6 @@ func (s *ApiIpLog) GetGameIPList(c *gin.Context) {
 	}
 }
 
-
-
-
 // @Tags loging
 // @Summary 获取某天具体ip
 // @Security ApiKeyAuth
@@ -88,7 +84,7 @@ func (s *ApiIpLog) GetIp(c *gin.Context) {
 		response.FailWithMessage("租机编号不能为空", c)
 		return
 	}
-	if ip.CreateDate == ""{
+	if ip.CreateDate == "" {
 		response.FailWithMessage("创建日期不能为空", c)
 		return
 	}
@@ -98,8 +94,8 @@ func (s *ApiIpLog) GetIp(c *gin.Context) {
 		response.FailWithMessage("获取失败", c)
 	} else {
 		response.OkWithDetailed(response.PageResult{
-			List:     list,
-			Total:    total,
+			List:  list,
+			Total: total,
 		}, "获取成功", c)
 	}
 }
@@ -113,7 +109,7 @@ func (s *ApiIpLog) GetGameIp(c *gin.Context) {
 		return
 	}
 
-	if ip.CreateDate == ""{
+	if ip.CreateDate == "" {
 		response.FailWithMessage("创建日期不能为空", c)
 		return
 	}
@@ -123,8 +119,8 @@ func (s *ApiIpLog) GetGameIp(c *gin.Context) {
 		response.FailWithMessage("获取失败", c)
 	} else {
 		response.OkWithDetailed(response.PageResult{
-			List:     list,
-			Total:    total,
+			List:  list,
+			Total: total,
 		}, "获取成功", c)
 	}
 }
@@ -180,4 +176,4 @@ func (s *ApiIpLog) GameIpExport(c *gin.Context) {
 	}
 	c.Writer.Header().Add("success", "true")
 	c.File(filePath)
-}
+}

+ 27 - 1
api/v1/log/loging.go

@@ -380,6 +380,28 @@ func (s *ApiLoging) GetGameIdStatistics(c *gin.Context) {
 }
 
 // @Tags loging
+// @Summary 通过GameId获取电脑数据
+// @Security ApiKeyAuth
+// @accept application/json
+// @Produce application/json
+// @Success 200 {object} response.Response{data=interface{}} "获取统计数据通过GameId"
+// @Router /loging/getTaskComputer [post]
+func (s *ApiLoging) GetTaskComputer(c *gin.Context) {
+	var paramsInfo request.IdDateReply
+	_ = c.ShouldBindJSON(&paramsInfo)
+	list, total, err := ServiceStatisticsLog.TaskComputerNumInfo(c, paramsInfo)
+	if err != nil {
+		global.GVA_LOG.Error("获取失败!", zap.Error(err))
+		response.FailWithMessage("获取失败", c)
+	} else {
+		response.OkWithDetailed(response.PageResult{
+			List:  list,
+			Total: total,
+		}, "获取成功", c)
+	}
+}
+
+// @Tags loging
 // @Summary 获取统计电脑数量
 // @Security ApiKeyAuth
 // @accept application/json
@@ -724,7 +746,7 @@ func (e *ApiLoging) GetWuYToken(c *gin.Context) {
 	token := reqs.Cookies()[1].Value
 	if token != "" {
 		token = "token=" + token
-		global.GVA_REDIS.Set(c, key, token, time.Hour*15)
+		global.GVA_REDIS.Set(c, key, token, time.Minute*6)
 	}
 	data.Token = token
 	response.OkWithDetailed(data, "获取成功", c)
@@ -750,3 +772,7 @@ func (s *ApiLoging) SupConErr(c *gin.Context) {
 	global.GVA_LOG.Warn(fmt.Sprintf("中控上报异常pc_code=%s 描述=%s", paramsInfo.PcCode, paramsInfo.Describe))
 	response.OkWithDetailed(num, "上报成功", c)
 }
+
+func (s *ApiLoging) CheckErr(c *gin.Context) {
+	response.OkWithDetailed("", "检测成功", c)
+}

+ 17 - 18
api/v1/task/central_control_conf.go

@@ -12,11 +12,10 @@ import (
 )
 
 type CentralControlApi struct {
-
 }
 
 //创建中控配置
-func (a *CentralControlApi) CreateCentralControlConf (c *gin.Context)  {
+func (a *CentralControlApi) CreateCentralControlConf(c *gin.Context) {
 	var conf task.CentralControlConf
 	_ = c.ShouldBindJSON(&conf)
 	if conf.Mirror == "" {
@@ -31,7 +30,7 @@ func (a *CentralControlApi) CreateCentralControlConf (c *gin.Context)  {
 		response.FailWithMessage(err.Error(), c)
 		return
 	}
-	if err := centralControlService.CreateCentralControlConf(conf);err != nil {
+	if err := centralControlService.CreateCentralControlConf(conf); err != nil {
 		global.GVA_LOG.Error("创建失败!", zap.Error(err))
 		response.FailWithMessage("创建失败", c)
 	} else {
@@ -42,13 +41,13 @@ func (a *CentralControlApi) CreateCentralControlConf (c *gin.Context)  {
 //删除配置列表
 func (a *CentralControlApi) DeleteCentralControlConf(c *gin.Context) {
 	var conf task.CentralControlConf
-	 _ = c.ShouldBindJSON(&conf)
+	_ = c.ShouldBindJSON(&conf)
 
-	 //数据校验
-	 if err := utils.Verify(conf, utils.CentralControlConfVerify); err != nil {
-		 response.FailWithMessage(err.Error(), c)
-		 return
-	 }
+	//数据校验
+	if err := utils.Verify(conf, utils.CentralControlConfVerify); err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
 	if err := centralControlService.DeleteCentralControlConf(conf); err != nil {
 		global.GVA_LOG.Error("删除失败!", zap.Error(err))
 		response.FailWithMessage("删除失败", c)
@@ -70,14 +69,14 @@ func (a *CentralControlApi) DeleteCentralControlConfByIds(c *gin.Context) {
 }
 
 //更新中控配置
-func (a *CentralControlApi) UpdateCentralControlConf (c *gin.Context)  {
+func (a *CentralControlApi) UpdateCentralControlConf(c *gin.Context) {
 	var conf task.CentralControlConf
 	_ = c.ShouldBindJSON(&conf)
-	if err := utils.Verify(conf, utils.CentralControlConfVerify); err != nil{
+	if err := utils.Verify(conf, utils.CentralControlConfVerify); err != nil {
 		response.FailWithMessage(err.Error(), c)
 		return
 	}
-	if err := centralControlService.UpdateCentralControlConf(conf); err != nil{
+	if err := centralControlService.UpdateCentralControlConf(conf); err != nil {
 		global.GVA_LOG.Error("更新失败!", zap.Error(err))
 		response.FailWithMessage("更新失败", c)
 	} else {
@@ -86,14 +85,14 @@ func (a *CentralControlApi) UpdateCentralControlConf (c *gin.Context)  {
 }
 
 //id获取中控配置
-func (a *CentralControlApi) GetCentralControlConfById (c *gin.Context)  {
+func (a *CentralControlApi) GetCentralControlConfById(c *gin.Context) {
 	var id request.GetById
 	_ = c.ShouldBindJSON(&id)
 	if err := utils.Verify(id, utils.IdVerify); err != nil {
 		response.FailWithMessage(err.Error(), c)
 		return
 	}
-	if conf, err := centralControlService.GetCentralControlConfById(id.ID); err != nil{
+	if conf, err := centralControlService.GetCentralControlConfById(id.ID); err != nil {
 		global.GVA_LOG.Error("获取失败!", zap.Error(err))
 		response.FailWithMessage("获取失败", c)
 	} else {
@@ -102,16 +101,16 @@ func (a *CentralControlApi) GetCentralControlConfById (c *gin.Context)  {
 }
 
 //获取中控配置列表
-func (a *CentralControlApi) GetCentralControlConfList (c *gin.Context)  {
+func (a *CentralControlApi) GetCentralControlConfList(c *gin.Context) {
 	//获取前端传值并校验
 	var pageInfo taskRequest.SearchCentralControlConfParams
 	_ = c.ShouldBindJSON(&pageInfo)
 	//页面信息校验
-	if err := utils.Verify(pageInfo.PageInfo, utils.PageInfoVerify); err != nil{
+	if err := utils.Verify(pageInfo.PageInfo, utils.PageInfoVerify); err != nil {
 		response.FailWithMessage(err.Error(), c)
 		return
 	}
-	if list, total, err := centralControlService.GetCentralControlConfList(pageInfo.CentralControlConf, pageInfo.PageInfo, pageInfo.OrderKey, pageInfo.Desc); err != nil{
+	if list, total, err := centralControlService.GetCentralControlConfList(pageInfo.CentralControlConfList, pageInfo.PageInfo, pageInfo.OrderKey, pageInfo.Desc); err != nil {
 		global.GVA_LOG.Error("获取失败!", zap.Error(err))
 		response.FailWithMessage("获取失败", c)
 	} else {
@@ -125,7 +124,7 @@ func (a *CentralControlApi) GetCentralControlConfList (c *gin.Context)  {
 }
 
 //获取云中控配置列表
-func (a *CentralControlApi) GetCloudConfList(c *gin.Context)  {
+func (a *CentralControlApi) GetCloudConfList(c *gin.Context) {
 	list, err := centralControlService.GetCloudConfList()
 	if err != nil {
 		global.GVA_LOG.Error("获取失败!", zap.Error(err))

+ 83 - 1
api/v1/task/game_task.go

@@ -5,10 +5,12 @@ import (
 	"go.uber.org/zap"
 	"log-server/global"
 	"log-server/model/common/response"
+	log2 "log-server/model/log"
 	"log-server/model/task/request"
 	taskResponse "log-server/model/task/response"
 	"log-server/utils"
 	"net/http"
+	"strconv"
 	"time"
 )
 
@@ -536,7 +538,6 @@ func (e *GameTaskApi) TaskTargetExport(c *gin.Context) {
 func (e *GameTaskApi) TemporaryTask(c *gin.Context) {
 	var params request.GetTemporaryTaskRequest
 	_ = c.ShouldBindJSON(&params)
-	global.GVA_LOG.Warn(params.PcCode)
 	if params.PcCode == "" {
 		response.FailWithMessage("参数错误", c)
 		return
@@ -547,3 +548,84 @@ func (e *GameTaskApi) TemporaryTask(c *gin.Context) {
 		response.OkWithDetailed(data, "获取成功", c)
 	}
 }
+
+func (e *GameTaskApi) GetSheepPay(c *gin.Context) {
+	money := c.Query("money")
+	gameid := c.Query("gameid")
+	payTime := c.Query("pay_time")
+	global.GVA_LOG.Info(money)
+	global.GVA_LOG.Info(gameid)
+	global.GVA_LOG.Info(payTime)
+	if money == "" || gameid == "" || payTime == "" {
+		response.FailWithMessage("参数错误", c)
+		return
+	}
+	moneyInt, _ := strconv.Atoi(money)
+	taskService.GetSheepPay(c, moneyInt, gameid, payTime)
+	response.OkWithDetailed("", "收到数据", c)
+}
+
+func (e *GameTaskApi) UpdateRetentionRatio(c *gin.Context) {
+	var params request.RetentionRatioRequest
+	_ = c.ShouldBindJSON(&params)
+	if err := taskService.UpdateRetentionRatio(c, params); err != nil {
+		global.GVA_LOG.Error("设置失败!", zap.Error(err))
+		response.FailWithMessage("设置失败 "+err.Error(), c)
+	} else {
+		response.OkWithMessage("设置成功", c)
+	}
+}
+
+func (e *GameTaskApi) GetRetentionRatio(c *gin.Context) {
+	var params request.GetRetentionRatioRequest
+	_ = c.ShouldBindJSON(&params)
+	if api, err := taskService.GetRetentionRatio(c, params); err != nil {
+		global.GVA_LOG.Error("获取失败!", zap.Error(err))
+		response.FailWithMessage("获取失败 "+err.Error(), c)
+	} else {
+		response.OkWithDetailed(api, "获取成功", c)
+	}
+}
+
+func (e *GameTaskApi) UploadGameCharacter(c *gin.Context) {
+	var params request.UploadGameCharacterRequest
+	_ = c.ShouldBindJSON(&params)
+	if err := taskService.UploadGameCharacter(c, params); err != nil {
+		global.GVA_LOG.Error("上报失败!", zap.Error(err))
+		response.FailWithMessage("上报失败 "+err.Error(), c)
+	} else {
+		response.OkWithMessage("上报成功", c)
+	}
+}
+
+func (e *GameTaskApi) PushCompleteTaskData(c *gin.Context) {
+	dt := c.Query("date")
+	if dt == "" {
+		response.FailWithMessage("参数错误 ", c)
+		return
+	}
+	taskService.PushCompleteTaskData(dt)
+	response.OkWithMessage("推送成功", c)
+}
+
+func (e *GameTaskApi) GetWindowTask(c *gin.Context) {
+	var confit log2.IpLogResponse
+	_ = c.ShouldBindJSON(&confit)
+	if confit.GameId == 0 {
+		response.FailWithMessage("游戏id不能为空", c)
+		return
+	}
+	if confit.PcCode == "" {
+		response.FailWithMessage("租机编号不能为空", c)
+		return
+	}
+	list, _, err := taskService.GetWindowTask(confit.PcCode, confit.GameId)
+	if err != nil {
+		global.GVA_LOG.Error("获取失败!", zap.Error(err))
+		response.FailWithMessage("获取失败", c)
+	} else {
+		response.OkWithDetailed(response.PageResult{
+			List: list,
+		}, "获取成功", c)
+	}
+}

+ 52 - 17
api/v1/task/urgent_task_conf.go

@@ -14,8 +14,8 @@ type UrgentTaskApi struct {
 }
 
 //查询空闲租机
-func (a *UrgentTaskApi) GetUnusedPc (c *gin.Context)  {
-	if pcList,err := urgentTaskService.GetUnusedPc(); err != nil {
+func (a *UrgentTaskApi) GetUnusedPc(c *gin.Context) {
+	if pcList, err := urgentTaskService.GetUnusedPc(); err != nil {
 		global.GVA_LOG.Error("创建失败!", zap.Error(err))
 		response.FailWithMessage(err.Error(), c)
 	} else {
@@ -24,7 +24,7 @@ func (a *UrgentTaskApi) GetUnusedPc (c *gin.Context)  {
 }
 
 //创建紧急任务
-func (a *UrgentTaskApi) CreateUrgentTask (c *gin.Context)  {
+func (a *UrgentTaskApi) CreateUrgentTask(c *gin.Context) {
 	var task1 task.CreateAndUpdateUrgentTaskConf
 	_ = c.ShouldBindJSON(&task1)
 	var pcCodeString string
@@ -37,16 +37,16 @@ func (a *UrgentTaskApi) CreateUrgentTask (c *gin.Context)  {
 		return
 	}
 	//处理pc_code数组
-	for k,pcCode := range task1.PcCode{
-		if k != len(task1.PcCode) - 1 {
+	for k, pcCode := range task1.PcCode {
+		if k != len(task1.PcCode)-1 {
 			pcCodeString = pcCodeString + pcCode + ","
 		} else {
 			pcCodeString = pcCodeString + pcCode
 		}
 	}
 	//创建实体
-	entity := task.UrgentTaskConf {
-		Id: task1.Id,
+	entity := task.UrgentTaskConf{
+		Id:     task1.Id,
 		TaskId: task1.TaskId,
 		PcCode: pcCodeString,
 	}
@@ -75,7 +75,7 @@ func (a *UrgentTaskApi) DeleteUrgentTask(c *gin.Context) {
 }
 
 //批量删除紧急任务
-func (a *UrgentTaskApi) DeleteUrgentTaskByIds (c *gin.Context) {
+func (a *UrgentTaskApi) DeleteUrgentTaskByIds(c *gin.Context) {
 	var ids request.IdsReq
 	_ = c.ShouldBindJSON(&ids)
 	if err := urgentTaskService.DeleteUrgentTaskByIds(ids.Ids); err != nil {
@@ -87,7 +87,7 @@ func (a *UrgentTaskApi) DeleteUrgentTaskByIds (c *gin.Context) {
 }
 
 //更新紧急任务
-func (a *UrgentTaskApi) UpdateUrgentTask (c *gin.Context)  {
+func (a *UrgentTaskApi) UpdateUrgentTask(c *gin.Context) {
 	var task1 task.CreateAndUpdateUrgentTaskConf
 	_ = c.ShouldBindJSON(&task1)
 	var pcCodeString string
@@ -100,22 +100,57 @@ func (a *UrgentTaskApi) UpdateUrgentTask (c *gin.Context)  {
 		return
 	}
 	//处理pc_code数组
-	for k,pcCode := range task1.PcCode{
-		if k != len(task1.PcCode) - 1 {
+	for k, pcCode := range task1.PcCode {
+		if k != len(task1.PcCode)-1 {
 			pcCodeString = pcCodeString + pcCode + ","
 		} else {
 			pcCodeString = pcCodeString + pcCode
 		}
 	}
 	//创建实体
-	entity := task.UrgentTaskConf {
-		Id: task1.Id,
+	entity := task.UrgentTaskConf{
+		Id:     task1.Id,
 		TaskId: task1.TaskId,
 		PcCode: pcCodeString,
-		CreateDate: task1.CreateDate[:10],
 	}
 
-	if err := urgentTaskService.UpdateUrgentTask(entity); err != nil{
+	if err := urgentTaskService.UpdateUrgentTask(entity, 0); err != nil {
+		global.GVA_LOG.Error("更新失败!", zap.Error(err))
+		response.FailWithMessage("更新失败", c)
+	} else {
+		response.OkWithMessage("更新成功", c)
+	}
+}
+
+//删除电脑编号
+func (a *UrgentTaskApi) DelCodeUrgentTask(c *gin.Context) {
+	var task1 task.CreateAndUpdateUrgentTaskConf
+	_ = c.ShouldBindJSON(&task1)
+	var pcCodeString string
+	if task1.TaskId == 0 {
+		response.FailWithMessage("请传入任务id", c)
+		return
+	}
+	if len(task1.PcCode) == 0 {
+		response.FailWithMessage("请传入租机列表", c)
+		return
+	}
+	//处理pc_code数组
+	for k, pcCode := range task1.PcCode {
+		if k != len(task1.PcCode)-1 {
+			pcCodeString = pcCodeString + pcCode + ","
+		} else {
+			pcCodeString = pcCodeString + pcCode
+		}
+	}
+	//创建实体
+	entity := task.UrgentTaskConf{
+		Id:     task1.Id,
+		TaskId: task1.TaskId,
+		PcCode: pcCodeString,
+	}
+
+	if err := urgentTaskService.UpdateUrgentTask(entity, 1); err != nil {
 		global.GVA_LOG.Error("更新失败!", zap.Error(err))
 		response.FailWithMessage("更新失败", c)
 	} else {
@@ -124,14 +159,14 @@ func (a *UrgentTaskApi) UpdateUrgentTask (c *gin.Context)  {
 }
 
 //id获取紧急任务
-func (a *UrgentTaskApi) GetUrgentTaskById(c *gin.Context){
+func (a *UrgentTaskApi) GetUrgentTaskById(c *gin.Context) {
 	var id request.GetById
 	_ = c.ShouldBindJSON(&id)
 	if err := utils.Verify(id, utils.IdVerify); err != nil {
 		response.FailWithMessage(err.Error(), c)
 		return
 	}
-	if task1, err := urgentTaskService.GetUrgentTaskById(id.ID); err != nil{
+	if task1, err := urgentTaskService.GetUrgentTaskById(id.ID); err != nil {
 		global.GVA_LOG.Error("获取失败!", zap.Error(err))
 		response.FailWithMessage("获取失败", c)
 	} else {

+ 1 - 0
compile.bat

@@ -1,3 +1,4 @@
+SET CGO_ENABLED=0
 set GOOS=linux
 set GOARCH=amd64
 go build -ldflags "-s -w"

+ 6 - 2
config.yaml

@@ -148,6 +148,9 @@ timer:
   - tableName: jwt_blacklists
     compareField: created_at
     interval: 168h
+  - tableName: image_record
+    compareField: create_time
+    interval: 168h
 zap:
   level: info
   prefix: '[log-server]'
@@ -167,8 +170,9 @@ send-url:
   tx-send-mobile: "1111111111"
 extranet-domain:
   #control: "http://bpm.kfzs.com:7089"
-  control: "http://192.168.50.35:8099"
+  control: ""
+  yl-control: "https://test.yl.kfzs.com"
 #extranet-domain:
-#  control: "http://192.168.50.35:8099"
+#  control: "http://xjf.lianyou.fun:8099"
 prefix-url:
   prefix-local: "http://192.168.50.17:8080/api/"

+ 2 - 1
config/extranet_domain.go

@@ -1,5 +1,6 @@
 package config
 
 type ExtranetDomain struct {
-	Control string `mapstructure:"control" json:"control" yaml:"control"` // 群控域名
+	Control   string `mapstructure:"control" json:"control" yaml:"control"`          // 群控域名
+	YlControl string `mapstructure:"yl-control" json:"yl-control" yaml:"yl-control"` // 易练域名
 }

+ 3 - 29
initialize/gorm.go

@@ -1,14 +1,12 @@
 package initialize
 
 import (
+	"log-server/model/log"
 	"os"
 
-	"log-server/global"
-	"log-server/model/example"
-	"log-server/model/system"
-
 	"go.uber.org/zap"
 	"gorm.io/gorm"
+	"log-server/global"
 )
 
 // Gorm 初始化数据库并产生数据库全局变量
@@ -28,31 +26,7 @@ func Gorm() *gorm.DB {
 // Author SliverHorn
 func RegisterTables(db *gorm.DB) {
 	err := db.AutoMigrate(
-		// 系统模块表
-		system.SysApi{},
-		system.SysUser{},
-		system.SysBaseMenu{},
-		system.JwtBlacklist{},
-		system.SysAuthority{},
-		system.SysDictionary{},
-		system.SysOperationRecord{},
-		system.SysAutoCodeHistory{},
-		system.SysDictionaryDetail{},
-		system.SysBaseMenuParameter{},
-		system.SysBaseMenuBtn{},
-		system.SysAuthorityBtn{},
-		system.SysAutoCode{},
-
-		// 示例模块表
-		example.ExaFile{},
-		example.ExaCustomer{},
-		example.ExaFileChunk{},
-		example.ExaFileUploadAndDownload{},
-
-		// 自动化模块表
-		// Code generated by log-server Begin; DO NOT EDIT.
-
-		// Code generated by log-server End; DO NOT EDIT.
+		log.GameCharacter{},
 	)
 	if err != nil {
 		global.GVA_LOG.Error("register table failed", zap.Error(err))

+ 203 - 172
initialize/timer.go

@@ -25,6 +25,7 @@ var serviceWeChatScannerDetailed = new(dataStatistics.ServiceWeChatScannerDetail
 var serviceDownLoadUrl = new(fileManager.ServiceDownLoadUrl)
 var robotService = new(system.RobotService)
 var imageRecordService = new(levelMonitor.ImageRecordService)
+
 var ServiceRegularTask = new(task.ServiceRegularTask)
 var serviceFileQiniu = new(fileManager.ServiceFileQiniu)
 
@@ -45,190 +46,220 @@ func Timer() {
 		}
 	}
 
-	//// 定时更新前一天的统计数据
-	//_, err := global.GVA_Timer.AddTaskByFunc("StatisticsLog", "2 8 5 * * * ", serviceStatisticsLog.CreateStatisticsLog)
-	//if err != nil {
-	//	fmt.Println("add taskCode timer error:", err)
-	//}
-	//
-	////定时同步电脑相关的统计数据
-	//_, err = global.GVA_Timer.AddTaskByFunc("CreateComputerStatisticsData", "40 9,19,29,39,49,59 7-23 * * * ", serviceStatisticsLog.CreateComputerStatisticsData)
-	//if err != nil {
-	//	fmt.Println("add CreateComputerStatisticsData timer error:", err)
-	//}
-	//// 同步游戏相关的统计数据
-	//_, err = global.GVA_Timer.AddTaskByFunc("TodayCreateStatisticsGameInfoLog", "2 8,18,28,38,48,58 6-23 * * * ", serviceStatisticsLog.TodayCreateStatisticsGameInfoLog)
-	//if err != nil {
-	//	fmt.Println("add TodayCreateStatisticsGameInfoLog timer error:", err)
-	//}
-	//// 同步任务统计数据
-	//_, err = global.GVA_Timer.AddTaskByFunc("TaskStatisticsDataCache", "20 0/3 6-23 * * * ", serviceStatisticsLog.TaskStatisticsDataCache)
-	//if err != nil {
-	//	fmt.Println("add TaskStatisticsDataCache timer error:", err)
-	//}
-	//// 重试失败数据
-	//_, err = global.GVA_Timer.AddTaskByFunc("createFailLog", "2 15,35,55 6-23 * * * ", ServiceLogList.CreateFailLog)
-	//if err != nil {
-	//	fmt.Println("everyDayResetStatisticsCache timer error:", err)
-	//}
-	//// 定时检查电脑上报
-	//_, err = global.GVA_Timer.AddTaskByFunc("RegularCheckPc", "2 2 9-23 * * * ", serviceStatisticsLog.RegularCheckPc)
-	//if err != nil {
-	//	fmt.Println("RegularCheckPc timer error:", err)
-	//}
-	//// 新建日志表
-	//_, err = global.GVA_Timer.AddTaskByFunc("RegularCreateLogingTable", "2 1 19 20 * * ", ServiceLogList.RegularCreateLogingTable)
-	//if err != nil {
-	//	fmt.Println("add RegularCreateLogingTable timer error:", err)
-	//}
-	//// 定时删缓存
-	//_, err = global.GVA_Timer.AddTaskByFunc("RegularDelCheckData", "2 33 11 * * *", serviceStatisticsLog.RegularDelCheckData)
-	//if err != nil {
-	//	fmt.Println("add RegularDelCheckData timer error:", err)
-	//}
-	////定时添加任务
-	//_, err = global.GVA_Timer.AddTaskByFunc("EveryDaySyncTaskData", "30 22 21 * * *", syncData.EveryDaySyncTaskData)
-	//if err != nil {
-	//	fmt.Println("add EveryDaySyncTaskData timer error:", err)
-	//}
-	////同步任务数据
-	//_, err = global.GVA_Timer.AddTaskByFunc("SyncTaskData", "2 1/3 1-23 * * *", syncData.SyncTaskData)
-	//if err != nil {
-	//	fmt.Println("add SyncTaskData timer error:", err)
-	//}
-	//// 数优任务统计
-	//_, err = global.GVA_Timer.AddTaskByFunc("DayTargetDataStatistics", "40 2 5 * * *", syncData.DayTargetDataStatistics)
-	//if err != nil {
-	//	fmt.Println("add DayTargetDataStatistics timer error:", err)
-	//}
-	//
-	//// 定时检查是否有电脑到期,修改租机状态@every 1s
-	//_, err = global.GVA_Timer.AddTaskByFunc("CheckIsExpire", "0 0/5 * * * *", serviceRentComputer.CheckIsExpire)
-	//if err != nil {
-	//	fmt.Println("add CheckIsExpire timer error:", err)
-	//}
-	//// 定时生成租机每日台账@every 1s
-	//_, err = global.GVA_Timer.AddTaskByFunc("CreateRentComputerLedger", "0 30 23 * * *", serviceRentComputer.CreateRentComputerLedger)
-	//if err != nil {
-	//	fmt.Println("add CreateRentComputerLedger timer error:", err)
-	//}
-	//
-	////定时获取扫码平台余额,每小时执行一次
-	////_, err = global.GVA_Timer.AddTaskByFunc("SyncGetWeChatScannerBalance", "0 58 * * * *", serviceWeChatScannerApi.SyncGetWeChatScannerBalance)
-	////_, err = global.GVA_Timer.AddTaskByFunc("SyncGetWeChatScannerBalance", "0 58 * * * *", serviceWeChatScannerApi.SyncGetWeChatScannerBalance)
-	////if err != nil {
-	////	fmt.Println("add UpdateGameVersion 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)
-	////}
-	//
-	//////半小时同步一次机房设备信息,播报是否有异常
-	////_, err = global.GVA_Timer.AddTaskByFunc("SyncJfDevicesMessage", "0 0,30 * * * *", robotService.SyncJfDevicesMessage)
-	////if err != nil {
-	////	fmt.Println("add SyncJfDevicesMessage timer error:", err)
-	////}
-	//
-	//// 活跃定时推送消息
-	//_, err = global.GVA_Timer.AddTaskByFunc("TaskMsgSend", "20 2/30 8-21 * * *", syncData.TaskMsgSend)
-	//if err != nil {
-	//	fmt.Println("add TaskMsgSend timer error:", err)
-	//}
-	//
-	//// 活跃定时推送消息
-	//_, err = global.GVA_Timer.AddTaskByFunc("TaskMsgSend", "30 1/10 22-23 * * *", syncData.TaskMsgSend)
-	//if err != nil {
-	//	fmt.Println("add TaskMsgSend timer error:", err)
-	//}
-	//
-	//// 付费定时推送消息
-	//_, err = global.GVA_Timer.AddTaskByFunc("TaskMsgSend", "45 2/15 8-21 * * *", syncData.TaskFreeMsgSend)
-	//if err != nil {
-	//	fmt.Println("add TaskFreeMsgSend timer error:", err)
-	//}
-	//
-	//// 付费定时推送消息
-	//_, err = global.GVA_Timer.AddTaskByFunc("TaskMsgSend", "50 1/5 22-23 * * *", syncData.TaskFreeMsgSend)
-	//if err != nil {
-	//	fmt.Println("add TaskFreeMsgSend timer error:", err)
-	//}
-	//
-	//// 23起检测任务完成情况
-	//_, err = global.GVA_Timer.AddTaskByFunc("CheckTaskCompletedInfo", "57 10/4 23 * * *", syncData.CheckTaskCompletedInfo)
-	//if err != nil {
-	//	fmt.Println("add CheckTaskCompletedInfo timer error:", err)
-	//}
-	//
-	////定时更新游戏版本号和链接
-	//_, err = global.GVA_Timer.AddTaskByFunc("UpdateGameVersion", "0 3/15 * * * *", serviceDownLoadUrl.UpdateGameVersion)
+	// 定时更新前一天的统计数据
+	_, err := global.GVA_Timer.AddTaskByFunc("StatisticsLog", "2 8 5 * * * ", serviceStatisticsLog.CreateStatisticsLog)
+	if err != nil {
+		fmt.Println("add taskCode timer error:", err)
+	}
+
+	//定时同步电脑相关的统计数据
+	_, err = global.GVA_Timer.AddTaskByFunc("CreateComputerStatisticsData", "40 9,19,29,39,49,59 7-23 * * * ", serviceStatisticsLog.CreateComputerStatisticsData)
+	if err != nil {
+		fmt.Println("add CreateComputerStatisticsData timer error:", err)
+	}
+	// 同步游戏相关的统计数据
+	_, err = global.GVA_Timer.AddTaskByFunc("TodayCreateStatisticsGameInfoLog", "2 8,18,28,38,48,58 6-23 * * * ", serviceStatisticsLog.TodayCreateStatisticsGameInfoLog)
+	if err != nil {
+		fmt.Println("add TodayCreateStatisticsGameInfoLog timer error:", err)
+	}
+	// 同步任务统计数据
+	_, err = global.GVA_Timer.AddTaskByFunc("TaskStatisticsDataCache", "20 0/3 6-23 * * * ", serviceStatisticsLog.TaskStatisticsDataCache)
+	if err != nil {
+		fmt.Println("add TaskStatisticsDataCache timer error:", err)
+	}
+	// 重试失败数据
+	_, err = global.GVA_Timer.AddTaskByFunc("createFailLog", "2 15,35,55 6-23 * * * ", ServiceLogList.CreateFailLog)
+	if err != nil {
+		fmt.Println("everyDayResetStatisticsCache timer error:", err)
+	}
+	// 定时检查电脑上报
+	_, err = global.GVA_Timer.AddTaskByFunc("RegularCheckPc", "2 2 9-23 * * * ", serviceStatisticsLog.RegularCheckPc)
+	if err != nil {
+		fmt.Println("RegularCheckPc timer error:", err)
+	}
+	// 新建日志表
+	_, err = global.GVA_Timer.AddTaskByFunc("RegularCreateLogingTable", "2 1 19 20 * * ", ServiceLogList.RegularCreateLogingTable)
+	if err != nil {
+		fmt.Println("add RegularCreateLogingTable timer error:", err)
+	}
+	// 定时删缓存
+	_, err = global.GVA_Timer.AddTaskByFunc("RegularDelCheckData", "2 33 11 * * *", serviceStatisticsLog.RegularDelCheckData)
+	if err != nil {
+		fmt.Println("add RegularDelCheckData timer error:", err)
+	}
+	//定时添加任务
+	_, err = global.GVA_Timer.AddTaskByFunc("EveryDaySyncTaskData", "30 22 21 * * *", syncData.EveryDaySyncTaskData)
+	if err != nil {
+		fmt.Println("add EveryDaySyncTaskData timer error:", err)
+	}
+	//同步任务数据
+	_, err = global.GVA_Timer.AddTaskByFunc("SyncTaskData", "2 1/3 1-23 * * *", syncData.SyncTaskData)
+	if err != nil {
+		fmt.Println("add SyncTaskData timer error:", err)
+	}
+
+	// 前一天数优任务统计
+	_, err = global.GVA_Timer.AddTaskByFunc("YesterdaySyncTaskData", "40 36 2 * * *", syncData.YesterdaySyncTaskData)
+	if err != nil {
+		fmt.Println("add YesterdaySyncTaskData timer error:", err)
+	}
+
+	// 数优任务统计
+	_, err = global.GVA_Timer.AddTaskByFunc("DayTargetDataStatistics", "40 2 5 * * *", syncData.DayTargetDataStatistics)
+	if err != nil {
+		fmt.Println("add DayTargetDataStatistics timer error:", err)
+	}
+
+	// 定时检查是否有电脑到期,修改租机状态@every 1s
+	_, err = global.GVA_Timer.AddTaskByFunc("CheckIsExpire", "0 0/5 * * * *", serviceRentComputer.CheckIsExpire)
+	if err != nil {
+		fmt.Println("add CheckIsExpire timer error:", err)
+	}
+	// 定时生成租机每日台账@every 1s
+	_, err = global.GVA_Timer.AddTaskByFunc("CreateRentComputerLedger", "0 30 23 * * *", serviceRentComputer.CreateRentComputerLedger)
+	if err != nil {
+		fmt.Println("add CreateRentComputerLedger timer error:", err)
+	}
+
+	//定时获取扫码平台余额,每小时执行一次
+	//_, err = global.GVA_Timer.AddTaskByFunc("SyncGetWeChatScannerBalance", "0 58 * * * *", serviceWeChatScannerApi.SyncGetWeChatScannerBalance)
+	//_, err = global.GVA_Timer.AddTaskByFunc("SyncGetWeChatScannerBalance", "0 58 * * * *", serviceWeChatScannerApi.SyncGetWeChatScannerBalance)
 	//if err != nil {
 	//	fmt.Println("add UpdateGameVersion timer error:", err)
 	//}
-	//
-	////定时更新在线电脑缓存
-	//_, err = global.GVA_Timer.AddTaskByFunc("OnlinePcCodeUpdateCache", "14 7 8-20 * * *", ServiceRegularTask.OnlinePcCodeUpdateCache)
-	//if err != nil {
-	//	fmt.Println("add OnlinePcCodeUpdateCache timer error:", err)
-	//}
-	//
-	//// 定时同步arpu值
-	//_, err = global.GVA_Timer.AddTaskByFunc("SyncArpu", "50 36 23 * * *", syncData.SyncArpu)
-	//if err != nil {
-	//	fmt.Println("add SyncArpu timer error:", err)
-	//}
-	//
-	//// 提醒修改腾讯目标
-	////_, err = global.GVA_Timer.AddTaskByFunc("RemindSendOne", "11 2 18,22 * * *", syncData.RemindSendOne)
-	////if err != nil {
-	////	fmt.Println("add RemindSendOne timer error:", err)
-	////}
-	//
-	////定时获取机房小绵羊新号剩余
-	//_, err = global.GVA_Timer.AddTaskByFunc("SyncJfXmyNewAccount", "0 0,30 * * * *", robotService.SyncJfXmyNewAccount)
-	//if err != nil {
-	//	fmt.Println("add SyncJfXmyNewAccount timer error:", err)
-	//}
-	//
-	//// 设备信息
-	//_, err = global.GVA_Timer.AddTaskByFunc("DeviceStatistics", "10 9/10 8-23 * * *", serviceStatisticsLog.DeviceStatistics)
+	//定时更新异常率
+	_, 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 DeviceStatistics timer error:", err)
+	//	fmt.Println("add SyncTodayWeChatScannerDetailed timer error:", err)
 	//}
-	//
-	////定时查看延迟更新的镜像是否到期
-	//_, err = global.GVA_Timer.AddTaskByFunc("CheckPushTime", "35 0/5 * * * *", serviceFileQiniu.CheckPushTime)
+
+	////0点更新昨日微信扫码订单列表
+	//_, err = global.GVA_Timer.AddTaskByFunc("SyncYesterdayWeChatScannerDetailed", "1 1 0 * * *", serviceWeChatScannerDetailed.SyncYesterdayWeChatScannerDetailed)
 	//if err != nil {
-	//	fmt.Println("add CheckPushTime timer error:", err)
+	//	fmt.Println("add SyncYesterdayWeChatScannerDetailed timer error:", err)
 	//}
-	//
-	//// 半小时同步一次IP信息,播报是否有异常
-	//_, err = global.GVA_Timer.AddTaskByFunc("SyncIPMessage", "50 8/10 9-23 * * ? ", robotService.SyncIPMessage)
+
+	////半小时同步一次机房设备信息,播报是否有异常
+	//_, err = global.GVA_Timer.AddTaskByFunc("SyncJfDevicesMessage", "0 0,30 * * * *", robotService.SyncJfDevicesMessage)
 	//if err != nil {
-	//	fmt.Println("add SyncIPMessage timer error:", err)
+	//	fmt.Println("add SyncJfDevicesMessage timer error:", err)
 	//}
-	//
-	//_, err = global.GVA_Timer.AddTaskByFunc("ComputerUpdateStatus", "30 1/5 8-23 * * *", serviceStatisticsLog.ComputerUpdateStatus)
+
+	// 活跃定时推送消息
+	_, err = global.GVA_Timer.AddTaskByFunc("TaskMsgSend", "20 2/30 8-21 * * *", syncData.TaskMsgSend)
+	if err != nil {
+		fmt.Println("add TaskMsgSend timer error:", err)
+	}
+
+	// 活跃定时推送消息
+	_, err = global.GVA_Timer.AddTaskByFunc("TaskMsgSend", "30 1/10 22-23 * * *", syncData.TaskMsgSend)
+	if err != nil {
+		fmt.Println("add TaskMsgSend timer error:", err)
+	}
+
+	// 付费定时推送消息
+	_, err = global.GVA_Timer.AddTaskByFunc("TaskMsgSend", "45 2/15 8-21 * * *", syncData.TaskFreeMsgSend)
+	if err != nil {
+		fmt.Println("add TaskFreeMsgSend timer error:", err)
+	}
+
+	// 付费定时推送消息
+	_, err = global.GVA_Timer.AddTaskByFunc("TaskMsgSend", "50 1/5 22-23 * * *", syncData.TaskFreeMsgSend)
+	if err != nil {
+		fmt.Println("add TaskFreeMsgSend timer error:", err)
+	}
+
+	// 23起检测任务完成情况
+	_, err = global.GVA_Timer.AddTaskByFunc("CheckTaskCompletedInfo", "57 10/4 23 * * *", syncData.CheckTaskCompletedInfo)
+	if err != nil {
+		fmt.Println("add CheckTaskCompletedInfo timer error:", err)
+	}
+
+	//定时更新游戏版本号和链接
+	_, err = global.GVA_Timer.AddTaskByFunc("UpdateGameVersion", "0 3/15 * * * *", serviceDownLoadUrl.UpdateGameVersion)
+	if err != nil {
+		fmt.Println("add UpdateGameVersion timer error:", err)
+	}
+
+	//定时更新在线电脑缓存
+	_, err = global.GVA_Timer.AddTaskByFunc("OnlinePcCodeUpdateCache", "14 7 8-20 * * *", ServiceRegularTask.OnlinePcCodeUpdateCache)
+	if err != nil {
+		fmt.Println("add OnlinePcCodeUpdateCache timer error:", err)
+	}
+
+	// 定时同步arpu值
+	_, err = global.GVA_Timer.AddTaskByFunc("SyncArpu", "50 36 23 * * *", syncData.SyncArpu)
+	if err != nil {
+		fmt.Println("add SyncArpu timer error:", err)
+	}
+
+	// 提醒修改腾讯目标
+	//_, err = global.GVA_Timer.AddTaskByFunc("RemindSendOne", "11 2 18,22 * * *", syncData.RemindSendOne)
 	//if err != nil {
-	//	fmt.Println("add ComputerUpdateStatus timer error:", err)
+	//	fmt.Println("add RemindSendOne timer error:", err)
 	//}
-	//
-	////每天凌晨3点删除一次过期图片信息
-	//_, err = global.GVA_Timer.AddTaskByFunc("DeleteExpireImageRecord", "0 0 3 * * ? ", imageRecordService.DeleteExpireImageRecord)
+
+	//定时获取机房小绵羊新号剩余
+	_, err = global.GVA_Timer.AddTaskByFunc("SyncJfXmyNewAccount", "0 0,30 * * * *", robotService.SyncJfXmyNewAccount)
+	if err != nil {
+		fmt.Println("add SyncJfXmyNewAccount timer error:", err)
+	}
+
+	// 设备信息
+	_, err = global.GVA_Timer.AddTaskByFunc("DeviceStatistics", "10 9/10 8-23 * * *", serviceStatisticsLog.DeviceStatistics)
+	if err != nil {
+		fmt.Println("add DeviceStatistics timer error:", err)
+	}
+
+	//定时查看延迟更新的镜像是否到期
+	_, err = global.GVA_Timer.AddTaskByFunc("CheckPushTime", "35 0/5 * * * *", serviceFileQiniu.CheckPushTime)
+	if err != nil {
+		fmt.Println("add CheckPushTime timer error:", err)
+	}
+
+	// 半小时同步一次IP信息,播报是否有异常
+	_, err = global.GVA_Timer.AddTaskByFunc("SyncIPMessage", "50 8/10 9-23 * * ? ", robotService.SyncIPMessage)
+	if err != nil {
+		fmt.Println("add SyncIPMessage timer error:", err)
+	}
+
+	_, err = global.GVA_Timer.AddTaskByFunc("ComputerUpdateStatus", "30 1/5 8-23 * * *", serviceStatisticsLog.ComputerUpdateStatus)
+	if err != nil {
+		fmt.Println("add ComputerUpdateStatus timer error:", err)
+	}
+
+	//每天凌晨3点删除一次过期图片信息
+	//_, err = global.GVA_Timer.AddTaskByFunc("DeleteExpireImageRecord", "0 58 3 * * ? ", imageRecordService.DeleteExpireImageRecord)
 	//if err != nil {
 	//	fmt.Println("add DeleteExpireImageRecord timer error:", err)
 	//}
+
+	_, err = global.GVA_Timer.AddTaskByFunc("YesterdayStatistics", "10 51 2 * * ? ", imageRecordService.YesterdayStatistics)
+	if err != nil {
+		fmt.Println("add YesterdayStatistics timer error:", err)
+	}
+
+	_, err = global.GVA_Timer.AddTaskByFunc("TodayStatistics", "50 44 9-23 * * ? ", imageRecordService.TodayStatistics)
+	if err != nil {
+		fmt.Println("add TodayStatistics timer error:", err)
+	}
+
+	// 电脑效率检测
+	_, err = global.GVA_Timer.AddTaskByFunc("OnlineComputerEfficiencyStatistics", "20 47 10-23 * * *", serviceStatisticsLog.OnlineComputerEfficiencyStatistics)
+	if err != nil {
+		fmt.Println("add OnlineComputerEfficiencyStatistics timer error:", err)
+	}
+
+	// 定时推送任务到检测平台
+	_, err = global.GVA_Timer.AddTaskByFunc("GameTaskTargetInfoPush", "20 55 14 * * *", syncData.GameTaskTargetInfoPush)
+	if err != nil {
+		fmt.Println("add GameTaskTargetInfoPush timer error:", err)
+	}
+
 }

+ 7 - 5
main.go

@@ -24,13 +24,15 @@ func main() {
 	global.GVA_LOG = core.Zap()  // 初始化zap日志库
 	zap.ReplaceGlobals(global.GVA_LOG)
 	global.GVA_DB = initialize.Gorm() // gorm连接数据库
+	if global.GVA_DB != nil {
+		initialize.RegisterTables(global.GVA_DB) // 初始化表
+		// 程序结束前关闭数据库链接
+		db, _ := global.GVA_DB.DB()
+		defer db.Close()
+	}
 	initialize.Redis()
 	initialize.Timer()
 	initialize.DBList()
-
-	core.RunWindowsServer()
 	defer global.GVA_REDIS.Close()
-	// 程序结束前关闭数据库链接
-	db, _ := global.GVA_DB.DB()
-	defer db.Close()
+	core.RunWindowsServer()
 }

+ 1 - 4
middleware/operation.go

@@ -74,7 +74,7 @@ func OperationRecord() gin.HandlerFunc {
 			UserID: userId,
 		}
 
-		// 上传文件时候 中间件日志进行裁断操作
+		// 上传文件进行裁断操作
 		if strings.Index(c.GetHeader("Content-Type"), "multipart/form-data") > -1 {
 			if len(record.Body) > 1024 {
 				// 截断
@@ -84,16 +84,13 @@ func OperationRecord() gin.HandlerFunc {
 				defer respPool.Put(newBody[:0])
 			}
 		}
-
 		writer := responseBodyWriter{
 			ResponseWriter: c.Writer,
 			body:           &bytes.Buffer{},
 		}
 		c.Writer = writer
 		now := time.Now()
-
 		c.Next()
-
 		latency := time.Since(now)
 		record.ErrorMessage = c.Errors.ByType(gin.ErrorTypePrivate).String()
 		record.Status = c.Writer.Status()

+ 169 - 0
model/levelMonitor/baidu_account.go

@@ -0,0 +1,169 @@
+package levelMonitor
+
+import (
+	"context"
+	"encoding/json"
+	"fmt"
+	"github.com/go-redis/redis/v8"
+	"io/ioutil"
+	"log-server/global"
+	"net/http"
+	"strings"
+	"time"
+)
+
+//Ids = []string{
+//"1LVM2db0Ehr931W7gRUimZlF",
+//"wtipNMdKoeniksPtKGcyqt3N",
+//"l16wv0XqQW8VyFaFkhb7iIdG",
+//"OGLYftxvRsut3Mj6DszpZGOH",
+//"RRfRVDugxEtKGZGbWXQj7joF",
+//"0vyrRQzhNzmGm4oS5LhPQWAd",
+//"6tQwK5zGcoDoZReyTjEi6LhO",
+//"8QnWdj3Bbtkls9uT372oEx8A",
+//"zv67LjUDA3mOB6XeuxokhN3O",
+//"k3r4fesYiGCUehA2Zk55TRv3",
+//}
+//Secrets = []string{
+//"ZZW2xfzC2OAlkInI6YbWGECledb7GLoy",
+//"FSdfDdsGEeG0FUqmDgfwWzf64bd1ee3c",
+//"t8fIX8BYGlzZk3xOeGGuUaGo6kXI9qN6",
+//"2z2UIuKDANFyQSL1V0jSNlH1XkmoGEPQ",
+//"X41FM9VyxOn9Phx5xevzq8LyOHlM0DzL",
+//"X3zjn3WiAoY0qGARY02rAL4wioLCeMeB",
+//"qIc39tGvYEtEVGW2R9X0KxnaKR8nYw2K",
+//"b50C0BYG7GyhBW5m2zww6oGk9ZAyOBGo",
+//"vtDazOQPLuWlOqkdZG80w8doqwFM82C7",
+//"xggNtYdTQI1Qb4CDDUwDbREaosP8C1sI",
+//}
+
+var account1 = map[string]string{
+	"API_KEY":    "1LVM2db0Ehr931W7gRUimZlF",
+	"SECRET_KEY": "ZZW2xfzC2OAlkInI6YbWGECledb7GLoy",
+}
+
+var account2 = map[string]string{
+	"API_KEY":    "wtipNMdKoeniksPtKGcyqt3N",
+	"SECRET_KEY": "FSdfDdsGEeG0FUqmDgfwWzf64bd1ee3c",
+}
+
+var account3 = map[string]string{
+	"API_KEY":    "l16wv0XqQW8VyFaFkhb7iIdG",
+	"SECRET_KEY": "t8fIX8BYGlzZk3xOeGGuUaGo6kXI9qN6",
+}
+
+var account4 = map[string]string{
+	"API_KEY":    "OGLYftxvRsut3Mj6DszpZGOH",
+	"SECRET_KEY": "2z2UIuKDANFyQSL1V0jSNlH1XkmoGEPQ",
+}
+var account5 = map[string]string{
+	"API_KEY":    "RRfRVDugxEtKGZGbWXQj7joF",
+	"SECRET_KEY": "X41FM9VyxOn9Phx5xevzq8LyOHlM0DzL",
+}
+var account6 = map[string]string{
+	"API_KEY":    "0vyrRQzhNzmGm4oS5LhPQWAd",
+	"SECRET_KEY": "X3zjn3WiAoY0qGARY02rAL4wioLCeMeB",
+}
+var account7 = map[string]string{
+	"API_KEY":    "6tQwK5zGcoDoZReyTjEi6LhO",
+	"SECRET_KEY": "qIc39tGvYEtEVGW2R9X0KxnaKR8nYw2K",
+}
+var account8 = map[string]string{
+	"API_KEY":    "8QnWdj3Bbtkls9uT372oEx8A",
+	"SECRET_KEY": "b50C0BYG7GyhBW5m2zww6oGk9ZAyOBGo",
+}
+var account9 = map[string]string{
+	"API_KEY":    "zv67LjUDA3mOB6XeuxokhN3O",
+	"SECRET_KEY": "vtDazOQPLuWlOqkdZG80w8doqwFM82C7",
+}
+var account10 = map[string]string{
+	"API_KEY":    "k3r4fesYiGCUehA2Zk55TRv3",
+	"SECRET_KEY": "xggNtYdTQI1Qb4CDDUwDbREaosP8C1sI",
+}
+
+var Account = map[int]map[string]string{
+	1:  account1,
+	2:  account2,
+	3:  account3,
+	4:  account4,
+	5:  account5,
+	6:  account6,
+	7:  account7,
+	8:  account8,
+	9:  account9,
+	10: account10,
+}
+
+const BaiduIdentify = "baiduIdentifyTokenV2:%d"
+const AccountLimit = 350
+const BaiduIdentifyLimit = "%s:baiduIdentifyTokenV2:%d"
+const BaiduCurrentAccount = "%s:baiduCurrentAccount"
+const BaiduCurrentAccountLimit = "%s:baiduCurrentAccountLimit"
+
+type BaiduAccount struct {
+	CurrentDate                 string
+	BaiduCurrentAccountKey      string
+	BaiduCurrentAccountLimitKdy string
+}
+
+func (m *BaiduAccount) GetCurrentAccountInfo(ctx context.Context) (currentAccountId int, err error) {
+	currentAccountKey := fmt.Sprintf(BaiduCurrentAccount, m.CurrentDate)
+	currentAccountLimitKey := fmt.Sprintf(BaiduCurrentAccountLimit, m.CurrentDate)
+	m.BaiduCurrentAccountKey = currentAccountKey
+	m.BaiduCurrentAccountLimitKdy = currentAccountLimitKey
+	currentAccountId, err = global.GVA_REDIS.Get(ctx, currentAccountKey).Int()
+	if err != nil {
+		if err == redis.Nil {
+			global.GVA_REDIS.Set(ctx, currentAccountKey, 1, time.Hour*24)
+			global.GVA_REDIS.Set(ctx, currentAccountLimitKey, 1, time.Hour*24)
+			return 1, nil
+		}
+	}
+	return
+}
+
+func (m *BaiduAccount) CheckCurrentAccountLimit(ctx context.Context, id int) (currentAccountId int, err error) {
+	limit, err := global.GVA_REDIS.Get(ctx, m.BaiduCurrentAccountLimitKdy).Int()
+	if err != nil {
+		return
+	}
+	if limit >= AccountLimit {
+		if id < 10 {
+			id += 1
+			global.GVA_REDIS.Set(ctx, m.BaiduCurrentAccountKey, id, time.Hour*24)
+			global.GVA_REDIS.Set(ctx, m.BaiduCurrentAccountLimitKdy, 1, time.Hour*24)
+		} else {
+			id = 1
+			global.GVA_REDIS.Set(ctx, m.BaiduCurrentAccountKey, id, time.Hour*24)
+			global.GVA_REDIS.Set(ctx, m.BaiduCurrentAccountLimitKdy, 1, time.Hour*24)
+		}
+	}
+	currentAccountId = id
+	return
+}
+
+func (m *BaiduAccount) GetAccessToken(ctx context.Context, id int) (string, error) {
+	key := fmt.Sprintf(BaiduIdentify, id)
+	token, err := global.GVA_REDIS.Get(ctx, key).Result()
+	if err != nil || token == "" {
+		reqUrl := "https://aip.baidubce.com/oauth/2.0/token"
+		postData := fmt.Sprintf("grant_type=client_credentials&client_id=%s&client_secret=%s", Account[id]["API_KEY"], Account[id]["SECRET_KEY"])
+		resp, err := http.Post(reqUrl, "application/x-www-form-urlencoded", strings.NewReader(postData))
+		if err != nil {
+			fmt.Println(err)
+			return "", err
+		}
+		defer resp.Body.Close()
+		body, err := ioutil.ReadAll(resp.Body)
+		if err != nil {
+			fmt.Println(err)
+			return "", err
+		}
+		accessTokenObj := map[string]string{}
+		json.Unmarshal(body, &accessTokenObj)
+		global.GVA_REDIS.Set(ctx, key, accessTokenObj["access_token"], time.Hour*24*29)
+		return accessTokenObj["access_token"], err
+	}
+	global.GVA_REDIS.Incr(ctx, m.BaiduCurrentAccountLimitKdy)
+	return token, err
+}

+ 6 - 0
model/levelMonitor/request/search_image_record_params.go

@@ -34,6 +34,12 @@ type ImageRecordRequest struct {
 	UpdateTime  typeManage.LocalTime `json:"update_time"`
 }
 
+type CreateLevelRequest struct {
+	TaskId  int    `json:"task_id"` //任务id
+	Account string `json:"account"` //账号
+	Level   int    `json:"level"`
+}
+
 //统计数据请求
 type ImageRecordStatisticsRequest struct {
 	Id     int      `json:"id"`

+ 16 - 0
model/log/game_character.go

@@ -0,0 +1,16 @@
+package log
+
+import "time"
+
+type GameCharacter struct {
+	Id        uint   `json:"id" gorm:"primarykey"`
+	Character string `json:"character"` //角色
+	GameId    int    `json:"game_id"`   //游戏id
+	Account   string `json:"account"`
+	CreatedAt time.Time
+	UpdatedAt time.Time
+}
+
+func (GameCharacter) TableName() string {
+	return "game_character"
+}

+ 36 - 0
model/log/ip_lib.go

@@ -0,0 +1,36 @@
+package log
+
+import (
+	"go.uber.org/zap"
+	"log-server/global"
+	"time"
+)
+
+/*
+ip库
+*/
+type IpLib struct {
+	Id         uint      `json:"id"`
+	Ip         string    `json:"ip"`          //模拟器ip
+	GameId     int       `json:"game_id"`     //游戏id
+	Status     uint8     `json:"status"`      //1表示可用,2表示不可用
+	CreateTime time.Time `json:"create_time"` // 创建时间
+	UpdateTime time.Time `json:"update_time"` // 更新时间
+}
+
+func (IpLib) TableName() string {
+	return "ip_lib"
+}
+
+func (s *IpLib) AddIpLog(gameId int, ip string, status uint8) {
+	if gameId != 5001 {
+		return
+	}
+	s.GameId = gameId
+	s.Ip = ip
+	s.Status = status
+	err := global.GVA_DB.Omit("create_time", "update_time").Create(&s).Error
+	if err != nil {
+		global.GVA_LOG.Error("create LogScanningCode fail", zap.Error(err))
+	}
+}

+ 10 - 8
model/log/log_ip.go

@@ -1,14 +1,16 @@
 package log
 
 type IpLog struct {
-	Id         uint   `json:"id"`
-	Ip         string `json:"ip"`          //模拟器ip
-	LogUuid    string `json:"log_uuid"`    //日志UUID
-	GameId     int    `json:"game_id"`     //游戏id
-	Account    string `json:"account"`     //账号
-	PcCode     string `json:"pc_code"`     //电脑编号
-	CreateDate string `json:"create_date"` // 创建日期
-	CreateTime string `json:"create_time"` // 创建时间
+	Id            uint   `json:"id"`
+	Ip            string `json:"ip"`       //模拟器ip
+	LogUuid       string `json:"log_uuid"` //日志UUID
+	GameId        int    `json:"game_id"`  //游戏id
+	Account       string `json:"account"`  //账号
+	PcCode        string `json:"pc_code"`  //电脑编号
+	SimulatorCode string `json:"simulator_code"`
+	FrontIp       string `json:"front_ip"`    //前端IP
+	CreateDate    string `json:"create_date"` // 创建日期
+	CreateTime    string `json:"create_time"` // 创建时间
 }
 
 //播报处理的iplog

+ 5 - 0
model/log/request/common.go

@@ -17,6 +17,11 @@ type CreateDateReply struct {
 	CreateDate string `json:"create_date"` // 日期
 }
 
+type IdDateReply struct {
+	GetById
+	CreateDateReply
+}
+
 func (r *GetById) Uint() uint {
 	return uint(r.ID)
 }

+ 6 - 0
model/log/response/loging.go

@@ -98,3 +98,9 @@ type DeviceInfoReply struct {
 	AccountErrNum uint8  `json:"account_err_num"`
 	CreateDate    string `json:"create_date"`
 }
+
+type TaskComputerInfoReply struct {
+	PcCode   string `json:"pc_code"`
+	PcMac    string `json:"pc_mac"`
+	Operator string `json:"operator"`
+}

+ 19 - 0
model/log/seal_ip.go

@@ -0,0 +1,19 @@
+package log
+
+/*
+封号ip日志
+*/
+type SealIpLog struct {
+	Id         uint   `json:"id"`
+	Ip         string `json:"ip"`          //模拟器ip
+	LogUuid    string `json:"log_uuid"`    //日志UUID
+	GameId     int    `json:"game_id"`     //游戏id
+	Account    string `json:"account"`     //账号
+	PcCode     string `json:"pc_code"`     //电脑编号
+	CreateDate string `json:"create_date"` // 创建日期
+	CreateTime string `json:"create_time"` // 创建时间
+}
+
+func (SealIpLog) TableName() string {
+	return "seal_ip_log"
+}

+ 5 - 0
model/task/central_control_conf.go

@@ -54,3 +54,8 @@ type CentralControlTaskConf struct {
 func (CentralControlConf) TableName() string {
 	return "central_control_conf"
 }
+
+type CentralControlConfList struct {
+	CentralControlConf
+	User string `json:"user"`
+}

+ 14 - 0
model/task/control/request.go

@@ -16,3 +16,17 @@ type CreateGameTaskRequest struct {
 	NewRetained       string `json:"new_retained"`
 	GamePort          string `json:"game_port"`
 }
+
+type GameRetentionRatio struct {
+	GameId    int `json:"game_id"`   //游戏Id
+	Second    int `json:"second"`    //次日留
+	Third     int `json:"third"`     //3日留存
+	Forth     int `json:"forth"`     //4日留存
+	Fifth     int `json:"fifth"`     //5日留存
+	Sixth     int `json:"sixth"`     //6日留存
+	Seventh   int `json:"seventh"`   //7日留存
+	Tenth     int `json:"tenth"`     //10日留存
+	Fifteenth int `json:"fifteenth"` //15日留存
+	Twentieth int `json:"twentieth"` //20日留存
+	Thirtieth int `json:"thirtieth"` //30日留存
+}

+ 19 - 0
model/task/game_retention_ratio.go

@@ -0,0 +1,19 @@
+package task
+
+type GameRetentionRatio struct {
+	GameId    int `json:"game_id"`   //游戏Id
+	Second    int `json:"second"`    //次日留
+	Third     int `json:"third"`     //3日留存
+	Forth     int `json:"forth"`     //4日留存
+	Fifth     int `json:"fifth"`     //5日留存
+	Sixth     int `json:"sixth"`     //6日留存
+	Seventh   int `json:"seventh"`   //7日留存
+	Tenth     int `json:"tenth"`     //10日留存
+	Fifteenth int `json:"fifteenth"` //15日留存
+	Twentieth int `json:"twentieth"` //20日留存
+	Thirtieth int `json:"thirtieth"` //30日留存
+}
+
+func (GameRetentionRatio) TableName() string {
+	return "game_retention_ratio"
+}

+ 1 - 0
model/task/game_task.go

@@ -67,6 +67,7 @@ type GameTaskUnion struct {
 	IsDel           int       `json:"is_del"`      // 是否删除-1删除,1正常
 	DeleteTime      time.Time `json:"delete_time"`
 	StopTime        time.Time `json:"stop_time"`
+	PushPayRatio    int       `json:"push_pay_ratio"`
 }
 
 func (GameTask) TableName() string {

+ 38 - 0
model/task/request/game_task.go

@@ -86,6 +86,20 @@ type GameTargetCompleteRequest struct {
 	TotalAmount      float64  `json:"total_amount"`
 }
 
+type GetGameTargetCompleteInfo struct {
+	GameId           int    `json:"game_id"`
+	GameName         string `json:"game_name"`
+	Username         string `json:"username"`
+	NewComplete      int    `json:"new_complete"`
+	PayComplete      int    `json:"pay_complete"`
+	RetainedComplete int    `json:"retain_complete"`
+	NewTarget        int    `json:"new_target"`
+	PayTarget        int    `json:"pay_target"`
+	RetainedTarget   int    `json:"retain_target"`
+	TheDate          string `json:"the_date"`
+	IsComplete       int    `json:"is_complete"`
+}
+
 type GetGameTaskTargetByIdRequest struct {
 	ID         int    `json:"id" form:"id"` // 主键ID
 	CreateDate string `json:"create_date"`
@@ -131,3 +145,27 @@ type GameListRequest struct {
 type GetTemporaryTaskRequest struct {
 	PcCode string `json:"pc_code"`
 }
+
+type RetentionRatioRequest struct {
+	GameId    int `json:"game_id"`   //游戏Id
+	Second    int `json:"second"`    //次日留
+	Third     int `json:"third"`     //3日留存
+	Forth     int `json:"forth"`     //4日留存
+	Fifth     int `json:"fifth"`     //5日留存
+	Sixth     int `json:"sixth"`     //6日留存
+	Seventh   int `json:"seventh"`   //7日留存
+	Tenth     int `json:"tenth"`     //10日留存
+	Fifteenth int `json:"fifteenth"` //15日留存
+	Twentieth int `json:"twentieth"` //20日留存
+	Thirtieth int `json:"thirtieth"` //30日留存
+}
+
+type GetRetentionRatioRequest struct {
+	GameID int `json:"game_id"` //游戏Id
+}
+
+type UploadGameCharacterRequest struct {
+	Character string `json:"character"` //角色
+	GameId    int    `json:"game_id"`   //游戏id
+	Account   string `json:"account"`
+}

+ 1 - 2
model/task/request/search_central_control_conf_params.go

@@ -6,9 +6,8 @@ import (
 )
 
 type SearchCentralControlConfParams struct {
-	task.CentralControlConf
+	task.CentralControlConfList
 	request.PageInfo
 	OrderKey string `json:"orderKey"` // 排序
 	Desc     bool   `json:"desc"`     // 排序方式:升序false(默认)|降序true
 }
-

+ 1 - 0
model/task/response/game_task.go

@@ -47,6 +47,7 @@ type GetGameTaskListUnionReply struct {
 	CreateTime      string `json:"create_time"` // 创建时间
 	UpdateTime      string `json:"update_time"` // 更新时间
 	StopTime        string `json:"stop_time"`
+	PushPayRatio    int    `json:"push_pay_ratio"`
 }
 
 type GetGameTargetComplete struct {

+ 13 - 0
model/task/sheep_pay.go

@@ -0,0 +1,13 @@
+package task
+
+type SheepPay struct {
+	Id      int    `json:"id"`
+	GameId  string `json:"game_id"`
+	PayDate string `json:"pay_date"`
+	PayTime string `json:"pay_time"`
+	Money   int    `json:"money"`
+}
+
+func (SheepPay) TableName() string {
+	return "sheep_pay"
+}

+ 1 - 0
model/task/task_conf.go

@@ -10,6 +10,7 @@ type TaskConf struct {
 	User          string `json:"user"`
 	AddFeeNotice  int    `json:"add_fee_notice"`
 	SimulatorType int    `json:"simulator_type"`
+	PushPayRatio  int    `json:"push_pay_ratio"`
 }
 
 func (TaskConf) TableName() string {

+ 18 - 6
model/task/urgent_task_conf.go

@@ -9,15 +9,27 @@ type UrgentTaskConf struct {
 	CreateDate string               `json:"create_date"` //创建日期
 	CreateTime typeManage.LocalTime `json:"create_time"`
 	UpdateTime typeManage.LocalTime `json:"update_time"`
+	Url        string               `json:"url"`
+}
+
+type ByIdUrgentTaskConf struct {
+	Id          int                  `json:"id"`
+	TaskId      int                  `json:"task_id"`     //任务id
+	PcCode      []string             `json:"pc_code"`     //电脑编号
+	CreateDate  string               `json:"create_date"` //创建日期
+	CreateTime  typeManage.LocalTime `json:"create_time"`
+	UpdateTime  typeManage.LocalTime `json:"update_time"`
+	IsDelPcCode int                  `json:"is_del_pc_code"`
 }
 
 type CreateAndUpdateUrgentTaskConf struct {
-	Id         int                  `json:"id"`
-	TaskId     int                  `json:"task_id"`     //任务id
-	PcCode     []string             `json:"pc_code"`     //电脑编号
-	CreateDate string               `json:"create_date"` //创建日期
-	CreateTime typeManage.LocalTime `json:"create_time"`
-	UpdateTime typeManage.LocalTime `json:"update_time"`
+	Id          int                  `json:"id"`
+	TaskId      int                  `json:"task_id"`     //任务id
+	PcCode      []string             `json:"pc_code"`     //电脑编号
+	CreateDate  string               `json:"create_date"` //创建日期
+	CreateTime  typeManage.LocalTime `json:"create_time"`
+	UpdateTime  typeManage.LocalTime `json:"update_time"`
+	IsDelPcCode int                  `json:"is_del_pc_code"`
 }
 
 //紧急任务请求

+ 5 - 4
router/levelMonitor/image_record.go

@@ -12,12 +12,13 @@ func (r *ImageRecordRouter) InitImageRecordRouter(Router *gin.RouterGroup) {
 	imageRecordRouter := Router.Group("levelMonitor")
 	imageRecordApi := v1.ApiGroupApp.LevelMonitorGroup.ImageRecordApi
 	{
-		imageRecordRouter.POST("getImageRecordList", imageRecordApi.GetImageRecordList) //获取图片记录列表
+		imageRecordRouter.POST("getImageRecordList", imageRecordApi.GetImageRecordList)                     //获取图片记录列表
 		imageRecordRouter.POST("getWeekImageRecordStatistics", imageRecordApi.GetWeekImageRecordStatistics) //获取7日等级统计数据
 		imageRecordRouter.POST("getImageRecordStatisticsList", imageRecordApi.GetImageRecordStatisticsList) //获取图片记录列表
-		imageRecordRouter.POST("imageRecordStatisticsExport", imageRecordApi.ImageRecordStatisticsExport)	//导出等级统计数据
-		imageRecordRouter.POST("createImageRecord", imageRecordApi.CreateImageRecord)   //创建图片记录
-		imageRecordRouter.POST("uploadOrNot", imageRecordApi.UploadOrNot)               //询问是否上传图片
+		imageRecordRouter.POST("imageRecordStatisticsExport", imageRecordApi.ImageRecordStatisticsExport)   //导出等级统计数据
+		imageRecordRouter.POST("createImageRecord", imageRecordApi.CreateImageRecord)                       //创建图片记录
+		imageRecordRouter.POST("uploadOrNot", imageRecordApi.UploadOrNot)                                   //询问是否上传图片
+		imageRecordRouter.POST("upLevel", imageRecordApi.UpLevel)                                           //上传等级
 	}
 	//imageRecordRouter1 := Router.Group("levelMonitor").Use(middleware.OperationRecord())
 	//{

+ 1 - 0
router/log/loging.go

@@ -35,5 +35,6 @@ func (e *LogingRouter) InitLogingRouter(Router *gin.RouterGroup) {
 		excelRouter.POST("deviceErrRateExcel", logApi.DeviceErrRateExcel)
 		excelRouter.GET("getWuYToken", logApi.GetWuYToken)
 		excelRouter.POST("supConErr", logApi.SupConErr)
+		excelRouter.POST("getTaskComputer", logApi.GetTaskComputer)
 	}
 }

+ 21 - 16
router/task/game_task.go

@@ -10,24 +10,29 @@ type GameTaskRouter struct {
 }
 
 func (e *GameTaskRouter) InitGameTaskRouter(Router *gin.RouterGroup) {
-	GameTaskRouter := Router.Group("gameTask")
+	gameTaskRouter := Router.Group("gameTask")
 	GameTaskApi := v1.ApiGroupApp.GroupTask.GameTaskApi
 	{
-		GameTaskRouter.POST("getGameTaskList", GameTaskApi.GetGameTaskList)
-		GameTaskRouter.POST("getUsedGameTaskList", GameTaskApi.GetUsedGameTaskList) //获取启用状态的任务
-		GameTaskRouter.POST("getGameTaskById", GameTaskApi.GetGameTaskById)
-		GameTaskRouter.POST("getGameTaskTargetList", GameTaskApi.GetGameTaskTargetList)
-		GameTaskRouter.POST("getGameTaskTargetById", GameTaskApi.GetGameTaskTargetById)
-		GameTaskRouter.GET("targetStatistics", GameTaskApi.TargetStatistics)
-		GameTaskRouter.POST("everyDayStatistics", GameTaskApi.EveryDayStatistics)
-		GameTaskRouter.POST("monthStatistics", GameTaskApi.MonthStatistics)
-		GameTaskRouter.POST("gameStatistics", GameTaskApi.GameStatistics)
-		GameTaskRouter.POST("gameList", GameTaskApi.GameList)
-		GameTaskRouter.POST("getGameTxTaskList", GameTaskApi.GetGameTxTaskList)
-		GameTaskRouter.POST("getFeeAccountList", GameTaskApi.GetFeeAccountList)
-		GameTaskRouter.POST("taskTargetExport", GameTaskApi.TaskTargetExport)
-		GameTaskRouter.POST("getXmyTaskList", GameTaskApi.GetXmyTaskList) //获取小绵羊任务列表
-		GameTaskRouter.POST("temporaryTask", GameTaskApi.TemporaryTask)
+		gameTaskRouter.POST("getGameTaskList", GameTaskApi.GetGameTaskList)
+		gameTaskRouter.POST("getUsedGameTaskList", GameTaskApi.GetUsedGameTaskList) //获取启用状态的任务
+		gameTaskRouter.POST("getGameTaskById", GameTaskApi.GetGameTaskById)
+		gameTaskRouter.POST("getGameTaskTargetList", GameTaskApi.GetGameTaskTargetList)
+		gameTaskRouter.POST("getGameTaskTargetById", GameTaskApi.GetGameTaskTargetById)
+		gameTaskRouter.GET("targetStatistics", GameTaskApi.TargetStatistics)
+		gameTaskRouter.POST("everyDayStatistics", GameTaskApi.EveryDayStatistics)
+		gameTaskRouter.POST("monthStatistics", GameTaskApi.MonthStatistics)
+		gameTaskRouter.POST("gameStatistics", GameTaskApi.GameStatistics)
+		gameTaskRouter.POST("gameList", GameTaskApi.GameList)
+		gameTaskRouter.POST("getGameTxTaskList", GameTaskApi.GetGameTxTaskList)
+		gameTaskRouter.POST("getFeeAccountList", GameTaskApi.GetFeeAccountList)
+		gameTaskRouter.POST("taskTargetExport", GameTaskApi.TaskTargetExport)
+		gameTaskRouter.POST("getXmyTaskList", GameTaskApi.GetXmyTaskList) //获取小绵羊任务列表
+		gameTaskRouter.POST("temporaryTask", GameTaskApi.TemporaryTask)
+		gameTaskRouter.GET("sheepPay", GameTaskApi.GetSheepPay)
+		gameTaskRouter.POST("getRatio", GameTaskApi.GetRetentionRatio)
+		gameTaskRouter.POST("updateRatio", GameTaskApi.UpdateRetentionRatio)
+		gameTaskRouter.POST("uploadGameCharacter", GameTaskApi.UploadGameCharacter)
+		gameTaskRouter.GET("pushTaskData", GameTaskApi.PushCompleteTaskData)
 	}
 	GameTaskRouter1 := Router.Group("gameTask").Use(middleware.OperationRecord())
 	{

+ 1 - 0
router/task/urgent_task_conf.go

@@ -25,5 +25,6 @@ func (r *UrgentTaskRouter) InitUrgentTaskRouter(Router *gin.RouterGroup) {
 		urgentTaskApi1.POST("deleteUrgentTask", urgentTaskApi.DeleteUrgentTask)             //单个删除紧急任务
 		urgentTaskApi1.DELETE("deleteUrgentTaskByIds", urgentTaskApi.DeleteUrgentTaskByIds) //批量删除紧急任务
 		urgentTaskApi1.POST("updateUrgentTask", urgentTaskApi.UpdateUrgentTask)             //更新紧急任务
+		urgentTaskApi1.POST("delCodeUrgentTask", urgentTaskApi.DelCodeUrgentTask)           //删电脑编号
 	}
 }

+ 1 - 0
service/cache/cache.go

@@ -10,6 +10,7 @@ import (
 const (
 	TemporaryTaskPcCode = "%s:temporaryTaskPcCode:%s"
 	UploadImageNum      = "%s:UploadImageNum:%d"
+	ComputerEfficiency  = "%s:ComputerEfficiency:%s"
 )
 
 type Cache struct {

+ 2 - 2
service/dataStatistics/data_abnormal_rate.go

@@ -460,7 +460,7 @@ func (s *ServiceDataAbnormalRate) SyncAbnormalRateByBatch() {
 // QueryXjfLogByBatch 请求机房任务数据
 func (s *ServiceDataAbnormalRate) QueryXjfLogByBatch(action string, actionResult string) (result []byte, err error) {
 	today := time.Now().Format("2006-01-02")
-	jfUrl := "http://xjf.lianyou.fun:8099/v1/device/get_log_by_game"
+	jfUrl := global.GVA_CONFIG.ExtranetDomain.Control + "/v1/device/get_log_by_game"
 	jfParams := map[string]string{
 		"date":          today,
 		"action":        action,
@@ -473,7 +473,7 @@ func (s *ServiceDataAbnormalRate) QueryXjfLogByBatch(action string, actionResult
 // 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"
+	jfurl := global.GVA_CONFIG.ExtranetDomain.Control + "/v1/task_statistics"
 	jfparams := map[string]string{
 		"query": "date:" + today + ",type:machine",
 	}

+ 1 - 1
service/dataStatistics/wechat_scanner_detailed.go

@@ -241,7 +241,7 @@ func (s *ServiceWeChatScannerDetailed) SyncWeChatScannerDetailed(today string) {
 //
 // getJfWechatOrder 获取机房后台微信订单列表信息
 func (s *ServiceWeChatScannerDetailed) getJfWechatOrder(gameId int, date string) (result []byte, err error) {
-	jfUrl := "http://xjf.lianyou.fun:8099/v1/account/get_wechat_order"
+	jfUrl := global.GVA_CONFIG.ExtranetDomain.Control + "/v1/account/get_wechat_order"
 	jfParams := map[string]string{
 		"game_id": strconv.Itoa(gameId),
 		"date":    date,

+ 8 - 2
service/fileManager/download_url.go

@@ -40,8 +40,14 @@ func (s *ServiceDownLoadUrl) UpdateGameVersion() {
 		if err != nil {
 			return
 		}
-		dataJson, _ := simplejson.NewJson(result)
-		code, _ := dataJson.Get("code").Int()
+		dataJson, err := simplejson.NewJson(result)
+		if err != nil {
+			return
+		}
+		code, err := dataJson.Get("code").Int()
+		if err != nil {
+			return
+		}
 		//global.GVA_LOG.Info(strconv.Itoa(code))
 		//msg, _ := dataJson.Get("msg").String()
 		//global.GVA_LOG.Info(msg)

+ 1 - 1
service/fileManager/file_qiniu.go

@@ -23,7 +23,7 @@ type ServiceFileQiniu struct {
 const accessKey = "B81Gsvry2StqKVE3txS-7v9GBBfqykC9zhebmxnW" //七牛云ak,sk,bucket
 const secretKey = "YEZJuYcdeF7vRvzffxpopAVR-jMPZg9pZ-4IKTVW"
 const bucket0 = "pinaishop"
-const CName = "http://cdn.pinaishop.kfzs.com/" //七牛云外链
+const CName = "http://cdn.sjyh.kfzs.com/" //七牛云外链
 
 // QueryVersionByType 查询某一类文件最新的版本号
 func (s *ServiceFileQiniu) QueryVersionByType(req request.FileQiniuRequest) (int64, error) {

+ 114 - 19
service/levelMonitor/image_record.go

@@ -15,6 +15,7 @@ import (
 	levelRequest "log-server/model/levelMonitor/request"
 	"log-server/model/log"
 	"log-server/service/cache"
+	"log-server/utils"
 	"net/http"
 	"net/url"
 	"regexp"
@@ -32,11 +33,11 @@ func (s *ImageRecordService) CreateImageRecord(record levelMonitor.ImageRecord)
 	//获取今日日期
 	date := time.Now().Format("2006-01-02")
 	key := fmt.Sprintf(cache.UploadImageNum, date, record.TaskId)
-	ctx := context.Background()
-	num, _ := s.cache.GetCacheNum(ctx, key)
-	if num > 50 {
-		return errors.New("数据上传已到上限")
-	}
+	//ctx := context.Background()
+	//num, _ := s.cache.GetCacheNum(ctx, key)
+	//if num > 100 {
+	//	return errors.New("数据上传已到上限")
+	//}
 	var entity levelMonitor.ImageRecord
 	//创建日期赋值
 	record.CreateDate = date
@@ -50,22 +51,83 @@ func (s *ImageRecordService) CreateImageRecord(record levelMonitor.ImageRecord)
 	if err != nil {
 		return err
 	}
+
 	go s.ImageIdentify(record, key)
 	return
 }
 
+func (s *ImageRecordService) CreateLevel(request levelRequest.CreateLevelRequest) (err error) {
+	//获取今日日期
+	date := time.Now().Format("2006-01-02")
+	key := fmt.Sprintf(cache.UploadImageNum, date, request.TaskId)
+	ctx := context.Background()
+	//num, _ := s.cache.GetCacheNum(ctx, key)
+	//if num > 100 {
+	//	return errors.New("数据上传已到上限")
+	//}
+	var entity levelMonitor.ImageRecord
+
+	//查找数据库是否存在此账号此游戏今日等级上报记录
+	err = global.GVA_DB.Model(&levelMonitor.ImageRecord{}).Where("task_id = ? and account = ? and create_date = ?", request.TaskId, request.Account, date).First(&entity).Error
+	if !errors.Is(err, gorm.ErrRecordNotFound) {
+		return errors.New("此记录已存在,请勿重复添加")
+	}
+	var gameAccount log.GameAccount
+	global.GVA_DB.Where("game_id", request.TaskId).Where("account", request.Account).First(&gameAccount)
+	//创建日期赋值
+	entity.CreateDate = date
+	entity.Status = 1
+	entity.TaskId = request.TaskId
+	entity.Account = request.Account
+	entity.Identify = float64(request.Level)
+	entity.UseNum = gameAccount.UseNum
+	err = global.GVA_DB.Model(&levelMonitor.ImageRecord{}).Omit("create_time", "update_time").Create(&entity).Error
+	if err != nil {
+		global.GVA_LOG.Error("添加ImageRecord fail", zap.Error(err))
+		return err
+	}
+	UpdateGameAccountIdentify(entity.Account, entity.TaskId, entity.Identify)
+	// 等級》1上報中控
+	if request.Level > 1 {
+		s.UpdateControlAccountLevel(request.Account, request.TaskId, request.Level)
+	}
+	s.cache.SetCacheNum(ctx, key)
+	return
+}
+
+// http请求群控创建任务
+func (s *ImageRecordService) UpdateControlAccountLevel(account string, gameId, level int) {
+	urlControl := global.GVA_CONFIG.ExtranetDomain.Control + "/v1/account/account_level"
+	//game_id=2003&level=yyyyy
+	requestData := map[string]string{
+		"account": account,
+		"game_id": strconv.Itoa(gameId),
+		"level":   strconv.Itoa(level),
+	}
+	_, _ = utils.HttpGet(urlControl, requestData)
+	return
+}
+
 func (s *ImageRecordService) UploadOrNot(record levelMonitor.ImageRecord) (err error) {
 	date := time.Now().Format("2006-01-02")
 	key := fmt.Sprintf(cache.UploadImageNum, date, record.TaskId)
 	ctx := context.Background()
 	num, _ := s.cache.GetCacheNum(ctx, key)
-	if num > 50 {
+	if num > 300 {
 		return errors.New("数据上传已到上限")
 	}
 	return nil
 }
 
-//删除三日前的图片记录
+func (s *ImageRecordService) UploadLeve(record levelMonitor.ImageRecord) (err error) {
+	date := time.Now().Format("2006-01-02")
+	key := fmt.Sprintf(cache.UploadImageNum, date, record.TaskId)
+	ctx := context.Background()
+	s.cache.SetCacheNum(ctx, key)
+	return nil
+}
+
+//删除7日前的图片记录
 func (s *ImageRecordService) DeleteExpireImageRecord() {
 	markTime := time.Now().Add(-time.Hour * 48).Format("2006-01-02")
 	err := global.GVA_DB.Where("create_date < ?", markTime).Delete(&levelMonitor.ImageRecord{}).Error
@@ -76,6 +138,7 @@ func (s *ImageRecordService) DeleteExpireImageRecord() {
 }
 
 //获取图片记录列表
+
 func (s *ImageRecordService) GetImageRecordList(record levelRequest.ImageRecordRequest, info request.PageInfo, order string, desc bool) (recordList []levelMonitor.ImageRecordResponse, total int64, err error) {
 	limit := info.PageSize
 	offset := info.PageSize * (info.Page - 1)
@@ -140,7 +203,31 @@ const API_KEY = "z9GNcyrC7VeV3g1xXEj3YL1s"
 const SECRET_KEY = "VASRBsEzeVsyKduSkkflfL87r5yqoqvj"
 const BAIDU_IDENTIFY = "baiduIdentifyToken"
 
+func (s *ImageRecordService) GetAccessToken(ctx context.Context) (token string, err error) {
+	baiduAccount := new(levelMonitor.BaiduAccount)
+	baiduAccount.CurrentDate = time.Now().Format("2006-01-02")
+	accountId, err := baiduAccount.GetCurrentAccountInfo(ctx)
+	if err != nil {
+		global.GVA_LOG.Error("get token fail", zap.Error(err))
+		return
+	}
+	accountId, err = baiduAccount.CheckCurrentAccountLimit(ctx, accountId)
+	if err != nil {
+		global.GVA_LOG.Error("get token fail", zap.Error(err))
+		return
+	}
+	token, err = baiduAccount.GetAccessToken(ctx, accountId)
+	return
+}
+
 func (s *ImageRecordService) ImageIdentify(record levelMonitor.ImageRecord, key string) {
+	var gameAccount log.GameAccount
+	global.GVA_DB.Where("game_id", record.TaskId).Where("account", record.Account).First(&gameAccount)
+	if gameAccount.UseNum == 1 {
+		global.GVA_DB.Where("id = ?", record.Id).Delete(&levelMonitor.ImageRecord{})
+		return
+	}
+	ctx := context.Background()
 	token, err := GetAccessToken()
 	if err != nil {
 		global.GVA_LOG.Error("get token fail", zap.Error(err))
@@ -174,15 +261,21 @@ func (s *ImageRecordService) ImageIdentify(record levelMonitor.ImageRecord, key
 		return
 	}
 	i, err := strconv.ParseFloat(data.WordsResult[0].Words, 64)
+
 	if err != nil {
 		// 定义价格提取的正则表达式模式
 		identifyPattern := `([0-9]+(?:\.[0-9]{1,2})?)`
 		// 编译正则表达式
 		re := regexp.MustCompile(identifyPattern)
 		// 使用正则表达式查找价格信息
-		level := re.FindAllString(data.WordsResult[0].Words, -1)
-		l, _ := strconv.ParseFloat(level[0], 64)
-		identify = l
+		upLevel := strings.ReplaceAll(data.WordsResult[0].Words, ",", "")
+		level := re.FindAllString(upLevel, -1)
+		if len(level) == 0 {
+			identify = 0
+		} else {
+			l, _ := strconv.ParseFloat(level[0], 64)
+			identify = l
+		}
 	} else {
 		identify = i
 	}
@@ -191,11 +284,12 @@ func (s *ImageRecordService) ImageIdentify(record levelMonitor.ImageRecord, key
 		s.UpdateImageRecordStatus(record.Id, string(body), -1, 0, 0)
 		return
 	}
-	var gameAccount log.GameAccount
-	global.GVA_DB.Where("game_id", record.TaskId).Where("account", record.Account).First(&gameAccount)
+
 	s.UpdateImageRecordStatus(record.Id, string(body), 1, gameAccount.UseNum, identify)
 	UpdateGameAccountIdentify(record.Account, record.TaskId, identify)
-	ctx := context.Background()
+	if identify > 1 && record.TaskId == 5001 {
+		s.UpdateControlAccountLevel(record.Account, record.TaskId, int(identify))
+	}
 	s.cache.SetCacheNum(ctx, key)
 	return
 }
@@ -212,6 +306,7 @@ func (s *ImageRecordService) UpdateImageRecordStatus(id int, result string, stat
 
 func Request(baiduToken, content string) (body []byte, err error) {
 	reqUrl := "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic?access_token=" + baiduToken
+	//reqUrl := "https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic?access_token=" + baiduToken
 	var (
 		params = url.Values{}
 	)
@@ -300,9 +395,9 @@ func (s *ImageRecordService) ImageRecordStatistics(date string) {
 		return
 	}
 	type StatisticsData struct {
-		UseNum     int `json:"use_num"`
-		AccountNum int `json:"account_num"`
-		LevelNum   int `json:"level_num"`
+		UseNum     int     `json:"use_num"`
+		AccountNum int     `json:"account_num"`
+		LevelNum   float64 `json:"level_num"`
 	}
 	for _, taskId := range taskIds {
 		var statisticsData []StatisticsData
@@ -321,7 +416,7 @@ func (s *ImageRecordService) ImageRecordStatistics(date string) {
 		b := false
 		for _, data := range statisticsData {
 			if _, ok := levelMonitor.R[data.UseNum]; ok {
-				imageRecordStatistics[levelMonitor.R[data.UseNum]] = float64(data.LevelNum) / float64(data.AccountNum)
+				imageRecordStatistics[levelMonitor.R[data.UseNum]] = data.LevelNum / float64(data.AccountNum)
 				b = true
 			}
 		}
@@ -346,7 +441,7 @@ func (s *ImageRecordService) CreateImageRecordStatistics(taskId int, imageRecord
 }
 
 //获取7日统计数据
-func (s *ImageRecordService) GetWeekImageRecordStatistics(taskId int, createDate string) (dataList []levelMonitor.ImageRecordStatisticsResponse, err error){
+func (s *ImageRecordService) GetWeekImageRecordStatistics(taskId int, createDate string) (dataList []levelMonitor.ImageRecordStatisticsResponse, err error) {
 	db := global.GVA_DB.Model(&levelMonitor.ImageRecordStatistics{})
 	db = db.Select("image_record_statistics.*, game_task.user, game_task.task_name")
 	db = db.Joins("left join game_task on image_record_statistics.task_id = game_task.task_id")
@@ -464,4 +559,4 @@ func (s *ImageRecordService) ImageRecordStatisticsListExcel(infoList []levelMoni
 	}
 	err := excel.SaveAs(filePath)
 	return err
-}
+}

+ 2 - 2
service/log/log_ip.go

@@ -369,8 +369,8 @@ func (s *ServiceIpLog) UpdateAbnormalMachineIp() (err error) {
 		createDate := abnormalIpList[i].CreateDate[:10]
 		count := abnormalIpList[i].Count
 
-		//根据count判断,如果count < 9, continue继续做下一条记录的处理
-		if count < 6 {
+		//根据count判断,如果count < 5, continue继续做下一条记录的处理
+		if count < 5 {
 			continue
 		}
 

+ 140 - 5
service/log/log_statistics.go

@@ -15,6 +15,7 @@ import (
 	"log-server/model/log/response"
 	"log-server/model/task"
 	"log-server/model/typeManage"
+	"log-server/service/cache"
 	loging2 "log-server/service/log/loging"
 	"log-server/utils"
 	"strconv"
@@ -220,8 +221,8 @@ func (s *ServiceStatisticsLog) statisticsData(ctx context.Context, gameIdInt, tt
 	mzLoginOk, _ := s.LogicalLog.TypeLogGetNum(ctx, date, gameIdInt, "4603000", loging2.OkStatus, tt)
 	LoginFail := xmyLoginFail + wxLoginFail + mzLoginFail
 	LoginOk := xmyLoginOk + wxLoginOk + mzLoginOk
-	EnterMainFail, _ := s.LogicalLog.NodeLogGetNum(ctx, date, gameIdInt, "4700000", loging2.FailStatus, tt)
-	EnterMainOk, _ := s.LogicalLog.NodeLogGetNum(ctx, date, gameIdInt, "4700000", loging2.OkStatus, tt)
+	EnterMainFail, _ := s.LogicalLog.TypeLogGetNum(ctx, date, gameIdInt, "4701000", loging2.FailStatus, tt)
+	EnterMainOk, _ := s.LogicalLog.TypeLogGetNum(ctx, date, gameIdInt, "4701000", loging2.OkStatus, tt)
 	FeeFail, _ := s.LogicalLog.NodeLogGetNum(ctx, date, gameIdInt, "4800000", loging2.FailStatus, tt)
 	FeeOk, _ := s.LogicalLog.NodeLogGetNum(ctx, date, gameIdInt, "4800000", loging2.OkStatus, tt)
 	ScriptStartFail, _ := s.LogicalLog.NodeLogGetNum(ctx, date, gameIdInt, "4300000", loging2.FailStatus, tt)
@@ -554,9 +555,10 @@ func (s *ServiceStatisticsLog) CreateComputerStatisticsData() {
 	var csReplys []*log.LogComputer
 	for code, _ := range codeMps {
 		// 不统计不在电脑列表里的
-		if _, ok := computerData[code]; !ok {
-			continue
-		}
+		//if _, ok := computerData[code]; !ok {
+		//	continue
+		//}
+
 		// 负责人为空的不统计
 		if computerData[code] == "" {
 			continue
@@ -576,6 +578,9 @@ func (s *ServiceStatisticsLog) CreateComputerStatisticsData() {
 		operator := computerData[code]
 		delete(computerData, code)
 		for gameId, num := range accountMps {
+			if gameId == "0" {
+				continue
+			}
 			csReply := new(log.LogComputer)
 			csReply.PcCode = code
 			if _, ok := onlineComputerMpa[csReply.PcCode]; ok {
@@ -838,6 +843,109 @@ func (s *ServiceStatisticsLog) OnlineComputerStatistics(ctx context.Context, api
 	return statisticsLogs, total, err
 }
 
+// OnlineComputerStatistics 在线电脑
+func (s *ServiceStatisticsLog) OnlineComputerEfficiencyStatistics() {
+	date := s.CurrentDate()
+	db := global.GVA_DB.Model(&log.LogComputer{})
+	db = db.Select("SUM(pull_account_num) pull_account_total,SUM(enter_main) enter_main_total,operator,pc_code,status,create_date,remarks")
+	db = db.Where("create_date = ?", date)
+	db = db.Group("pc_code")
+	var statisticsLogs []*response.ComputerUseLogReply
+	err := db.Find(&statisticsLogs).Error
+	if err != nil {
+		return
+	}
+	// 查询两小时内上报的数据
+	var computersF = map[string]string{}
+	var noReportingPc []string
+	ctx := context.Background()
+	for _, computer := range statisticsLogs {
+		computersF[computer.PcCode] = computer.Operator
+		if strings.Contains(computer.Operator, "备用") {
+			continue
+		}
+		if computer.Operator == "" {
+			continue
+		}
+		key := fmt.Sprintf(cache.ComputerEfficiency, date, computer.PcCode)
+
+		if computer.EnterMainTotal == 0 && computer.PullAccountTotal == 0 {
+			continue
+		}
+
+		if computer.EnterMainTotal == 0 {
+			continue
+		}
+
+		num := float64(computer.EnterMainTotal) / float64(computer.PullAccountTotal) * 100
+		formattedNumber := fmt.Sprintf("%.2f", num)
+		if num < 30 {
+			getNum, _ := global.GVA_REDIS.Get(ctx, key).Result()
+			if getNum != "" {
+				fmt.Println(computer.PcCode)
+				getCacheNumFormat, _ := strconv.ParseFloat(getNum, 64)
+				formatNum, _ := strconv.ParseFloat(formattedNumber, 64)
+
+				if getCacheNumFormat > formatNum {
+					noReportingPc = append(noReportingPc, computer.PcCode)
+					global.GVA_REDIS.Set(ctx, key, formattedNumber, time.Hour*10)
+				}
+			} else {
+				global.GVA_REDIS.Set(ctx, key, formattedNumber, time.Hour*10)
+				noReportingPc = append(noReportingPc, computer.PcCode)
+			}
+		} else {
+			global.GVA_REDIS.Del(ctx, key)
+		}
+	}
+	mpsPerson, _ := s.Person.GetUserInfoData()
+	var mobile []string
+	var content string
+	nameMps := map[string]string{}
+	if len(noReportingPc) != 0 {
+		content += fmt.Sprintf("检测电脑效率异常<font color=\"warning\">%d台</font>:", len(noReportingPc))
+		for _, pc := range noReportingPc {
+			content += "\n"
+			name := computersF[pc]
+			content += name + " : " + pc
+			if nameMps[name] == "" {
+				nameMps[name] = pc
+			} else {
+				nameMps[name] += ","
+				nameMps[name] += pc
+			}
+		}
+	}
+
+	c := "# 检测电脑效率异常"
+	c += "\n"
+	if len(nameMps) != 0 {
+		for name, ct := range nameMps {
+			if _, ok := mpsPerson[name]; ok {
+				mobile = append(mobile, mpsPerson[name].MobilePhoneNumber)
+			}
+			ct = fmt.Sprintf("<font color=\"warning\">%s</font>", ct)
+			ct = c + ct
+			global.GVA_LOG.Info(ct)
+			go s.SendContent(ct, mpsPerson[name].Url)
+		}
+	}
+	if content != "" {
+		var sendMsg SendMsg
+		sendMsg.MsgType = "markdown"
+		sendMsg.Markdown.Content = content
+		url := global.GVA_CONFIG.SendUrl.ComputerSendUrl
+		_, err = s.SendMsgData(url, sendMsg)
+		if len(mobile) != 0 {
+			var sendTextData SendTextMsg
+			sendTextData.MsgType = "text"
+			sendTextData.Text.MentionedMobileList = mobile
+			_, _ = s.SendMsgData(url, sendTextData)
+		}
+	}
+	return
+}
+
 // GameStatistics 根据游戏id查询数据
 func (s *ServiceStatisticsLog) GameStatistics(ctx context.Context, api log.LogComputer, info request.PageInfo) (interface{}, int64, error) {
 	date := api.CreateDate
@@ -883,6 +991,32 @@ func (s *ServiceStatisticsLog) GameStatistics(ctx context.Context, api log.LogCo
 	return statisticsLogsByGameId, total, err
 }
 
+func (s *ServiceStatisticsLog) TaskComputerNumInfo(ctx context.Context, reply request.IdDateReply) (interface{}, int64, error) {
+	if reply.ID == 0 {
+		return nil, 0, errors.New("参数错误")
+	}
+	createDate := time.Now().Format("2006-01-02")
+	if reply.CreateDate == "" {
+		createDate = time.Now().Format("2006-01-02")
+	} else {
+		createDate = reply.CreateDate
+	}
+
+	splitTime := strings.Split(createDate, "-")
+	table := "loging_" + splitTime[0] + "-" + splitTime[1]
+	fmt.Println(table)
+	db := global.GVA_DB.Table(table)
+	db = db.Select("pc_code,operator,pc_mac")
+	db = db.Where("create_date = ?", createDate)
+	db = db.Where("game_id = ?", reply.ID)
+	db = db.Group("pc_mac")
+	var total int64
+	db.Count(&total)
+	var computerInfos []response.TaskComputerInfoReply
+	db.Find(&computerInfos)
+	return computerInfos, total, nil
+}
+
 func (s *ServiceStatisticsLog) GameTargetInfo(ctx context.Context, date string, gameId string) (taskStatistics1 request.TaskStatistics) {
 	key := fmt.Sprintf(taskStatistics, date)
 	data, err := global.GVA_REDIS.HGet(ctx, key, gameId).Result()
@@ -1024,6 +1158,7 @@ func (s *ServiceStatisticsLog) ComputerTest(c context.Context) (interface{}, err
 func (s *ServiceStatisticsLog) RegularCheckPc() {
 	ctx := context.Background()
 	var computer log.Computer
+	// 重缓存中获取到数据
 	computers, err := computer.OnlinePcCodeCache()
 	//computersF, err := computer.OnlinePcCodeCache()
 	if err != nil {

+ 6 - 1
service/log/loging/enter_main_log.go

@@ -28,7 +28,7 @@ func (s *EnterMainLog) SuccessLog(ctx context.Context, request request.AddLogReq
 	} else {
 		_ = s.logical.SetUuidCodeCache(context.Background(), s.logical.CurrentDate(), s.logical.Request.LogUuid, s.logical.Request.Coding, s.logical.Request.GameId)
 	}
-
+	go s.logical.AddIpLib(s.logical.Request)
 	code := strconv.Itoa(request.Coding)
 	err = s.logical.PartTypeLogSetNum(ctx, s.logical.CurrentDate(), s.logical.Request.GameId, code, OkStatus, s.logical.Request.TaskType)
 	if err != nil {
@@ -64,6 +64,11 @@ func (s *EnterMainLog) FailLog(ctx context.Context, request request.AddLogReques
 	if s.logical.ScriptType == 1 {
 		return
 	}
+	// 封号ip记录
+	if code == "4701003" {
+		// 线上测试打印日志
+		go s.logical.AddSealIpLog(s.logical.Request)
+	}
 	if code[5:] == "00" {
 		err = s.logical.CodeLogSetNum(ctx, s.logical.CurrentDate(), s.logical.Request.GameId, strconv.Itoa(request.Coding), NoLogStatus, s.logical.Request.TaskType)
 		if code[3:] == "1000" {

+ 97 - 7
service/log/loging/logical_log.go

@@ -339,18 +339,21 @@ func (s *LogicalLog) SetCacheNum(ctx context.Context, key string) (err error) {
 	}
 }
 
+// 节点缓存
 func (s *LogicalLog) NodeLogGetNum(ctx context.Context, date string, gameId int, code string, status string, taskType int) (num int, err error) {
 	node := code[:3]
 	num, err = s.LogGetNum(ctx, date, gameId, node, status, taskType)
 	return
 }
 
+// 类型缓存
 func (s *LogicalLog) TypeLogGetNum(ctx context.Context, date string, gameId int, code string, status string, taskType int) (num int, err error) {
 	node := code[:5]
 	num, err = s.LogGetNum(ctx, date, gameId, node, status, taskType)
 	return
 }
 
+// 编号缓存
 func (s *LogicalLog) CodeLogGetNum(ctx context.Context, date string, gameId int, code string, status string, taskType int) (num int, err error) {
 	num, err = s.LogGetNum(ctx, date, gameId, code, status, taskType)
 	return
@@ -706,7 +709,7 @@ func (s *LogicalLog) GetStatisticsComputerRate(ctx context.Context, pcCode strin
 // 请求机房任务数据
 func (s *LogicalLog) RequestJfRoom() (result []byte, err error) {
 	today := time.Now().Format("2006-01-02")
-	jfurl := "http://xjf.lianyou.fun:8099/v1/task_statistics"
+	jfurl := global.GVA_CONFIG.ExtranetDomain.Control + "/v1/task_statistics"
 	jfparams := map[string]string{
 		"query": "date:" + today + ",type:machine",
 	}
@@ -902,6 +905,11 @@ func (s *LogicalLog) AddIpLog(request request.AddLogRequest) {
 	logSC.Ip = request.SimulatorIp
 	logSC.Account = request.Account
 	logSC.PcCode = request.PcCode
+	logSC.SimulatorCode = request.SimulatorCode
+	segments := strings.Split(request.SimulatorIp, ".")
+	if len(segments) > 3 {
+		logSC.FrontIp = strings.Join(segments[:3], ".")
+	}
 	logSC.CreateDate = time.Now().Format("2006-01-02")
 	err := global.GVA_DB.Omit("create_time").Create(&logSC).Error
 	if err != nil {
@@ -960,6 +968,17 @@ func (s *LogicalLog) AddDeviceLog(request request.AddLogRequest) {
 				logSC.ErrStatus = 3
 				gameDeviceErrKey := fmt.Sprintf(GameDeviceErrKey, logSC.CreateDate, request.GameId)
 				s.cache.SetCacheNum(ctx, gameDeviceErrKey)
+				var gameAccount log.GameAccount
+				gameAccount.DeviceId = logSC.DeviceId
+				gameAccount.DeviceImei = logSC.DeviceImei
+				gameAccount.DeviceMac = logSC.DeviceMac
+				gameAccount.DeviceManufacturer = logSC.DeviceManufacturer
+				gameAccount.DeviceModel = logSC.DeviceModel
+				gameAccount.DeviceSdk = logSC.DeviceSdk
+				gameAccount.DeviceNumber = logSC.DeviceNumber
+				gameAccount.AccountHex = logSC.AccountHex
+				gameAccount.DeviceHex = logSC.DeviceHex
+				global.GVA_DB.Where("game_id = ?", request.GameId).Where("account = ?", request.Account).Updates(&gameAccount)
 			}
 		}
 	} else {
@@ -978,6 +997,7 @@ func (s *LogicalLog) AddDeviceLog(request request.AddLogRequest) {
 		global.GVA_LOG.Error("create LogScanningCode fail", zap.Error(err))
 	}
 	if logSC.ErrStatus == 3 || logSC.ErrStatus == 2 {
+		logSC.ScriptDeviceId = deviceLogs[0].ScriptDeviceId
 		s.AddDeviceErr(logSC, deviceLogs)
 	}
 }
@@ -1112,9 +1132,9 @@ func (s *LogicalLog) CheckDeviceId(request request.AddLogRequest) {
 		b, deviceLog := s.CheckDeviceIdErr(request.ScriptDeviceId, request.LogUuid, request.GameId)
 		// 有异常处理
 		if b && len(deviceLog) >= 3 {
-			s.AddScriptDeviceErr(request.GameId, request.Account, request.ScriptDeviceId, request.ScriptDeviceId, deviceLog[0].Account, deviceLog[0].GameId, 2, request.PcCode, request.Operator)
-			//ct := fmt.Sprintf("<font color=\"warning\">%s:%d, 相同设备id</font>", request.PcCode, request.GameId)
-			//s.SendDeviceMsg(ct, request.Operator)
+			s.AddScriptDeviceErr(request.GameId, request.Account, request.ScriptDeviceId, request.ScriptDeviceId, deviceLog[1].Account, deviceLog[1].GameId, 2, request.PcCode, request.Operator)
+			ct := fmt.Sprintf("<font color=\"warning\">%s:%d, 相同设备id</font>", request.PcCode, request.GameId)
+			s.SendDeviceMsg(ct, request.Operator)
 		}
 		s.AddAccount(request, device)
 		return
@@ -1134,8 +1154,10 @@ func (s *LogicalLog) CheckDeviceId(request request.AddLogRequest) {
 	}
 	if gameAccount.ScriptDeviceId != request.ScriptDeviceId {
 		s.AddScriptDeviceErr(request.GameId, request.Account, gameAccount.ScriptDeviceId, request.ScriptDeviceId, gameAccount.Account, gameAccount.GameId, 1, request.PcCode, request.Operator)
-		//ct := fmt.Sprintf("<font color=\"warning\">%s:%d, 设备id出现不同</font>", request.PcCode, request.GameId)
-		//s.SendDeviceMsg(ct, request.Operator)
+		if request.GameId != 5001 {
+			ct := fmt.Sprintf("<font color=\"warning\">%s:%d, 设备id出现不同</font>", request.PcCode, request.GameId)
+			s.SendDeviceMsg(ct, request.Operator)
+		}
 		gameAccount.ScriptDeviceId = request.ScriptDeviceId
 	}
 	if device.ErrStatus == 3 || gameAccount.DeviceHex == "" {
@@ -1151,10 +1173,14 @@ func (s *LogicalLog) CheckDeviceId(request request.AddLogRequest) {
 			gameAccount.DeviceHex = device.DeviceHex
 		}
 	}
-	gameAccount.UseNum += 1
+	//gameAccount.UseNum += 1
 	global.GVA_DB.Save(&gameAccount)
 }
 
+func (s *LogicalLog) GameUseNumChange(gameId int, account string) {
+	global.GVA_DB.Model(&log.GameAccount{}).Where("game_id = ?", gameId).Where("account = ?", account).Update("use_num", gorm.Expr("use_num + ?", 1))
+}
+
 func (s *LogicalLog) SendDeviceMsg(content string, operator string) {
 	c := "# 设备异常"
 	c += "\n"
@@ -1237,3 +1263,67 @@ func (s *LogicalLog) AddDeviceErrLog(request request.AddLogRequest, st uint) {
 	}
 	global.GVA_REDIS.Set(ctx, key, 1, time.Hour)
 }
+
+func (s *LogicalLog) AddSealIpLog(request request.AddLogRequest) {
+	if request.GameId != 5001 {
+		return
+	}
+	var ipLog log.IpLog
+	err := global.GVA_DB.Where("create_date = ?", s.CurrentDate()).Where("log_uuid = ?", request.LogUuid).First(&ipLog).Error
+	if err != nil || ipLog.Ip == "" {
+		return
+	}
+	logSC := new(log.SealIpLog)
+	logSC.GameId = ipLog.GameId
+	logSC.LogUuid = ipLog.LogUuid
+	logSC.Ip = ipLog.Ip
+	logSC.Account = ipLog.Account
+	logSC.PcCode = ipLog.PcCode
+	logSC.CreateDate = time.Now().Format("2006-01-02")
+	err = global.GVA_DB.Omit("create_time").Create(&logSC).Error
+	if err != nil {
+		global.GVA_LOG.Error("create SealIpLog fail", zap.Error(err))
+		return
+	}
+	var ipLib log.IpLib
+	result := global.GVA_DB.Where("game_id = ?", ipLog.GameId).Where("ip = ?", ipLog.Account).First(&ipLib)
+	if result.Error != nil {
+		if result.Error == gorm.ErrRecordNotFound {
+			// 数据不存在,执行创建操作
+			ipLib.AddIpLog(ipLog.GameId, ipLog.Ip, 2)
+			return
+		} else {
+			// 其他错误
+			global.GVA_LOG.Error("Add ipLog fail", zap.Error(result.Error))
+			return
+		}
+	}
+	ipLib.Status = 2
+	global.GVA_DB.Omit("update_time").Save(&ipLib)
+}
+
+func (s *LogicalLog) AddIpLib(request request.AddLogRequest) {
+	if request.GameId != 5001 {
+		return
+	}
+	var ipLog log.IpLog
+	err := global.GVA_DB.Where("create_date = ?", s.CurrentDate()).Where("log_uuid = ?", request.LogUuid).First(&ipLog).Error
+	if err != nil || ipLog.Ip == "" {
+		return
+	}
+	var ipLib log.IpLib
+	result := global.GVA_DB.Where("game_id = ?", ipLog.GameId).Where("ip = ?", ipLog.Account).First(&ipLib)
+	if result.Error != nil {
+		if result.Error == gorm.ErrRecordNotFound {
+			// 数据不存在,执行创建操作
+			ipLib.AddIpLog(ipLog.GameId, ipLog.Ip, 1)
+			return
+		} else {
+			// 其他错误
+			global.GVA_LOG.Error("Add ipLog fail", zap.Error(result.Error))
+			return
+		}
+	}
+	ipLib.Status = 1
+	global.GVA_DB.Omit("update_time").Save(&ipLib)
+}

+ 1 - 0
service/log/loging/login_log.go

@@ -33,6 +33,7 @@ func (s *LoginLog) SuccessLog(ctx context.Context, request request.AddLogRequest
 	}
 	if code[:5] == "46050" {
 		s.logical.UpdateIpLogStatus(s.logical.Request.LogUuid, s.logical.CurrentDate())
+		go s.logical.GameUseNumChange(s.logical.Request.GameId, s.logical.Request.Account)
 	}
 	err = s.logical.PartTypeLogSetNum(ctx, s.logical.CurrentDate(), s.logical.Request.GameId, code, OkStatus, s.logical.Request.TaskType)
 	if err != nil {

+ 2 - 2
service/system/sys_robot.go

@@ -120,7 +120,7 @@ func (robotService *RobotService) RequestJfDevicesState(rack int) (result []byte
 
 // RequestJfXmyNewAccount 获取机房小绵羊新号剩余
 func (robotService *RobotService) RequestJfXmyNewAccount() (result []byte, err error) {
-	jfUrl := "http://xjf.lianyou.fun:8099/v1/account/get_left_smallsheep_account"
+	jfUrl := global.GVA_CONFIG.ExtranetDomain.Control + "/v1/account/get_left_smallsheep_account"
 	jfParams := map[string]string{}
 	result, err = utils.HttpGet(jfUrl, jfParams)
 	return
@@ -178,7 +178,7 @@ func (robotService *RobotService) SyncIPMessage() {
 	//if len(abnormalTodayIpList) != 0
 	//将租机编号添加至消息体
 	for k, v := range abnormalTodayIpList {
-		ipMsgData[v] += fmt.Sprintf("<font color=\"warning\">%s</font>", k ) + "\n"
+		ipMsgData[v] += fmt.Sprintf("<font color=\"warning\">%s</font>", k) + "\n"
 		//if k != len(abnormalTodayIpList) - 1 {
 		//	ipMsgData[v.User] +=  "\n"
 		//}

+ 7 - 8
service/task/central_control_conf.go

@@ -10,7 +10,6 @@ import (
 )
 
 type CentralControlService struct {
-
 }
 
 //创建配置记录
@@ -27,7 +26,7 @@ func (s *CentralControlService) CreateCentralControlConf(conf task.CentralContro
 }
 
 //删除中控配置记录
-func (s *CentralControlService) DeleteCentralControlConf(conf task.CentralControlConf) (err error)  {
+func (s *CentralControlService) DeleteCentralControlConf(conf task.CentralControlConf) (err error) {
 	var entity task.CentralControlConf
 	err = global.GVA_DB.Model(&task.CentralControlConf{}).Where("id", conf.Id).First(&entity).Error
 	if errors.Is(err, gorm.ErrRecordNotFound) {
@@ -59,7 +58,7 @@ func (s *CentralControlService) GetCentralControlConfById(id int) (conf task.Cen
 }
 
 //获取配置列表
-func (s *CentralControlService) GetCentralControlConfList(conf task.CentralControlConf, info request.PageInfo, order string, desc bool) (list interface{}, total int64, err error){
+func (s *CentralControlService) GetCentralControlConfList(conf task.CentralControlConfList, info request.PageInfo, order string, desc bool) (list interface{}, total int64, err error) {
 	//获取limit和offset
 	limit := info.PageSize
 	offset := (info.Page - 1) * info.PageSize
@@ -73,16 +72,16 @@ func (s *CentralControlService) GetCentralControlConfList(conf task.CentralContr
 	}
 
 	err = db.Count(&total).Error
-	if err != nil{
+	if err != nil {
 		//如果出错直接返回
 		return confList, total, err
 	} else {
 		//先分页再排序
 		db = db.Limit(limit).Offset(offset)
-		if order != ""{
+		if order != "" {
 			//传入排序字段,进行排序
 			//定义orderStr存储完整的排序字段
-			var  orderStr string
+			var orderStr string
 			//为了避免sql注入,自己创建数组匹配
 			orderMap := make(map[string]bool, 3)
 			orderMap["task_id"] = true
@@ -111,11 +110,11 @@ func (s *CentralControlService) GetCentralControlConfList(conf task.CentralContr
 }
 
 //获取云配置列表
-func (s *CentralControlService) GetCloudConfList() (dataList []task.CentralControlTaskConf, err error)  {
+func (s *CentralControlService) GetCloudConfList() (dataList []task.CentralControlTaskConf, err error) {
 	//获取所有的中控配置列表
 	db := global.GVA_DB.Model(&task.CentralControlConf{})
 	db = db.Select("central_control_conf.*,game_task.task_name").Joins("left join game_task on central_control_conf.task_id = game_task.task_id")
 	err = db.Find(&dataList).Error
 	//err = global.GVA_DB.Model(&task.CentralControlConf{}).Find(&dataList).Error
 	return
-}
+}

+ 46 - 2
service/task/common.go

@@ -61,7 +61,7 @@ func (s *Common) SaveGameAddFee(num, target int, taskName string) {
 }
 
 // 加付费通知
-func (s *Common) FreeSendMsg(num, target, taskId int, taskName, director string) {
+func (s *Common) FreeSendMsg(num, target, taskId int, taskName, director string, payComplete int) {
 	taskConf, err := s.TConf.GetTaskConfByTaskId(taskId)
 	if err != nil {
 		global.GVA_LOG.Error("FreeSendMsg获取任务配置失败"+director, zap.Error(err))
@@ -85,10 +85,54 @@ func (s *Common) FreeSendMsg(num, target, taskId int, taskName, director string)
 	personMsg += fmt.Sprintf("<font color=\"warning\">%s</font>", time.Now().Format("2006-01-02 15:04:05"))
 	personMsg += "\n"
 	personMsg += taskName
-	personMsg += fmt.Sprintf("<font color=\"warning\"> 加付费 %d, 当前付费目标 %d</font>", num, target)
+	personMsg += fmt.Sprintf("<font color=\"warning\"> 加付费 %d, 当前付费目标 %d, 当前剩余付费 %d</font>", num, target, target-payComplete)
 	url := person.Url
 	var sendData SendMsg
 	sendData.MsgType = "markdown"
 	sendData.Markdown.Content = personMsg
 	s.SendMsgData(url, sendData)
 }
+
+func (s *Common) PaymentRatioErrSendMsg(paymentRatio map[string]string) {
+	if len(paymentRatio) <= 0 {
+		return
+	}
+	hour := time.Now().Hour()
+	if hour < 8 {
+		return
+	}
+	var groupMobile []string
+	groupMsg := "# 付费比例异常"
+	groupMsg += fmt.Sprintf("<font color=\"warning\">%s</font>", time.Now().Format("2006-01-02 15:04:05"))
+	groupMsg += "\n"
+	for director, msg := range paymentRatio {
+		person, err := s.Person.GetUserInfoByName(director)
+		if err != nil {
+			global.GVA_LOG.Error("PaymentRatioErrSendMsg获取用户数据失败"+director, zap.Error(err))
+		}
+		personMsg := "# 付费比例异常"
+		personMsg += fmt.Sprintf("<font color=\"warning\">%s</font>", time.Now().Format("2006-01-02 15:04:05"))
+		personMsg += "\n"
+		personMsg += msg
+		groupMsg += "**" + director + "**"
+		groupMsg += "\n"
+		groupMsg += msg
+		url := person.Url
+		var sendData SendMsg
+		sendData.MsgType = "markdown"
+		sendData.Markdown.Content = personMsg
+		s.SendMsgData(url, sendData)
+		groupMobile = append(groupMobile, person.MobilePhoneNumber)
+	}
+	url := global.GVA_CONFIG.SendUrl.ComputerSendUrl
+	var sendData SendMsg
+	sendData.MsgType = "markdown"
+	sendData.Markdown.Content = groupMsg
+	s.SendMsgData(url, sendData)
+	if len(groupMobile) != 0 {
+		var sendTextData SendTextMsg
+		sendTextData.MsgType = "text"
+		sendTextData.Text.MentionedMobileList = groupMobile
+		s.SendMsgData(url, sendTextData)
+	}
+}

+ 193 - 2
service/task/game_task.go

@@ -10,6 +10,7 @@ import (
 	"gorm.io/gorm"
 	"io/ioutil"
 	"log-server/global"
+	"log-server/model/log"
 	"log-server/model/task"
 	"log-server/model/task/control"
 	"log-server/model/task/request"
@@ -350,7 +351,7 @@ func (apiService *GameTask) GetUsedGameTaskInfoList(api task.GameTask, info requ
 	offset := info.PageSize * (info.Page - 1)
 	db := global.GVA_DB.Model(&task.GameTask{})
 	var apiList []task.GameTaskUnion
-	db = db.Select("game_task.*, task_conf.add_fee_notice, task_conf.simulator_type")
+	db = db.Select("game_task.*, task_conf.add_fee_notice, task_conf.simulator_type, task_conf.push_pay_ratio")
 	db = db.Joins("left join task_conf on task_conf.task_id = game_task.task_id")
 	db = db.Where("is_del = ?", -1)
 	if api.TaskName != "" {
@@ -433,6 +434,7 @@ func (apiService *GameTask) GetUsedGameTaskInfoList(api task.GameTask, info requ
 			apiReply.RetainedTargetH = apiInfo.RetainedTargetH
 			apiReply.NewTargetH = apiInfo.NewTargetH
 			apiReply.StopTime = apiInfo.StopTime.Format("2006-01-02 15:04:05")
+			apiReply.PushPayRatio = apiInfo.PushPayRatio
 			if apiInfo.Status == 1 {
 				apiReply.StopTime = ""
 			}
@@ -908,7 +910,7 @@ func (s *GameTask) UpdateGameTaskTarget(requestData request.UpdateGameTaskTarget
 				n, _ := s.cache.GetCacheNum(context.Background(), payErrAddNumKey)
 				_ = s.cache.SetCacheStr(context.Background(), payErrAddNumKey, requestData.PayTarget-gameTask.PayTarget+n)
 			}
-			go s.common.FreeSendMsg(requestData.PayTarget-gameTask.PayTarget, requestData.PayTarget, taskData.TaskId, taskData.TaskName, taskData.User)
+			//go s.common.FreeSendMsg(requestData.PayTarget-gameTask.PayTarget, requestData.PayTarget, taskData.TaskId, taskData.TaskName, taskData.User)
 			//msg := "# 监控报警 " + time.Now().Format("2006-01-02 15:04:05")
 			//msg += "\n"
 			//msg += "**" + taskData.User + "**"
@@ -1263,3 +1265,192 @@ func (apiService *GameTask) TemporaryTask(ctx context.Context, pcCode string) (t
 	}
 	return temporaryConf, err
 }
+
+func (apiService *GameTask) GetSheepPay(ctx context.Context, money int, gameId string, payTime string) {
+	//formatTime, _ := time.Parse("2006-01-02 15:04:05", payTime)
+	//payDate := formatTime.Format("2006-01-02")
+	var sheepPay task.SheepPay
+	sheepPay.PayDate = payTime
+	sheepPay.PayTime = time.Now().Format("2006-01-02 15:04:05")
+	sheepPay.Money = money
+	sheepPay.GameId = gameId
+	err := global.GVA_DB.Create(&sheepPay).Error
+	if err != nil {
+		global.GVA_LOG.Error("保存SheepPay错误", zap.Error(err))
+	}
+}
+
+func (apiService *GameTask) UpdateRetentionRatio(ctx context.Context, ratioRequest request.RetentionRatioRequest) (err error) {
+	if ratioRequest.GameId == 0 {
+		return errors.New("参数错误")
+	}
+	var entity task.GameTask
+	err = global.GVA_DB.Where("task_id = ?", ratioRequest.GameId).First(&entity).Error
+	if errors.Is(err, gorm.ErrRecordNotFound) {
+		return
+	}
+	url := global.GVA_CONFIG.ExtranetDomain.Control + "/v1/task_statistics/retained/" + strconv.Itoa(ratioRequest.GameId)
+	data, code, err := utils.HttpPutReplyCode(url, ratioRequest)
+	fmt.Println(code)
+	if code != 200 {
+		return err
+	}
+	fmt.Println(string(data))
+	if string(data) != "\"OK\"" {
+		return errors.New("更新失败")
+	}
+	return
+}
+
+func (apiService *GameTask) GetRetentionRatio(ctx context.Context, ratioRequest request.GetRetentionRatioRequest) (gameRatio task.GameRetentionRatio, err error) {
+	//http://xjf.lianyou.fun:8099/v1/task_statistics/retained/1000961
+	if ratioRequest.GameID == 0 {
+		err = errors.New("参数错误")
+	}
+	url := global.GVA_CONFIG.ExtranetDomain.Control + "/v1/task_statistics/retained/" + strconv.Itoa(ratioRequest.GameID)
+	data, code, err := utils.HttpGetReplyCode(url, nil)
+	fmt.Println(code)
+	if code != 200 {
+		return gameRatio, errors.New(string(data))
+	}
+	err = json.Unmarshal(data, &gameRatio)
+	return
+}
+
+func (apiService *GameTask) UploadGameCharacter(ctx context.Context, rqet request.UploadGameCharacterRequest) (err error) {
+	if rqet.Character == "" || rqet.GameId == 0 || rqet.Account == "" {
+		return errors.New("参数错误")
+	}
+	var entity log.GameCharacter
+	res := global.GVA_DB.Where("game_id = ? and account = ? and `character` = ?", rqet.GameId, rqet.Account, rqet.Character).First(&entity)
+	if res.Error != nil {
+		if res.Error == gorm.ErrRecordNotFound {
+			entity.Character = rqet.Character
+			entity.GameId = rqet.GameId
+			entity.Account = rqet.Account
+			global.GVA_DB.Save(&entity)
+			key := fmt.Sprintf("%d:%s:%s", rqet.GameId, rqet.Account, rqet.Character)
+			apiService.SetGameCharacter(ctx, key, entity)
+		}
+	}
+	return
+}
+
+func (apiService *GameTask) UploadGameCharacter1(ctx context.Context, rqet request.UploadGameCharacterRequest) (err error) {
+	if rqet.Character == "" || rqet.GameId == 0 || rqet.Account == "" {
+		return errors.New("参数错误")
+	}
+	if !apiService.GetGameCharacter(ctx, rqet) {
+		var entity log.GameCharacter
+		entity.Character = rqet.Character
+		entity.GameId = rqet.GameId
+		entity.Account = rqet.Account
+		global.GVA_DB.Save(&entity)
+		key := fmt.Sprintf("%d:%s:%s", rqet.GameId, rqet.Account, rqet.Character)
+		apiService.SetGameCharacter(ctx, key, entity)
+	}
+	return
+}
+
+func (apiService *GameTask) SetGameCharacter(ctx context.Context, key string, entity log.GameCharacter) {
+
+}
+
+func (apiService *GameTask) GetGameCharacter(ctx context.Context, rqet request.UploadGameCharacterRequest) (bl bool) {
+	return
+}
+
+func (s *GameTask) PushCompleteTaskData(date string) {
+	s.PushTaskToYl(date)
+}
+
+func (s *GameTask) PushTaskToYl(date string) {
+	global.GVA_LOG.Warn("推送任务导api.yilian.run")
+	var apiList []response.GetGameTargetComplete
+	db := global.GVA_DB.Table("game_target_complete gtc")
+	db = db.Select("gtc.id,gtc.task_id,gt.task_name,gt.game_id_xmy,gtc.new_target,gt.login_method,gt.user,gtc.pay_target,gtc.retained_target," +
+		"gtc.new_complete,gtc.pay_complete,gtc.retained_complete,gtc.create_date,gtc.amount,gtc.game_rate,gtc.is_complete,gtc.hand_new_complete," +
+		"gtc.hand_retained_complete,gtc.hand_pay_complete,gtc.hand_amount_total,gtc.aupr, gtc.total_amount")
+	db = db.Joins("left join game_task gt on gt.task_id = gtc.task_id")
+	db = db.Where("gtc.task_id not in(?)", []int{1000770})
+	db = db.Where("create_date = ?", date)
+
+	err := db.Find(&apiList).Error
+	if err != nil {
+		global.GVA_LOG.Error("GameTaskTargetInfoPush select fail", zap.Error(err))
+		return
+	}
+
+	if len(apiList) < 1 {
+		global.GVA_LOG.Warn("GameTaskTargetInfoPush select not data")
+		return
+	}
+	var infos []request.GetGameTargetCompleteInfo
+	for _, api := range apiList {
+		var info request.GetGameTargetCompleteInfo
+		info.GameId = api.TaskId
+		info.GameName = api.TaskName
+		info.PayComplete = api.PayComplete + api.HandPayComplete
+		info.PayTarget = api.PayTarget
+		info.NewComplete = api.NewComplete + api.HandNewComplete
+		info.NewTarget = api.NewTarget
+		info.RetainedComplete = api.RetainedComplete + api.HandRetainedComplete
+		info.RetainedTarget = api.RetainedTarget
+		info.IsComplete = api.IsComplete
+		if api.IsComplete == -1 {
+			info.IsComplete = 0
+		}
+		info.Username = api.User
+		info.TheDate = api.CreateDate
+		infos = append(infos, info)
+	}
+	if len(infos) < 1 {
+		global.GVA_LOG.Warn("推送任务数据同步识别 GameTaskTargetInfoPush")
+		return
+	}
+	_, err = s.RequestControlBackend(infos)
+	if err != nil {
+		global.GVA_LOG.Error("推送任务数据同步识别", zap.Error(err))
+	}
+	return
+}
+
+func (s *GameTask) RequestControlBackend(requestData []request.GetGameTargetCompleteInfo) (d string, err error) {
+	//url := global.GVA_CONFIG.ExtranetDomain.Control + CreateTaskUrl
+	url := global.GVA_CONFIG.ExtranetDomain.YlControl + "/bpm_api/data_optimize"
+	requestMap := map[string]interface{}{
+		"jsonData": requestData,
+	}
+	data, code, err := utils.HttpPostReplyCode2(url, requestMap)
+	if err != nil {
+		global.GVA_LOG.Error("RequestControlBackend fail", zap.Error(err))
+	}
+	if code != 200 {
+		msg := fmt.Sprintf("status:%d,data:%s", code, string(data))
+		global.GVA_LOG.Warn(msg)
+		return string(data), errors.New(string(data))
+	}
+	msg := fmt.Sprintf("status:%d,data:%s", code, string(data))
+	global.GVA_LOG.Warn(msg)
+	return
+}
+
+func (s *GameTask) GetWindowTask(pcCode string, id int) (list interface{}, d string, err error) {
+	//url := global.GVA_CONFIG.ExtranetDomain.Control + CreateTaskUrl
+	//url := global.GVA_CONFIG.ExtranetDomain.YlControl + "/bpm_api/data_optimize"
+	//requestMap := map[string]interface{}{
+	//	"jsonData": requestData,
+	//}
+	//data, code, err := utils.HttpPostReplyCode2(url, requestMap)
+	//if err != nil {
+	//	global.GVA_LOG.Error("RequestControlBackend fail", zap.Error(err))
+	//}
+	//if code != 200 {
+	//	msg := fmt.Sprintf("status:%d,data:%s", code, string(data))
+	//	global.GVA_LOG.Warn(msg)
+	//	return string(data), errors.New(string(data))
+	//}
+	//msg := fmt.Sprintf("status:%d,data:%s", code, string(data))
+	//global.GVA_LOG.Warn(msg)
+	return
+}

+ 227 - 6
service/task/sync_data.go

@@ -145,6 +145,33 @@ func (s *SyncData) EveryDaySyncTaskData() {
 	return
 }
 
+func (s *SyncData) CurrDaySyncTaskData() {
+	db := global.GVA_DB.Model(&task.GameTask{})
+	var apiList []task.GameTask
+	db = db.Where("is_del = ?", -1)
+	db = db.Where("status = ?", 1)
+	err := db.Order("id desc").Find(&apiList).Error
+	if err != nil {
+		global.GVA_LOG.Error("EveryDaySyncTaskData fail", zap.Error(err))
+		return
+	}
+	date := time.Now()
+	var gameTargetCompletes []*task.GameTargetComplete
+	for _, gameTask := range apiList {
+		if !errors.Is(global.GVA_DB.Where("task_id = ?", gameTask.TaskId).Where("create_date = ?", date).First(&task.GameTargetComplete{}).Error, gorm.ErrRecordNotFound) {
+			continue
+		}
+		gameTargetComplete := s.GameTask.CreateGameTargetCompleteModel(gameTask, date)
+		gameTargetCompletes = append(gameTargetCompletes, gameTargetComplete)
+	}
+	err = global.GVA_DB.Model(&task.GameTargetComplete{}).Omit("update_time", "game_rate", "is_complete").Create(gameTargetCompletes).Error
+	if err != nil {
+		global.GVA_LOG.Error("create GameTargetComplete fail", zap.Error(err))
+		return
+	}
+	return
+}
+
 // 定时同步机房群控、小绵羊数据
 func (s *SyncData) SyncTaskData() {
 	db := global.GVA_DB.Model(&task.GameTask{})
@@ -171,11 +198,178 @@ func (s *SyncData) SyncTaskData() {
 		global.GVA_LOG.Error("CompleteTaskData get data fail", zap.Error(err))
 		return
 	}
-	wslData, err := s.SyncWslGameData(date)
+	//wslData, err := s.SyncWslGameData(date)
+	//if err != nil {
+	//	global.GVA_LOG.Error("SyncWslGameData get wsl data fail", zap.Error(err))
+	//	//return
+	//}
+	paymentRatio := make(map[string]string)
+	for _, gameTask := range apiList {
+		//var gameTargetComplete task.GameTargetComplete
+		//global.GVA_DB.Where("task_id = ?", gameTask.TaskId).Where("create_date = ?", date).First(&gameTargetComplete)
+		var gameTarget task.GameTargetComplete
+		roomData, _ := s.SyncRoomData(date, gameTask.TaskId)
+
+		if gameTask.GameIdXmy != "" {
+			gameIdXmy, _ := strconv.Atoi(gameTask.GameIdXmy)
+			xmyGameInfo := xmyGameData[gameIdXmy]
+			gameTarget.NewComplete, _ = strconv.Atoi(xmyGameInfo.UserNum)
+			gameTarget.PayComplete, _ = strconv.Atoi(xmyGameInfo.Cnt)
+			gameTarget.RetainedComplete, _ = strconv.Atoi(xmyGameInfo.ActiveUserNum)
+			f, _ := strconv.ParseFloat(xmyGameInfo.Amount, 64)
+			gameTarget.Amount = int(f)
+			num, _ := s.SyncXmyFreeData(date, gameIdXmy)
+			if num != 0 {
+				gameTarget.PayTarget = num
+				if gameTarget.PayTarget > completeTaskData[gameTask.TaskId].PayTarget {
+					lastPayAddUpdateTimeKey := fmt.Sprintf(LastPayAddUpdateTimeKey, date, gameTask.TaskId)
+					_ = s.cache.SetCacheStr(context.Background(), lastPayAddUpdateTimeKey, time.Now().Unix())
+					// 本次加付费目标数据
+					lastPayAddNumKey := fmt.Sprintf(LastPayAddNumKey, date, gameTask.TaskId)
+					_ = s.cache.SetCacheStr(context.Background(), lastPayAddNumKey, gameTarget.PayTarget-completeTaskData[gameTask.TaskId].PayTarget)
+					payErrAddNumKey := fmt.Sprintf(PayErrAddNumKey, date, gameTask.TaskId)
+					diffNum := gameTarget.PayTarget - completeTaskData[gameTask.TaskId].PayTarget
+					s.common.SaveGameAddFee(diffNum, gameTarget.PayTarget, gameTask.TaskName)
+					go s.common.FreeSendMsg(diffNum, gameTarget.PayTarget, gameTask.TaskId, gameTask.TaskName, gameTask.User, gameTarget.PayComplete)
+					paymentRatio = s.DetectionPaymentRatio(gameTask.TaskName, gameTask.TaskId, gameTask.User, gameTarget.PayTarget, roomData.RetainedTarget, paymentRatio)
+					// 如果当前付费目标完成,加入一下逻辑
+					if completeTaskData[gameTask.TaskId].PayTarget <= completeTaskData[gameTask.TaskId].PayComplete {
+						lastPayCompletedUpdateTimeKey := fmt.Sprintf(LastPayCompletedUpdateTimeKey, date, gameTask.TaskId)
+						_ = s.cache.SetCacheStr(context.Background(), lastPayCompletedUpdateTimeKey, time.Now().Unix())
+						_ = s.cache.SetCacheStr(context.Background(), payErrAddNumKey, gameTarget.PayTarget-completeTaskData[gameTask.TaskId].PayTarget)
+					} else {
+						n, _ := s.cache.GetCacheNum(context.Background(), payErrAddNumKey)
+						_ = s.cache.SetCacheStr(context.Background(), payErrAddNumKey, gameTarget.PayTarget-completeTaskData[gameTask.TaskId].PayTarget+n)
+					}
+				}
+			}
+
+		} else {
+			gameTarget.NewComplete = roomData.NewCompleteLocal
+			gameTarget.PayComplete = roomData.PayCompleteLocal
+			gameTarget.RetainedComplete = roomData.NewCompleteLocal + roomData.RetainedCompleteLocal
+			gameTarget.Amount = gameTask.PayPrice * roomData.PayCompleteLocal
+			if gameTarget.RetainedComplete < roomData.RetainedComplete {
+				gameTarget.RetainedComplete = roomData.RetainedComplete
+			}
+		}
+		gameTarget.GameRate = roomData.GameRate
+		if (gameTask.GamePortId == 5 && gameTask.LoginMethod == 2) || gameTask.LoginMethod == 7 || gameTask.LoginMethod == 9 {
+			// 魅族游戏id处理
+			GameId := gameTask.MzGameId + "-" + gameTask.MzChannel
+			// 青雀账号游戏id处理
+			if gameTask.LoginMethod == 7 {
+				taskId := strconv.Itoa(gameTask.TaskId)
+				GameId = "rose-" + taskId
+				gameTarget.PayComplete = roomData.PayComplete
+			}
+			// 酷云账号游戏id处理
+			if gameTask.LoginMethod == 9 {
+				taskId := strconv.Itoa(gameTask.TaskId)
+				GameId = "coolyun-" + taskId
+				gameTarget.PayComplete = roomData.PayComplete
+			}
+			b, sheepPay := s.SelectSheepPay(date, GameId)
+			if b {
+				gameTarget.PayTarget = sheepPay.Money
+				if gameTarget.PayTarget > completeTaskData[gameTask.TaskId].PayTarget {
+					lastPayAddUpdateTimeKey := fmt.Sprintf(LastPayAddUpdateTimeKey, date, gameTask.TaskId)
+					_ = s.cache.SetCacheStr(context.Background(), lastPayAddUpdateTimeKey, time.Now().Unix())
+					// 本次加付费目标数据
+					lastPayAddNumKey := fmt.Sprintf(LastPayAddNumKey, date, gameTask.TaskId)
+					_ = s.cache.SetCacheStr(context.Background(), lastPayAddNumKey, gameTarget.PayTarget-completeTaskData[gameTask.TaskId].PayTarget)
+					payErrAddNumKey := fmt.Sprintf(PayErrAddNumKey, date, gameTask.TaskId)
+					diffNum := gameTarget.PayTarget - completeTaskData[gameTask.TaskId].PayTarget
+					s.common.SaveGameAddFee(diffNum, gameTarget.PayTarget, gameTask.TaskName)
+					go s.common.FreeSendMsg(diffNum, gameTarget.PayTarget, gameTask.TaskId, gameTask.TaskName, gameTask.User, gameTarget.PayComplete)
+					paymentRatio = s.DetectionPaymentRatio(gameTask.TaskName, gameTask.TaskId, gameTask.User, gameTarget.PayTarget, roomData.RetainedTarget, paymentRatio)
+					// 如果当前付费目标完成,加入一下逻辑
+					if completeTaskData[gameTask.TaskId].PayTarget <= completeTaskData[gameTask.TaskId].PayComplete {
+						lastPayCompletedUpdateTimeKey := fmt.Sprintf(LastPayCompletedUpdateTimeKey, date, gameTask.TaskId)
+						_ = s.cache.SetCacheStr(context.Background(), lastPayCompletedUpdateTimeKey, time.Now().Unix())
+						_ = s.cache.SetCacheStr(context.Background(), payErrAddNumKey, gameTarget.PayTarget-completeTaskData[gameTask.TaskId].PayTarget)
+					} else {
+						n, _ := s.cache.GetCacheNum(context.Background(), payErrAddNumKey)
+						_ = s.cache.SetCacheStr(context.Background(), payErrAddNumKey, gameTarget.PayTarget-completeTaskData[gameTask.TaskId].PayTarget+n)
+					}
+				}
+			}
+		}
+		gameTarget.IsComplete = -1
+		if gameTarget.RetainedComplete+completeTaskData[gameTask.TaskId].HandRetainedComplete >= completeTaskData[gameTask.TaskId].RetainedTarget && gameTarget.PayComplete >= completeTaskData[gameTask.TaskId].PayTarget && gameTarget.NewComplete+completeTaskData[gameTask.TaskId].HandNewComplete >= completeTaskData[gameTask.TaskId].NewTarget {
+			gameTarget.IsComplete = 1
+		}
+		//if completeTaskData[gameTask.TaskId].RetainedTarget == 0 || completeTaskData[gameTask.TaskId].RetainedTarget == 1 {
+		//	gameTarget.RetainedTarget = roomData.RetainedTarget
+		//}
+		global.GVA_DB.Model(&task.GameTargetComplete{}).Where("task_id = ?", gameTask.TaskId).Where("create_date = ?", date).Omit("create_date", "update_time", "task_id").Updates(gameTarget)
+	}
+	go s.common.PaymentRatioErrSendMsg(paymentRatio)
+	return
+}
+
+// 检测付费比例
+func (s *SyncData) DetectionPaymentRatio(taskName string, taskId int, user string, payTarget, retainedTarget int, paymentRatio map[string]string) map[string]string {
+	var tConf task.TaskConf
+	taskConf, err := tConf.GetTaskConfByTaskId(taskId)
+	if err != nil {
+		global.GVA_LOG.Error("DetectionPaymentRatio获取任务配置失败"+user, zap.Error(err))
+		return paymentRatio
+	}
+	if taskConf.PushPayRatio != 1 {
+		return paymentRatio
+	}
+
+	ratio := float64(payTarget) / float64(retainedTarget) * 100
+
+	global.GVA_LOG.Warn(fmt.Sprintf("%s付费率%2f,payTarget%d,retainedTarget%d", taskName, ratio, payTarget, paymentRatio))
+	if ratio >= 20 {
+		paymentRatio[user] += fmt.Sprintf("<font color=\"warning\"> %s</font>", taskName)
+		paymentRatio[user] += "\n"
+	}
+	return paymentRatio
+}
+
+func (s *SyncData) SelectSheepPay(date string, gameId string) (b bool, sheepPay task.SheepPay) {
+	b = false
+	global.GVA_DB.Model(&task.SheepPay{}).Where("pay_date = ?", date).Where("game_id = ?", gameId).Order("id desc").Find(&sheepPay)
+	if sheepPay.Id != 0 {
+		b = true
+	}
+	return
+}
+
+// 定时同步机房群控、小绵羊数据
+func (s *SyncData) YesterdaySyncTaskData() {
+	db := global.GVA_DB.Model(&task.GameTask{})
+	var apiList []task.GameTask
+	db = db.Where("is_del = ?", -1)
+	db = db.Where("status = ?", 1)
+	err := db.Order("id desc").Find(&apiList).Error
 	if err != nil {
-		global.GVA_LOG.Error("SyncWslGameData get wsl data fail", zap.Error(err))
+		global.GVA_LOG.Error("EveryDaySyncTaskData fail", zap.Error(err))
+		return
+	}
+	if len(apiList) == 0 {
+		global.GVA_LOG.Info("没有任务数据")
 		return
 	}
+	date := time.Now().Add(-time.Hour * 24).Format("2006-01-02")
+	xmyGameData, err := s.SyncXmyGameData(date)
+	if err != nil {
+		global.GVA_LOG.Error("SyncTaskData get xmy data fail", zap.Error(err))
+		return
+	}
+	completeTaskData, err := s.CompleteTaskData(date)
+	if err != nil {
+		global.GVA_LOG.Error("CompleteTaskData get data fail", zap.Error(err))
+		return
+	}
+	//wslData, err := s.SyncWslGameData(date)
+	//if err != nil {
+	//	global.GVA_LOG.Error("SyncWslGameData get wsl data fail", zap.Error(err))
+	//	return
+	//}
 	for _, gameTask := range apiList {
 		var gameTarget task.GameTargetComplete
 		roomData, _ := s.SyncRoomData(date, gameTask.TaskId)
@@ -200,7 +394,7 @@ func (s *SyncData) SyncTaskData() {
 					payErrAddNumKey := fmt.Sprintf(PayErrAddNumKey, date, gameTask.TaskId)
 					diffNum := gameTarget.PayTarget - completeTaskData[gameTask.TaskId].PayTarget
 					s.common.SaveGameAddFee(diffNum, gameTarget.PayTarget, gameTask.TaskName)
-					go s.common.FreeSendMsg(diffNum, gameTarget.PayTarget, gameTask.TaskId, gameTask.TaskName, gameTask.User)
+					//go s.common.FreeSendMsg(diffNum, gameTarget.PayTarget, gameTask.TaskId, gameTask.TaskName, gameTask.User)
 					// 如果当前付费目标完成,加入一下逻辑
 					if completeTaskData[gameTask.TaskId].PayTarget <= completeTaskData[gameTask.TaskId].PayComplete {
 						lastPayCompletedUpdateTimeKey := fmt.Sprintf(LastPayCompletedUpdateTimeKey, date, gameTask.TaskId)
@@ -232,8 +426,9 @@ func (s *SyncData) SyncTaskData() {
 				GameId = "rose-" + taskId
 				gameTarget.PayComplete = roomData.PayComplete
 			}
-			if _, ok := wslData[GameId]; ok {
-				gameTarget.PayTarget = wslData[GameId]
+			b, sheepPay := s.SelectSheepPay(date, GameId)
+			if b {
+				gameTarget.PayTarget = sheepPay.Money
 				if gameTarget.PayTarget > completeTaskData[gameTask.TaskId].PayTarget {
 					lastPayAddUpdateTimeKey := fmt.Sprintf(LastPayAddUpdateTimeKey, date, gameTask.TaskId)
 					_ = s.cache.SetCacheStr(context.Background(), lastPayAddUpdateTimeKey, time.Now().Unix())
@@ -243,7 +438,7 @@ func (s *SyncData) SyncTaskData() {
 					payErrAddNumKey := fmt.Sprintf(PayErrAddNumKey, date, gameTask.TaskId)
 					diffNum := gameTarget.PayTarget - completeTaskData[gameTask.TaskId].PayTarget
 					s.common.SaveGameAddFee(diffNum, gameTarget.PayTarget, gameTask.TaskName)
-					go s.common.FreeSendMsg(diffNum, gameTarget.PayTarget, gameTask.TaskId, gameTask.TaskName, gameTask.User)
+					//go s.common.FreeSendMsg(diffNum, gameTarget.PayTarget, gameTask.TaskId, gameTask.TaskName, gameTask.User)
 					// 如果当前付费目标完成,加入一下逻辑
 					if completeTaskData[gameTask.TaskId].PayTarget <= completeTaskData[gameTask.TaskId].PayComplete {
 						lastPayCompletedUpdateTimeKey := fmt.Sprintf(LastPayCompletedUpdateTimeKey, date, gameTask.TaskId)
@@ -1446,3 +1641,29 @@ func (s *SyncData) RemindSendOne() {
 	mobile := []string{global.GVA_CONFIG.SendUrl.TxSendMobile}
 	s.common.RemindSend(url, content, mobile)
 }
+
+func (s *SyncData) GameTaskTargetInfoPush() {
+	date := time.Now().Add(-time.Hour * 24).Format("2006-01-02")
+	s.GameTask.PushTaskToYl(date)
+	return
+}
+
+func (s *SyncData) RequestControlBackend(requestData []request2.GetGameTargetCompleteInfo) (d string, err error) {
+	//url := global.GVA_CONFIG.ExtranetDomain.Control + CreateTaskUrl
+	url := global.GVA_CONFIG.ExtranetDomain.YlControl + "/bpm_api/data_optimize"
+	requestMap := map[string]interface{}{
+		"jsonData": requestData,
+	}
+	data, code, err := utils.HttpPostReplyCode2(url, requestMap)
+	if err != nil {
+		global.GVA_LOG.Error("RequestControlBackend fail", zap.Error(err))
+	}
+	if code != 200 {
+		msg := fmt.Sprintf("status:%d,data:%s", code, string(data))
+		global.GVA_LOG.Warn(msg)
+		return string(data), errors.New(string(data))
+	}
+	msg := fmt.Sprintf("status:%d,data:%s", code, string(data))
+	global.GVA_LOG.Warn(msg)
+	return
+}

+ 9 - 11
service/task/task_conf.go

@@ -348,7 +348,7 @@ func (e *TaskConfService) JudgeOperate(taskConf task.TaskConf) (err error) {
 		return global.GVA_DB.Model(&task.TaskConf{}).Create(&taskConf).Error
 	}
 	//如果有,更新
-	return global.GVA_DB.Model(&task.TaskConf{}).Where("task_id = ?", taskConf.TaskId).Omit("task_id", "user").Updates(map[string]interface{}{"add_fee_notice": taskConf.AddFeeNotice, "simulator_type": taskConf.SimulatorType}).Error
+	return global.GVA_DB.Model(&task.TaskConf{}).Where("task_id = ?", taskConf.TaskId).Omit("task_id", "user").Updates(map[string]interface{}{"add_fee_notice": taskConf.AddFeeNotice, "simulator_type": taskConf.SimulatorType, "push_pay_ratio": taskConf.PushPayRatio}).Error
 }
 
 //删除上传脚本
@@ -399,7 +399,7 @@ func (e *TaskConfService) DeleteScript(file task.GameScriptResponse) (err error)
 }
 
 //批量删除脚本
-func (e *TaskConfService) BulkDeleteScript(ids []int) (err error)  {
+func (e *TaskConfService) BulkDeleteScript(ids []int) (err error) {
 	var total int64
 	var scriptList []task.GameScriptResponse
 
@@ -417,7 +417,7 @@ func (e *TaskConfService) BulkDeleteScript(ids []int) (err error)  {
 	keys := make([]string, len(scriptList))
 
 	//获取key数组 及task_id的map
-	for k,_ := range scriptList {
+	for k, _ := range scriptList {
 		fmt.Println(scriptList[k].Url[30:])
 		keys[k] = scriptList[k].Url[30:]
 		if taskIdMap[scriptList[k].TaskID] != 0 {
@@ -434,7 +434,7 @@ func (e *TaskConfService) BulkDeleteScript(ids []int) (err error)  {
 	}
 
 	//遍历taskIdMap 更新缓存状态
-	for k,_ := range taskIdMap {
+	for k, _ := range taskIdMap {
 		err := e.UpdateRedisCache(k)
 		if err != nil {
 			global.GVA_LOG.Info("更新脚本md5值缓存失败:" + err.Error() + time.Now().Format("2006-01-02 15:04:05"))
@@ -445,12 +445,10 @@ func (e *TaskConfService) BulkDeleteScript(ids []int) (err error)  {
 	return
 	//批量删除七牛云脚本记录
 
-
-
 }
 
 //更新缓存状态
-func (e *TaskConfService) UpdateRedisCache (taskId int) (err error) {
+func (e *TaskConfService) UpdateRedisCache(taskId int) (err error) {
 	var file response.UploadFileResponse
 	contexts := context.Background()
 	//查找合格的file
@@ -461,7 +459,7 @@ func (e *TaskConfService) UpdateRedisCache (taskId int) (err error) {
 		//删除redis缓存,并且打印日志说明
 		fmt.Println("无可用脚本,尝试删除")
 
-		err := global.GVA_REDIS.Set(contexts, key, "无数据", time.Second * 1).Err()
+		err := global.GVA_REDIS.Set(contexts, key, "无数据", time.Second*1).Err()
 		if err != nil {
 			global.GVA_LOG.Info("删除脚本md5值缓存失败:" + err.Error() + time.Now().Format("2006-01-02 15:04:05"))
 			return err
@@ -478,7 +476,7 @@ func (e *TaskConfService) UpdateRedisCache (taskId int) (err error) {
 	return err
 }
 
-func (e *TaskConfService) BulkDeleteQiNiuYunScript(keys []string) (err error)  {
+func (e *TaskConfService) BulkDeleteQiNiuYunScript(keys []string) (err error) {
 	//七牛云删除所需要的条件
 	mac := qbox.NewMac(ACCESSKEY, SECRETKEY)
 	cfg := storage.Config{
@@ -494,7 +492,7 @@ func (e *TaskConfService) BulkDeleteQiNiuYunScript(keys []string) (err error)  {
 	bucket := BUCKET
 
 	//验证keys安全性
-	for _,v := range keys {
+	for _, v := range keys {
 		//删除七牛云之前先做判断
 		if v == "" {
 			return errors.New("请传入正确的key!")
@@ -529,4 +527,4 @@ func (e *TaskConfService) BulkDeleteQiNiuYunScript(keys []string) (err error)  {
 		}
 	}
 	return err
-}
+}

+ 17 - 9
service/task/urgent_task_conf.go

@@ -23,6 +23,7 @@ func (s *UrgentTaskService) CreateUrgentTask(task1 task.UrgentTaskConf) (err err
 	var centralEntity task.CentralControlConf
 	date := time.Now().Format("2006-01-02")
 	task1.CreateDate = date
+	task1.Url = strings.Trim(task1.Url, " ")
 	err = global.GVA_DB.Model(&task.UrgentTaskConf{}).Where("task_id = ? and create_date = ?", task1.TaskId, date).First(&urgentEntity).Error
 	if !errors.Is(err, gorm.ErrRecordNotFound) {
 		return errors.New("任务已存在,请勿重复添加")
@@ -74,19 +75,21 @@ func (s *UrgentTaskService) DeleteUrgentTaskByIds(ids []int) (err error) {
 	return err
 }
 
-func (s *UrgentTaskService) UpdateUrgentTask(task1 task.UrgentTaskConf) (err error) {
+func (s *UrgentTaskService) UpdateUrgentTask(task1 task.UrgentTaskConf, isDelPcCode int) (err error) {
 	//查找此task_id是否存在,如果存在不更新,否则更新
 	var entity task.UrgentTaskConf
-	err = global.GVA_DB.Model(&task.UrgentTaskConf{}).Where("task_id = ? and id = ? and create_date = ?", task1.TaskId, task1.Id, task1.CreateDate).First(&entity).Error
+	err = global.GVA_DB.Model(&task.UrgentTaskConf{}).Where("task_id = ? and id = ?", task1.TaskId, task1.Id).First(&entity).Error
 	if errors.Is(err, gorm.ErrRecordNotFound) {
 		return errors.New("没有找到数据")
 	}
 	upPcCode := ""
-	if task1.PcCode != "" {
-		upPcCode = task1.PcCode
-		task1.PcCode = entity.PcCode + "," + task1.PcCode
+	if isDelPcCode != 1 {
+		if task1.PcCode != "" {
+			upPcCode = task1.PcCode
+			task1.PcCode = entity.PcCode + "," + task1.PcCode
+		}
 	}
-	err = global.GVA_DB.Model(&task.UrgentTaskConf{}).Where("id", task1.Id).Updates(&task1).Error
+	err = global.GVA_DB.Model(&task.UrgentTaskConf{}).Where("id", task1.Id).Update("pc_code", task1.PcCode).Error
 	if err != nil {
 		return err
 	}
@@ -102,16 +105,21 @@ func (s *UrgentTaskService) UpdateUrgentTask(task1 task.UrgentTaskConf) (err err
 	return
 }
 
-func (s *UrgentTaskService) GetUrgentTaskById(id int) (task1 task.UrgentTaskConf, err error) {
+func (s *UrgentTaskService) GetUrgentTaskById(id int) (task2 task.ByIdUrgentTaskConf, err error) {
+	var task1 task.UrgentTaskConf
 	err = global.GVA_DB.Model(&task.UrgentTaskConf{}).Where("id", id).First(&task1).Error
-	return task1, err
+	task2.TaskId = task1.TaskId
+	task2.Id = task1.Id
+	task2.PcCode = strings.Split(task1.PcCode, ",")
+	return task2, err
 }
 
 //查询空闲租机
 func (s *UrgentTaskService) GetUnusedPc() (unusedPcList []task.UnusedPc, err error) {
 	//获取当日日期
 	date := time.Now().Format("2006-01-02")
-	db := global.GVA_DB.Table("computer_status").Where("status = ? and create_date = ?", -1, date)
+	// 放开状态为-1条件
+	db := global.GVA_DB.Table("computer_status").Where("create_date = ?", date)
 	pcCodes, err := s.GetTemporaryTaskId(date)
 	if pcCodes != "" {
 		db.Not("pc_code", strings.Split(pcCodes, ","))

+ 1 - 0
utils/request.go

@@ -0,0 +1 @@
+package utils

+ 23 - 0
utils/requst_http.go

@@ -1,6 +1,7 @@
 package utils
 
 import (
+	"bytes"
 	"encoding/json"
 	"fmt"
 	"io"
@@ -86,6 +87,28 @@ func HttpPostReplyCode(url string, params interface{}) (result []byte, code int,
 	return
 }
 
+func HttpPostReplyCode2(url string, params interface{}) (result []byte, code int, err error) {
+	data, _ := json.Marshal(params)
+	fmt.Println(string(data))
+	resp, err := http.Post(url, "application/json", bytes.NewBuffer(data))
+	if err != nil {
+		fmt.Println("POST request failed:", err)
+		return
+	}
+	defer resp.Body.Close()
+	if err != nil {
+		return
+	}
+	code = resp.StatusCode
+	defer resp.Body.Close()
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return
+	}
+	result = body
+	return
+}
+
 func HttpGetReplyCode(url string, params map[string]string) (result []byte, code int, err error) {
 	req, err := http.NewRequest("GET", url, nil)
 	if err != nil {