sync_data.go 60 KB

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