sync_data.go 53 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441
  1. package task
  2. import (
  3. "context"
  4. "encoding/json"
  5. "errors"
  6. "fmt"
  7. "github.com/go-redis/redis/v8"
  8. "go.uber.org/zap"
  9. "gorm.io/gorm"
  10. "log-server/global"
  11. "log-server/model/log/request"
  12. "log-server/model/task"
  13. "log-server/model/task/control"
  14. request2 "log-server/model/task/request"
  15. "log-server/model/typeManage"
  16. "log-server/service/cache"
  17. "log-server/utils"
  18. "strconv"
  19. "strings"
  20. "time"
  21. )
  22. type SyncData struct {
  23. GameTask GameTask
  24. cache cache.Cache
  25. common Common
  26. Person typeManage.ResponsiblePerson
  27. }
  28. func (s *SyncData) SyncXmyGameData(date string) (mps map[int]control.XmyPayRequestReplyData, err error) {
  29. xmyUrl := "http://api.sheepsdk.17xmy.com/foreign/api/get_youhua_data.php"
  30. xmyParams := map[string]string{
  31. "start_day": date,
  32. "end_day": date,
  33. }
  34. requestData := new(control.XmyReply)
  35. xmyByteData, err := utils.HttpGet(xmyUrl, xmyParams)
  36. if err != nil {
  37. return
  38. }
  39. _ = json.Unmarshal(xmyByteData, &requestData)
  40. mps = map[int]control.XmyPayRequestReplyData{}
  41. for _, data := range requestData.Data.List {
  42. gameId, _ := strconv.Atoi(data.GameId)
  43. mps[gameId] = data
  44. }
  45. return
  46. }
  47. func (s *SyncData) SyncXmyFreeData(date string, gameId int) (num int, err error) {
  48. xmyFreeUrl := "http://rtd.kfzs.com/fake.php"
  49. xmyFreeParams := map[string]string{
  50. "day": date,
  51. "game_id": strconv.Itoa(gameId),
  52. }
  53. requestData := new(control.XmyFreeReply)
  54. xmyByteData, err := utils.HttpGet(xmyFreeUrl, xmyFreeParams)
  55. if err != nil {
  56. return
  57. }
  58. _ = json.Unmarshal(xmyByteData, &requestData)
  59. if len(requestData.Data) != 0 {
  60. num, _ = strconv.Atoi(requestData.Data[0].Num)
  61. }
  62. return
  63. }
  64. func (s *SyncData) SyncWslGameData(date string) (mps map[string]int, err error) {
  65. wslUrl := "http://148.70.251.170/wsl-A/get_sheep_pay.php"
  66. wslParams := map[string]string{
  67. "times": date,
  68. }
  69. var requestData []control.WslReply
  70. wslByteData, err := utils.HttpGet(wslUrl, wslParams)
  71. if err != nil {
  72. return
  73. }
  74. _ = json.Unmarshal(wslByteData, &requestData)
  75. mps = map[string]int{}
  76. for _, data := range requestData {
  77. num, _ := strconv.Atoi(data.Money)
  78. mps[data.GameId] = num
  79. }
  80. return
  81. }
  82. var taskStatistics = "%s:taskStatistics"
  83. func (s *SyncData) SyncRoomData(date string, gameIdInt int) (ts request.TaskStatistics, err error) {
  84. ctx := context.Background()
  85. key := fmt.Sprintf(taskStatistics, date)
  86. gameIdStr := strconv.Itoa(gameIdInt)
  87. data, err := global.GVA_REDIS.HGet(ctx, key, gameIdStr).Result()
  88. if err != nil {
  89. if err == redis.Nil {
  90. global.GVA_LOG.Info("SyncRoomData not data", zap.Error(err))
  91. } else {
  92. global.GVA_LOG.Error("SyncRoomData fail", zap.Error(err))
  93. return
  94. }
  95. }
  96. _ = json.Unmarshal([]byte(data), &ts)
  97. return
  98. }
  99. // 获取任务完成数据
  100. func (s *SyncData) CompleteTaskData(date string) (mps map[int]task.GameTargetComplete, err error) {
  101. db := global.GVA_DB.Table("game_target_complete")
  102. db = db.Where("create_date = ?", date)
  103. var apiList []task.GameTargetComplete
  104. mps = map[int]task.GameTargetComplete{}
  105. err = db.Order("id desc").Find(&apiList).Error
  106. for _, api := range apiList {
  107. mps[api.TaskId] = api
  108. }
  109. return
  110. }
  111. // 同步每天的任务基础数据
  112. func (s *SyncData) EveryDaySyncTaskData() {
  113. db := global.GVA_DB.Model(&task.GameTask{})
  114. var apiList []task.GameTask
  115. db = db.Where("is_del = ?", -1)
  116. db = db.Where("status = ?", 1)
  117. err := db.Order("id desc").Find(&apiList).Error
  118. if err != nil {
  119. global.GVA_LOG.Error("EveryDaySyncTaskData fail", zap.Error(err))
  120. return
  121. }
  122. date := time.Now().Add(+time.Hour * 24)
  123. var gameTargetCompletes []*task.GameTargetComplete
  124. for _, gameTask := range apiList {
  125. if !errors.Is(global.GVA_DB.Where("task_id = ?", gameTask.TaskId).Where("create_date = ?", date).First(&task.GameTargetComplete{}).Error, gorm.ErrRecordNotFound) {
  126. continue
  127. }
  128. gameTargetComplete := s.GameTask.CreateGameTargetCompleteModel(gameTask, date)
  129. gameTargetCompletes = append(gameTargetCompletes, gameTargetComplete)
  130. }
  131. err = global.GVA_DB.Model(&task.GameTargetComplete{}).Omit("update_time", "game_rate", "is_complete").Create(gameTargetCompletes).Error
  132. if err != nil {
  133. global.GVA_LOG.Error("create GameTargetComplete fail", zap.Error(err))
  134. return
  135. }
  136. return
  137. }
  138. // 定时同步机房群控、小绵羊数据
  139. func (s *SyncData) SyncTaskData() {
  140. db := global.GVA_DB.Model(&task.GameTask{})
  141. var apiList []task.GameTask
  142. db = db.Where("is_del = ?", -1)
  143. db = db.Where("status = ?", 1)
  144. err := db.Order("id desc").Find(&apiList).Error
  145. if err != nil {
  146. global.GVA_LOG.Error("EveryDaySyncTaskData fail", zap.Error(err))
  147. return
  148. }
  149. if len(apiList) == 0 {
  150. global.GVA_LOG.Info("没有任务数据")
  151. return
  152. }
  153. date := time.Now().Format("2006-01-02")
  154. xmyGameData, err := s.SyncXmyGameData(date)
  155. if err != nil {
  156. global.GVA_LOG.Error("SyncTaskData get xmy data fail", zap.Error(err))
  157. return
  158. }
  159. completeTaskData, err := s.CompleteTaskData(date)
  160. if err != nil {
  161. global.GVA_LOG.Error("CompleteTaskData get data fail", zap.Error(err))
  162. return
  163. }
  164. wslData, err := s.SyncWslGameData(date)
  165. if err != nil {
  166. global.GVA_LOG.Error("SyncWslGameData get wsl data fail", zap.Error(err))
  167. return
  168. }
  169. for _, gameTask := range apiList {
  170. var gameTarget task.GameTargetComplete
  171. roomData, _ := s.SyncRoomData(date, gameTask.TaskId)
  172. if gameTask.GameIdXmy != "" {
  173. gameIdXmy, _ := strconv.Atoi(gameTask.GameIdXmy)
  174. xmyGameInfo := xmyGameData[gameIdXmy]
  175. gameTarget.NewComplete, _ = strconv.Atoi(xmyGameInfo.UserNum)
  176. gameTarget.PayComplete, _ = strconv.Atoi(xmyGameInfo.Cnt)
  177. gameTarget.RetainedComplete, _ = strconv.Atoi(xmyGameInfo.ActiveUserNum)
  178. f, _ := strconv.ParseFloat(xmyGameInfo.Amount, 64)
  179. gameTarget.Amount = int(f)
  180. num, _ := s.SyncXmyFreeData(date, gameIdXmy)
  181. if num != 0 {
  182. gameTarget.PayTarget = num
  183. if gameTarget.PayTarget > completeTaskData[gameTask.TaskId].PayTarget {
  184. lastPayAddUpdateTimeKey := fmt.Sprintf(LastPayAddUpdateTimeKey, date, gameTask.TaskId)
  185. _ = s.cache.SetCacheStr(context.Background(), lastPayAddUpdateTimeKey, time.Now().Unix())
  186. // 本次加付费目标数据
  187. lastPayAddNumKey := fmt.Sprintf(LastPayAddNumKey, date, gameTask.TaskId)
  188. _ = s.cache.SetCacheStr(context.Background(), lastPayAddNumKey, gameTarget.PayTarget-completeTaskData[gameTask.TaskId].PayTarget)
  189. payErrAddNumKey := fmt.Sprintf(PayErrAddNumKey, date, gameTask.TaskId)
  190. diffNum := gameTarget.PayTarget - completeTaskData[gameTask.TaskId].PayTarget
  191. s.common.SaveGameAddFee(diffNum, gameTarget.PayTarget, gameTask.TaskName)
  192. go s.common.FreeSendMsg(diffNum, gameTarget.PayTarget, gameTask.TaskId, gameTask.TaskName, gameTask.User)
  193. // 如果当前付费目标完成,加入一下逻辑
  194. if completeTaskData[gameTask.TaskId].PayTarget <= completeTaskData[gameTask.TaskId].PayComplete {
  195. lastPayCompletedUpdateTimeKey := fmt.Sprintf(LastPayCompletedUpdateTimeKey, date, gameTask.TaskId)
  196. _ = s.cache.SetCacheStr(context.Background(), lastPayCompletedUpdateTimeKey, time.Now().Unix())
  197. _ = s.cache.SetCacheStr(context.Background(), payErrAddNumKey, gameTarget.PayTarget-completeTaskData[gameTask.TaskId].PayTarget)
  198. } else {
  199. n, _ := s.cache.GetCacheNum(context.Background(), payErrAddNumKey)
  200. _ = s.cache.SetCacheStr(context.Background(), payErrAddNumKey, gameTarget.PayTarget-completeTaskData[gameTask.TaskId].PayTarget+n)
  201. }
  202. }
  203. }
  204. } else {
  205. gameTarget.NewComplete = roomData.NewCompleteLocal
  206. gameTarget.PayComplete = roomData.PayCompleteLocal
  207. gameTarget.RetainedComplete = roomData.NewCompleteLocal + roomData.RetainedCompleteLocal
  208. gameTarget.Amount = gameTask.PayPrice * roomData.PayCompleteLocal
  209. if gameTarget.RetainedComplete < roomData.RetainedComplete {
  210. gameTarget.RetainedComplete = roomData.RetainedComplete
  211. }
  212. }
  213. gameTarget.GameRate = roomData.GameRate
  214. if gameTask.GamePortId == 5 && gameTask.LoginMethod == 2 {
  215. mzGameId := gameTask.MzGameId + "-" + gameTask.MzChannel
  216. if _, ok := wslData[mzGameId]; ok {
  217. gameTarget.PayTarget = wslData[mzGameId]
  218. if gameTarget.PayTarget > completeTaskData[gameTask.TaskId].PayTarget {
  219. lastPayAddUpdateTimeKey := fmt.Sprintf(LastPayAddUpdateTimeKey, date, gameTask.TaskId)
  220. _ = s.cache.SetCacheStr(context.Background(), lastPayAddUpdateTimeKey, time.Now().Unix())
  221. // 本次加付费目标数据
  222. lastPayAddNumKey := fmt.Sprintf(LastPayAddNumKey, date, gameTask.TaskId)
  223. _ = s.cache.SetCacheStr(context.Background(), lastPayAddNumKey, gameTarget.PayTarget-completeTaskData[gameTask.TaskId].PayTarget)
  224. payErrAddNumKey := fmt.Sprintf(PayErrAddNumKey, date, gameTask.TaskId)
  225. diffNum := gameTarget.PayTarget - completeTaskData[gameTask.TaskId].PayTarget
  226. s.common.SaveGameAddFee(diffNum, gameTarget.PayTarget, gameTask.TaskName)
  227. go s.common.FreeSendMsg(diffNum, gameTarget.PayTarget, gameTask.TaskId, gameTask.TaskName, gameTask.User)
  228. // 如果当前付费目标完成,加入一下逻辑
  229. if completeTaskData[gameTask.TaskId].PayTarget <= completeTaskData[gameTask.TaskId].PayComplete {
  230. lastPayCompletedUpdateTimeKey := fmt.Sprintf(LastPayCompletedUpdateTimeKey, date, gameTask.TaskId)
  231. _ = s.cache.SetCacheStr(context.Background(), lastPayCompletedUpdateTimeKey, time.Now().Unix())
  232. _ = s.cache.SetCacheStr(context.Background(), payErrAddNumKey, gameTarget.PayTarget-completeTaskData[gameTask.TaskId].PayTarget)
  233. } else {
  234. n, _ := s.cache.GetCacheNum(context.Background(), payErrAddNumKey)
  235. _ = s.cache.SetCacheStr(context.Background(), payErrAddNumKey, gameTarget.PayTarget-completeTaskData[gameTask.TaskId].PayTarget+n)
  236. }
  237. }
  238. }
  239. }
  240. gameTarget.IsComplete = -1
  241. 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 {
  242. gameTarget.IsComplete = 1
  243. }
  244. global.GVA_DB.Model(&task.GameTargetComplete{}).Where("task_id = ?", gameTask.TaskId).Where("create_date = ?", date).Omit("create_date", "update_time", "task_id").Updates(gameTarget)
  245. }
  246. return
  247. }
  248. func (s *SyncData) DayTargetDataStatistics() {
  249. date := time.Now().Add(-time.Hour * 24).Format("2006-01-02")
  250. request1 := request2.GameTaskStatisticsRequest{
  251. GroupKey: "user,gt.game_port_id",
  252. Date: date,
  253. }
  254. gameTargets, err := s.GameTask.EveryDayTargetData(date, request1)
  255. if err != nil {
  256. global.GVA_LOG.Error("DayTargetDataStatistics 统计数据失败", zap.Error(err))
  257. return
  258. }
  259. if len(gameTargets) == 0 {
  260. global.GVA_LOG.Info("没有数据统计", zap.Error(err))
  261. return
  262. }
  263. var gameTargetDates []task.GameTargetStatistics
  264. for _, gameTarget := range gameTargets {
  265. var gameTargetDate task.GameTargetStatistics
  266. gameTargetDate.PayTarget = gameTarget.PayTarget
  267. gameTargetDate.NewTarget = gameTarget.NewTarget
  268. gameTargetDate.RetainedTarget = gameTarget.RetainedTarget
  269. gameTargetDate.PayComplete = gameTarget.PayComplete
  270. gameTargetDate.NewComplete = gameTarget.NewComplete + gameTarget.HandNewComplete
  271. gameTargetDate.RetainedComplete = gameTarget.RetainedComplete + gameTarget.HandRetainedComplete
  272. gameTargetDate.Amount = gameTarget.Amount
  273. gameTargetDate.GamePortId = gameTarget.GamePortId
  274. gameTargetDate.User = gameTarget.User
  275. gameTargetDate.TaskDate = gameTarget.CreateDate
  276. if !errors.Is(global.GVA_DB.Where("user = ?", gameTarget.User).Where("task_date = ?", gameTarget.CreateDate).Where("game_port_id = ?", gameTarget.GamePortId).First(&task.GameTargetStatistics{}).Error, gorm.ErrRecordNotFound) {
  277. err := global.GVA_DB.Where("user = ?", gameTarget.User).Where("task_date = ?", gameTarget.CreateDate).Where("game_port_id = ?", gameTarget.GamePortId).Omit("update_time", "task_date", "user", "game_port_id", "task_month", "task_year").Updates(&gameTargetDate).Error
  278. if err != nil {
  279. global.GVA_LOG.Error("DayTargetDataStatistics 更新统计数据失败", zap.Error(err))
  280. }
  281. continue
  282. }
  283. year, month, _ := time.Now().Date()
  284. gameTargetDate.TaskMonth = int(month)
  285. gameTargetDate.TaskYear = year
  286. gameTargetDates = append(gameTargetDates, gameTargetDate)
  287. }
  288. if len(gameTargetDates) < 1 {
  289. return
  290. }
  291. global.GVA_DB.Omit("update_time").Create(gameTargetDates)
  292. }
  293. var LastMsgSendTimeKey = "%s:lastMsgSendTime" // 上次活跃发送消息时间
  294. var LastNewCompletedKey = "%s:msgSendInfo:%d:lastNewCompleted" // 最后新增完成数量
  295. var LastPayCompletedKey = "%s:msgSendInfo:%d:lastPayCompleted" // 最后支付完成数量
  296. var LastRetainedCompletedKey = "%s:msgSendInfo:%d:lastRetainedCompleted" // 最后留存完成数量
  297. var LastNewCompletedUpdateTimeKey = "%s:msgSendInfo:%d:lastNewCompletedUpdateTime" // 最后新增完成更新时间
  298. var LastPayCompletedUpdateTimeKey = "%s:msgSendInfo:%d:lastPayCompletedUpdateTime" // 最后支付完成更新时间
  299. var LastRetainedCompletedUpdateTimeKey = "%s:msgSendInfo:%d:lastRetainedCompletedUpdateTime" // 最后留存完成更新时间
  300. var LastPayAddUpdateTimeKey = "%s:msgSendInfo:%d:lastPayAddUpdateTime" // 最后加付费时间
  301. var LastPayAddNumKey = "%s:msgSendInfo:%d:lastPayAddNum" // 最后加付费数量
  302. var PayErrAddNumKey = "%s:msgSendInfo:%d:PayErrAddNum" // 支付异常累加数量
  303. var TaskCompletedStatusKey = "%s:taskCompletedStatus" // 任务完成状态-1,1
  304. var LastFreeMsgSendTimeKey = "%s:lastFreeMsgSendTime" // 上次付费发送消息时间
  305. var LastDirectorMsgSendTimeKey = "%s:lastDirectorMsgSendTime:%d" // 上次负责人活跃发送消息时间
  306. var LastFreeDirectorMsgSendTimeKey = "%s:lastFreeDirectorMsgSendTime:%d" // 上次负责人付费发送消息时间
  307. type CompletedInfo struct {
  308. AlsoTarget int //剩余数量
  309. Rate int //时间段做的任务数
  310. TimeRate int // 完成任务数据更新时间
  311. TaskId int
  312. AddPayUpdateTime int
  313. }
  314. // 获取未完成的任务数据
  315. func (s *SyncData) TaskNoCompleteDate(date string) (completesInfo []task.GameTargetComplete, err error) {
  316. db := global.GVA_DB.Table("game_target_complete")
  317. db = db.Where("is_complete = ?", -1)
  318. db = db.Where("create_date = ?", date)
  319. err = db.Find(&completesInfo).Error
  320. if err != nil {
  321. return
  322. }
  323. return
  324. }
  325. func (s *SyncData) TaskMsgSendInitData(ctx context.Context, completesInfo []task.GameTargetComplete, ctime int64, date, taskCompletedStatusKey, lastMsgSendTimeKey string) {
  326. for _, complete := range completesInfo {
  327. lastNewCompletedKey := fmt.Sprintf(LastNewCompletedKey, date, complete.TaskId)
  328. lastPayCompletedKey := fmt.Sprintf(LastPayCompletedKey, date, complete.TaskId)
  329. lastRetainedCompletedKey := fmt.Sprintf(LastRetainedCompletedKey, date, complete.TaskId)
  330. lastPayCompletedUpdateTimeKey := fmt.Sprintf(LastPayCompletedUpdateTimeKey, date, complete.TaskId)
  331. lastNewCompletedUpdateTimeKey := fmt.Sprintf(LastNewCompletedUpdateTimeKey, date, complete.TaskId)
  332. lastRetainedCompletedUpdateTimeKey := fmt.Sprintf(LastRetainedCompletedUpdateTimeKey, date, complete.TaskId)
  333. lastNewCompleted := complete.NewComplete + complete.HandNewComplete //上次新增完成数
  334. _ = s.cache.SetCacheStr(ctx, lastNewCompletedKey, lastNewCompleted)
  335. lastPayCompleted := complete.PayComplete + complete.HandPayComplete //上次支付完成数
  336. _ = s.cache.SetCacheStr(ctx, lastPayCompletedKey, lastPayCompleted)
  337. lastRetainedCompleted := complete.RetainedComplete + complete.HandRetainedComplete //上次活跃完成数
  338. _ = s.cache.SetCacheStr(ctx, lastRetainedCompletedKey, lastRetainedCompleted)
  339. //lastNewCompletedUpdateTime := complete.NewComplete //上次新增完成更新时间
  340. _ = s.cache.SetCacheStr(ctx, lastNewCompletedUpdateTimeKey, ctime)
  341. //lastPayCompletedUpdateTime := complete.NewComplete //上次支付完成更新时间
  342. _ = s.cache.SetCacheStr(ctx, lastPayCompletedUpdateTimeKey, ctime)
  343. //lastRetainedCompletedUpdateTime := complete.NewComplete //上次留存完成更新时间
  344. _ = s.cache.SetCacheStr(ctx, lastRetainedCompletedUpdateTimeKey, ctime)
  345. //lastPayAddUpdateTime := complete.NewComplete //上次付费增加更新时间
  346. }
  347. _ = s.cache.SetCacheStr(ctx, taskCompletedStatusKey, -1)
  348. _ = s.cache.SetCacheStr(ctx, lastMsgSendTimeKey, time.Now().Unix())
  349. }
  350. func (s *SyncData) TaskMsgSendRetainedData(ctx context.Context, completesInfo []task.GameTargetComplete, ctime int64, date, lastMsgSendTimeKey string) {
  351. var mps = make(map[int]map[string]CompletedInfo)
  352. lastMsgSendTime, _ := s.cache.GetCacheNum(ctx, lastMsgSendTimeKey)
  353. for _, complete := range completesInfo {
  354. lastNewCompletedKey := fmt.Sprintf(LastNewCompletedKey, date, complete.TaskId)
  355. lastRetainedCompletedKey := fmt.Sprintf(LastRetainedCompletedKey, date, complete.TaskId)
  356. lastNewCompletedUpdateTimeKey := fmt.Sprintf(LastNewCompletedUpdateTimeKey, date, complete.TaskId)
  357. lastRetainedCompletedUpdateTimeKey := fmt.Sprintf(LastRetainedCompletedUpdateTimeKey, date, complete.TaskId)
  358. currentNewCompleted := complete.NewComplete + complete.HandNewComplete
  359. currentRetainedCompleted := complete.RetainedComplete + complete.HandRetainedComplete
  360. var RateMp = make(map[string]CompletedInfo)
  361. var newBool = false
  362. var retainedBoll = false
  363. // 处理新增
  364. if complete.NewTarget > currentNewCompleted {
  365. lastNewCompleted, _ := s.cache.GetCacheNum(ctx, lastNewCompletedKey)
  366. alsoNewTarget := complete.NewTarget - currentNewCompleted
  367. newRate := 0
  368. lastNewCompletedUpdateTime, _ := s.cache.GetCacheNum(ctx, lastNewCompletedUpdateTimeKey)
  369. timeRate := int(ctime) - lastNewCompletedUpdateTime
  370. if lastNewCompleted < currentNewCompleted {
  371. newRate = currentNewCompleted - lastNewCompleted
  372. _ = s.cache.SetCacheStr(ctx, lastNewCompletedKey, currentNewCompleted)
  373. _ = s.cache.SetCacheStr(ctx, lastNewCompletedUpdateTimeKey, ctime) //上次新增完成更新时间
  374. }
  375. RateMp["newRate"] = CompletedInfo{
  376. AlsoTarget: alsoNewTarget,
  377. Rate: newRate,
  378. TimeRate: timeRate,
  379. TaskId: complete.TaskId,
  380. }
  381. } else {
  382. newBool = true
  383. // 如果当前新增为0,或者完成也更新时间
  384. _ = s.cache.SetCacheStr(ctx, lastNewCompletedUpdateTimeKey, ctime) //上次新增完成更新时间
  385. }
  386. // 处理留存
  387. if complete.RetainedTarget > currentRetainedCompleted {
  388. lastRetainedCompleted, _ := s.cache.GetCacheNum(ctx, lastRetainedCompletedKey)
  389. alsoRetainedTarget := complete.RetainedTarget - currentRetainedCompleted
  390. retainedRate := 0
  391. lastRetainedCompletedUpdateTime, _ := s.cache.GetCacheNum(ctx, lastRetainedCompletedUpdateTimeKey)
  392. timeRate := int(ctime) - lastRetainedCompletedUpdateTime
  393. if lastRetainedCompleted < currentRetainedCompleted {
  394. retainedRate = currentRetainedCompleted - lastRetainedCompleted
  395. _ = s.cache.SetCacheStr(ctx, lastRetainedCompletedKey, currentRetainedCompleted)
  396. _ = s.cache.SetCacheStr(ctx, lastRetainedCompletedUpdateTimeKey, ctime) //上次留存完成更新时间
  397. }
  398. RateMp["retainedRate"] = CompletedInfo{
  399. AlsoTarget: alsoRetainedTarget,
  400. Rate: retainedRate,
  401. TimeRate: timeRate,
  402. TaskId: complete.TaskId,
  403. }
  404. } else {
  405. retainedBoll = true
  406. // 如果当前留存为0,或者完成也更新时间
  407. _ = s.cache.SetCacheStr(ctx, lastRetainedCompletedUpdateTimeKey, ctime) //上次留存完成更新时间
  408. }
  409. if !newBool || !retainedBoll {
  410. mps[complete.TaskId] = RateMp
  411. }
  412. }
  413. var taskStatistics = "%s:taskStatistics"
  414. var retained = "# 活跃播报 "
  415. if len(mps) == 0 {
  416. global.GVA_LOG.Warn(retained)
  417. }
  418. retained += fmt.Sprintf("<font color=\"warning\">%s</font>", time.Now().Format("2006-01-02 15:04:05"))
  419. var errMsg = "**以下游戏目标效率为零:**"
  420. var errMsgZ = ""
  421. var sendMsg = map[string]string{}
  422. var errSendMsg = map[string]string{}
  423. var m int // 时间内
  424. m = (int(ctime) - lastMsgSendTime) / 60
  425. for taskId, data := range mps {
  426. key := fmt.Sprintf(taskStatistics, date)
  427. gameIdStr := strconv.Itoa(taskId)
  428. gameTask, err := global.GVA_REDIS.HGet(ctx, key, gameIdStr).Result()
  429. if err != nil {
  430. if err == redis.Nil {
  431. continue
  432. } else {
  433. global.GVA_LOG.Error("TaskMsgSendRetainedData获取缓存任务数据失败", zap.Error(err))
  434. continue
  435. }
  436. }
  437. var taskStatistics request.TaskStatistics
  438. _ = json.Unmarshal([]byte(gameTask), &taskStatistics)
  439. var eMsg = "" //单条异常数据
  440. var isNew = false
  441. var nm int //新增时间内
  442. var rm int //存时间内
  443. var rate string //效率
  444. var newErr = false
  445. var retainedErr = false
  446. var name = taskStatistics.Remark
  447. if info, ok := data["newRate"]; ok {
  448. sendMsg[name] += "\n"
  449. sendMsg[name] += taskStatistics.GameName
  450. sendMsg[name] += ",新增差"
  451. //sendMsg[name] += strconv.Itoa(info.AlsoTarget)
  452. sendMsg[name] += fmt.Sprintf("<font color=\"warning\">%d</font>", info.AlsoTarget)
  453. isNew = true
  454. if info.TimeRate > 60*60*24 {
  455. lastNewCompletedUpdateTimeKey := fmt.Sprintf(LastNewCompletedUpdateTimeKey, date, info.TaskId)
  456. _ = s.cache.SetCacheStr(ctx, lastNewCompletedUpdateTimeKey, ctime) //上次新增完成更新时间
  457. nm = 1
  458. } else {
  459. nm = info.TimeRate / 60
  460. }
  461. rate = strconv.Itoa(info.Rate)
  462. if info.Rate == 0 {
  463. newErr = true
  464. }
  465. }
  466. if info, ok := data["retainedRate"]; ok {
  467. if !isNew {
  468. sendMsg[name] += "\n"
  469. sendMsg[name] += taskStatistics.GameName
  470. rate = strconv.Itoa(info.Rate)
  471. sendMsg[name] += "活跃差"
  472. } else {
  473. rate += "/" + strconv.Itoa(info.Rate)
  474. sendMsg[name] += ",活跃差"
  475. }
  476. if info.TimeRate > 60*60*24 {
  477. lastRetainedCompletedUpdateTimeKey := fmt.Sprintf(LastRetainedCompletedUpdateTimeKey, date, info.TaskId)
  478. _ = s.cache.SetCacheStr(ctx, lastRetainedCompletedUpdateTimeKey, ctime) //上次留存完成更新时间
  479. rm = 1
  480. } else {
  481. rm = info.TimeRate / 60
  482. }
  483. //sendMsg[name] += strconv.Itoa(info.AlsoTarget)
  484. sendMsg[name] += fmt.Sprintf("<font color=\"warning\">%d</font>", info.AlsoTarget)
  485. if info.Rate == 0 {
  486. retainedErr = true
  487. }
  488. }
  489. // 5分钟数据没动报异常数据
  490. if newErr && nm > 4 {
  491. eMsg += "\n"
  492. eMsg += taskStatistics.GameName
  493. eMsg += ",新增"
  494. if nm >= 60 {
  495. eMsg += "("
  496. eMsg += strconv.Itoa(nm / 60)
  497. eMsg += "小时内)"
  498. } else {
  499. eMsg += "("
  500. eMsg += strconv.Itoa(nm)
  501. eMsg += "分钟内)"
  502. }
  503. }
  504. if retainedErr && rm > 4 {
  505. if !newErr {
  506. eMsg += "\n"
  507. eMsg += taskStatistics.GameName
  508. }
  509. eMsg += ",活跃"
  510. if rm >= 60 {
  511. eMsg += "("
  512. eMsg += strconv.Itoa(rm / 60)
  513. eMsg += "小时内)"
  514. } else {
  515. eMsg += "("
  516. eMsg += strconv.Itoa(rm)
  517. eMsg += "分钟内)"
  518. }
  519. }
  520. if eMsg != "" {
  521. errMsgZ += eMsg
  522. errSendMsg[name] += eMsg
  523. }
  524. sendMsg[name] += ","
  525. if m >= 60 {
  526. sendMsg[name] += strconv.Itoa(m / 60)
  527. sendMsg[name] += "小时内完成"
  528. } else {
  529. sendMsg[name] += strconv.Itoa(m)
  530. sendMsg[name] += "分钟内完成"
  531. }
  532. //sendMsg[name] += rate
  533. sendMsg[name] += fmt.Sprintf("<font color=\"warning\">%s</font>", rate)
  534. }
  535. hour := time.Now().Hour()
  536. msg := ""
  537. mpsPerson, _ := s.Person.GetUserInfo()
  538. //b1 ,_ := json.Marshal(mpsPerson)
  539. //global.GVA_LOG.Warn(string(b1))
  540. var mobile []string
  541. if hour >= 16 {
  542. if len(sendMsg) == 0 {
  543. return
  544. }
  545. if len(mps) != 0 && len(errSendMsg) != 0 {
  546. for name, _ := range errSendMsg {
  547. mobile = append(mobile, mpsPerson[name])
  548. }
  549. }
  550. for name, msg := range sendMsg {
  551. retained += "\n"
  552. retained += "**" + name + "**"
  553. retained += msg
  554. }
  555. msg = retained
  556. if errMsgZ != "" {
  557. msg += "\n"
  558. //msg += errMsg + errMsgZ
  559. msg += fmt.Sprintf("<font color=\"warning\">%s</font>", errMsg+errMsgZ)
  560. }
  561. } else {
  562. if errMsgZ != "" {
  563. //msg += errMsg + errMsgZ
  564. }
  565. if len(mps) != 0 && len(errSendMsg) != 0 {
  566. msg += "# 活跃播报 "
  567. msg += errMsg
  568. for name, m := range errSendMsg {
  569. mobile = append(mobile, mpsPerson[name])
  570. msg += "\n"
  571. msg += "**" + name + "**"
  572. msg += fmt.Sprintf("<font color=\"warning\">%s</font>", m)
  573. }
  574. }
  575. }
  576. //global.GVA_LOG.Warn(msg)
  577. _ = s.cache.SetCacheStr(ctx, lastMsgSendTimeKey, time.Now().Unix())
  578. if msg == "" {
  579. return
  580. }
  581. url := global.GVA_CONFIG.SendUrl.ComputerSendUrl
  582. var sendData SendMsg
  583. sendData.MsgType = "markdown"
  584. sendData.Markdown.Content = msg
  585. s.SendMsgData(url, sendData)
  586. if len(mobile) != 0 {
  587. var sendTextData SendTextMsg
  588. sendTextData.MsgType = "text"
  589. sendTextData.Text.MentionedMobileList = mobile
  590. //b ,_ := json.Marshal(sendTextData)
  591. //global.GVA_LOG.Warn(string(b))
  592. s.SendMsgData(url, sendTextData)
  593. }
  594. }
  595. func (s *SyncData) TaskMsgSendFreeData(ctx context.Context, completesInfo []task.GameTargetComplete, ctime int64, date, lastFreeMsgSendTimeKey string, isOne bool) {
  596. var RateMp = make(map[int]CompletedInfo)
  597. lastFreeMsgSendTime, _ := s.cache.GetCacheNum(ctx, lastFreeMsgSendTimeKey)
  598. for _, complete := range completesInfo {
  599. lastPayCompletedKey := fmt.Sprintf(LastPayCompletedKey, date, complete.TaskId)
  600. lastPayCompletedUpdateTimeKey := fmt.Sprintf(LastPayCompletedUpdateTimeKey, date, complete.TaskId)
  601. lastPayAddUpdateTimeKey := fmt.Sprintf(LastPayAddUpdateTimeKey, date, complete.TaskId)
  602. currentPayCompleted := complete.PayComplete + complete.HandPayComplete
  603. // 付费处理
  604. if complete.PayTarget != 0 && complete.PayTarget > currentPayCompleted {
  605. lastPayCompleted, _ := s.cache.GetCacheNum(ctx, lastPayCompletedKey)
  606. alsoPayTarget := complete.PayTarget - currentPayCompleted
  607. payRate := 0
  608. lastPayCompletedUpdateTime, _ := s.cache.GetCacheNum(ctx, lastPayCompletedUpdateTimeKey)
  609. lastPayAddUpdateTime, _ := s.cache.GetCacheNum(ctx, lastPayAddUpdateTimeKey)
  610. timeRate := int(ctime) - lastPayCompletedUpdateTime
  611. if lastPayCompleted < currentPayCompleted {
  612. payRate = currentPayCompleted - lastPayCompleted
  613. _ = s.cache.SetCacheStr(ctx, lastPayCompletedKey, currentPayCompleted)
  614. _ = s.cache.SetCacheStr(ctx, lastPayCompletedUpdateTimeKey, ctime) //上次付费更新时间
  615. }
  616. RateMp[complete.TaskId] = CompletedInfo{
  617. AlsoTarget: alsoPayTarget,
  618. Rate: payRate,
  619. TimeRate: timeRate,
  620. TaskId: complete.TaskId,
  621. AddPayUpdateTime: lastPayAddUpdateTime,
  622. }
  623. } else {
  624. // 如果当前付费为0,或者完成也更新时间
  625. _ = s.cache.SetCacheStr(ctx, lastPayCompletedUpdateTimeKey, ctime) //上次付费更新时间
  626. }
  627. }
  628. if isOne {
  629. _ = s.cache.SetCacheStr(ctx, lastFreeMsgSendTimeKey, time.Now().Unix())
  630. return
  631. }
  632. if len(RateMp) == 0 {
  633. global.GVA_LOG.Info("TaskMsgSendFreeData没有查询到未完成付费数据")
  634. return
  635. }
  636. var taskStatistics = "%s:taskStatistics"
  637. var retained = "付费播报 "
  638. retained += fmt.Sprintf("<font color=\"warning\">%s</font>", time.Now().Format("2006-01-02 15:04:05"))
  639. var errMsg = "**以下游戏付费效率为零:**"
  640. var errMsgZ = ""
  641. var sendMsg = map[string]string{}
  642. var m int //时间内
  643. m = (int(ctime) - lastFreeMsgSendTime) / 60
  644. mpsPerson, _ := s.Person.GetUserInfo()
  645. var mobile []string
  646. for taskId, data := range RateMp {
  647. if data.AlsoTarget <= 0 {
  648. continue
  649. }
  650. key := fmt.Sprintf(taskStatistics, date)
  651. gameIdStr := strconv.Itoa(taskId)
  652. gameTask, err := global.GVA_REDIS.HGet(ctx, key, gameIdStr).Result()
  653. if err != nil {
  654. if err == redis.Nil {
  655. continue
  656. } else {
  657. global.GVA_LOG.Error("TaskMsgSendRetainedData获取缓存任务数据失败", zap.Error(err))
  658. continue
  659. }
  660. }
  661. var taskStatistics request.TaskStatistics
  662. _ = json.Unmarshal([]byte(gameTask), &taskStatistics)
  663. var name = taskStatistics.Remark
  664. sendMsg[name] += "\n"
  665. sendMsg[name] += taskStatistics.GameName
  666. sendMsg[name] += ",付费差"
  667. //sendMsg[name] += strconv.Itoa(data.AlsoTarget)
  668. sendMsg[name] += fmt.Sprintf("<font color=\"warning\">%d</font>", data.AlsoTarget)
  669. if data.TimeRate > 60*60*24 {
  670. lastPayCompletedUpdateTimeKey := fmt.Sprintf(LastPayCompletedUpdateTimeKey, date, data.TaskId)
  671. _ = s.cache.SetCacheStr(ctx, lastPayCompletedUpdateTimeKey, ctime) //上次付费更新时间
  672. data.TimeRate = 60 * 60 * 2
  673. }
  674. // 5分钟数据没动报异常数据
  675. if data.TimeRate/60 >= 2 {
  676. if data.Rate == 0 {
  677. lastPayAddNumKey := fmt.Sprintf(LastPayAddNumKey, date, data.TaskId)
  678. payErrAddNumKey := fmt.Sprintf(PayErrAddNumKey, date, data.TaskId)
  679. numErr, _ := s.cache.GetCacheNum(context.Background(), payErrAddNumKey)
  680. lastAddFeeNumErr, _ := s.cache.GetCacheNum(context.Background(), lastPayAddNumKey)
  681. errMsgZ += "\n"
  682. errMsgZ += taskStatistics.GameName
  683. errMsgZ += "("
  684. if data.TimeRate/60 >= 60 {
  685. errMsgZ += strconv.Itoa(data.TimeRate / 60 / 60)
  686. errMsgZ += "小时内(+" + strconv.Itoa(numErr) + "))"
  687. } else {
  688. errMsgZ += strconv.Itoa(data.TimeRate / 60)
  689. errMsgZ += "分钟内(+" + strconv.Itoa(numErr) + "))"
  690. }
  691. errMsgZ += ","
  692. errMsgZ += "最后加付费时间 "
  693. t := time.Unix(int64(data.AddPayUpdateTime), 0)
  694. errMsgZ += t.Format("15:04:05")
  695. errMsgZ += "(+" + strconv.Itoa(lastAddFeeNumErr) + ")"
  696. if _, ok := mpsPerson[name]; ok {
  697. mobile = append(mobile, mpsPerson[name])
  698. }
  699. }
  700. }
  701. sendMsg[name] += ","
  702. if m >= 60 {
  703. sendMsg[name] += strconv.Itoa(m / 60)
  704. sendMsg[name] += "分钟内完成"
  705. } else {
  706. sendMsg[name] += strconv.Itoa(m)
  707. sendMsg[name] += "分钟内完成"
  708. }
  709. //sendMsg[name] += strconv.Itoa(data.Rate)
  710. sendMsg[name] += fmt.Sprintf("<font color=\"warning\">%d</font>", data.Rate)
  711. }
  712. if len(sendMsg) == 0 {
  713. return
  714. }
  715. for name, msg := range sendMsg {
  716. retained += "\n"
  717. retained += name
  718. retained += msg
  719. }
  720. msg := retained
  721. if errMsgZ != "" {
  722. msg += "\n"
  723. //msg += errMsg + errMsgZ
  724. msg += fmt.Sprintf("<font color=\"warning\">%s</font>", errMsg+errMsgZ)
  725. }
  726. _ = s.cache.SetCacheStr(ctx, lastFreeMsgSendTimeKey, time.Now().Unix())
  727. url := global.GVA_CONFIG.SendUrl.ComputerSendUrl
  728. var sendData SendMsg
  729. sendData.MsgType = "markdown"
  730. sendData.Markdown.Content = msg
  731. s.SendMsgData(url, sendData)
  732. if len(mobile) != 0 {
  733. var sendTextData SendTextMsg
  734. sendTextData.MsgType = "text"
  735. sendTextData.Text.MentionedMobileList = mobile
  736. s.SendMsgData(url, sendTextData)
  737. }
  738. return
  739. }
  740. func (s *SyncData) SendMsgData(url string, params interface{}) {
  741. _, _ = utils.HttpPost(url, params)
  742. return
  743. }
  744. //活跃新增数据推送
  745. func (s *SyncData) TaskMsgSend() {
  746. date := time.Now().Format("2006-01-02")
  747. ctx := context.Background()
  748. taskCompletedStatusKey := fmt.Sprintf(TaskCompletedStatusKey, date)
  749. taskCompletedStatus, _ := s.cache.GetCacheNum(ctx, taskCompletedStatusKey)
  750. if taskCompletedStatus == 1 {
  751. return
  752. }
  753. completesInfo, err := s.TaskNoCompleteDate(date)
  754. if err != nil {
  755. global.GVA_LOG.Error("TaskMsgSend查询任务数据报错", zap.Error(err))
  756. }
  757. if len(completesInfo) == 0 {
  758. global.GVA_LOG.Info("TaskMsgSend没有查询到未完成数据")
  759. }
  760. lastMsgSendTimeKey := fmt.Sprintf(LastMsgSendTimeKey, date)
  761. b, err := s.cache.ExistsKey(context.Background(), lastMsgSendTimeKey)
  762. if err != nil {
  763. global.GVA_LOG.Error("TaskMsgSend查询任务数据报错", zap.Error(err))
  764. return
  765. }
  766. ctime := time.Now().Unix()
  767. if !b {
  768. s.TaskMsgSendInitData(ctx, completesInfo, ctime, date, taskCompletedStatusKey, lastMsgSendTimeKey)
  769. } else {
  770. lastMsgSendTime, _ := s.cache.GetCacheNum(ctx, lastMsgSendTimeKey)
  771. if int(ctime)-lastMsgSendTime < 60 {
  772. global.GVA_LOG.Error("TaskMsgSend上次数据发送时间还没到5分钟", zap.Error(err))
  773. return
  774. }
  775. //s.TaskMsgSendRetainedData(ctx, completesInfo, ctime, date, lastMsgSendTimeKey)
  776. s.TaskMsgSendRetainedDataUpdate(ctx, completesInfo, ctime, date, lastMsgSendTimeKey)
  777. }
  778. }
  779. //活跃新增数据推送
  780. func (s *SyncData) TaskFreeMsgSend() {
  781. date := time.Now().Format("2006-01-02")
  782. ctx := context.Background()
  783. taskCompletedStatusKey := fmt.Sprintf(TaskCompletedStatusKey, date)
  784. taskCompletedStatus, _ := s.cache.GetCacheNum(ctx, taskCompletedStatusKey)
  785. if taskCompletedStatus == 1 {
  786. return
  787. }
  788. completesInfo, err := s.TaskNoCompleteDate(date)
  789. if err != nil {
  790. global.GVA_LOG.Error("TaskMsgSend查询任务数据报错", zap.Error(err))
  791. }
  792. if len(completesInfo) == 0 {
  793. global.GVA_LOG.Info("TaskMsgSend没有查询到未完成数据")
  794. }
  795. lastFreeMsgSendTimeKey := fmt.Sprintf(LastFreeMsgSendTimeKey, date)
  796. ctime := time.Now().Unix()
  797. lastFreeMsgSendTime, _ := s.cache.GetCacheNum(ctx, lastFreeMsgSendTimeKey)
  798. if int(ctime)-lastFreeMsgSendTime < 60 {
  799. global.GVA_LOG.Error("TaskMsgSend上次数据发送时间还没到5分钟", zap.Error(err))
  800. return
  801. }
  802. var isOne = false
  803. if lastFreeMsgSendTime == 0 {
  804. isOne = true
  805. }
  806. //s.TaskMsgSendFreeData(ctx, completesInfo, ctime, date, lastFreeMsgSendTimeKey, isOne)
  807. s.TaskMsgSendFreeDataUpdate(ctx, completesInfo, ctime, date, lastFreeMsgSendTimeKey, isOne)
  808. }
  809. func (s *SyncData) CheckTaskCompletedInfo() {
  810. date := time.Now().Format("2006-01-02")
  811. ctx := context.Background()
  812. taskCompletedStatusKey := fmt.Sprintf(TaskCompletedStatusKey, date)
  813. completesInfo, err := s.TaskNoCompleteDate(date)
  814. if err != nil {
  815. global.GVA_LOG.Error("CheckTaskCompletedInfo查询任务数据报错", zap.Error(err))
  816. return
  817. }
  818. status, _ := s.cache.GetCacheNum(ctx, taskCompletedStatusKey)
  819. if status == 1 {
  820. global.GVA_LOG.Info("任务已完成")
  821. return
  822. }
  823. if len(completesInfo) == 0 {
  824. global.GVA_LOG.Info("TaskMsgSend没有查询到未完成数据")
  825. time.Sleep(time.Second * 10)
  826. _ = s.cache.SetCacheStr(ctx, taskCompletedStatusKey, 1)
  827. msg := "# 监控报警 "
  828. msg += fmt.Sprintf("<font color=\"warning\">%s</font>", time.Now().Format("2006-01-02 15:04:05"))
  829. msg += "\n"
  830. msg += "今日任务目标已完成"
  831. url := global.GVA_CONFIG.SendUrl.ComputerSendUrl
  832. var sendData SendMsg
  833. sendData.MsgType = "markdown"
  834. sendData.Markdown.Content = msg
  835. s.SendMsgData(url, sendData)
  836. }
  837. }
  838. func (s *SyncData) TaskMsgSendRetainedDataUpdate(ctx context.Context, completesInfo []task.GameTargetComplete, ctime int64, date, lastMsgSendTimeKey string) {
  839. var mps = make(map[int]map[string]CompletedInfo)
  840. lastMsgSendTime, _ := s.cache.GetCacheNum(ctx, lastMsgSendTimeKey)
  841. for _, complete := range completesInfo {
  842. lastNewCompletedKey := fmt.Sprintf(LastNewCompletedKey, date, complete.TaskId)
  843. lastRetainedCompletedKey := fmt.Sprintf(LastRetainedCompletedKey, date, complete.TaskId)
  844. lastNewCompletedUpdateTimeKey := fmt.Sprintf(LastNewCompletedUpdateTimeKey, date, complete.TaskId)
  845. lastRetainedCompletedUpdateTimeKey := fmt.Sprintf(LastRetainedCompletedUpdateTimeKey, date, complete.TaskId)
  846. currentNewCompleted := complete.NewComplete + complete.HandNewComplete
  847. currentRetainedCompleted := complete.RetainedComplete + complete.HandRetainedComplete
  848. var RateMp = make(map[string]CompletedInfo)
  849. var newBool = false
  850. var retainedBoll = false
  851. // 处理新增
  852. if complete.NewTarget > currentNewCompleted {
  853. lastNewCompleted, _ := s.cache.GetCacheNum(ctx, lastNewCompletedKey)
  854. alsoNewTarget := complete.NewTarget - currentNewCompleted
  855. newRate := 0
  856. lastNewCompletedUpdateTime, _ := s.cache.GetCacheNum(ctx, lastNewCompletedUpdateTimeKey)
  857. timeRate := int(ctime) - lastNewCompletedUpdateTime
  858. if lastNewCompleted < currentNewCompleted {
  859. newRate = currentNewCompleted - lastNewCompleted
  860. _ = s.cache.SetCacheStr(ctx, lastNewCompletedKey, currentNewCompleted)
  861. _ = s.cache.SetCacheStr(ctx, lastNewCompletedUpdateTimeKey, ctime) //上次新增完成更新时间
  862. }
  863. RateMp["newRate"] = CompletedInfo{
  864. AlsoTarget: alsoNewTarget,
  865. Rate: newRate,
  866. TimeRate: timeRate,
  867. TaskId: complete.TaskId,
  868. }
  869. } else {
  870. newBool = true
  871. // 如果当前新增为0,或者完成也更新时间
  872. _ = s.cache.SetCacheStr(ctx, lastNewCompletedUpdateTimeKey, ctime) //上次新增完成更新时间
  873. }
  874. // 处理留存
  875. if complete.RetainedTarget > currentRetainedCompleted {
  876. lastRetainedCompleted, _ := s.cache.GetCacheNum(ctx, lastRetainedCompletedKey)
  877. alsoRetainedTarget := complete.RetainedTarget - currentRetainedCompleted
  878. retainedRate := 0
  879. lastRetainedCompletedUpdateTime, _ := s.cache.GetCacheNum(ctx, lastRetainedCompletedUpdateTimeKey)
  880. timeRate := int(ctime) - lastRetainedCompletedUpdateTime
  881. if lastRetainedCompleted < currentRetainedCompleted {
  882. retainedRate = currentRetainedCompleted - lastRetainedCompleted
  883. _ = s.cache.SetCacheStr(ctx, lastRetainedCompletedKey, currentRetainedCompleted)
  884. _ = s.cache.SetCacheStr(ctx, lastRetainedCompletedUpdateTimeKey, ctime) //上次留存完成更新时间
  885. }
  886. RateMp["retainedRate"] = CompletedInfo{
  887. AlsoTarget: alsoRetainedTarget,
  888. Rate: retainedRate,
  889. TimeRate: timeRate,
  890. TaskId: complete.TaskId,
  891. }
  892. } else {
  893. retainedBoll = true
  894. // 如果当前留存为0,或者完成也更新时间
  895. _ = s.cache.SetCacheStr(ctx, lastRetainedCompletedUpdateTimeKey, ctime) //上次留存完成更新时间
  896. }
  897. if !newBool || !retainedBoll {
  898. mps[complete.TaskId] = RateMp
  899. }
  900. }
  901. var taskStatistics = "%s:taskStatistics"
  902. var retained = "# 活跃播报 "
  903. if len(mps) == 0 {
  904. global.GVA_LOG.Warn(retained)
  905. }
  906. //b, _ := json.Marshal(mps)
  907. //global.GVA_LOG.Warn(string(b))
  908. mpsPerson, _ := s.Person.GetUserInfoData()
  909. retained += fmt.Sprintf("<font color=\"warning\">%s</font>", time.Now().Format("2006-01-02 15:04:05"))
  910. var errMsg = "**以下游戏目标效率为零:**"
  911. var errMsgZ = ""
  912. var sendMsg = make(map[string]string, len(mpsPerson))
  913. var errSendMsg = make(map[string]string, len(mpsPerson))
  914. var PErrSendMsg = make(map[string]string, len(mpsPerson))
  915. var m int // 时间内
  916. m = (int(ctime) - lastMsgSendTime) / 60
  917. for taskId, data := range mps {
  918. key := fmt.Sprintf(taskStatistics, date)
  919. gameIdStr := strconv.Itoa(taskId)
  920. gameTask, err := global.GVA_REDIS.HGet(ctx, key, gameIdStr).Result()
  921. if err != nil {
  922. if err == redis.Nil {
  923. continue
  924. } else {
  925. global.GVA_LOG.Error("TaskMsgSendRetainedData获取缓存任务数据失败", zap.Error(err))
  926. continue
  927. }
  928. }
  929. var taskStatistics request.TaskStatistics
  930. _ = json.Unmarshal([]byte(gameTask), &taskStatistics)
  931. var eMsg = "" //单条异常数据
  932. var isNew = false
  933. var nm int //新增时间内
  934. var rm int //存时间内
  935. var rate string //效率
  936. var newErr = false
  937. var retainedErr = false
  938. var name = taskStatistics.Remark
  939. if info, ok := data["newRate"]; ok {
  940. sendMsg[name] += "\n"
  941. sendMsg[name] += taskStatistics.GameName
  942. sendMsg[name] += ",新增差"
  943. //sendMsg[name] += strconv.Itoa(info.AlsoTarget)
  944. sendMsg[name] += fmt.Sprintf("<font color=\"warning\">%d</font>", info.AlsoTarget)
  945. isNew = true
  946. if info.TimeRate > 60*60*24 {
  947. lastNewCompletedUpdateTimeKey := fmt.Sprintf(LastNewCompletedUpdateTimeKey, date, info.TaskId)
  948. _ = s.cache.SetCacheStr(ctx, lastNewCompletedUpdateTimeKey, ctime) //上次新增完成更新时间
  949. nm = 1
  950. } else {
  951. nm = info.TimeRate / 60
  952. }
  953. rate = strconv.Itoa(info.Rate)
  954. if info.Rate == 0 {
  955. newErr = true
  956. }
  957. }
  958. if info, ok := data["retainedRate"]; ok {
  959. if !isNew {
  960. sendMsg[name] += "\n"
  961. sendMsg[name] += taskStatistics.GameName
  962. rate = strconv.Itoa(info.Rate)
  963. sendMsg[name] += "活跃差"
  964. } else {
  965. rate += "/" + strconv.Itoa(info.Rate)
  966. sendMsg[name] += ",活跃差"
  967. }
  968. if info.TimeRate > 60*60*24 {
  969. lastRetainedCompletedUpdateTimeKey := fmt.Sprintf(LastRetainedCompletedUpdateTimeKey, date, info.TaskId)
  970. _ = s.cache.SetCacheStr(ctx, lastRetainedCompletedUpdateTimeKey, ctime) //上次留存完成更新时间
  971. rm = 1
  972. } else {
  973. rm = info.TimeRate / 60
  974. }
  975. //sendMsg[name] += strconv.Itoa(info.AlsoTarget)
  976. sendMsg[name] += fmt.Sprintf("<font color=\"warning\">%d</font>", info.AlsoTarget)
  977. if info.Rate == 0 {
  978. retainedErr = true
  979. }
  980. }
  981. oneErrM := ""
  982. // 5分钟数据没动报异常数据
  983. if newErr && nm > 4 {
  984. eMsg += "\n"
  985. eMsg += s.StrMontage(nm, taskStatistics.GameName, ",新增", 0)
  986. if nm >= 60 {
  987. oneErrM += s.StrMontage(nm, taskStatistics.GameName, ",新增", data["newRate"].AlsoTarget)
  988. }
  989. }
  990. if retainedErr && rm > 4 {
  991. if !newErr {
  992. eMsg += "\n"
  993. eMsg += s.StrMontage(rm, taskStatistics.GameName, ",活跃", 0)
  994. if rm >= 60 {
  995. oneErrM += s.StrMontage(rm, taskStatistics.GameName, ",活跃", data["retainedRate"].AlsoTarget)
  996. }
  997. } else {
  998. eMsg += s.StrMontage(rm, "", ",活跃", 0)
  999. if rm >= 60 {
  1000. if oneErrM != "" {
  1001. oneErrM += s.StrMontage(rm, "", ",活跃", data["retainedRate"].AlsoTarget)
  1002. } else {
  1003. eMsg += "\n"
  1004. eMsg += s.StrMontage(rm, taskStatistics.GameName, ",活跃", 0)
  1005. }
  1006. }
  1007. }
  1008. }
  1009. if eMsg != "" {
  1010. errMsgZ += eMsg
  1011. errSendMsg[name] += eMsg
  1012. }
  1013. if oneErrM != "" {
  1014. PErrSendMsg[name] += oneErrM
  1015. PErrSendMsg[name] += "\n"
  1016. }
  1017. sendMsg[name] += ","
  1018. if m >= 60 {
  1019. sendMsg[name] += strconv.Itoa(m / 60)
  1020. sendMsg[name] += "小时内完成"
  1021. } else {
  1022. sendMsg[name] += strconv.Itoa(m)
  1023. sendMsg[name] += "分钟内完成"
  1024. }
  1025. //sendMsg[name] += rate
  1026. sendMsg[name] += fmt.Sprintf("<font color=\"warning\">%s</font>", rate)
  1027. }
  1028. hour := time.Now().Hour()
  1029. msg := ""
  1030. //b1 ,_ := json.Marshal(mpsPerson)
  1031. //global.GVA_LOG.Warn(string(b1))
  1032. msgType := "# 活跃异常 "
  1033. var mobile []string
  1034. if hour >= 16 {
  1035. if len(sendMsg) == 0 {
  1036. return
  1037. }
  1038. if len(mps) != 0 && len(errSendMsg) != 0 {
  1039. for name, _ := range errSendMsg {
  1040. mobile = append(mobile, mpsPerson[name].MobilePhoneNumber)
  1041. }
  1042. }
  1043. for name, msg := range sendMsg {
  1044. retained += "\n"
  1045. retained += "**" + name + "**"
  1046. retained += msg
  1047. }
  1048. msg = retained
  1049. if errMsgZ != "" {
  1050. msg += "\n"
  1051. //msg += errMsg + errMsgZ
  1052. msg += fmt.Sprintf("<font color=\"warning\">%s</font>", errMsg+errMsgZ)
  1053. }
  1054. go s.TaskMsgSendDirector(ctx, msgType, PErrSendMsg, mpsPerson, hour, date, 60, false)
  1055. } else {
  1056. if errMsgZ != "" {
  1057. //msg += errMsg + errMsgZ
  1058. }
  1059. if len(mps) != 0 && len(errSendMsg) != 0 {
  1060. msg += "# 活跃播报 "
  1061. msg += errMsg
  1062. for name, m := range errSendMsg {
  1063. mobile = append(mobile, mpsPerson[name].MobilePhoneNumber)
  1064. msg += "\n"
  1065. msg += "**" + name + "**"
  1066. msg += fmt.Sprintf("<font color=\"warning\">%s</font>", m)
  1067. }
  1068. }
  1069. go s.TaskMsgSendDirector(ctx, msgType, PErrSendMsg, mpsPerson, hour, date, 60, false)
  1070. }
  1071. //global.GVA_LOG.Warn(msg)
  1072. _ = s.cache.SetCacheStr(ctx, lastMsgSendTimeKey, time.Now().Unix())
  1073. if msg == "" {
  1074. return
  1075. }
  1076. url := global.GVA_CONFIG.SendUrl.ComputerSendUrl
  1077. var sendData SendMsg
  1078. sendData.MsgType = "markdown"
  1079. sendData.Markdown.Content = msg
  1080. s.SendMsgData(url, sendData)
  1081. if len(mobile) != 0 {
  1082. var sendTextData SendTextMsg
  1083. sendTextData.MsgType = "text"
  1084. sendTextData.Text.MentionedMobileList = mobile
  1085. //b ,_ := json.Marshal(sendTextData)
  1086. //global.GVA_LOG.Warn(string(b))
  1087. s.SendMsgData(url, sendTextData)
  1088. }
  1089. }
  1090. // 数据拼接
  1091. func (s *SyncData) StrMontage(minute int, taskName, strType string, diff int) (msg string) {
  1092. if taskName != "" {
  1093. msg += taskName
  1094. }
  1095. msg += strType
  1096. if minute >= 60 {
  1097. msg += "("
  1098. msg += strconv.Itoa(minute / 60)
  1099. msg += "小时内)"
  1100. } else {
  1101. msg += "("
  1102. msg += strconv.Itoa(minute)
  1103. msg += "分钟内)"
  1104. }
  1105. if diff > 0 {
  1106. msg += ",剩余 " + strconv.Itoa(diff)
  1107. }
  1108. return msg
  1109. }
  1110. func (s *SyncData) TaskMsgSendDirector(ctx context.Context, msgType string, sendMsg map[string]string, mpsPerson map[string]typeManage.ResponsiblePerson, hour int, date string, lt int, isFree bool) {
  1111. for pName, pMsg := range sendMsg {
  1112. lastTimeKey := ""
  1113. if isFree {
  1114. lastTimeKey = fmt.Sprintf(LastFreeDirectorMsgSendTimeKey, date, mpsPerson[pName].Id)
  1115. } else {
  1116. lastTimeKey = fmt.Sprintf(LastDirectorMsgSendTimeKey, date, mpsPerson[pName].Id)
  1117. }
  1118. lastTime, _ := s.cache.GetCacheNum(ctx, lastTimeKey)
  1119. if lastTime == 0 {
  1120. lastTime = int(time.Now().Unix()) - 60*61
  1121. }
  1122. lttime := int(time.Now().Unix()) - lastTime
  1123. if hour >= mpsPerson[pName].StartTime && lttime/60 >= lt {
  1124. var personMsg = msgType //"# 活跃异常 "
  1125. personMsg += "\n"
  1126. personMsg += fmt.Sprintf("<font color=\"warning\">%s</font>", pMsg)
  1127. url := mpsPerson[pName].Url
  1128. var sendPersonData SendMsg
  1129. sendPersonData.MsgType = "markdown"
  1130. sendPersonData.Markdown.Content = personMsg
  1131. global.GVA_LOG.Warn(personMsg)
  1132. s.SendMsgData(url, sendPersonData)
  1133. if mpsPerson[pName].Custodians != "" {
  1134. custodiansMsg := fmt.Sprintf("<font color=\"warning\">%s的任务</font>", pName)
  1135. custodiansMsg += "\n"
  1136. custodiansMsg += personMsg
  1137. var custodiansData SendMsg
  1138. custodiansData.MsgType = "markdown"
  1139. custodiansData.Markdown.Content = custodiansMsg
  1140. urlCustodians := mpsPerson[mpsPerson[pName].Custodians].Url
  1141. s.SendMsgData(urlCustodians, custodiansData)
  1142. }
  1143. _ = s.cache.SetCacheStr(ctx, lastTimeKey, time.Now().Unix())
  1144. }
  1145. }
  1146. }
  1147. func (s *SyncData) TaskMsgSendFreeDataUpdate(ctx context.Context, completesInfo []task.GameTargetComplete, ctime int64, date, lastFreeMsgSendTimeKey string, isOne bool) {
  1148. var RateMp = make(map[int]CompletedInfo)
  1149. lastFreeMsgSendTime, _ := s.cache.GetCacheNum(ctx, lastFreeMsgSendTimeKey)
  1150. for _, complete := range completesInfo {
  1151. lastPayCompletedKey := fmt.Sprintf(LastPayCompletedKey, date, complete.TaskId)
  1152. lastPayCompletedUpdateTimeKey := fmt.Sprintf(LastPayCompletedUpdateTimeKey, date, complete.TaskId)
  1153. lastPayAddUpdateTimeKey := fmt.Sprintf(LastPayAddUpdateTimeKey, date, complete.TaskId)
  1154. currentPayCompleted := complete.PayComplete + complete.HandPayComplete
  1155. payErrAddNumKey := fmt.Sprintf(PayErrAddNumKey, date, complete.TaskId)
  1156. // 付费处理
  1157. if complete.PayTarget != 0 && complete.PayTarget > currentPayCompleted {
  1158. lastPayCompleted, _ := s.cache.GetCacheNum(ctx, lastPayCompletedKey)
  1159. alsoPayTarget := complete.PayTarget - currentPayCompleted
  1160. payRate := 0
  1161. lastPayCompletedUpdateTime, _ := s.cache.GetCacheNum(ctx, lastPayCompletedUpdateTimeKey)
  1162. lastPayAddUpdateTime, _ := s.cache.GetCacheNum(ctx, lastPayAddUpdateTimeKey)
  1163. timeRate := int(ctime) - lastPayCompletedUpdateTime
  1164. if lastPayCompleted < currentPayCompleted {
  1165. payRate = currentPayCompleted - lastPayCompleted
  1166. // 如有效率就初始发累加的付费数量
  1167. _ = s.cache.SetCacheStr(ctx, payErrAddNumKey, 0)
  1168. _ = s.cache.SetCacheStr(ctx, lastPayCompletedKey, currentPayCompleted)
  1169. _ = s.cache.SetCacheStr(ctx, lastPayCompletedUpdateTimeKey, ctime) //上次付费更新时间
  1170. }
  1171. RateMp[complete.TaskId] = CompletedInfo{
  1172. AlsoTarget: alsoPayTarget,
  1173. Rate: payRate,
  1174. TimeRate: timeRate,
  1175. TaskId: complete.TaskId,
  1176. AddPayUpdateTime: lastPayAddUpdateTime,
  1177. }
  1178. } else {
  1179. // 如果当前付费为0,或者完成也更新时间
  1180. _ = s.cache.SetCacheStr(ctx, lastPayCompletedUpdateTimeKey, ctime) //上次付费更新时间
  1181. }
  1182. }
  1183. if isOne {
  1184. _ = s.cache.SetCacheStr(ctx, lastFreeMsgSendTimeKey, time.Now().Unix())
  1185. return
  1186. }
  1187. if len(RateMp) == 0 {
  1188. global.GVA_LOG.Info("TaskMsgSendFreeData没有查询到未完成付费数据")
  1189. return
  1190. }
  1191. var taskStatistics = "%s:taskStatistics"
  1192. var retained = "# 付费播报 "
  1193. retained += fmt.Sprintf("<font color=\"warning\">%s</font>", time.Now().Format("2006-01-02 15:04:05"))
  1194. var errMsg = "**以下游戏付费效率为零:**"
  1195. var errMsgZ = ""
  1196. var sendMsg = map[string]string{}
  1197. var m int //时间内
  1198. m = (int(ctime) - lastFreeMsgSendTime) / 60
  1199. mpsPerson, _ := s.Person.GetUserInfoData()
  1200. var PErrSendMsg = make(map[string]string, len(mpsPerson))
  1201. var mobile []string
  1202. for taskId, data := range RateMp {
  1203. if data.AlsoTarget <= 0 {
  1204. continue
  1205. }
  1206. key := fmt.Sprintf(taskStatistics, date)
  1207. gameIdStr := strconv.Itoa(taskId)
  1208. gameTask, err := global.GVA_REDIS.HGet(ctx, key, gameIdStr).Result()
  1209. if err != nil {
  1210. if err == redis.Nil {
  1211. continue
  1212. } else {
  1213. global.GVA_LOG.Error("TaskMsgSendRetainedData获取缓存任务数据失败", zap.Error(err))
  1214. continue
  1215. }
  1216. }
  1217. var taskStatistics request.TaskStatistics
  1218. _ = json.Unmarshal([]byte(gameTask), &taskStatistics)
  1219. var name = taskStatistics.Remark
  1220. sendMsg[name] += "\n"
  1221. sendMsg[name] += taskStatistics.GameName
  1222. sendMsg[name] += ",付费差"
  1223. //sendMsg[name] += strconv.Itoa(data.AlsoTarget)
  1224. sendMsg[name] += fmt.Sprintf("<font color=\"warning\">%d</font>", data.AlsoTarget)
  1225. if data.TimeRate > 60*60*24 {
  1226. lastPayCompletedUpdateTimeKey := fmt.Sprintf(LastPayCompletedUpdateTimeKey, date, data.TaskId)
  1227. _ = s.cache.SetCacheStr(ctx, lastPayCompletedUpdateTimeKey, ctime) //上次付费更新时间
  1228. data.TimeRate = 60 * 60 * 2
  1229. }
  1230. // 单条异常记录
  1231. oneErrM := ""
  1232. // 5分钟数据没动报异常数据
  1233. if data.TimeRate/60 >= 2 {
  1234. if data.Rate == 0 {
  1235. lastPayAddNumKey := fmt.Sprintf(LastPayAddNumKey, date, data.TaskId)
  1236. payErrAddNumKey := fmt.Sprintf(PayErrAddNumKey, date, data.TaskId)
  1237. numErr, _ := s.cache.GetCacheNum(context.Background(), payErrAddNumKey)
  1238. lastAddFeeNumErr, _ := s.cache.GetCacheNum(context.Background(), lastPayAddNumKey)
  1239. oneErrM += taskStatistics.GameName
  1240. oneErrM += "("
  1241. if data.TimeRate/60 >= 60 {
  1242. oneErrM += strconv.Itoa(data.TimeRate / 60 / 60)
  1243. oneErrM += "小时内(+" + strconv.Itoa(numErr) + "))"
  1244. } else {
  1245. oneErrM += strconv.Itoa(data.TimeRate / 60)
  1246. oneErrM += "分钟内(+" + strconv.Itoa(numErr) + "))"
  1247. }
  1248. oneErrM += ","
  1249. oneErrM += "最后加付费时间 "
  1250. t := time.Unix(int64(data.AddPayUpdateTime), 0)
  1251. oneErrM += t.Format("15:04:05")
  1252. oneErrM += "(+" + strconv.Itoa(lastAddFeeNumErr) + ")"
  1253. errMsgZ += "\n"
  1254. errMsgZ += oneErrM
  1255. if _, ok := mpsPerson[name]; ok {
  1256. mobile = append(mobile, mpsPerson[name].MobilePhoneNumber)
  1257. }
  1258. if data.TimeRate/60 >= 30 {
  1259. PErrSendMsg[name] += s.StrMontage(data.TimeRate/60, taskStatistics.GameName, ",付费", data.AlsoTarget)
  1260. PErrSendMsg[name] += ","
  1261. PErrSendMsg[name] += "最后加付费时间 "
  1262. PErrSendMsg[name] += t.Format("15:04:05")
  1263. PErrSendMsg[name] += "(+" + strconv.Itoa(lastAddFeeNumErr) + ")"
  1264. PErrSendMsg[name] += "\n"
  1265. }
  1266. }
  1267. }
  1268. sendMsg[name] += ","
  1269. if m >= 60 {
  1270. sendMsg[name] += strconv.Itoa(m / 60)
  1271. sendMsg[name] += "小时内完成"
  1272. } else {
  1273. sendMsg[name] += strconv.Itoa(m)
  1274. sendMsg[name] += "分钟内完成"
  1275. }
  1276. //sendMsg[name] += strconv.Itoa(data.Rate)
  1277. sendMsg[name] += fmt.Sprintf("<font color=\"warning\">%d</font>", data.Rate)
  1278. }
  1279. if len(sendMsg) == 0 {
  1280. return
  1281. }
  1282. hour := time.Now().Hour()
  1283. msgType := "# 付费异常 "
  1284. go s.TaskMsgSendDirector(ctx, msgType, PErrSendMsg, mpsPerson, hour, date, 30, true)
  1285. msg := retained
  1286. for name, msg1 := range sendMsg {
  1287. msg += "\n"
  1288. msg += name
  1289. msg += msg1
  1290. }
  1291. if errMsgZ != "" {
  1292. msg += "\n"
  1293. //msg += errMsg + errMsgZ
  1294. msg += fmt.Sprintf("<font color=\"warning\">%s</font>", errMsg+errMsgZ)
  1295. }
  1296. //global.GVA_LOG.Warn(msg)
  1297. _ = s.cache.SetCacheStr(ctx, lastFreeMsgSendTimeKey, time.Now().Unix())
  1298. url := global.GVA_CONFIG.SendUrl.ComputerSendUrl
  1299. var sendData SendMsg
  1300. sendData.MsgType = "markdown"
  1301. sendData.Markdown.Content = msg
  1302. s.SendMsgData(url, sendData)
  1303. if len(mobile) != 0 {
  1304. var sendTextData SendTextMsg
  1305. sendTextData.MsgType = "text"
  1306. sendTextData.Text.MentionedMobileList = mobile
  1307. s.SendMsgData(url, sendTextData)
  1308. }
  1309. return
  1310. }
  1311. // 加付费通知 common
  1312. //func (s *SyncData) FreeSendMsg(num, target int, taskName, director string) {
  1313. // hour := time.Now().Hour()
  1314. // if hour < 8 || num < 20 {
  1315. // return
  1316. // }
  1317. // person, err := s.Person.GetUserInfoByName(director)
  1318. // if err != nil {
  1319. // global.GVA_LOG.Error("FreeSendMsg获取用户数据失败"+director, zap.Error(err))
  1320. // }
  1321. // if person.PushStatus != 1 {
  1322. // return
  1323. // }
  1324. // personMsg := "# 加付费"
  1325. // personMsg += fmt.Sprintf("<font color=\"warning\">%s</font>", time.Now().Format("2006-01-02 15:04:05"))
  1326. // personMsg += "\n"
  1327. // personMsg += taskName
  1328. // personMsg += fmt.Sprintf("<font color=\"warning\"> 加付费 %d, 当前付费目标 %d</font>", num, target)
  1329. // url := person.Url
  1330. // var sendData SendMsg
  1331. // sendData.MsgType = "markdown"
  1332. // sendData.Markdown.Content = personMsg
  1333. // s.SendMsgData(url, sendData)
  1334. //}
  1335. type TaskIdXmy struct {
  1336. TaskId int `json:"task_id"`
  1337. GameIdXmy string `json:"game_id_xmy"`
  1338. }
  1339. func (s *SyncData) getTaskData() []TaskIdXmy {
  1340. db := global.GVA_DB.Table("game_task").Where("status=?", 1)
  1341. var count int64
  1342. db.Count(&count)
  1343. var data = make([]TaskIdXmy, count)
  1344. db.Find(&data)
  1345. return data
  1346. }
  1347. type ArpuInfo struct {
  1348. Arpu string `json:"arpu"`
  1349. GameId string `json:"game_id"`
  1350. GameName string `json:"game_name"`
  1351. SheepGameId string `json:"sheep_game_id"`
  1352. }
  1353. func (s *SyncData) SyncArpu() {
  1354. url := global.GVA_CONFIG.SendUrl.GetUrlArpu
  1355. jfparams := map[string]string{}
  1356. jfbyteData, err := utils.HttpGet(url, jfparams)
  1357. if err != nil {
  1358. global.GVA_LOG.Error("SyncArpu获取arpu值失败", zap.Error(err))
  1359. }
  1360. var arpuInfo []ArpuInfo
  1361. _ = json.Unmarshal(jfbyteData, &arpuInfo)
  1362. mps := make(map[string]int, len(arpuInfo))
  1363. for _, data := range arpuInfo {
  1364. s := strings.Split(data.Arpu, ".")
  1365. arpu, _ := strconv.Atoi(s[0])
  1366. mps[data.SheepGameId] = arpu
  1367. }
  1368. data := s.getTaskData()
  1369. for _, taskInfo := range data {
  1370. if taskInfo.GameIdXmy != "" {
  1371. if _, ok := mps[taskInfo.GameIdXmy]; ok {
  1372. err := global.GVA_DB.Table("game_target_complete").Where("task_id = ?", taskInfo.TaskId).Where("create_date = ?", time.Now().Format("2006-01-02")).Update("aupr", mps[taskInfo.GameIdXmy]).Error
  1373. if err != nil {
  1374. global.GVA_LOG.Error("SyncArpu更新game_target_complete失败", zap.Error(err))
  1375. }
  1376. }
  1377. }
  1378. }
  1379. }
  1380. func (s *SyncData) RemindSendOne() {
  1381. url := "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=89460a48-e1a1-4181-86c0-533bad342628"
  1382. content := "请修改腾讯付费目标"
  1383. mobile := []string{"18874128185"}
  1384. s.common.RemindSend(url, content, mobile)
  1385. }