Просмотр исходного кода

Merge branch 'master' of http://10.8.230.114:3000/wangbin/log-server

倚楼听风雨 лет назад: 3
Родитель
Сommit
994fb08ec0

+ 31 - 0
api/v1/log/loging.go

@@ -429,3 +429,34 @@ func (s *ApiLoging) GetLogScanningList(c *gin.Context) {
 		}, "获取成功", c)
 		}, "获取成功", c)
 	}
 	}
 }
 }
+
+// @Tags loging
+// @Summary 导出Excel
+// @Security ApiKeyAuth
+// @accept application/json
+// @Produce  application/octet-stream
+// @Param data body request.GetStatisticsComputerRequest true "导出Excel文件信息"
+// @Success 200
+// @Router /loging/computerRateExport [post]
+func (e *ApiLoging) ComputerRateExport(c *gin.Context) {
+	var excelInfo request.ExcelInfo
+	_ = c.ShouldBindJSON(&excelInfo)
+	paramsInfo := excelInfo.InfoList
+	paramsInfo.PageSize = 300
+	paramsInfo.Page = 1
+	list, _, err := ServiceStatisticsLog.ComputerStatistics(c, paramsInfo.LogComputer, paramsInfo.PageInfo, paramsInfo.OrderKey, paramsInfo.Desc)
+	if err != nil {
+		global.GVA_LOG.Error("获取电脑数据失败!", zap.Error(err))
+		response.FailWithMessage("获取电脑数据失败", c)
+		return
+	}
+	filePath := global.GVA_CONFIG.Excel.Dir + excelInfo.FileName
+	err = ServiceStatisticsLog.ComputeRateList2Excel(list, filePath)
+	if err != nil {
+		global.GVA_LOG.Error("转换Excel失败!", zap.Error(err))
+		response.FailWithMessage("转换Excel失败", c)
+		return
+	}
+	c.Writer.Header().Add("success", "true")
+	c.File(filePath)
+}

+ 86 - 0
api/v1/task/game_task.go

@@ -398,3 +398,89 @@ func (s *GameTaskApi) GameList(c *gin.Context) {
 		}, "获取成功", c)
 		}, "获取成功", c)
 	}
 	}
 }
 }
+
+// @Tags gameTask
+// @Summary 重置付费
+// @Security ApiKeyAuth
+// @accept application/json
+// @Produce application/json
+// @Param data body request.GameTaskRequest true
+// @Success 200 {object} response.Response{msg=string} "更新游戏任务目标"
+// @Router /gameTask/taskResetFee [post]
+func (s *GameTaskApi) TaskResetFee(c *gin.Context) {
+	var api request.GameTaskRequest
+	_ = c.ShouldBindJSON(&api)
+	if err := utils.Verify(api, utils.TaskIdVerify); err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+	if err := taskService.TaskResetFee(api); err != nil {
+		global.GVA_LOG.Error("重置付费失败!", zap.Error(err))
+		response.FailWithMessage("重置付费失败 "+err.Error(), c)
+	} else {
+		response.OkWithMessage("重置付费成功", c)
+	}
+}
+
+// @Tags gameTask
+// @Summary 根据id获取游戏可付费账号
+// @Security ApiKeyAuth
+// @accept application/json
+// @Produce application/json
+// @Param data body request.GetById true "根据id获取可付费账号列表"
+// @Success 200 {object} response.Response{data=response.GetGameTargetComplete} "根据id获取可付费账号列表"
+// @Router /gameTask/getFeeAccountList [post]
+func (s *GameTaskApi) GetFeeAccountList(c *gin.Context) {
+	var idInfo request.GetGameTaskTargetByIdRequest
+	_ = c.ShouldBindJSON(&idInfo)
+	if err := utils.Verify(idInfo, utils.IdVerify); err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+	date := time.Now().Format("2006-01-02")
+	if idInfo.CreateDate != date {
+		response.FailWithMessage("只能获取当天的任务", c)
+		return
+	}
+	api, err := taskService.GetFeeAccountList(idInfo.ID)
+	if err != nil {
+		global.GVA_LOG.Error("获取失败!", zap.Error(err))
+		response.FailWithMessage("获取失败 "+err.Error(), c)
+	} else {
+		response.OkWithDetailed(api, "获取成功", c)
+	}
+}
+
+// @Tags gameTask
+// @Summary 导出任务目标Excel
+// @Security ApiKeyAuth
+// @accept application/json
+// @Produce  application/octet-stream
+// @Param data body request.GameTargetCompleteRequest true "导出Excel文件信息"
+// @Success 200
+// @Router /gameTask/taskTargetExport [post]
+func (e *GameTaskApi) TaskTargetExport(c *gin.Context) {
+	var excelInfo request.ExcelInfo
+	_ = c.ShouldBindJSON(&excelInfo)
+	paramsInfo := excelInfo.InfoList
+	paramsInfo.PageSize = 300
+	paramsInfo.Page = 1
+	if err := utils.Verify(paramsInfo.PageInfo, utils.PageInfoVerify); err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+	list, _, err := taskService.GetGameTaskTargetInfoList(paramsInfo.GameTargetCompleteRequest, paramsInfo.PageInfo, paramsInfo.OrderKey, paramsInfo.Desc, false)
+	if err != nil {
+		global.GVA_LOG.Error("获取失败!", zap.Error(err))
+		response.FailWithMessage("获取失败 "+err.Error(), c)
+	}
+	filePath := global.GVA_CONFIG.Excel.Dir + excelInfo.FileName
+	err = taskService.TaskStatisticsList2Excel(list, filePath)
+	if err != nil {
+		global.GVA_LOG.Error("转换Excel失败!", zap.Error(err))
+		response.FailWithMessage("转换Excel失败", c)
+		return
+	}
+	c.Writer.Header().Add("success", "true")
+	c.File(filePath)
+}

+ 39 - 21
initialize/timer.go

@@ -96,16 +96,16 @@ func Timer() {
 		fmt.Println("add DayTargetDataStatistics timer error:", err)
 		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)
-	}
+	//// 定时检查是否有电脑到期,修改租机状态@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)
@@ -137,15 +137,33 @@ func Timer() {
 		fmt.Println("add SyncJfDevicesMessage timer error:", err)
 		fmt.Println("add SyncJfDevicesMessage timer error:", err)
 	}
 	}
 
 
-	//// 活跃定时推送消息
-	//_, err = global.GVA_Timer.AddTaskByFunc("TaskMsgSend", "20 0/2 * * * *", syncData.TaskMsgSend)
-	//if err != nil {
-	//	fmt.Println("add DayTargetDataStatistics timer error:", err)
-	//}
-	//
-	//// 付费定时推送消息
-	//_, err = global.GVA_Timer.AddTaskByFunc("TaskMsgSend", "40 0/2 * * * *", syncData.TaskFreeMsgSend)
-	//if err != nil {
-	//	fmt.Println("add DayTargetDataStatistics timer error:", err)
-	//}
+	// 活跃定时推送消息
+	_, err = global.GVA_Timer.AddTaskByFunc("TaskMsgSend", "20 29,59 8-21 * * *", syncData.TaskMsgSend)
+	if err != nil {
+		fmt.Println("add TaskMsgSend timer error:", err)
+	}
+
+	// 活跃定时推送消息
+	_, err = global.GVA_Timer.AddTaskByFunc("TaskMsgSend", "20 0/10 22-23 * * *", syncData.TaskMsgSend)
+	if err != nil {
+		fmt.Println("add TaskMsgSend timer error:", err)
+	}
+
+	// 付费定时推送消息
+	_, err = global.GVA_Timer.AddTaskByFunc("TaskMsgSend", "40 15,30,45,59 8-21 * * *", syncData.TaskFreeMsgSend)
+	if err != nil {
+		fmt.Println("add TaskFreeMsgSend timer error:", err)
+	}
+
+	// 付费定时推送消息
+	_, err = global.GVA_Timer.AddTaskByFunc("TaskMsgSend", "40 0/5 22-23 * * *", syncData.TaskFreeMsgSend)
+	if err != nil {
+		fmt.Println("add TaskFreeMsgSend timer error:", err)
+	}
+
+	// 23起检测任务完成情况
+	_, err = global.GVA_Timer.AddTaskByFunc("CheckTaskCompletedInfo", "10 0/4 23 * * *", syncData.CheckTaskCompletedInfo)
+	if err != nil {
+		fmt.Println("add CheckTaskCompletedInfo timer error:", err)
+	}
 }
 }

+ 31 - 17
model/task/request/game_task.go

@@ -1,6 +1,8 @@
 package request
 package request
 
 
-import "log-server/model/task"
+import (
+	"log-server/model/task"
+)
 
 
 type GameTaskRequest struct {
 type GameTaskRequest struct {
 	Id              uint   `json:"id"`
 	Id              uint   `json:"id"`
@@ -46,23 +48,35 @@ type GetGameTaskListTargetRequest struct {
 	Desc     bool   `json:"desc"`     // 排序方式:升序false(默认)|降序true
 	Desc     bool   `json:"desc"`     // 排序方式:升序false(默认)|降序true
 }
 }
 
 
+type ExcelInfo struct {
+	FileName string `json:"fileName"` // 文件名
+	InfoList struct {
+		GameTargetCompleteRequest
+		PageInfo
+		OrderKey string `json:"orderKey"` // 排序
+		Desc     bool   `json:"desc"`     // 排序方式:升序false(默认)|降序true
+	} `json:"infoList"`
+}
+
 type GameTargetCompleteRequest struct {
 type GameTargetCompleteRequest struct {
-	Id               uint   `json:"id"`
-	TaskId           int    `json:"task_id"`
-	TaskName         string `json:"task_name"`
-	User             string `json:"user"`
-	LoginMethod      string `json:"login_method"`
-	NewComplete      int    `json:"new_complete"`
-	PayComplete      int    `json:"pay_complete"`
-	RetainedComplete int    `json:"retained_complete"`
-	NewTarget        int    `json:"new_target"`
-	PayTarget        int    `json:"pay_target"`
-	RetainedTarget   int    `json:"retained_target"`
-	Amount           int    `json:"amount"`
-	CreateDate       string `json:"create_date"`
-	UpdateTime       string `json:"update_time"` // 更新时间
-	GameRate         string `json:"game_rate"`
-	IsComplete       int    `json:"is_complete"`
+	Id               uint     `json:"id"`
+	TaskId           int      `json:"task_id"`
+	TaskName         string   `json:"task_name"`
+	User             string   `json:"user"`
+	LoginMethod      string   `json:"login_method"`
+	NewComplete      int      `json:"new_complete"`
+	PayComplete      int      `json:"pay_complete"`
+	RetainedComplete int      `json:"retained_complete"`
+	NewTarget        int      `json:"new_target"`
+	PayTarget        int      `json:"pay_target"`
+	RetainedTarget   int      `json:"retained_target"`
+	Amount           int      `json:"amount"`
+	CreateDate       string   `json:"create_date"`
+	UpdateTime       string   `json:"update_time"` // 更新时间
+	GameRate         string   `json:"game_rate"`
+	IsComplete       int      `json:"is_complete"`
+	Date             []string `json:"date"`
+	GamePortId       int      `json:"game_port_id"`
 }
 }
 
 
 type GetGameTaskTargetByIdRequest struct {
 type GetGameTaskTargetByIdRequest struct {

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

@@ -44,6 +44,7 @@ type GetGameTargetComplete struct {
 	HandRetainedComplete int    `json:"hand_retained_complete"`
 	HandRetainedComplete int    `json:"hand_retained_complete"`
 	HandPayComplete      int    `json:"hand_pay_complete"`
 	HandPayComplete      int    `json:"hand_pay_complete"`
 	HandAmountTotal      int    `json:"hand_amount_total"`
 	HandAmountTotal      int    `json:"hand_amount_total"`
+	GameIdXmy            string `json:"game_id_xmy"`
 }
 }
 
 
 type GameTargetStatistics struct {
 type GameTargetStatistics struct {

+ 1 - 0
router/log/loging.go

@@ -26,5 +26,6 @@ func (e *LogingRouter) InitLogingRouter(Router *gin.RouterGroup) {
 		excelRouter.POST("exportExcel", logApi.ExportExcel)
 		excelRouter.POST("exportExcel", logApi.ExportExcel)
 		excelRouter.POST("updatePcRemarks", logApi.UpdatePcRemarks)
 		excelRouter.POST("updatePcRemarks", logApi.UpdatePcRemarks)
 		excelRouter.POST("getLogScanningList", logApi.GetLogScanningList)
 		excelRouter.POST("getLogScanningList", logApi.GetLogScanningList)
+		excelRouter.POST("computerRateExport", logApi.ComputerRateExport)
 	}
 	}
 }
 }

+ 3 - 0
router/task/game_task.go

@@ -23,6 +23,8 @@ func (e *GameTaskRouter) InitGameTaskRouter(Router *gin.RouterGroup) {
 		GameTaskRouter.POST("gameStatistics", GameTaskApi.GameStatistics)
 		GameTaskRouter.POST("gameStatistics", GameTaskApi.GameStatistics)
 		GameTaskRouter.POST("gameList", GameTaskApi.GameList)
 		GameTaskRouter.POST("gameList", GameTaskApi.GameList)
 		GameTaskRouter.POST("getGameTxTaskList", GameTaskApi.GetGameTxTaskList)
 		GameTaskRouter.POST("getGameTxTaskList", GameTaskApi.GetGameTxTaskList)
+		GameTaskRouter.POST("getFeeAccountList", GameTaskApi.GetFeeAccountList)
+		GameTaskRouter.POST("taskTargetExport", GameTaskApi.TaskTargetExport)
 	}
 	}
 	GameTaskRouter1 := Router.Group("gameTask").Use(middleware.OperationRecord())
 	GameTaskRouter1 := Router.Group("gameTask").Use(middleware.OperationRecord())
 	{
 	{
@@ -31,5 +33,6 @@ func (e *GameTaskRouter) InitGameTaskRouter(Router *gin.RouterGroup) {
 		GameTaskRouter1.POST("update", GameTaskApi.UpdateGameTask)
 		GameTaskRouter1.POST("update", GameTaskApi.UpdateGameTask)
 		GameTaskRouter1.POST("delete", GameTaskApi.DeleteGameTask)
 		GameTaskRouter1.POST("delete", GameTaskApi.DeleteGameTask)
 		GameTaskRouter1.POST("updateTarget", GameTaskApi.UpdateGameTaskTarget)
 		GameTaskRouter1.POST("updateTarget", GameTaskApi.UpdateGameTaskTarget)
+		GameTaskRouter1.POST("taskResetFee", GameTaskApi.TaskResetFee)
 	}
 	}
 }
 }

+ 34 - 5
service/log/log_statistics.go

@@ -515,7 +515,15 @@ func (s *ServiceStatisticsLog) CreateComputerStatisticsData() {
 	var computer log.Computer
 	var computer log.Computer
 	computerData, _ := computer.OnlinePcCodeCache()
 	computerData, _ := computer.OnlinePcCodeCache()
 	var csReplys []*log.LogComputer
 	var csReplys []*log.LogComputer
+	// 不统计本地测试电脑
+	notStatistics := map[string]int{
+		"001": 1,
+		"002": 1,
+	}
 	for code, r := range codeMps {
 	for code, r := range codeMps {
+		if _, ok := notStatistics[code]; ok {
+			continue
+		}
 		accountMps, err := s.LogicalLog.GetComputerPullAccountNumCache(ctx, s.LogicalLog.CurrentDate(), code)
 		accountMps, err := s.LogicalLog.GetComputerPullAccountNumCache(ctx, s.LogicalLog.CurrentDate(), code)
 		if err != nil {
 		if err != nil {
 			continue
 			continue
@@ -644,7 +652,7 @@ func (s *ServiceStatisticsLog) CreateComputerStatisticsData() {
 	return
 	return
 }
 }
 
 
-func (s *ServiceStatisticsLog) ComputerStatistics(ctx context.Context, api log.LogComputer, info request.PageInfo, order string, desc bool) (interface{}, int64, error) {
+func (s *ServiceStatisticsLog) ComputerStatistics(ctx context.Context, api log.LogComputer, info request.PageInfo, order string, desc bool) (statisticsLogsComputer []*response.ComputerStatisticsReply1, total int64, err error) {
 	date := api.CreateDate
 	date := api.CreateDate
 	isCurrentDate := false
 	isCurrentDate := false
 	if date == "" {
 	if date == "" {
@@ -652,7 +660,6 @@ func (s *ServiceStatisticsLog) ComputerStatistics(ctx context.Context, api log.L
 		isCurrentDate = true
 		isCurrentDate = true
 	}
 	}
 	db := global.GVA_DB.Model(&log.LogComputer{})
 	db := global.GVA_DB.Model(&log.LogComputer{})
-	var total int64
 	db = db.Where("create_date = ?", date)
 	db = db.Where("create_date = ?", date)
 	if api.Operator != "" {
 	if api.Operator != "" {
 		db = db.Where("operator = ?", api.Operator)
 		db = db.Where("operator = ?", api.Operator)
@@ -663,7 +670,7 @@ func (s *ServiceStatisticsLog) ComputerStatistics(ctx context.Context, api log.L
 	if api.GameId != 0 {
 	if api.GameId != 0 {
 		db = db.Where("game_id = ?", api.GameId)
 		db = db.Where("game_id = ?", api.GameId)
 	}
 	}
-	err := db.Count(&total).Error
+	err = db.Count(&total).Error
 	if err != nil {
 	if err != nil {
 		return nil, 0, err
 		return nil, 0, err
 	}
 	}
@@ -687,7 +694,7 @@ func (s *ServiceStatisticsLog) ComputerStatistics(ctx context.Context, api log.L
 			}
 			}
 		} else { // didn't matched any order key in `orderMap`
 		} else { // didn't matched any order key in `orderMap`
 			global.GVA_LOG.Error("获取失败!", zap.Error(err))
 			global.GVA_LOG.Error("获取失败!", zap.Error(err))
-			return statisticsLogs, total, err
+			return statisticsLogsComputer, total, err
 		}
 		}
 		err = db.Order(OrderStr).Find(&statisticsLogs).Error
 		err = db.Order(OrderStr).Find(&statisticsLogs).Error
 	} else {
 	} else {
@@ -696,7 +703,6 @@ func (s *ServiceStatisticsLog) ComputerStatistics(ctx context.Context, api log.L
 	if err != nil {
 	if err != nil {
 		return nil, 0, err
 		return nil, 0, err
 	}
 	}
-	var statisticsLogsComputer []*response.ComputerStatisticsReply1
 
 
 	for _, statisticsLog := range statisticsLogs {
 	for _, statisticsLog := range statisticsLogs {
 		/*var gameInfo []*response.GameInfo
 		/*var gameInfo []*response.GameInfo
@@ -1219,3 +1225,26 @@ func (apiService *ServiceStatisticsLog) GetScanningInfoList(api request.LogScann
 	}
 	}
 	return apisReply, total, err
 	return apisReply, total, err
 }
 }
+
+func (exa *ServiceStatisticsLog) ComputeRateList2Excel(infoList []*response.ComputerStatisticsReply1, filePath string) error {
+	excel := excelize.NewFile()
+	excel.SetSheetRow("Sheet1", "A1", &[]string{"电脑编号", "使用者", "日期", "游戏id", "目标数量", "拉取账号", "进入主线", "主线成功", "半小时付费", "任务完成效率", "空闲时间"})
+	for i, statisticsLog := range infoList {
+		axis := fmt.Sprintf("A%d", i+2)
+		excel.SetSheetRow("Sheet1", axis, &[]interface{}{
+			statisticsLog.PcCode,
+			statisticsLog.Operator,
+			statisticsLog.CreateDate[:10],
+			statisticsLog.GameId,
+			statisticsLog.TargetNum,
+			statisticsLog.PullAccountNum,
+			statisticsLog.EnterMain,
+			statisticsLog.TaskSuccessNum,
+			statisticsLog.ComputerFeeRate,
+			statisticsLog.ComputerHourAverageRate,
+			statisticsLog.ComputerFreeTime,
+		})
+	}
+	err := excel.SaveAs(filePath)
+	return err
+}

+ 25 - 1
service/log/loging/logical_log.go

@@ -668,8 +668,32 @@ func (s *LogicalLog) GetStatisticsComputerRate(ctx context.Context, pcCode strin
 	key := fmt.Sprintf(GameComputerRateCacheKey, s.CurrentDate(), pcCode)
 	key := fmt.Sprintf(GameComputerRateCacheKey, s.CurrentDate(), pcCode)
 	key = key + "*"
 	key = key + "*"
 	data, _ := s.cache.GetCacheKeys(ctx, key)
 	data, _ := s.cache.GetCacheKeys(ctx, key)
+	h := map[string]int{
+		"2": 1,
+		"3": 1,
+		"4": 1,
+		"5": 1,
+		"6": 1,
+		"7": 1,
+		"8": 1,
+	}
+	var i = 0
+	for _, v := range data {
+		key := strings.Split(v, ":")
+		hr := key[len(key)-1:][0]
+		if _, ok := h[hr]; ok {
+			continue
+		}
+		i++
+	}
 	hour := time.Now().Hour()
 	hour := time.Now().Hour()
-	num = hour + 1 - len(data)
+	//num = hour + 1 - len(data)
+	if hour >= 8 {
+		num = hour + 1 - 7 - i
+	} else {
+		notCalculated := hour - 2
+		num = hour + 1 - notCalculated - i
+	}
 	return
 	return
 }
 }
 
 

+ 18 - 0
service/task/common.go

@@ -0,0 +1,18 @@
+package task
+
+import "log-server/utils"
+
+type Common struct {
+}
+
+type SendMsg struct {
+	MsgType  string `json:"msgtype"`
+	Markdown struct {
+		Content string `json:"content"`
+	} `json:"markdown"`
+}
+
+func (s *Common) SendMsgData(url string, params interface{}) {
+	_, _ = utils.HttpPost(url, params)
+	return
+}

+ 178 - 15
service/task/game_task.go

@@ -1,9 +1,11 @@
 package task
 package task
 
 
 import (
 import (
+	"context"
 	"encoding/json"
 	"encoding/json"
 	"errors"
 	"errors"
 	"fmt"
 	"fmt"
+	"github.com/xuri/excelize/v2"
 	"go.uber.org/zap"
 	"go.uber.org/zap"
 	"gorm.io/gorm"
 	"gorm.io/gorm"
 	"log-server/global"
 	"log-server/global"
@@ -11,6 +13,7 @@ import (
 	"log-server/model/task/control"
 	"log-server/model/task/control"
 	"log-server/model/task/request"
 	"log-server/model/task/request"
 	"log-server/model/task/response"
 	"log-server/model/task/response"
+	"log-server/service/cache"
 	"log-server/utils"
 	"log-server/utils"
 	"math"
 	"math"
 	"math/rand"
 	"math/rand"
@@ -52,6 +55,8 @@ var (
 )
 )
 
 
 type GameTask struct {
 type GameTask struct {
+	cache  cache.Cache
+	common Common
 }
 }
 
 
 // 创建游戏任务
 // 创建游戏任务
@@ -341,6 +346,8 @@ func (c *GameTask) GetGameTaskById(id int) (gameTask request.GameTaskRequest, er
 	gameTask.PayTarget = requestData.PayTarget
 	gameTask.PayTarget = requestData.PayTarget
 	gameTask.RetainedTarget = requestData.RetainedTarget
 	gameTask.RetainedTarget = requestData.RetainedTarget
 	gameTask.PayPrice = requestData.PayPrice
 	gameTask.PayPrice = requestData.PayPrice
+	gameTask.RetainedTargetH = requestData.RetainedTargetH
+	gameTask.NewTargetH = requestData.NewTargetH
 	return
 	return
 }
 }
 
 
@@ -504,19 +511,23 @@ func (s *GameTask) DeleteGameTask(api request.GameTaskRequest) (err error) {
 //@description: 分页获取数据,
 //@description: 分页获取数据,
 //@param: card card.Card, info request.PageInfo, order string, desc bool
 //@param: card card.Card, info request.PageInfo, order string, desc bool
 //@return: list interface{}, total int64, err error
 //@return: list interface{}, total int64, err error
-func (apiService *GameTask) GetGameTaskTargetInfoList(api request.GameTargetCompleteRequest, info request.PageInfo, order string, desc bool, isTx bool) (list interface{}, total int64, err error) {
+func (apiService *GameTask) GetGameTaskTargetInfoList(api request.GameTargetCompleteRequest, info request.PageInfo, order string, desc bool, isTx bool) (apiList []response.GetGameTargetComplete, total int64, err error) {
 	limit := info.PageSize
 	limit := info.PageSize
 	offset := info.PageSize * (info.Page - 1)
 	offset := info.PageSize * (info.Page - 1)
-	if api.CreateDate == "" {
-		api.CreateDate = time.Now().Format("2006-01-02")
+	startDate := time.Now().Format("2006-01-02")
+	endDate := time.Now().Format("2006-01-02")
+	if len(api.Date) == 2 {
+		startDate = api.Date[0]
+		endDate = api.Date[1]
 	}
 	}
 	db := global.GVA_DB.Table("game_target_complete gtc")
 	db := global.GVA_DB.Table("game_target_complete gtc")
-	db = db.Select("gtc.id,gtc.task_id,gt.task_name,gtc.new_target,gt.login_method,gt.user,gtc.pay_target,gtc.retained_target," +
+	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.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.hand_retained_complete,gtc.hand_pay_complete,gtc.hand_amount_total")
 	db = db.Joins("left join game_task gt on gt.task_id = gtc.task_id")
 	db = db.Joins("left join game_task gt on gt.task_id = gtc.task_id")
-	db = db.Where("gtc.create_date = ?", api.CreateDate)
-	var apiList []response.GetGameTargetComplete
+	//db = db.Where("gtc.create_date = ?", api.CreateDate)
+	db = db.Where("create_date >= ? and create_date <= ?", startDate, endDate)
+
 	if api.TaskName != "" {
 	if api.TaskName != "" {
 		db = db.Where("gt.task_name LIKE ?", "%"+api.TaskName+"%")
 		db = db.Where("gt.task_name LIKE ?", "%"+api.TaskName+"%")
 	}
 	}
@@ -526,6 +537,9 @@ func (apiService *GameTask) GetGameTaskTargetInfoList(api request.GameTargetComp
 	if isTx {
 	if isTx {
 		db = db.Where("gt.game_port_id = ?", 1)
 		db = db.Where("gt.game_port_id = ?", 1)
 	}
 	}
+	if api.GamePortId != 0 {
+		db = db.Where("gt.game_port_id = ?", api.GamePortId)
+	}
 	if api.TaskId != 0 {
 	if api.TaskId != 0 {
 		db = db.Where("gtc.task_id = ?", api.TaskId)
 		db = db.Where("gtc.task_id = ?", api.TaskId)
 	}
 	}
@@ -567,10 +581,8 @@ func (apiService *GameTask) GetGameTaskTargetInfoList(api request.GameTargetComp
 			loginMethod, _ := strconv.Atoi(api.LoginMethod)
 			loginMethod, _ := strconv.Atoi(api.LoginMethod)
 			apiList[i].LoginMethod = LoginMethod[loginMethod]
 			apiList[i].LoginMethod = LoginMethod[loginMethod]
 			apiList[i].CreateDate = date[0]
 			apiList[i].CreateDate = date[0]
-			apiList[i].RetainedComplete = api.RetainedComplete + api.HandRetainedComplete + api.HandNewComplete
-			apiList[i].PayComplete = api.PayComplete + api.HandPayComplete
 			apiList[i].NewComplete = api.NewComplete + api.HandNewComplete
 			apiList[i].NewComplete = api.NewComplete + api.HandNewComplete
-			apiList[i].Amount = api.Amount + api.HandAmountTotal
+			apiList[i].RetainedComplete = api.RetainedComplete + api.HandRetainedComplete
 		}
 		}
 	}
 	}
 	return apiList, total, err
 	return apiList, total, err
@@ -672,6 +684,7 @@ func (s *GameTask) UpdateGameTaskTarget(requestData request.UpdateGameTaskTarget
 		"hand_pay_complete":      requestData.HandPayComplete + gameTask.HandPayComplete,
 		"hand_pay_complete":      requestData.HandPayComplete + gameTask.HandPayComplete,
 		"hand_amount_total":      requestData.HandAmountTotal + gameTask.HandAmountTotal,
 		"hand_amount_total":      requestData.HandAmountTotal + gameTask.HandAmountTotal,
 	}
 	}
+	date := time.Now().Format("2006-01-02")
 	err = global.GVA_DB.Transaction(func(tx *gorm.DB) error {
 	err = global.GVA_DB.Transaction(func(tx *gorm.DB) error {
 		if requestData.IsFree == 1 {
 		if requestData.IsFree == 1 {
 			handComplete := new(task.GameHandComplete)
 			handComplete := new(task.GameHandComplete)
@@ -727,7 +740,7 @@ func (s *GameTask) UpdateGameTaskTarget(requestData request.UpdateGameTaskTarget
 			}
 			}
 			if requestData.IsUploadXjf == 1 {
 			if requestData.IsUploadXjf == 1 {
 				for i := 0; i < requestData.HandPayComplete; i++ {
 				for i := 0; i < requestData.HandPayComplete; i++ {
-					account := "hand_" + strconv.Itoa(i) + "_" + createDate
+					account := "hand_" + strconv.Itoa(i) + "_" + strconv.Itoa(int(time.Now().Unix()))
 					err = s.FreeUploadXjf(strconv.Itoa(taskData.TaskId), "付费充值", account, "付费成功", "")
 					err = s.FreeUploadXjf(strconv.Itoa(taskData.TaskId), "付费充值", account, "付费成功", "")
 					if err != nil {
 					if err != nil {
 						global.GVA_LOG.Error("上传xjf数据失败taskId = "+strconv.Itoa(taskData.TaskId)+"date = "+createDate, zap.Error(err))
 						global.GVA_LOG.Error("上传xjf数据失败taskId = "+strconv.Itoa(taskData.TaskId)+"date = "+createDate, zap.Error(err))
@@ -745,6 +758,23 @@ func (s *GameTask) UpdateGameTaskTarget(requestData request.UpdateGameTaskTarget
 		}
 		}
 		return err
 		return err
 	})
 	})
+	if gameTask.CreateDate.Format("2006-01-02") == date {
+		if gameTask.PayTarget < requestData.PayTarget {
+			global.GVA_LOG.Warn("进入修改add update")
+			lastPayAddUpdateTimeKey := fmt.Sprintf(LastPayAddUpdateTimeKey, date, gameTask.TaskId)
+			_ = s.cache.SetCacheStr(context.Background(), lastPayAddUpdateTimeKey, time.Now().Unix())
+			msg := "# 测试监控报警 " + time.Now().Format("2006-01-02 15:04:05")
+			msg += "\n"
+			msg += "**" + taskData.User + "**"
+			msg += "\n"
+			msg += taskData.TaskName + ", 付费目标改为" + strconv.Itoa(requestData.PayTarget)
+			url := "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=5ccfb180-c062-48b5-ae18-0c96f7c19f0b"
+			var sendData SendMsg
+			sendData.MsgType = "markdown"
+			sendData.Markdown.Content = msg
+			s.common.SendMsgData(url, sendData)
+		}
+	}
 	return
 	return
 }
 }
 
 
@@ -771,7 +801,7 @@ func (s *GameTask) TargetStatistics(date string) (apiList []control.TargetStatis
 			targetStatistics.TargetNew = target.NewTarget
 			targetStatistics.TargetNew = target.NewTarget
 			targetStatistics.CompleteNew = target.NewComplete + target.HandNewComplete
 			targetStatistics.CompleteNew = target.NewComplete + target.HandNewComplete
 			targetStatistics.CompleteActive = target.RetainedComplete + target.HandRetainedComplete
 			targetStatistics.CompleteActive = target.RetainedComplete + target.HandRetainedComplete
-			targetStatistics.CompletePay = target.PayComplete + target.HandPayComplete
+			targetStatistics.CompletePay = target.PayComplete
 			targetStatistics.XmyId = target.GameIdXmy
 			targetStatistics.XmyId = target.GameIdXmy
 			targetStatistics.QqId = target.TxGameId
 			targetStatistics.QqId = target.TxGameId
 			targetStatistics.QqChannel = target.TxChannel
 			targetStatistics.QqChannel = target.TxChannel
@@ -801,10 +831,10 @@ func (s *GameTask) DayStatisticsData(request request.GameTaskStatisticsRequest)
 			gameTargetDate.PayTarget = gameTarget.PayTarget
 			gameTargetDate.PayTarget = gameTarget.PayTarget
 			gameTargetDate.NewTarget = gameTarget.NewTarget
 			gameTargetDate.NewTarget = gameTarget.NewTarget
 			gameTargetDate.RetainedTarget = gameTarget.RetainedTarget
 			gameTargetDate.RetainedTarget = gameTarget.RetainedTarget
-			gameTargetDate.PayComplete = gameTarget.PayComplete + gameTarget.HandPayComplete
-			gameTargetDate.NewComplete = gameTarget.NewComplete + gameTarget.HandNewComplete
-			gameTargetDate.RetainedComplete = gameTarget.RetainedComplete + gameTarget.HandRetainedComplete
-			gameTargetDate.Amount = gameTarget.Amount + gameTarget.HandAmountTotal
+			gameTargetDate.PayComplete = gameTarget.PayComplete
+			gameTargetDate.NewComplete = gameTarget.NewComplete
+			gameTargetDate.RetainedComplete = gameTarget.RetainedComplete
+			gameTargetDate.Amount = gameTarget.Amount
 			gameTargetDate.GamePort = GamePort[gameTarget.GamePortId]
 			gameTargetDate.GamePort = GamePort[gameTarget.GamePortId]
 			gameTargetDate.User = gameTarget.User
 			gameTargetDate.User = gameTarget.User
 			gameTargetDate.TaskDate = gameTarget.CreateDate.Format("2006-01-02")
 			gameTargetDate.TaskDate = gameTarget.CreateDate.Format("2006-01-02")
@@ -910,3 +940,136 @@ func (s *GameTask) GameStatisticsList(rq request.GameListRequest) (gameTarget []
 	}
 	}
 	return
 	return
 }
 }
+
+//
+func (s *GameTask) ResetFeeUploadXjf(gameId int) (err error) {
+	url := global.GVA_CONFIG.ExtranetDomain.Control + "/v1/task_statistics/rerun_retained"
+	requestData := map[string]string{
+		"game_id": strconv.Itoa(gameId),
+	}
+	data, code, err := utils.HttpGetReplyCode(url, requestData)
+	if err != nil {
+		return err
+	}
+	fmt.Println(code)
+	if code != 200 {
+		return errors.New(string(data))
+	}
+	return
+}
+
+//@function: TaskResetFee
+//@description: 重置付费
+//@param: api task.GameTask
+//@return: err error
+func (s *GameTask) TaskResetFee(api request.GameTaskRequest) (err error) {
+	var entity task.GameTask
+	err = global.GVA_DB.Where("task_id = ?", api.TaskId).First(&entity).Error
+	if errors.Is(err, gorm.ErrRecordNotFound) {
+		return err
+	}
+	err = s.ResetFeeUploadXjf(api.TaskId)
+	if err != nil {
+		global.GVA_LOG.Error("请求群控数据报错: ", zap.Error(err))
+		return errors.New("请求群控数据报错")
+	}
+	return
+}
+
+// http请求群控付费账号
+func (s *GameTask) GetFeeAccountControl(taskId int) (d []byte, err error) {
+	url := global.GVA_CONFIG.ExtranetDomain.Control + "/v1/device/get_log_by_game"
+	//url := "http://xjf.lianyou.fun:8099/v1/device/get_log_by_game"
+	params := map[string]string{
+		"date":          time.Now().Format("2006-01-02"),
+		"action":        "付费账号",
+		"action_result": "占位",
+		"game_id":       strconv.Itoa(taskId),
+	}
+	d, code, err := utils.HttpGetReplyCode(url, params)
+	fmt.Println(code)
+	if code != 200 {
+		return nil, errors.New(string(d))
+	}
+	return
+}
+
+type FeeAccount struct {
+	Account  string `json:"account"`
+	Password string `json:"password"`
+}
+
+func (s *GameTask) GetFeeAccountList(taskId int) (fa []FeeAccount, err error) {
+	b, err := s.GetFeeAccountControl(taskId)
+	if err != nil {
+		return
+	}
+	err = json.Unmarshal(b, &fa)
+	if err != nil {
+		return
+	}
+	return
+}
+
+func (exa *GameTask) TaskStatisticsList2Excel(infoList []response.GetGameTargetComplete, filePath string) error {
+	excel := excelize.NewFile()
+	excel.SetSheetRow("Sheet1", "A1", &[]string{
+		"日期",
+		"任务id",
+		"任务名称",
+		"登录方式",
+		"目标新增",
+		"目标付费",
+		"目标活跃",
+		"完成新增",
+		"完成付费",
+		"完成活跃",
+		"未完新增",
+		"未完付费",
+		"未完活跃",
+		"负责人",
+		"完成",
+		"手动付费",
+		"手动付费金额",
+		"付费流水"})
+	for i, statisticsLog := range infoList {
+		axis := fmt.Sprintf("A%d", i+2)
+		newNo := 0
+		retainedNo := 0
+		payNo := 0
+		isComplete := "是"
+		if statisticsLog.IsComplete == -1 {
+			isComplete = "否"
+		}
+		if statisticsLog.PayComplete < statisticsLog.PayTarget {
+			payNo = statisticsLog.PayTarget - statisticsLog.PayComplete
+		}
+		if statisticsLog.RetainedComplete+statisticsLog.HandRetainedComplete < statisticsLog.RetainedTarget {
+			retainedNo = statisticsLog.RetainedTarget - statisticsLog.RetainedComplete - statisticsLog.HandRetainedComplete
+		}
+		if statisticsLog.NewComplete+statisticsLog.HandNewComplete < statisticsLog.NewTarget {
+			newNo = statisticsLog.NewTarget - statisticsLog.NewComplete - statisticsLog.HandNewComplete
+		}
+		excel.SetSheetRow("Sheet1", axis, &[]interface{}{
+			statisticsLog.CreateDate[:10],
+			statisticsLog.TaskId,
+			statisticsLog.TaskName,
+			statisticsLog.LoginMethod,
+			statisticsLog.NewTarget,
+			statisticsLog.PayTarget,
+			statisticsLog.RetainedTarget,
+			statisticsLog.NewComplete + statisticsLog.NewComplete,
+			statisticsLog.PayComplete,
+			statisticsLog.RetainedComplete + statisticsLog.HandRetainedComplete,
+			newNo,
+			payNo,
+			retainedNo,
+			statisticsLog.User,
+			isComplete,
+			statisticsLog.HandPayComplete,
+			statisticsLog.HandAmountTotal,
+		})
+	}
+	err := excel.SaveAs(filePath)
+	return err
+}

+ 75 - 19
service/task/sync_data.go

@@ -175,6 +175,7 @@ func (s *SyncData) SyncTaskData() {
 	for _, gameTask := range apiList {
 	for _, gameTask := range apiList {
 		var gameTarget task.GameTargetComplete
 		var gameTarget task.GameTargetComplete
 		roomData, _ := s.SyncRoomData(date, gameTask.TaskId)
 		roomData, _ := s.SyncRoomData(date, gameTask.TaskId)
+
 		if gameTask.GameIdXmy != "" {
 		if gameTask.GameIdXmy != "" {
 			gameIdXmy, _ := strconv.Atoi(gameTask.GameIdXmy)
 			gameIdXmy, _ := strconv.Atoi(gameTask.GameIdXmy)
 			xmyGameInfo := xmyGameData[gameIdXmy]
 			xmyGameInfo := xmyGameData[gameIdXmy]
@@ -186,7 +187,12 @@ func (s *SyncData) SyncTaskData() {
 			num, _ := s.SyncXmyFreeData(date, gameIdXmy)
 			num, _ := s.SyncXmyFreeData(date, gameIdXmy)
 			if num != 0 {
 			if num != 0 {
 				gameTarget.PayTarget = num
 				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())
+				}
 			}
 			}
+
 		} else {
 		} else {
 			gameTarget.NewComplete = roomData.NewCompleteLocal
 			gameTarget.NewComplete = roomData.NewCompleteLocal
 			gameTarget.PayComplete = roomData.PayCompleteLocal
 			gameTarget.PayComplete = roomData.PayCompleteLocal
@@ -195,16 +201,21 @@ func (s *SyncData) SyncTaskData() {
 			if gameTarget.RetainedComplete < roomData.RetainedComplete {
 			if gameTarget.RetainedComplete < roomData.RetainedComplete {
 				gameTarget.RetainedComplete = roomData.RetainedComplete
 				gameTarget.RetainedComplete = roomData.RetainedComplete
 			}
 			}
+
 		}
 		}
 		gameTarget.GameRate = roomData.GameRate
 		gameTarget.GameRate = roomData.GameRate
 		if gameTask.GamePortId == 5 && gameTask.LoginMethod == 2 {
 		if gameTask.GamePortId == 5 && gameTask.LoginMethod == 2 {
 			mzGameId := gameTask.MzGameId + "-" + gameTask.MzChannel
 			mzGameId := gameTask.MzGameId + "-" + gameTask.MzChannel
 			if _, ok := wslData[mzGameId]; ok {
 			if _, ok := wslData[mzGameId]; ok {
 				gameTarget.PayTarget = wslData[mzGameId]
 				gameTarget.PayTarget = wslData[mzGameId]
+				if gameTarget.PayTarget > completeTaskData[gameTask.TaskId].PayTarget {
+					lastPayAddUpdateTimeKey := fmt.Sprintf(LastPayAddUpdateTimeKey, date, gameTask.TaskId)
+					_ = s.cache.SetCacheStr(context.Background(), lastPayAddUpdateTimeKey, time.Now().Unix())
+				}
 			}
 			}
 		}
 		}
 		gameTarget.IsComplete = -1
 		gameTarget.IsComplete = -1
-		if gameTarget.RetainedComplete+completeTaskData[gameTask.TaskId].HandRetainedComplete >= completeTaskData[gameTask.TaskId].RetainedTarget && gameTarget.PayComplete+completeTaskData[gameTask.TaskId].HandPayComplete >= completeTaskData[gameTask.TaskId].PayTarget && gameTarget.NewComplete+completeTaskData[gameTask.TaskId].HandNewComplete >= completeTaskData[gameTask.TaskId].NewTarget {
+		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
 			gameTarget.IsComplete = 1
 		}
 		}
 		global.GVA_DB.Model(&task.GameTargetComplete{}).Where("task_id = ?", gameTask.TaskId).Where("create_date = ?", date).Omit("create_date", "update_time", "task_id").Updates(gameTarget)
 		global.GVA_DB.Model(&task.GameTargetComplete{}).Where("task_id = ?", gameTask.TaskId).Where("create_date = ?", date).Omit("create_date", "update_time", "task_id").Updates(gameTarget)
@@ -233,10 +244,10 @@ func (s *SyncData) DayTargetDataStatistics() {
 		gameTargetDate.PayTarget = gameTarget.PayTarget
 		gameTargetDate.PayTarget = gameTarget.PayTarget
 		gameTargetDate.NewTarget = gameTarget.NewTarget
 		gameTargetDate.NewTarget = gameTarget.NewTarget
 		gameTargetDate.RetainedTarget = gameTarget.RetainedTarget
 		gameTargetDate.RetainedTarget = gameTarget.RetainedTarget
-		gameTargetDate.PayComplete = gameTarget.PayComplete + gameTarget.HandPayComplete
+		gameTargetDate.PayComplete = gameTarget.PayComplete
 		gameTargetDate.NewComplete = gameTarget.NewComplete + gameTarget.HandNewComplete
 		gameTargetDate.NewComplete = gameTarget.NewComplete + gameTarget.HandNewComplete
 		gameTargetDate.RetainedComplete = gameTarget.RetainedComplete + gameTarget.HandRetainedComplete
 		gameTargetDate.RetainedComplete = gameTarget.RetainedComplete + gameTarget.HandRetainedComplete
-		gameTargetDate.Amount = gameTarget.Amount + gameTarget.HandAmountTotal
+		gameTargetDate.Amount = gameTarget.Amount
 		gameTargetDate.GamePortId = gameTarget.GamePortId
 		gameTargetDate.GamePortId = gameTarget.GamePortId
 		gameTargetDate.User = gameTarget.User
 		gameTargetDate.User = gameTarget.User
 		gameTargetDate.TaskDate = gameTarget.CreateDate
 		gameTargetDate.TaskDate = gameTarget.CreateDate
@@ -297,7 +308,7 @@ func (s *SyncData) TaskMsgSendInitData(ctx context.Context, completesInfo []task
 		lastPayCompletedUpdateTimeKey := fmt.Sprintf(LastPayCompletedUpdateTimeKey, date, complete.TaskId)
 		lastPayCompletedUpdateTimeKey := fmt.Sprintf(LastPayCompletedUpdateTimeKey, date, complete.TaskId)
 		lastNewCompletedUpdateTimeKey := fmt.Sprintf(LastNewCompletedUpdateTimeKey, date, complete.TaskId)
 		lastNewCompletedUpdateTimeKey := fmt.Sprintf(LastNewCompletedUpdateTimeKey, date, complete.TaskId)
 		lastRetainedCompletedUpdateTimeKey := fmt.Sprintf(LastRetainedCompletedUpdateTimeKey, date, complete.TaskId)
 		lastRetainedCompletedUpdateTimeKey := fmt.Sprintf(LastRetainedCompletedUpdateTimeKey, date, complete.TaskId)
-		lastPayAddUpdateTimeKey := fmt.Sprintf(LastPayAddUpdateTimeKey, date, complete.TaskId)
+
 		lastNewCompleted := complete.NewComplete + complete.HandNewComplete //上次新增完成数
 		lastNewCompleted := complete.NewComplete + complete.HandNewComplete //上次新增完成数
 		_ = s.cache.SetCacheStr(ctx, lastNewCompletedKey, lastNewCompleted)
 		_ = s.cache.SetCacheStr(ctx, lastNewCompletedKey, lastNewCompleted)
 		lastPayCompleted := complete.PayComplete + complete.HandPayComplete //上次支付完成数
 		lastPayCompleted := complete.PayComplete + complete.HandPayComplete //上次支付完成数
@@ -311,7 +322,7 @@ func (s *SyncData) TaskMsgSendInitData(ctx context.Context, completesInfo []task
 		//lastRetainedCompletedUpdateTime := complete.NewComplete //上次留存完成更新时间
 		//lastRetainedCompletedUpdateTime := complete.NewComplete //上次留存完成更新时间
 		_ = s.cache.SetCacheStr(ctx, lastRetainedCompletedUpdateTimeKey, ctime)
 		_ = s.cache.SetCacheStr(ctx, lastRetainedCompletedUpdateTimeKey, ctime)
 		//lastPayAddUpdateTime := complete.NewComplete //上次付费增加更新时间
 		//lastPayAddUpdateTime := complete.NewComplete //上次付费增加更新时间
-		_ = s.cache.SetCacheStr(ctx, lastPayAddUpdateTimeKey, ctime)
+
 	}
 	}
 	_ = s.cache.SetCacheStr(ctx, taskCompletedStatusKey, -1)
 	_ = s.cache.SetCacheStr(ctx, taskCompletedStatusKey, -1)
 	_ = s.cache.SetCacheStr(ctx, lastMsgSendTimeKey, time.Now().Unix())
 	_ = s.cache.SetCacheStr(ctx, lastMsgSendTimeKey, time.Now().Unix())
@@ -382,11 +393,12 @@ func (s *SyncData) TaskMsgSendRetainedData(ctx context.Context, completesInfo []
 	}
 	}
 
 
 	var taskStatistics = "%s:taskStatistics"
 	var taskStatistics = "%s:taskStatistics"
-	var retained = "活跃播报 " + time.Now().Format("2006-01-02 15:04:05")
+	var retained = "# 测试活跃播报 "
 	if len(mps) == 0 {
 	if len(mps) == 0 {
 		global.GVA_LOG.Warn(retained)
 		global.GVA_LOG.Warn(retained)
 	}
 	}
-	var errMsg = "以下游戏目标效率为零:"
+	retained += fmt.Sprintf("<font color=\"warning\">%s</font>", time.Now().Format("2006-01-02 15:04:05"))
+	var errMsg = "**以下游戏目标效率为零:**"
 	var errMsgZ = ""
 	var errMsgZ = ""
 	var sendMsg = map[string]string{}
 	var sendMsg = map[string]string{}
 	var m int // 时间内
 	var m int // 时间内
@@ -416,7 +428,8 @@ func (s *SyncData) TaskMsgSendRetainedData(ctx context.Context, completesInfo []
 			sendMsg[name] += "\n"
 			sendMsg[name] += "\n"
 			sendMsg[name] += taskStatistics.GameName
 			sendMsg[name] += taskStatistics.GameName
 			sendMsg[name] += ",新增差"
 			sendMsg[name] += ",新增差"
-			sendMsg[name] += strconv.Itoa(info.AlsoTarget)
+			//sendMsg[name] += strconv.Itoa(info.AlsoTarget)
+			sendMsg[name] += fmt.Sprintf("<font color=\"warning\">%d</font>", info.AlsoTarget)
 			isNew = true
 			isNew = true
 			if info.TimeRate > 60*60*24 {
 			if info.TimeRate > 60*60*24 {
 				lastNewCompletedUpdateTimeKey := fmt.Sprintf(LastNewCompletedUpdateTimeKey, date, info.TaskId)
 				lastNewCompletedUpdateTimeKey := fmt.Sprintf(LastNewCompletedUpdateTimeKey, date, info.TaskId)
@@ -448,7 +461,8 @@ func (s *SyncData) TaskMsgSendRetainedData(ctx context.Context, completesInfo []
 				rm = info.TimeRate / 60
 				rm = info.TimeRate / 60
 			}
 			}
 
 
-			sendMsg[name] += strconv.Itoa(info.AlsoTarget)
+			//sendMsg[name] += strconv.Itoa(info.AlsoTarget)
+			sendMsg[name] += fmt.Sprintf("<font color=\"warning\">%d</font>", info.AlsoTarget)
 			if info.Rate == 0 {
 			if info.Rate == 0 {
 				retainedErr = true
 				retainedErr = true
 			}
 			}
@@ -493,21 +507,31 @@ func (s *SyncData) TaskMsgSendRetainedData(ctx context.Context, completesInfo []
 			sendMsg[name] += strconv.Itoa(m)
 			sendMsg[name] += strconv.Itoa(m)
 			sendMsg[name] += "分钟内完成"
 			sendMsg[name] += "分钟内完成"
 		}
 		}
-		sendMsg[name] += rate
+		//sendMsg[name] += rate
+		sendMsg[name] += fmt.Sprintf("<font color=\"warning\">%s</font>", rate)
 	}
 	}
 
 
+	if len(sendMsg) == 0 {
+		return
+	}
 	for name, msg := range sendMsg {
 	for name, msg := range sendMsg {
 		retained += "\n"
 		retained += "\n"
-		retained += name
+		retained += "**" + name + "**"
 		retained += msg
 		retained += msg
 	}
 	}
 	msg := retained
 	msg := retained
 	if errMsgZ != "" {
 	if errMsgZ != "" {
 		msg += "\n"
 		msg += "\n"
-		msg += errMsg + errMsgZ
+		//msg += errMsg + errMsgZ
+		msg += fmt.Sprintf("<font color=\"warning\">%s</font>", errMsg+errMsgZ)
 	}
 	}
 	global.GVA_LOG.Warn(msg)
 	global.GVA_LOG.Warn(msg)
 	_ = s.cache.SetCacheStr(ctx, lastMsgSendTimeKey, time.Now().Unix())
 	_ = s.cache.SetCacheStr(ctx, lastMsgSendTimeKey, time.Now().Unix())
+	url := "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=7d095d5b-8240-45fd-a68c-baff3628d83b"
+	var sendData SendMsg
+	sendData.MsgType = "markdown"
+	sendData.Markdown.Content = msg
+	s.SendMsgData(url, sendData)
 }
 }
 
 
 func (s *SyncData) TaskMsgSendFreeData(ctx context.Context, completesInfo []task.GameTargetComplete, ctime int64, date, lastFreeMsgSendTimeKey string, isOne bool) {
 func (s *SyncData) TaskMsgSendFreeData(ctx context.Context, completesInfo []task.GameTargetComplete, ctime int64, date, lastFreeMsgSendTimeKey string, isOne bool) {
@@ -552,8 +576,9 @@ func (s *SyncData) TaskMsgSendFreeData(ctx context.Context, completesInfo []task
 		return
 		return
 	}
 	}
 	var taskStatistics = "%s:taskStatistics"
 	var taskStatistics = "%s:taskStatistics"
-	var retained = "付费播报 " + time.Now().Format("2006-01-02 15:04:05")
-	var errMsg = "以下游戏付费效率为零:"
+	var retained = "测试付费播报 "
+	retained += fmt.Sprintf("<font color=\"warning\">%s</font>", time.Now().Format("2006-01-02 15:04:05"))
+	var errMsg = "**以下游戏付费效率为零:**"
 	var errMsgZ = ""
 	var errMsgZ = ""
 	var sendMsg = map[string]string{}
 	var sendMsg = map[string]string{}
 	var m int //时间内
 	var m int //时间内
@@ -580,11 +605,13 @@ func (s *SyncData) TaskMsgSendFreeData(ctx context.Context, completesInfo []task
 		sendMsg[name] += "\n"
 		sendMsg[name] += "\n"
 		sendMsg[name] += taskStatistics.GameName
 		sendMsg[name] += taskStatistics.GameName
 		sendMsg[name] += ",付费差"
 		sendMsg[name] += ",付费差"
-		sendMsg[name] += strconv.Itoa(data.AlsoTarget)
+		//sendMsg[name] += strconv.Itoa(data.AlsoTarget)
+		sendMsg[name] += fmt.Sprintf("<font color=\"warning\">%d</font>", data.AlsoTarget)
 
 
 		if data.TimeRate > 60*60*24 {
 		if data.TimeRate > 60*60*24 {
 			lastPayCompletedUpdateTimeKey := fmt.Sprintf(LastPayCompletedUpdateTimeKey, date, data.TaskId)
 			lastPayCompletedUpdateTimeKey := fmt.Sprintf(LastPayCompletedUpdateTimeKey, date, data.TaskId)
 			_ = s.cache.SetCacheStr(ctx, lastPayCompletedUpdateTimeKey, ctime) //上次付费更新时间
 			_ = s.cache.SetCacheStr(ctx, lastPayCompletedUpdateTimeKey, ctime) //上次付费更新时间
+			data.TimeRate = 60 * 60 * 2
 		}
 		}
 		// 5分钟数据没动报异常数据
 		// 5分钟数据没动报异常数据
 		if data.TimeRate/60 >= 4 {
 		if data.TimeRate/60 >= 4 {
@@ -613,7 +640,11 @@ func (s *SyncData) TaskMsgSendFreeData(ctx context.Context, completesInfo []task
 			sendMsg[name] += strconv.Itoa(m)
 			sendMsg[name] += strconv.Itoa(m)
 			sendMsg[name] += "分钟内完成"
 			sendMsg[name] += "分钟内完成"
 		}
 		}
-		sendMsg[name] += strconv.Itoa(data.Rate)
+		//sendMsg[name] += strconv.Itoa(data.Rate)
+		sendMsg[name] += fmt.Sprintf("<font color=\"warning\">%d</font>", data.Rate)
+	}
+	if len(sendMsg) == 0 {
+		return
 	}
 	}
 	for name, msg := range sendMsg {
 	for name, msg := range sendMsg {
 		retained += "\n"
 		retained += "\n"
@@ -623,10 +654,21 @@ func (s *SyncData) TaskMsgSendFreeData(ctx context.Context, completesInfo []task
 	msg := retained
 	msg := retained
 	if errMsgZ != "" {
 	if errMsgZ != "" {
 		msg += "\n"
 		msg += "\n"
-		msg += errMsg + errMsgZ
+		//msg += errMsg + errMsgZ
+		msg += fmt.Sprintf("<font color=\"warning\">%s</font>", errMsg+errMsgZ)
 	}
 	}
 	global.GVA_LOG.Warn(msg)
 	global.GVA_LOG.Warn(msg)
 	_ = s.cache.SetCacheStr(ctx, lastFreeMsgSendTimeKey, time.Now().Unix())
 	_ = s.cache.SetCacheStr(ctx, lastFreeMsgSendTimeKey, time.Now().Unix())
+	url := "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=7d095d5b-8240-45fd-a68c-baff3628d83b"
+	var sendData SendMsg
+	sendData.MsgType = "markdown"
+	sendData.Markdown.Content = msg
+	s.SendMsgData(url, sendData)
+	return
+}
+
+func (s *SyncData) SendMsgData(url string, params interface{}) {
+	_, _ = utils.HttpPost(url, params)
 	return
 	return
 }
 }
 
 
@@ -701,13 +743,27 @@ func (s *SyncData) CheckTaskCompletedInfo() {
 	ctx := context.Background()
 	ctx := context.Background()
 	taskCompletedStatusKey := fmt.Sprintf(TaskCompletedStatusKey, date)
 	taskCompletedStatusKey := fmt.Sprintf(TaskCompletedStatusKey, date)
 	completesInfo, err := s.TaskNoCompleteDate(date)
 	completesInfo, err := s.TaskNoCompleteDate(date)
-
 	if err != nil {
 	if err != nil {
 		global.GVA_LOG.Error("CheckTaskCompletedInfo查询任务数据报错", zap.Error(err))
 		global.GVA_LOG.Error("CheckTaskCompletedInfo查询任务数据报错", zap.Error(err))
+		return
+	}
+	status, _ := s.cache.GetCacheNum(ctx, taskCompletedStatusKey)
+	if status == 1 {
+		global.GVA_LOG.Info("任务已完成")
+		return
 	}
 	}
 	if len(completesInfo) == 0 {
 	if len(completesInfo) == 0 {
 		global.GVA_LOG.Info("TaskMsgSend没有查询到未完成数据")
 		global.GVA_LOG.Info("TaskMsgSend没有查询到未完成数据")
-		time.Sleep(time.Minute * 1)
+		time.Sleep(time.Second * 10)
 		_ = s.cache.SetCacheStr(ctx, taskCompletedStatusKey, 1)
 		_ = s.cache.SetCacheStr(ctx, taskCompletedStatusKey, 1)
+		msg := "# 测试监控报警 "
+		msg += fmt.Sprintf("<font color=\"warning\">%s</font>", time.Now().Format("2006-01-02 15:04:05"))
+		msg += "\n"
+		msg += "今日任务目标已完成"
+		url := "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=7d095d5b-8240-45fd-a68c-baff3628d83b"
+		var sendData SendMsg
+		sendData.MsgType = "markdown"
+		sendData.Markdown.Content = msg
+		s.SendMsgData(url, sendData)
 	}
 	}
 }
 }