sync_data.go 53 KB

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