sync_data.go 69 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872
  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. func (s *SyncData) CurrDaySyncTaskData() {
  139. db := global.GVA_DB.Model(&task.GameTask{})
  140. var apiList []task.GameTask
  141. db = db.Where("is_del = ?", -1)
  142. db = db.Where("status = ?", 1)
  143. err := db.Order("id desc").Find(&apiList).Error
  144. if err != nil {
  145. global.GVA_LOG.Error("EveryDaySyncTaskData fail", zap.Error(err))
  146. return
  147. }
  148. date := time.Now()
  149. var gameTargetCompletes []*task.GameTargetComplete
  150. for _, gameTask := range apiList {
  151. if !errors.Is(global.GVA_DB.Where("task_id = ?", gameTask.TaskId).Where("create_date = ?", date).First(&task.GameTargetComplete{}).Error, gorm.ErrRecordNotFound) {
  152. continue
  153. }
  154. gameTargetComplete := s.GameTask.CreateGameTargetCompleteModel(gameTask, date)
  155. gameTargetCompletes = append(gameTargetCompletes, gameTargetComplete)
  156. }
  157. err = global.GVA_DB.Model(&task.GameTargetComplete{}).Omit("update_time", "game_rate", "is_complete").Create(gameTargetCompletes).Error
  158. if err != nil {
  159. global.GVA_LOG.Error("create GameTargetComplete fail", zap.Error(err))
  160. return
  161. }
  162. return
  163. }
  164. // 定时同步机房群控、小绵羊数据
  165. func (s *SyncData) SyncTaskData() {
  166. db := global.GVA_DB.Model(&task.GameTask{})
  167. var apiList []task.GameTask
  168. db = db.Where("is_del = ?", -1)
  169. db = db.Where("status = ?", 1)
  170. err := db.Order("id desc").Find(&apiList).Error
  171. if err != nil {
  172. global.GVA_LOG.Error("EveryDaySyncTaskData fail", zap.Error(err))
  173. return
  174. }
  175. if len(apiList) == 0 {
  176. global.GVA_LOG.Info("没有任务数据")
  177. return
  178. }
  179. date := time.Now().Format("2006-01-02")
  180. xmyGameData, err := s.SyncXmyGameData(date)
  181. if err != nil {
  182. global.GVA_LOG.Error("SyncTaskData get xmy data fail", zap.Error(err))
  183. return
  184. }
  185. completeTaskData, err := s.CompleteTaskData(date)
  186. if err != nil {
  187. global.GVA_LOG.Error("CompleteTaskData get data fail", zap.Error(err))
  188. return
  189. }
  190. //wslData, err := s.SyncWslGameData(date)
  191. //if err != nil {
  192. // global.GVA_LOG.Error("SyncWslGameData get wsl data fail", zap.Error(err))
  193. // //return
  194. //}
  195. paymentRatio := make(map[string]string)
  196. for _, gameTask := range apiList {
  197. //var gameTargetComplete task.GameTargetComplete
  198. //global.GVA_DB.Where("task_id = ?", gameTask.TaskId).Where("create_date = ?", date).First(&gameTargetComplete)
  199. var gameTarget task.GameTargetComplete
  200. roomData, _ := s.SyncRoomData(date, gameTask.TaskId)
  201. gameTarget.JfRetainedTarget = roomData.RetainedTarget
  202. if gameTask.GameIdXmy != "" {
  203. gameIdXmy, _ := strconv.Atoi(gameTask.GameIdXmy)
  204. xmyGameInfo := xmyGameData[gameIdXmy]
  205. gameTarget.NewComplete, _ = strconv.Atoi(xmyGameInfo.UserNum)
  206. gameTarget.PayComplete, _ = strconv.Atoi(xmyGameInfo.Cnt)
  207. gameTarget.RetainedComplete, _ = strconv.Atoi(xmyGameInfo.ActiveUserNum)
  208. f, _ := strconv.ParseFloat(xmyGameInfo.Amount, 64)
  209. gameTarget.Amount = int(f)
  210. num, _ := s.SyncXmyFreeData(date, gameIdXmy)
  211. if num != 0 {
  212. gameTarget.PayTarget = num
  213. if gameTarget.PayTarget > completeTaskData[gameTask.TaskId].PayTarget {
  214. lastPayAddUpdateTimeKey := fmt.Sprintf(LastPayAddUpdateTimeKey, date, gameTask.TaskId)
  215. _ = s.cache.SetCacheStr(context.Background(), lastPayAddUpdateTimeKey, time.Now().Unix())
  216. // 本次加付费目标数据
  217. lastPayAddNumKey := fmt.Sprintf(LastPayAddNumKey, date, gameTask.TaskId)
  218. _ = s.cache.SetCacheStr(context.Background(), lastPayAddNumKey, gameTarget.PayTarget-completeTaskData[gameTask.TaskId].PayTarget)
  219. payErrAddNumKey := fmt.Sprintf(PayErrAddNumKey, date, gameTask.TaskId)
  220. diffNum := gameTarget.PayTarget - completeTaskData[gameTask.TaskId].PayTarget
  221. s.common.SaveGameAddFee(diffNum, gameTarget.PayTarget, gameTask.TaskName)
  222. go s.common.FreeSendMsg(diffNum, gameTarget.PayTarget, gameTask.TaskId, gameTask.TaskName, gameTask.User, gameTarget.PayComplete)
  223. paymentRatio = s.DetectionPaymentRatio(gameTask.TaskName, gameTask.TaskId, gameTask.User, gameTarget.PayTarget, roomData.RetainedTarget, paymentRatio)
  224. // 如果当前付费目标完成,加入一下逻辑
  225. if completeTaskData[gameTask.TaskId].PayTarget <= completeTaskData[gameTask.TaskId].PayComplete {
  226. lastPayCompletedUpdateTimeKey := fmt.Sprintf(LastPayCompletedUpdateTimeKey, date, gameTask.TaskId)
  227. _ = s.cache.SetCacheStr(context.Background(), lastPayCompletedUpdateTimeKey, time.Now().Unix())
  228. _ = s.cache.SetCacheStr(context.Background(), payErrAddNumKey, gameTarget.PayTarget-completeTaskData[gameTask.TaskId].PayTarget)
  229. } else {
  230. n, _ := s.cache.GetCacheNum(context.Background(), payErrAddNumKey)
  231. _ = s.cache.SetCacheStr(context.Background(), payErrAddNumKey, gameTarget.PayTarget-completeTaskData[gameTask.TaskId].PayTarget+n)
  232. }
  233. }
  234. }
  235. } else {
  236. gameTarget.NewComplete = roomData.NewCompleteLocal
  237. gameTarget.PayComplete = roomData.PayCompleteLocal
  238. gameTarget.RetainedComplete = roomData.NewCompleteLocal + roomData.RetainedCompleteLocal
  239. gameTarget.Amount = gameTask.PayPrice * roomData.PayCompleteLocal
  240. if gameTarget.RetainedComplete < roomData.RetainedComplete {
  241. gameTarget.RetainedComplete = roomData.RetainedComplete
  242. }
  243. }
  244. gameTarget.GameRate = roomData.GameRate
  245. if (gameTask.GamePortId == 5 && gameTask.LoginMethod == 2) || gameTask.LoginMethod == 7 || gameTask.LoginMethod == 9 {
  246. // 魅族游戏id处理
  247. GameId := gameTask.MzGameId + "-" + gameTask.MzChannel
  248. // 青雀账号游戏id处理
  249. if gameTask.LoginMethod == 7 {
  250. taskId := strconv.Itoa(gameTask.TaskId)
  251. GameId = "rose-" + taskId
  252. gameTarget.PayComplete = roomData.PayComplete
  253. }
  254. // 酷云账号游戏id处理
  255. if gameTask.LoginMethod == 9 {
  256. taskId := strconv.Itoa(gameTask.TaskId)
  257. GameId = "coolyun-" + taskId
  258. gameTarget.PayComplete = roomData.PayComplete
  259. }
  260. b, sheepPay := s.SelectSheepPay(date, GameId)
  261. if b {
  262. gameTarget.PayTarget = sheepPay.Money
  263. if gameTarget.PayTarget > completeTaskData[gameTask.TaskId].PayTarget {
  264. lastPayAddUpdateTimeKey := fmt.Sprintf(LastPayAddUpdateTimeKey, date, gameTask.TaskId)
  265. _ = s.cache.SetCacheStr(context.Background(), lastPayAddUpdateTimeKey, time.Now().Unix())
  266. // 本次加付费目标数据
  267. lastPayAddNumKey := fmt.Sprintf(LastPayAddNumKey, date, gameTask.TaskId)
  268. _ = s.cache.SetCacheStr(context.Background(), lastPayAddNumKey, gameTarget.PayTarget-completeTaskData[gameTask.TaskId].PayTarget)
  269. payErrAddNumKey := fmt.Sprintf(PayErrAddNumKey, date, gameTask.TaskId)
  270. diffNum := gameTarget.PayTarget - completeTaskData[gameTask.TaskId].PayTarget
  271. s.common.SaveGameAddFee(diffNum, gameTarget.PayTarget, gameTask.TaskName)
  272. go s.common.FreeSendMsg(diffNum, gameTarget.PayTarget, gameTask.TaskId, gameTask.TaskName, gameTask.User, gameTarget.PayComplete)
  273. paymentRatio = s.DetectionPaymentRatio(gameTask.TaskName, gameTask.TaskId, gameTask.User, gameTarget.PayTarget, roomData.RetainedTarget, paymentRatio)
  274. // 如果当前付费目标完成,加入一下逻辑
  275. if completeTaskData[gameTask.TaskId].PayTarget <= completeTaskData[gameTask.TaskId].PayComplete {
  276. lastPayCompletedUpdateTimeKey := fmt.Sprintf(LastPayCompletedUpdateTimeKey, date, gameTask.TaskId)
  277. _ = s.cache.SetCacheStr(context.Background(), lastPayCompletedUpdateTimeKey, time.Now().Unix())
  278. _ = s.cache.SetCacheStr(context.Background(), payErrAddNumKey, gameTarget.PayTarget-completeTaskData[gameTask.TaskId].PayTarget)
  279. } else {
  280. n, _ := s.cache.GetCacheNum(context.Background(), payErrAddNumKey)
  281. _ = s.cache.SetCacheStr(context.Background(), payErrAddNumKey, gameTarget.PayTarget-completeTaskData[gameTask.TaskId].PayTarget+n)
  282. }
  283. }
  284. }
  285. }
  286. gameTarget.IsComplete = -1
  287. if gameTarget.RetainedComplete+completeTaskData[gameTask.TaskId].HandRetainedComplete >= completeTaskData[gameTask.TaskId].JfRetainedTarget && gameTarget.PayComplete >= completeTaskData[gameTask.TaskId].PayTarget && gameTarget.NewComplete+completeTaskData[gameTask.TaskId].HandNewComplete >= completeTaskData[gameTask.TaskId].NewTarget {
  288. gameTarget.IsComplete = 1
  289. }
  290. global.GVA_DB.Model(&task.GameTargetComplete{}).Where("task_id = ?", gameTask.TaskId).Where("create_date = ?", date).Omit("create_date", "update_time", "task_id").Updates(gameTarget)
  291. }
  292. go s.common.PaymentRatioErrSendMsg(paymentRatio)
  293. return
  294. }
  295. // 检测付费比例
  296. func (s *SyncData) DetectionPaymentRatio(taskName string, taskId int, user string, payTarget, retainedTarget int, paymentRatio map[string]string) map[string]string {
  297. var tConf task.TaskConf
  298. taskConf, err := tConf.GetTaskConfByTaskId(taskId)
  299. if err != nil {
  300. global.GVA_LOG.Error("DetectionPaymentRatio获取任务配置失败"+user, zap.Error(err))
  301. return paymentRatio
  302. }
  303. if taskConf.PushPayRatio != 1 {
  304. return paymentRatio
  305. }
  306. ratio := float64(payTarget) / float64(retainedTarget) * 100
  307. global.GVA_LOG.Warn(fmt.Sprintf("%s付费率%2f,payTarget%d,retainedTarget%d", taskName, ratio, payTarget, paymentRatio))
  308. if ratio >= 20 {
  309. paymentRatio[user] += fmt.Sprintf("<font color=\"warning\"> %s</font>", taskName)
  310. paymentRatio[user] += "\n"
  311. }
  312. return paymentRatio
  313. }
  314. func (s *SyncData) SelectSheepPay(date string, gameId string) (b bool, sheepPay task.SheepPay) {
  315. b = false
  316. global.GVA_DB.Model(&task.SheepPay{}).Where("pay_date = ?", date).Where("game_id = ?", gameId).Order("id desc").Find(&sheepPay)
  317. if sheepPay.Id != 0 {
  318. b = true
  319. }
  320. return
  321. }
  322. // 定时同步机房群控、小绵羊数据
  323. func (s *SyncData) YesterdaySyncTaskData() {
  324. db := global.GVA_DB.Model(&task.GameTask{})
  325. var apiList []task.GameTask
  326. db = db.Where("is_del = ?", -1)
  327. db = db.Where("status = ?", 1)
  328. err := db.Order("id desc").Find(&apiList).Error
  329. if err != nil {
  330. global.GVA_LOG.Error("EveryDaySyncTaskData fail", zap.Error(err))
  331. return
  332. }
  333. if len(apiList) == 0 {
  334. global.GVA_LOG.Info("没有任务数据")
  335. return
  336. }
  337. date := time.Now().Add(-time.Hour * 24).Format("2006-01-02")
  338. xmyGameData, err := s.SyncXmyGameData(date)
  339. if err != nil {
  340. global.GVA_LOG.Error("SyncTaskData get xmy data fail", zap.Error(err))
  341. return
  342. }
  343. completeTaskData, err := s.CompleteTaskData(date)
  344. if err != nil {
  345. global.GVA_LOG.Error("CompleteTaskData get data fail", zap.Error(err))
  346. return
  347. }
  348. //wslData, err := s.SyncWslGameData(date)
  349. //if err != nil {
  350. // global.GVA_LOG.Error("SyncWslGameData get wsl data fail", zap.Error(err))
  351. // return
  352. //}
  353. for _, gameTask := range apiList {
  354. var gameTarget task.GameTargetComplete
  355. roomData, _ := s.SyncRoomData(date, gameTask.TaskId)
  356. gameTarget.JfRetainedTarget = roomData.RetainedTarget
  357. if gameTask.GameIdXmy != "" {
  358. gameIdXmy, _ := strconv.Atoi(gameTask.GameIdXmy)
  359. xmyGameInfo := xmyGameData[gameIdXmy]
  360. gameTarget.NewComplete, _ = strconv.Atoi(xmyGameInfo.UserNum)
  361. gameTarget.PayComplete, _ = strconv.Atoi(xmyGameInfo.Cnt)
  362. gameTarget.RetainedComplete, _ = strconv.Atoi(xmyGameInfo.ActiveUserNum)
  363. f, _ := strconv.ParseFloat(xmyGameInfo.Amount, 64)
  364. gameTarget.Amount = int(f)
  365. num, _ := s.SyncXmyFreeData(date, gameIdXmy)
  366. if num != 0 {
  367. gameTarget.PayTarget = num
  368. if gameTarget.PayTarget > completeTaskData[gameTask.TaskId].PayTarget {
  369. lastPayAddUpdateTimeKey := fmt.Sprintf(LastPayAddUpdateTimeKey, date, gameTask.TaskId)
  370. _ = s.cache.SetCacheStr(context.Background(), lastPayAddUpdateTimeKey, time.Now().Unix())
  371. // 本次加付费目标数据
  372. lastPayAddNumKey := fmt.Sprintf(LastPayAddNumKey, date, gameTask.TaskId)
  373. _ = s.cache.SetCacheStr(context.Background(), lastPayAddNumKey, gameTarget.PayTarget-completeTaskData[gameTask.TaskId].PayTarget)
  374. payErrAddNumKey := fmt.Sprintf(PayErrAddNumKey, date, gameTask.TaskId)
  375. diffNum := gameTarget.PayTarget - completeTaskData[gameTask.TaskId].PayTarget
  376. s.common.SaveGameAddFee(diffNum, gameTarget.PayTarget, gameTask.TaskName)
  377. //go s.common.FreeSendMsg(diffNum, gameTarget.PayTarget, gameTask.TaskId, gameTask.TaskName, gameTask.User)
  378. // 如果当前付费目标完成,加入一下逻辑
  379. if completeTaskData[gameTask.TaskId].PayTarget <= completeTaskData[gameTask.TaskId].PayComplete {
  380. lastPayCompletedUpdateTimeKey := fmt.Sprintf(LastPayCompletedUpdateTimeKey, date, gameTask.TaskId)
  381. _ = s.cache.SetCacheStr(context.Background(), lastPayCompletedUpdateTimeKey, time.Now().Unix())
  382. _ = s.cache.SetCacheStr(context.Background(), payErrAddNumKey, gameTarget.PayTarget-completeTaskData[gameTask.TaskId].PayTarget)
  383. } else {
  384. n, _ := s.cache.GetCacheNum(context.Background(), payErrAddNumKey)
  385. _ = s.cache.SetCacheStr(context.Background(), payErrAddNumKey, gameTarget.PayTarget-completeTaskData[gameTask.TaskId].PayTarget+n)
  386. }
  387. }
  388. }
  389. } else {
  390. gameTarget.NewComplete = roomData.NewCompleteLocal
  391. gameTarget.PayComplete = roomData.PayCompleteLocal
  392. gameTarget.RetainedComplete = roomData.NewCompleteLocal + roomData.RetainedCompleteLocal
  393. gameTarget.Amount = gameTask.PayPrice * roomData.PayCompleteLocal
  394. if gameTarget.RetainedComplete < roomData.RetainedComplete {
  395. gameTarget.RetainedComplete = roomData.RetainedComplete
  396. }
  397. }
  398. gameTarget.GameRate = roomData.GameRate
  399. if (gameTask.GamePortId == 5 && gameTask.LoginMethod == 2) || gameTask.LoginMethod == 7 {
  400. // 魅族游戏id处理
  401. GameId := gameTask.MzGameId + "-" + gameTask.MzChannel
  402. // 青雀账号游戏id处理
  403. if gameTask.LoginMethod == 7 {
  404. taskId := strconv.Itoa(gameTask.TaskId)
  405. GameId = "rose-" + taskId
  406. gameTarget.PayComplete = roomData.PayComplete
  407. }
  408. b, sheepPay := s.SelectSheepPay(date, GameId)
  409. if b {
  410. gameTarget.PayTarget = sheepPay.Money
  411. if gameTarget.PayTarget > completeTaskData[gameTask.TaskId].PayTarget {
  412. lastPayAddUpdateTimeKey := fmt.Sprintf(LastPayAddUpdateTimeKey, date, gameTask.TaskId)
  413. _ = s.cache.SetCacheStr(context.Background(), lastPayAddUpdateTimeKey, time.Now().Unix())
  414. // 本次加付费目标数据
  415. lastPayAddNumKey := fmt.Sprintf(LastPayAddNumKey, date, gameTask.TaskId)
  416. _ = s.cache.SetCacheStr(context.Background(), lastPayAddNumKey, gameTarget.PayTarget-completeTaskData[gameTask.TaskId].PayTarget)
  417. payErrAddNumKey := fmt.Sprintf(PayErrAddNumKey, date, gameTask.TaskId)
  418. diffNum := gameTarget.PayTarget - completeTaskData[gameTask.TaskId].PayTarget
  419. s.common.SaveGameAddFee(diffNum, gameTarget.PayTarget, gameTask.TaskName)
  420. //go s.common.FreeSendMsg(diffNum, gameTarget.PayTarget, gameTask.TaskId, gameTask.TaskName, gameTask.User)
  421. // 如果当前付费目标完成,加入一下逻辑
  422. if completeTaskData[gameTask.TaskId].PayTarget <= completeTaskData[gameTask.TaskId].PayComplete {
  423. lastPayCompletedUpdateTimeKey := fmt.Sprintf(LastPayCompletedUpdateTimeKey, date, gameTask.TaskId)
  424. _ = s.cache.SetCacheStr(context.Background(), lastPayCompletedUpdateTimeKey, time.Now().Unix())
  425. _ = s.cache.SetCacheStr(context.Background(), payErrAddNumKey, gameTarget.PayTarget-completeTaskData[gameTask.TaskId].PayTarget)
  426. } else {
  427. n, _ := s.cache.GetCacheNum(context.Background(), payErrAddNumKey)
  428. _ = s.cache.SetCacheStr(context.Background(), payErrAddNumKey, gameTarget.PayTarget-completeTaskData[gameTask.TaskId].PayTarget+n)
  429. }
  430. }
  431. }
  432. }
  433. gameTarget.IsComplete = -1
  434. 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 {
  435. gameTarget.IsComplete = 1
  436. }
  437. global.GVA_DB.Model(&task.GameTargetComplete{}).Where("task_id = ?", gameTask.TaskId).Where("create_date = ?", date).Omit("create_date", "update_time", "task_id").Updates(gameTarget)
  438. }
  439. return
  440. }
  441. func (s *SyncData) DayTargetDataStatistics() {
  442. date := time.Now().Add(-time.Hour * 24).Format("2006-01-02")
  443. request1 := request2.GameTaskStatisticsRequest{
  444. GroupKey: "user,gt.game_port_id",
  445. Date: date,
  446. }
  447. gameTargets, err := s.GameTask.EveryDayTargetData(date, request1)
  448. if err != nil {
  449. global.GVA_LOG.Error("DayTargetDataStatistics 统计数据失败", zap.Error(err))
  450. return
  451. }
  452. if len(gameTargets) == 0 {
  453. global.GVA_LOG.Info("没有数据统计", zap.Error(err))
  454. return
  455. }
  456. var gameTargetDates []task.GameTargetStatistics
  457. for _, gameTarget := range gameTargets {
  458. var gameTargetDate task.GameTargetStatistics
  459. gameTargetDate.PayTarget = gameTarget.PayTarget
  460. gameTargetDate.NewTarget = gameTarget.NewTarget
  461. gameTargetDate.RetainedTarget = gameTarget.RetainedTarget
  462. gameTargetDate.PayComplete = gameTarget.PayComplete
  463. gameTargetDate.NewComplete = gameTarget.NewComplete + gameTarget.HandNewComplete
  464. gameTargetDate.RetainedComplete = gameTarget.RetainedComplete + gameTarget.HandRetainedComplete
  465. gameTargetDate.Amount = gameTarget.Amount
  466. gameTargetDate.GamePortId = gameTarget.GamePortId
  467. gameTargetDate.User = gameTarget.User
  468. gameTargetDate.TaskDate = gameTarget.CreateDate
  469. 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) {
  470. 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
  471. if err != nil {
  472. global.GVA_LOG.Error("DayTargetDataStatistics 更新统计数据失败", zap.Error(err))
  473. }
  474. continue
  475. }
  476. year, month, _ := time.Now().Date()
  477. gameTargetDate.TaskMonth = int(month)
  478. gameTargetDate.TaskYear = year
  479. gameTargetDates = append(gameTargetDates, gameTargetDate)
  480. }
  481. if len(gameTargetDates) < 1 {
  482. return
  483. }
  484. global.GVA_DB.Omit("update_time").Create(gameTargetDates)
  485. }
  486. var LastMsgSendTimeKey = "%s:lastMsgSendTime" // 上次活跃发送消息时间
  487. var LastNewCompletedKey = "%s:msgSendInfo:%d:lastNewCompleted" // 最后新增完成数量
  488. var LastPayCompletedKey = "%s:msgSendInfo:%d:lastPayCompleted" // 最后支付完成数量
  489. var LastRetainedCompletedKey = "%s:msgSendInfo:%d:lastRetainedCompleted" // 最后留存完成数量
  490. var LastNewCompletedUpdateTimeKey = "%s:msgSendInfo:%d:lastNewCompletedUpdateTime" // 最后新增完成更新时间
  491. var LastPayCompletedUpdateTimeKey = "%s:msgSendInfo:%d:lastPayCompletedUpdateTime" // 最后支付完成更新时间
  492. var LastRetainedCompletedUpdateTimeKey = "%s:msgSendInfo:%d:lastRetainedCompletedUpdateTime" // 最后留存完成更新时间
  493. var LastPayAddUpdateTimeKey = "%s:msgSendInfo:%d:lastPayAddUpdateTime" // 最后加付费时间
  494. var LastPayAddNumKey = "%s:msgSendInfo:%d:lastPayAddNum" // 最后加付费数量
  495. var PayErrAddNumKey = "%s:msgSendInfo:%d:PayErrAddNum" // 支付异常累加数量
  496. var TaskCompletedStatusKey = "%s:taskCompletedStatus" // 任务完成状态-1,1
  497. var LastFreeMsgSendTimeKey = "%s:lastFreeMsgSendTime" // 上次付费发送消息时间
  498. var LastDirectorMsgSendTimeKey = "%s:lastDirectorMsgSendTime:%d" // 上次负责人活跃发送消息时间
  499. var LastFreeDirectorMsgSendTimeKey = "%s:lastFreeDirectorMsgSendTime:%d" // 上次负责人付费发送消息时间
  500. type CompletedInfo struct {
  501. AlsoTarget int //剩余数量
  502. Rate int //时间段做的任务数
  503. TimeRate int // 完成任务数据更新时间
  504. TaskId int
  505. AddPayUpdateTime int
  506. }
  507. // 获取未完成的任务数据
  508. func (s *SyncData) TaskNoCompleteDate(date string) (completesInfo []task.GameTargetComplete, err error) {
  509. db := global.GVA_DB.Table("game_target_complete")
  510. db = db.Where("is_complete = ?", -1)
  511. db = db.Where("create_date = ?", date)
  512. err = db.Find(&completesInfo).Error
  513. if err != nil {
  514. return
  515. }
  516. return
  517. }
  518. func (s *SyncData) TaskMsgSendInitData(ctx context.Context, completesInfo []task.GameTargetComplete, ctime int64, date, taskCompletedStatusKey, lastMsgSendTimeKey string) {
  519. for _, complete := range completesInfo {
  520. lastNewCompletedKey := fmt.Sprintf(LastNewCompletedKey, date, complete.TaskId)
  521. lastPayCompletedKey := fmt.Sprintf(LastPayCompletedKey, date, complete.TaskId)
  522. lastRetainedCompletedKey := fmt.Sprintf(LastRetainedCompletedKey, date, complete.TaskId)
  523. lastPayCompletedUpdateTimeKey := fmt.Sprintf(LastPayCompletedUpdateTimeKey, date, complete.TaskId)
  524. lastNewCompletedUpdateTimeKey := fmt.Sprintf(LastNewCompletedUpdateTimeKey, date, complete.TaskId)
  525. lastRetainedCompletedUpdateTimeKey := fmt.Sprintf(LastRetainedCompletedUpdateTimeKey, date, complete.TaskId)
  526. lastNewCompleted := complete.NewComplete + complete.HandNewComplete //上次新增完成数
  527. _ = s.cache.SetCacheStr(ctx, lastNewCompletedKey, lastNewCompleted)
  528. lastPayCompleted := complete.PayComplete + complete.HandPayComplete //上次支付完成数
  529. _ = s.cache.SetCacheStr(ctx, lastPayCompletedKey, lastPayCompleted)
  530. lastRetainedCompleted := complete.RetainedComplete + complete.HandRetainedComplete //上次活跃完成数
  531. _ = s.cache.SetCacheStr(ctx, lastRetainedCompletedKey, lastRetainedCompleted)
  532. //lastNewCompletedUpdateTime := complete.NewComplete //上次新增完成更新时间
  533. _ = s.cache.SetCacheStr(ctx, lastNewCompletedUpdateTimeKey, ctime)
  534. //lastPayCompletedUpdateTime := complete.NewComplete //上次支付完成更新时间
  535. _ = s.cache.SetCacheStr(ctx, lastPayCompletedUpdateTimeKey, ctime)
  536. //lastRetainedCompletedUpdateTime := complete.NewComplete //上次留存完成更新时间
  537. _ = s.cache.SetCacheStr(ctx, lastRetainedCompletedUpdateTimeKey, ctime)
  538. //lastPayAddUpdateTime := complete.NewComplete //上次付费增加更新时间
  539. }
  540. _ = s.cache.SetCacheStr(ctx, taskCompletedStatusKey, -1)
  541. _ = s.cache.SetCacheStr(ctx, lastMsgSendTimeKey, time.Now().Unix())
  542. }
  543. func (s *SyncData) TaskMsgSendRetainedData(ctx context.Context, completesInfo []task.GameTargetComplete, ctime int64, date, lastMsgSendTimeKey string) {
  544. var mps = make(map[int]map[string]CompletedInfo)
  545. lastMsgSendTime, _ := s.cache.GetCacheNum(ctx, lastMsgSendTimeKey)
  546. for _, complete := range completesInfo {
  547. lastNewCompletedKey := fmt.Sprintf(LastNewCompletedKey, date, complete.TaskId)
  548. lastRetainedCompletedKey := fmt.Sprintf(LastRetainedCompletedKey, date, complete.TaskId)
  549. lastNewCompletedUpdateTimeKey := fmt.Sprintf(LastNewCompletedUpdateTimeKey, date, complete.TaskId)
  550. lastRetainedCompletedUpdateTimeKey := fmt.Sprintf(LastRetainedCompletedUpdateTimeKey, date, complete.TaskId)
  551. currentNewCompleted := complete.NewComplete + complete.HandNewComplete
  552. currentRetainedCompleted := complete.RetainedComplete + complete.HandRetainedComplete
  553. var RateMp = make(map[string]CompletedInfo)
  554. var newBool = false
  555. var retainedBoll = false
  556. // 处理新增
  557. if complete.NewTarget > currentNewCompleted {
  558. lastNewCompleted, _ := s.cache.GetCacheNum(ctx, lastNewCompletedKey)
  559. alsoNewTarget := complete.NewTarget - currentNewCompleted
  560. newRate := 0
  561. lastNewCompletedUpdateTime, _ := s.cache.GetCacheNum(ctx, lastNewCompletedUpdateTimeKey)
  562. timeRate := int(ctime) - lastNewCompletedUpdateTime
  563. if lastNewCompleted < currentNewCompleted {
  564. newRate = currentNewCompleted - lastNewCompleted
  565. _ = s.cache.SetCacheStr(ctx, lastNewCompletedKey, currentNewCompleted)
  566. _ = s.cache.SetCacheStr(ctx, lastNewCompletedUpdateTimeKey, ctime) //上次新增完成更新时间
  567. }
  568. RateMp["newRate"] = CompletedInfo{
  569. AlsoTarget: alsoNewTarget,
  570. Rate: newRate,
  571. TimeRate: timeRate,
  572. TaskId: complete.TaskId,
  573. }
  574. } else {
  575. newBool = true
  576. // 如果当前新增为0,或者完成也更新时间
  577. _ = s.cache.SetCacheStr(ctx, lastNewCompletedUpdateTimeKey, ctime) //上次新增完成更新时间
  578. }
  579. // 处理留存
  580. if complete.RetainedTarget > currentRetainedCompleted {
  581. lastRetainedCompleted, _ := s.cache.GetCacheNum(ctx, lastRetainedCompletedKey)
  582. alsoRetainedTarget := complete.RetainedTarget - currentRetainedCompleted
  583. retainedRate := 0
  584. lastRetainedCompletedUpdateTime, _ := s.cache.GetCacheNum(ctx, lastRetainedCompletedUpdateTimeKey)
  585. timeRate := int(ctime) - lastRetainedCompletedUpdateTime
  586. if lastRetainedCompleted < currentRetainedCompleted {
  587. retainedRate = currentRetainedCompleted - lastRetainedCompleted
  588. _ = s.cache.SetCacheStr(ctx, lastRetainedCompletedKey, currentRetainedCompleted)
  589. _ = s.cache.SetCacheStr(ctx, lastRetainedCompletedUpdateTimeKey, ctime) //上次留存完成更新时间
  590. }
  591. RateMp["retainedRate"] = CompletedInfo{
  592. AlsoTarget: alsoRetainedTarget,
  593. Rate: retainedRate,
  594. TimeRate: timeRate,
  595. TaskId: complete.TaskId,
  596. }
  597. } else {
  598. retainedBoll = true
  599. // 如果当前留存为0,或者完成也更新时间
  600. _ = s.cache.SetCacheStr(ctx, lastRetainedCompletedUpdateTimeKey, ctime) //上次留存完成更新时间
  601. }
  602. if !newBool || !retainedBoll {
  603. mps[complete.TaskId] = RateMp
  604. }
  605. }
  606. var taskStatistics = "%s:taskStatistics"
  607. var retained = "# 活跃播报 "
  608. if len(mps) == 0 {
  609. global.GVA_LOG.Warn(retained)
  610. }
  611. retained += fmt.Sprintf("<font color=\"warning\">%s</font>", time.Now().Format("2006-01-02 15:04:05"))
  612. var errMsg = "**以下游戏目标效率为零:**"
  613. var errMsgZ = ""
  614. var sendMsg = map[string]string{}
  615. var errSendMsg = map[string]string{}
  616. var m int // 时间内
  617. m = (int(ctime) - lastMsgSendTime) / 60
  618. for taskId, data := range mps {
  619. key := fmt.Sprintf(taskStatistics, date)
  620. gameIdStr := strconv.Itoa(taskId)
  621. gameTask, err := global.GVA_REDIS.HGet(ctx, key, gameIdStr).Result()
  622. if err != nil {
  623. if err == redis.Nil {
  624. continue
  625. } else {
  626. global.GVA_LOG.Error("TaskMsgSendRetainedData获取缓存任务数据失败", zap.Error(err))
  627. continue
  628. }
  629. }
  630. var taskStatistics request.TaskStatistics
  631. _ = json.Unmarshal([]byte(gameTask), &taskStatistics)
  632. var eMsg = "" //单条异常数据
  633. var isNew = false
  634. var nm int //新增时间内
  635. var rm int //存时间内
  636. var rate string //效率
  637. var newErr = false
  638. var retainedErr = false
  639. var name = taskStatistics.Remark
  640. if info, ok := data["newRate"]; ok {
  641. sendMsg[name] += "\n"
  642. sendMsg[name] += taskStatistics.GameName
  643. sendMsg[name] += ",新增差"
  644. //sendMsg[name] += strconv.Itoa(info.AlsoTarget)
  645. sendMsg[name] += fmt.Sprintf("<font color=\"warning\">%d</font>", info.AlsoTarget)
  646. isNew = true
  647. if info.TimeRate > 60*60*24 {
  648. lastNewCompletedUpdateTimeKey := fmt.Sprintf(LastNewCompletedUpdateTimeKey, date, info.TaskId)
  649. _ = s.cache.SetCacheStr(ctx, lastNewCompletedUpdateTimeKey, ctime) //上次新增完成更新时间
  650. nm = 1
  651. } else {
  652. nm = info.TimeRate / 60
  653. }
  654. rate = strconv.Itoa(info.Rate)
  655. if info.Rate == 0 {
  656. newErr = true
  657. }
  658. }
  659. if info, ok := data["retainedRate"]; ok {
  660. if !isNew {
  661. sendMsg[name] += "\n"
  662. sendMsg[name] += taskStatistics.GameName
  663. rate = strconv.Itoa(info.Rate)
  664. sendMsg[name] += "活跃差"
  665. } else {
  666. rate += "/" + strconv.Itoa(info.Rate)
  667. sendMsg[name] += ",活跃差"
  668. }
  669. if info.TimeRate > 60*60*24 {
  670. lastRetainedCompletedUpdateTimeKey := fmt.Sprintf(LastRetainedCompletedUpdateTimeKey, date, info.TaskId)
  671. _ = s.cache.SetCacheStr(ctx, lastRetainedCompletedUpdateTimeKey, ctime) //上次留存完成更新时间
  672. rm = 1
  673. } else {
  674. rm = info.TimeRate / 60
  675. }
  676. //sendMsg[name] += strconv.Itoa(info.AlsoTarget)
  677. sendMsg[name] += fmt.Sprintf("<font color=\"warning\">%d</font>", info.AlsoTarget)
  678. if info.Rate == 0 {
  679. retainedErr = true
  680. }
  681. }
  682. // 5分钟数据没动报异常数据
  683. if newErr && nm > 4 {
  684. eMsg += "\n"
  685. eMsg += taskStatistics.GameName
  686. eMsg += ",新增"
  687. if nm >= 60 {
  688. eMsg += "("
  689. eMsg += strconv.Itoa(nm / 60)
  690. eMsg += "小时内)"
  691. } else {
  692. eMsg += "("
  693. eMsg += strconv.Itoa(nm)
  694. eMsg += "分钟内)"
  695. }
  696. }
  697. if retainedErr && rm > 4 {
  698. if !newErr {
  699. eMsg += "\n"
  700. eMsg += taskStatistics.GameName
  701. }
  702. eMsg += ",活跃"
  703. if rm >= 60 {
  704. eMsg += "("
  705. eMsg += strconv.Itoa(rm / 60)
  706. eMsg += "小时内)"
  707. } else {
  708. eMsg += "("
  709. eMsg += strconv.Itoa(rm)
  710. eMsg += "分钟内)"
  711. }
  712. }
  713. if eMsg != "" {
  714. errMsgZ += eMsg
  715. errSendMsg[name] += eMsg
  716. }
  717. sendMsg[name] += ","
  718. if m >= 60 {
  719. sendMsg[name] += strconv.Itoa(m / 60)
  720. sendMsg[name] += "小时内完成"
  721. } else {
  722. sendMsg[name] += strconv.Itoa(m)
  723. sendMsg[name] += "分钟内完成"
  724. }
  725. //sendMsg[name] += rate
  726. sendMsg[name] += fmt.Sprintf("<font color=\"warning\">%s</font>", rate)
  727. }
  728. hour := time.Now().Hour()
  729. msg := ""
  730. mpsPerson, _ := s.Person.GetUserInfo()
  731. //b1 ,_ := json.Marshal(mpsPerson)
  732. //global.GVA_LOG.Warn(string(b1))
  733. var mobile []string
  734. if hour >= 16 {
  735. if len(sendMsg) == 0 {
  736. return
  737. }
  738. if len(mps) != 0 && len(errSendMsg) != 0 {
  739. for name, _ := range errSendMsg {
  740. mobile = append(mobile, mpsPerson[name])
  741. }
  742. }
  743. for name, msg := range sendMsg {
  744. retained += "\n"
  745. retained += "**" + name + "**"
  746. retained += msg
  747. }
  748. msg = retained
  749. if errMsgZ != "" {
  750. msg += "\n"
  751. //msg += errMsg + errMsgZ
  752. msg += fmt.Sprintf("<font color=\"warning\">%s</font>", errMsg+errMsgZ)
  753. }
  754. } else {
  755. if errMsgZ != "" {
  756. //msg += errMsg + errMsgZ
  757. }
  758. if len(mps) != 0 && len(errSendMsg) != 0 {
  759. msg += "# 活跃播报 "
  760. msg += errMsg
  761. for name, m := range errSendMsg {
  762. mobile = append(mobile, mpsPerson[name])
  763. msg += "\n"
  764. msg += "**" + name + "**"
  765. msg += fmt.Sprintf("<font color=\"warning\">%s</font>", m)
  766. }
  767. }
  768. }
  769. //global.GVA_LOG.Warn(msg)
  770. _ = s.cache.SetCacheStr(ctx, lastMsgSendTimeKey, time.Now().Unix())
  771. if msg == "" {
  772. return
  773. }
  774. url := global.GVA_CONFIG.SendUrl.ComputerSendUrl
  775. var sendData SendMsg
  776. sendData.MsgType = "markdown"
  777. sendData.Markdown.Content = msg
  778. s.SendMsgData(url, sendData)
  779. if len(mobile) != 0 {
  780. var sendTextData SendTextMsg
  781. sendTextData.MsgType = "text"
  782. sendTextData.Text.MentionedMobileList = mobile
  783. //b ,_ := json.Marshal(sendTextData)
  784. //global.GVA_LOG.Warn(string(b))
  785. s.SendMsgData(url, sendTextData)
  786. }
  787. }
  788. func (s *SyncData) TaskMsgSendFreeData(ctx context.Context, completesInfo []task.GameTargetComplete, ctime int64, date, lastFreeMsgSendTimeKey string, isOne bool) {
  789. var RateMp = make(map[int]CompletedInfo)
  790. lastFreeMsgSendTime, _ := s.cache.GetCacheNum(ctx, lastFreeMsgSendTimeKey)
  791. for _, complete := range completesInfo {
  792. lastPayCompletedKey := fmt.Sprintf(LastPayCompletedKey, date, complete.TaskId)
  793. lastPayCompletedUpdateTimeKey := fmt.Sprintf(LastPayCompletedUpdateTimeKey, date, complete.TaskId)
  794. lastPayAddUpdateTimeKey := fmt.Sprintf(LastPayAddUpdateTimeKey, date, complete.TaskId)
  795. currentPayCompleted := complete.PayComplete + complete.HandPayComplete
  796. // 付费处理
  797. if complete.PayTarget != 0 && complete.PayTarget > currentPayCompleted {
  798. lastPayCompleted, _ := s.cache.GetCacheNum(ctx, lastPayCompletedKey)
  799. alsoPayTarget := complete.PayTarget - currentPayCompleted
  800. payRate := 0
  801. lastPayCompletedUpdateTime, _ := s.cache.GetCacheNum(ctx, lastPayCompletedUpdateTimeKey)
  802. lastPayAddUpdateTime, _ := s.cache.GetCacheNum(ctx, lastPayAddUpdateTimeKey)
  803. timeRate := int(ctime) - lastPayCompletedUpdateTime
  804. if lastPayCompleted < currentPayCompleted {
  805. payRate = currentPayCompleted - lastPayCompleted
  806. _ = s.cache.SetCacheStr(ctx, lastPayCompletedKey, currentPayCompleted)
  807. _ = s.cache.SetCacheStr(ctx, lastPayCompletedUpdateTimeKey, ctime) //上次付费更新时间
  808. }
  809. RateMp[complete.TaskId] = CompletedInfo{
  810. AlsoTarget: alsoPayTarget,
  811. Rate: payRate,
  812. TimeRate: timeRate,
  813. TaskId: complete.TaskId,
  814. AddPayUpdateTime: lastPayAddUpdateTime,
  815. }
  816. } else {
  817. // 如果当前付费为0,或者完成也更新时间
  818. _ = s.cache.SetCacheStr(ctx, lastPayCompletedUpdateTimeKey, ctime) //上次付费更新时间
  819. }
  820. }
  821. if isOne {
  822. _ = s.cache.SetCacheStr(ctx, lastFreeMsgSendTimeKey, time.Now().Unix())
  823. return
  824. }
  825. if len(RateMp) == 0 {
  826. global.GVA_LOG.Info("TaskMsgSendFreeData没有查询到未完成付费数据")
  827. return
  828. }
  829. var taskStatistics = "%s:taskStatistics"
  830. var retained = "付费播报 "
  831. retained += fmt.Sprintf("<font color=\"warning\">%s</font>", time.Now().Format("2006-01-02 15:04:05"))
  832. var errMsg = "**以下游戏付费效率为零:**"
  833. var errMsgZ = ""
  834. var sendMsg = map[string]string{}
  835. var m int //时间内
  836. m = (int(ctime) - lastFreeMsgSendTime) / 60
  837. mpsPerson, _ := s.Person.GetUserInfo()
  838. var mobile []string
  839. for taskId, data := range RateMp {
  840. if data.AlsoTarget <= 0 {
  841. continue
  842. }
  843. key := fmt.Sprintf(taskStatistics, date)
  844. gameIdStr := strconv.Itoa(taskId)
  845. gameTask, err := global.GVA_REDIS.HGet(ctx, key, gameIdStr).Result()
  846. if err != nil {
  847. if err == redis.Nil {
  848. continue
  849. } else {
  850. global.GVA_LOG.Error("TaskMsgSendRetainedData获取缓存任务数据失败", zap.Error(err))
  851. continue
  852. }
  853. }
  854. var taskStatistics request.TaskStatistics
  855. _ = json.Unmarshal([]byte(gameTask), &taskStatistics)
  856. var name = taskStatistics.Remark
  857. sendMsg[name] += "\n"
  858. sendMsg[name] += taskStatistics.GameName
  859. sendMsg[name] += ",付费差"
  860. //sendMsg[name] += strconv.Itoa(data.AlsoTarget)
  861. sendMsg[name] += fmt.Sprintf("<font color=\"warning\">%d</font>", data.AlsoTarget)
  862. if data.TimeRate > 60*60*24 {
  863. lastPayCompletedUpdateTimeKey := fmt.Sprintf(LastPayCompletedUpdateTimeKey, date, data.TaskId)
  864. _ = s.cache.SetCacheStr(ctx, lastPayCompletedUpdateTimeKey, ctime) //上次付费更新时间
  865. data.TimeRate = 60 * 60 * 2
  866. }
  867. // 5分钟数据没动报异常数据
  868. if data.TimeRate/60 >= 2 {
  869. if data.Rate == 0 {
  870. lastPayAddNumKey := fmt.Sprintf(LastPayAddNumKey, date, data.TaskId)
  871. payErrAddNumKey := fmt.Sprintf(PayErrAddNumKey, date, data.TaskId)
  872. numErr, _ := s.cache.GetCacheNum(context.Background(), payErrAddNumKey)
  873. lastAddFeeNumErr, _ := s.cache.GetCacheNum(context.Background(), lastPayAddNumKey)
  874. errMsgZ += "\n"
  875. errMsgZ += taskStatistics.GameName
  876. errMsgZ += "("
  877. if data.TimeRate/60 >= 60 {
  878. errMsgZ += strconv.Itoa(data.TimeRate / 60 / 60)
  879. errMsgZ += "小时内(+" + strconv.Itoa(numErr) + "))"
  880. } else {
  881. errMsgZ += strconv.Itoa(data.TimeRate / 60)
  882. errMsgZ += "分钟内(+" + strconv.Itoa(numErr) + "))"
  883. }
  884. errMsgZ += ","
  885. errMsgZ += "最后加付费时间 "
  886. t := time.Unix(int64(data.AddPayUpdateTime), 0)
  887. errMsgZ += t.Format("15:04:05")
  888. errMsgZ += "(+" + strconv.Itoa(lastAddFeeNumErr) + ")"
  889. if _, ok := mpsPerson[name]; ok {
  890. mobile = append(mobile, mpsPerson[name])
  891. }
  892. }
  893. }
  894. sendMsg[name] += ","
  895. if m >= 60 {
  896. sendMsg[name] += strconv.Itoa(m / 60)
  897. sendMsg[name] += "分钟内完成"
  898. } else {
  899. sendMsg[name] += strconv.Itoa(m)
  900. sendMsg[name] += "分钟内完成"
  901. }
  902. //sendMsg[name] += strconv.Itoa(data.Rate)
  903. sendMsg[name] += fmt.Sprintf("<font color=\"warning\">%d</font>", data.Rate)
  904. }
  905. if len(sendMsg) == 0 {
  906. return
  907. }
  908. for name, msg := range sendMsg {
  909. retained += "\n"
  910. retained += name
  911. retained += msg
  912. }
  913. msg := retained
  914. if errMsgZ != "" {
  915. msg += "\n"
  916. //msg += errMsg + errMsgZ
  917. msg += fmt.Sprintf("<font color=\"warning\">%s</font>", errMsg+errMsgZ)
  918. }
  919. _ = s.cache.SetCacheStr(ctx, lastFreeMsgSendTimeKey, time.Now().Unix())
  920. url := global.GVA_CONFIG.SendUrl.ComputerSendUrl
  921. var sendData SendMsg
  922. sendData.MsgType = "markdown"
  923. sendData.Markdown.Content = msg
  924. s.SendMsgData(url, sendData)
  925. if len(mobile) != 0 {
  926. var sendTextData SendTextMsg
  927. sendTextData.MsgType = "text"
  928. sendTextData.Text.MentionedMobileList = mobile
  929. s.SendMsgData(url, sendTextData)
  930. }
  931. return
  932. }
  933. func (s *SyncData) SendMsgData(url string, params interface{}) {
  934. _, _ = utils.HttpPost(url, params)
  935. return
  936. }
  937. //活跃新增数据推送
  938. func (s *SyncData) TaskMsgSend() {
  939. date := time.Now().Format("2006-01-02")
  940. ctx := context.Background()
  941. taskCompletedStatusKey := fmt.Sprintf(TaskCompletedStatusKey, date)
  942. taskCompletedStatus, _ := s.cache.GetCacheNum(ctx, taskCompletedStatusKey)
  943. if taskCompletedStatus == 1 {
  944. return
  945. }
  946. completesInfo, err := s.TaskNoCompleteDate(date)
  947. if err != nil {
  948. global.GVA_LOG.Error("TaskMsgSend查询任务数据报错", zap.Error(err))
  949. }
  950. if len(completesInfo) == 0 {
  951. global.GVA_LOG.Info("TaskMsgSend没有查询到未完成数据")
  952. }
  953. lastMsgSendTimeKey := fmt.Sprintf(LastMsgSendTimeKey, date)
  954. b, err := s.cache.ExistsKey(context.Background(), lastMsgSendTimeKey)
  955. if err != nil {
  956. global.GVA_LOG.Error("TaskMsgSend查询任务数据报错", zap.Error(err))
  957. return
  958. }
  959. ctime := time.Now().Unix()
  960. if !b {
  961. s.TaskMsgSendInitData(ctx, completesInfo, ctime, date, taskCompletedStatusKey, lastMsgSendTimeKey)
  962. } else {
  963. lastMsgSendTime, _ := s.cache.GetCacheNum(ctx, lastMsgSendTimeKey)
  964. if int(ctime)-lastMsgSendTime < 60 {
  965. global.GVA_LOG.Error("TaskMsgSend上次数据发送时间还没到5分钟", zap.Error(err))
  966. return
  967. }
  968. //s.TaskMsgSendRetainedData(ctx, completesInfo, ctime, date, lastMsgSendTimeKey)
  969. s.TaskMsgSendRetainedDataUpdate(ctx, completesInfo, ctime, date, lastMsgSendTimeKey)
  970. }
  971. }
  972. //活跃新增数据推送
  973. func (s *SyncData) TaskFreeMsgSend() {
  974. date := time.Now().Format("2006-01-02")
  975. ctx := context.Background()
  976. taskCompletedStatusKey := fmt.Sprintf(TaskCompletedStatusKey, date)
  977. taskCompletedStatus, _ := s.cache.GetCacheNum(ctx, taskCompletedStatusKey)
  978. if taskCompletedStatus == 1 {
  979. return
  980. }
  981. completesInfo, err := s.TaskNoCompleteDate(date)
  982. if err != nil {
  983. global.GVA_LOG.Error("TaskMsgSend查询任务数据报错", zap.Error(err))
  984. }
  985. if len(completesInfo) == 0 {
  986. global.GVA_LOG.Info("TaskMsgSend没有查询到未完成数据")
  987. }
  988. lastFreeMsgSendTimeKey := fmt.Sprintf(LastFreeMsgSendTimeKey, date)
  989. ctime := time.Now().Unix()
  990. lastFreeMsgSendTime, _ := s.cache.GetCacheNum(ctx, lastFreeMsgSendTimeKey)
  991. if int(ctime)-lastFreeMsgSendTime < 60 {
  992. global.GVA_LOG.Error("TaskMsgSend上次数据发送时间还没到5分钟", zap.Error(err))
  993. return
  994. }
  995. var isOne = false
  996. if lastFreeMsgSendTime == 0 {
  997. isOne = true
  998. }
  999. //s.TaskMsgSendFreeData(ctx, completesInfo, ctime, date, lastFreeMsgSendTimeKey, isOne)
  1000. s.TaskMsgSendFreeDataUpdate(ctx, completesInfo, ctime, date, lastFreeMsgSendTimeKey, isOne)
  1001. }
  1002. func (s *SyncData) CheckTaskCompletedInfo() {
  1003. date := time.Now().Format("2006-01-02")
  1004. ctx := context.Background()
  1005. taskCompletedStatusKey := fmt.Sprintf(TaskCompletedStatusKey, date)
  1006. completesInfo, err := s.TaskNoCompleteDate(date)
  1007. if err != nil {
  1008. global.GVA_LOG.Error("CheckTaskCompletedInfo查询任务数据报错", zap.Error(err))
  1009. return
  1010. }
  1011. status, _ := s.cache.GetCacheNum(ctx, taskCompletedStatusKey)
  1012. if status == 1 {
  1013. global.GVA_LOG.Info("任务已完成")
  1014. return
  1015. }
  1016. if len(completesInfo) == 0 {
  1017. global.GVA_LOG.Info("TaskMsgSend没有查询到未完成数据")
  1018. time.Sleep(time.Second * 10)
  1019. _ = s.cache.SetCacheStr(ctx, taskCompletedStatusKey, 1)
  1020. msg := "# 监控报警 "
  1021. msg += fmt.Sprintf("<font color=\"warning\">%s</font>", time.Now().Format("2006-01-02 15:04:05"))
  1022. msg += "\n"
  1023. msg += "今日任务目标已完成"
  1024. url := global.GVA_CONFIG.SendUrl.ComputerSendUrl
  1025. var sendData SendMsg
  1026. sendData.MsgType = "markdown"
  1027. sendData.Markdown.Content = msg
  1028. s.SendMsgData(url, sendData)
  1029. }
  1030. }
  1031. func (s *SyncData) TaskMsgSendRetainedDataUpdate(ctx context.Context, completesInfo []task.GameTargetComplete, ctime int64, date, lastMsgSendTimeKey string) {
  1032. var mps = make(map[int]map[string]CompletedInfo)
  1033. lastMsgSendTime, _ := s.cache.GetCacheNum(ctx, lastMsgSendTimeKey)
  1034. for _, complete := range completesInfo {
  1035. lastNewCompletedKey := fmt.Sprintf(LastNewCompletedKey, date, complete.TaskId)
  1036. lastRetainedCompletedKey := fmt.Sprintf(LastRetainedCompletedKey, date, complete.TaskId)
  1037. lastNewCompletedUpdateTimeKey := fmt.Sprintf(LastNewCompletedUpdateTimeKey, date, complete.TaskId)
  1038. lastRetainedCompletedUpdateTimeKey := fmt.Sprintf(LastRetainedCompletedUpdateTimeKey, date, complete.TaskId)
  1039. currentNewCompleted := complete.NewComplete + complete.HandNewComplete
  1040. currentRetainedCompleted := complete.RetainedComplete + complete.HandRetainedComplete
  1041. var RateMp = make(map[string]CompletedInfo)
  1042. var newBool = false
  1043. var retainedBoll = false
  1044. // 处理新增
  1045. if complete.NewTarget > currentNewCompleted {
  1046. lastNewCompleted, _ := s.cache.GetCacheNum(ctx, lastNewCompletedKey)
  1047. alsoNewTarget := complete.NewTarget - currentNewCompleted
  1048. newRate := 0
  1049. lastNewCompletedUpdateTime, _ := s.cache.GetCacheNum(ctx, lastNewCompletedUpdateTimeKey)
  1050. timeRate := int(ctime) - lastNewCompletedUpdateTime
  1051. if lastNewCompleted < currentNewCompleted {
  1052. newRate = currentNewCompleted - lastNewCompleted
  1053. _ = s.cache.SetCacheStr(ctx, lastNewCompletedKey, currentNewCompleted)
  1054. _ = s.cache.SetCacheStr(ctx, lastNewCompletedUpdateTimeKey, ctime) //上次新增完成更新时间
  1055. }
  1056. RateMp["newRate"] = CompletedInfo{
  1057. AlsoTarget: alsoNewTarget,
  1058. Rate: newRate,
  1059. TimeRate: timeRate,
  1060. TaskId: complete.TaskId,
  1061. }
  1062. } else {
  1063. newBool = true
  1064. // 如果当前新增为0,或者完成也更新时间
  1065. _ = s.cache.SetCacheStr(ctx, lastNewCompletedUpdateTimeKey, ctime) //上次新增完成更新时间
  1066. }
  1067. // 处理留存
  1068. if complete.JfRetainedTarget > currentRetainedCompleted {
  1069. lastRetainedCompleted, _ := s.cache.GetCacheNum(ctx, lastRetainedCompletedKey)
  1070. alsoRetainedTarget := complete.JfRetainedTarget - currentRetainedCompleted
  1071. retainedRate := 0
  1072. lastRetainedCompletedUpdateTime, _ := s.cache.GetCacheNum(ctx, lastRetainedCompletedUpdateTimeKey)
  1073. timeRate := int(ctime) - lastRetainedCompletedUpdateTime
  1074. if lastRetainedCompleted < currentRetainedCompleted {
  1075. retainedRate = currentRetainedCompleted - lastRetainedCompleted
  1076. _ = s.cache.SetCacheStr(ctx, lastRetainedCompletedKey, currentRetainedCompleted)
  1077. _ = s.cache.SetCacheStr(ctx, lastRetainedCompletedUpdateTimeKey, ctime) //上次留存完成更新时间
  1078. }
  1079. RateMp["retainedRate"] = CompletedInfo{
  1080. AlsoTarget: alsoRetainedTarget,
  1081. Rate: retainedRate,
  1082. TimeRate: timeRate,
  1083. TaskId: complete.TaskId,
  1084. }
  1085. } else {
  1086. retainedBoll = true
  1087. // 如果当前留存为0,或者完成也更新时间
  1088. _ = s.cache.SetCacheStr(ctx, lastRetainedCompletedUpdateTimeKey, ctime) //上次留存完成更新时间
  1089. }
  1090. if !newBool || !retainedBoll {
  1091. mps[complete.TaskId] = RateMp
  1092. }
  1093. }
  1094. var taskStatistics = "%s:taskStatistics"
  1095. var retained = "# 活跃播报 "
  1096. if len(mps) == 0 {
  1097. global.GVA_LOG.Warn(retained)
  1098. }
  1099. //b, _ := json.Marshal(mps)
  1100. //global.GVA_LOG.Warn(string(b))
  1101. mpsPerson, _ := s.Person.GetUserInfoData()
  1102. retained += fmt.Sprintf("<font color=\"warning\">%s</font>", time.Now().Format("2006-01-02 15:04:05"))
  1103. var errMsg = "**以下游戏目标效率为零:**"
  1104. var errMsgZ = ""
  1105. var sendMsg = make(map[string]string, len(mpsPerson))
  1106. var errSendMsg = make(map[string]string, len(mpsPerson))
  1107. var PErrSendMsg = make(map[string]string, len(mpsPerson))
  1108. var m int // 时间内
  1109. m = (int(ctime) - lastMsgSendTime) / 60
  1110. for taskId, data := range mps {
  1111. key := fmt.Sprintf(taskStatistics, date)
  1112. gameIdStr := strconv.Itoa(taskId)
  1113. gameTask, err := global.GVA_REDIS.HGet(ctx, key, gameIdStr).Result()
  1114. if err != nil {
  1115. if err == redis.Nil {
  1116. continue
  1117. } else {
  1118. global.GVA_LOG.Error("TaskMsgSendRetainedData获取缓存任务数据失败", zap.Error(err))
  1119. continue
  1120. }
  1121. }
  1122. var taskStatistics request.TaskStatistics
  1123. _ = json.Unmarshal([]byte(gameTask), &taskStatistics)
  1124. var eMsg = "" //单条异常数据
  1125. var isNew = false
  1126. var nm int //新增时间内
  1127. var rm int //存时间内
  1128. var rate string //效率
  1129. var newErr = false
  1130. var retainedErr = false
  1131. var name = taskStatistics.Remark
  1132. if info, ok := data["newRate"]; ok {
  1133. sendMsg[name] += "\n"
  1134. sendMsg[name] += taskStatistics.GameName
  1135. sendMsg[name] += ",新增差"
  1136. //sendMsg[name] += strconv.Itoa(info.AlsoTarget)
  1137. sendMsg[name] += fmt.Sprintf("<font color=\"warning\">%d</font>", info.AlsoTarget)
  1138. isNew = true
  1139. if info.TimeRate > 60*60*24 {
  1140. lastNewCompletedUpdateTimeKey := fmt.Sprintf(LastNewCompletedUpdateTimeKey, date, info.TaskId)
  1141. _ = s.cache.SetCacheStr(ctx, lastNewCompletedUpdateTimeKey, ctime) //上次新增完成更新时间
  1142. nm = 1
  1143. } else {
  1144. nm = info.TimeRate / 60
  1145. }
  1146. rate = strconv.Itoa(info.Rate)
  1147. if info.Rate == 0 {
  1148. newErr = true
  1149. }
  1150. }
  1151. if info, ok := data["retainedRate"]; ok {
  1152. if !isNew {
  1153. sendMsg[name] += "\n"
  1154. sendMsg[name] += taskStatistics.GameName
  1155. rate = strconv.Itoa(info.Rate)
  1156. sendMsg[name] += "活跃差"
  1157. } else {
  1158. rate += "/" + strconv.Itoa(info.Rate)
  1159. sendMsg[name] += ",活跃差"
  1160. }
  1161. if info.TimeRate > 60*60*24 {
  1162. lastRetainedCompletedUpdateTimeKey := fmt.Sprintf(LastRetainedCompletedUpdateTimeKey, date, info.TaskId)
  1163. _ = s.cache.SetCacheStr(ctx, lastRetainedCompletedUpdateTimeKey, ctime) //上次留存完成更新时间
  1164. rm = 1
  1165. } else {
  1166. rm = info.TimeRate / 60
  1167. }
  1168. //sendMsg[name] += strconv.Itoa(info.AlsoTarget)
  1169. sendMsg[name] += fmt.Sprintf("<font color=\"warning\">%d</font>", info.AlsoTarget)
  1170. if info.Rate == 0 {
  1171. retainedErr = true
  1172. }
  1173. }
  1174. oneErrM := ""
  1175. // 5分钟数据没动报异常数据
  1176. if newErr && nm > 4 {
  1177. eMsg += "\n"
  1178. eMsg += s.StrMontage(nm, taskStatistics.GameName, ",新增", 0)
  1179. if nm >= 60 {
  1180. oneErrM += s.StrMontage(nm, taskStatistics.GameName, ",新增", data["newRate"].AlsoTarget)
  1181. }
  1182. }
  1183. if retainedErr && rm > 4 {
  1184. if !newErr {
  1185. eMsg += "\n"
  1186. eMsg += s.StrMontage(rm, taskStatistics.GameName, ",活跃", 0)
  1187. if rm >= 60 {
  1188. oneErrM += s.StrMontage(rm, taskStatistics.GameName, ",活跃", data["retainedRate"].AlsoTarget)
  1189. }
  1190. } else {
  1191. eMsg += s.StrMontage(rm, "", ",活跃", 0)
  1192. if rm >= 60 {
  1193. if oneErrM != "" {
  1194. oneErrM += s.StrMontage(rm, "", ",活跃", data["retainedRate"].AlsoTarget)
  1195. } else {
  1196. eMsg += "\n"
  1197. eMsg += s.StrMontage(rm, taskStatistics.GameName, ",活跃", 0)
  1198. }
  1199. }
  1200. }
  1201. }
  1202. if eMsg != "" {
  1203. errMsgZ += eMsg
  1204. errSendMsg[name] += eMsg
  1205. }
  1206. if oneErrM != "" {
  1207. PErrSendMsg[name] += oneErrM
  1208. PErrSendMsg[name] += "\n"
  1209. }
  1210. sendMsg[name] += ","
  1211. if m >= 60 {
  1212. sendMsg[name] += strconv.Itoa(m / 60)
  1213. sendMsg[name] += "小时内完成"
  1214. } else {
  1215. sendMsg[name] += strconv.Itoa(m)
  1216. sendMsg[name] += "分钟内完成"
  1217. }
  1218. //sendMsg[name] += rate
  1219. sendMsg[name] += fmt.Sprintf("<font color=\"warning\">%s</font>", rate)
  1220. }
  1221. hour := time.Now().Hour()
  1222. msg := ""
  1223. //b1 ,_ := json.Marshal(mpsPerson)
  1224. //global.GVA_LOG.Warn(string(b1))
  1225. msgType := "# 活跃异常 "
  1226. var mobile []string
  1227. if hour >= 16 {
  1228. if len(sendMsg) == 0 {
  1229. return
  1230. }
  1231. if len(mps) != 0 && len(errSendMsg) != 0 {
  1232. for name, _ := range errSendMsg {
  1233. mobile = append(mobile, mpsPerson[name].MobilePhoneNumber)
  1234. }
  1235. }
  1236. for name, msg := range sendMsg {
  1237. retained += "\n"
  1238. retained += "**" + name + "**"
  1239. retained += msg
  1240. }
  1241. msg = retained
  1242. if errMsgZ != "" {
  1243. msg += "\n"
  1244. //msg += errMsg + errMsgZ
  1245. msg += fmt.Sprintf("<font color=\"warning\">%s</font>", errMsg+errMsgZ)
  1246. }
  1247. go s.TaskMsgSendDirector(ctx, msgType, PErrSendMsg, mpsPerson, hour, date, 60, false)
  1248. } else {
  1249. if errMsgZ != "" {
  1250. //msg += errMsg + errMsgZ
  1251. }
  1252. if len(mps) != 0 && len(errSendMsg) != 0 {
  1253. msg += "# 活跃播报 "
  1254. msg += errMsg
  1255. for name, m := range errSendMsg {
  1256. mobile = append(mobile, mpsPerson[name].MobilePhoneNumber)
  1257. msg += "\n"
  1258. msg += "**" + name + "**"
  1259. msg += fmt.Sprintf("<font color=\"warning\">%s</font>", m)
  1260. }
  1261. }
  1262. go s.TaskMsgSendDirector(ctx, msgType, PErrSendMsg, mpsPerson, hour, date, 60, false)
  1263. }
  1264. //global.GVA_LOG.Warn(msg)
  1265. _ = s.cache.SetCacheStr(ctx, lastMsgSendTimeKey, time.Now().Unix())
  1266. if msg == "" {
  1267. return
  1268. }
  1269. url := global.GVA_CONFIG.SendUrl.ComputerSendUrl
  1270. var sendData SendMsg
  1271. sendData.MsgType = "markdown"
  1272. sendData.Markdown.Content = msg
  1273. s.SendMsgData(url, sendData)
  1274. if len(mobile) != 0 {
  1275. var sendTextData SendTextMsg
  1276. sendTextData.MsgType = "text"
  1277. sendTextData.Text.MentionedMobileList = mobile
  1278. //b ,_ := json.Marshal(sendTextData)
  1279. //global.GVA_LOG.Warn(string(b))
  1280. s.SendMsgData(url, sendTextData)
  1281. }
  1282. }
  1283. // 数据拼接
  1284. func (s *SyncData) StrMontage(minute int, taskName, strType string, diff int) (msg string) {
  1285. if taskName != "" {
  1286. msg += taskName
  1287. }
  1288. msg += strType
  1289. if minute >= 60 {
  1290. msg += "("
  1291. msg += strconv.Itoa(minute / 60)
  1292. msg += "小时内)"
  1293. } else {
  1294. msg += "("
  1295. msg += strconv.Itoa(minute)
  1296. msg += "分钟内)"
  1297. }
  1298. if diff > 0 {
  1299. msg += ",剩余 " + strconv.Itoa(diff)
  1300. }
  1301. return msg
  1302. }
  1303. 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) {
  1304. for pName, pMsg := range sendMsg {
  1305. lastTimeKey := ""
  1306. if isFree {
  1307. lastTimeKey = fmt.Sprintf(LastFreeDirectorMsgSendTimeKey, date, mpsPerson[pName].Id)
  1308. } else {
  1309. lastTimeKey = fmt.Sprintf(LastDirectorMsgSendTimeKey, date, mpsPerson[pName].Id)
  1310. }
  1311. lastTime, _ := s.cache.GetCacheNum(ctx, lastTimeKey)
  1312. if lastTime == 0 {
  1313. lastTime = int(time.Now().Unix()) - 60*61
  1314. }
  1315. lttime := int(time.Now().Unix()) - lastTime
  1316. if hour >= mpsPerson[pName].StartTime && lttime/60 >= lt {
  1317. var personMsg = msgType //"# 活跃异常 "
  1318. personMsg += "\n"
  1319. personMsg += fmt.Sprintf("<font color=\"warning\">%s</font>", pMsg)
  1320. url := mpsPerson[pName].Url
  1321. var sendPersonData SendMsg
  1322. sendPersonData.MsgType = "markdown"
  1323. sendPersonData.Markdown.Content = personMsg
  1324. global.GVA_LOG.Warn(personMsg)
  1325. s.SendMsgData(url, sendPersonData)
  1326. if mpsPerson[pName].Custodians != "" {
  1327. custodiansMsg := fmt.Sprintf("<font color=\"warning\">%s的任务</font>", pName)
  1328. custodiansMsg += "\n"
  1329. custodiansMsg += personMsg
  1330. var custodiansData SendMsg
  1331. custodiansData.MsgType = "markdown"
  1332. custodiansData.Markdown.Content = custodiansMsg
  1333. urlCustodians := mpsPerson[mpsPerson[pName].Custodians].Url
  1334. s.SendMsgData(urlCustodians, custodiansData)
  1335. }
  1336. _ = s.cache.SetCacheStr(ctx, lastTimeKey, time.Now().Unix())
  1337. }
  1338. }
  1339. }
  1340. func (s *SyncData) TaskMsgSendFreeDataUpdate(ctx context.Context, completesInfo []task.GameTargetComplete, ctime int64, date, lastFreeMsgSendTimeKey string, isOne bool) {
  1341. var RateMp = make(map[int]CompletedInfo)
  1342. lastFreeMsgSendTime, _ := s.cache.GetCacheNum(ctx, lastFreeMsgSendTimeKey)
  1343. for _, complete := range completesInfo {
  1344. lastPayCompletedKey := fmt.Sprintf(LastPayCompletedKey, date, complete.TaskId)
  1345. lastPayCompletedUpdateTimeKey := fmt.Sprintf(LastPayCompletedUpdateTimeKey, date, complete.TaskId)
  1346. lastPayAddUpdateTimeKey := fmt.Sprintf(LastPayAddUpdateTimeKey, date, complete.TaskId)
  1347. currentPayCompleted := complete.PayComplete + complete.HandPayComplete
  1348. payErrAddNumKey := fmt.Sprintf(PayErrAddNumKey, date, complete.TaskId)
  1349. // 付费处理
  1350. if complete.PayTarget != 0 && complete.PayTarget > currentPayCompleted {
  1351. lastPayCompleted, _ := s.cache.GetCacheNum(ctx, lastPayCompletedKey)
  1352. alsoPayTarget := complete.PayTarget - currentPayCompleted
  1353. payRate := 0
  1354. lastPayCompletedUpdateTime, _ := s.cache.GetCacheNum(ctx, lastPayCompletedUpdateTimeKey)
  1355. lastPayAddUpdateTime, _ := s.cache.GetCacheNum(ctx, lastPayAddUpdateTimeKey)
  1356. timeRate := int(ctime) - lastPayCompletedUpdateTime
  1357. if lastPayCompleted < currentPayCompleted {
  1358. payRate = currentPayCompleted - lastPayCompleted
  1359. // 如有效率就初始发累加的付费数量
  1360. _ = s.cache.SetCacheStr(ctx, payErrAddNumKey, 0)
  1361. _ = s.cache.SetCacheStr(ctx, lastPayCompletedKey, currentPayCompleted)
  1362. _ = s.cache.SetCacheStr(ctx, lastPayCompletedUpdateTimeKey, ctime) //上次付费更新时间
  1363. }
  1364. RateMp[complete.TaskId] = CompletedInfo{
  1365. AlsoTarget: alsoPayTarget,
  1366. Rate: payRate,
  1367. TimeRate: timeRate,
  1368. TaskId: complete.TaskId,
  1369. AddPayUpdateTime: lastPayAddUpdateTime,
  1370. }
  1371. } else {
  1372. // 如果当前付费为0,或者完成也更新时间
  1373. _ = s.cache.SetCacheStr(ctx, lastPayCompletedUpdateTimeKey, ctime) //上次付费更新时间
  1374. }
  1375. }
  1376. if isOne {
  1377. _ = s.cache.SetCacheStr(ctx, lastFreeMsgSendTimeKey, time.Now().Unix())
  1378. return
  1379. }
  1380. if len(RateMp) == 0 {
  1381. global.GVA_LOG.Info("TaskMsgSendFreeData没有查询到未完成付费数据")
  1382. return
  1383. }
  1384. var taskStatistics = "%s:taskStatistics"
  1385. var retained = "# 付费播报 "
  1386. retained += fmt.Sprintf("<font color=\"warning\">%s</font>", time.Now().Format("2006-01-02 15:04:05"))
  1387. var errMsg = "**以下游戏付费效率为零:**"
  1388. var errMsgZ = ""
  1389. var sendMsg = map[string]string{}
  1390. var m int //时间内
  1391. m = (int(ctime) - lastFreeMsgSendTime) / 60
  1392. mpsPerson, _ := s.Person.GetUserInfoData()
  1393. var PErrSendMsg = make(map[string]string, len(mpsPerson))
  1394. var mobile []string
  1395. for taskId, data := range RateMp {
  1396. if data.AlsoTarget <= 0 {
  1397. continue
  1398. }
  1399. key := fmt.Sprintf(taskStatistics, date)
  1400. gameIdStr := strconv.Itoa(taskId)
  1401. gameTask, err := global.GVA_REDIS.HGet(ctx, key, gameIdStr).Result()
  1402. if err != nil {
  1403. if err == redis.Nil {
  1404. continue
  1405. } else {
  1406. global.GVA_LOG.Error("TaskMsgSendRetainedData获取缓存任务数据失败", zap.Error(err))
  1407. continue
  1408. }
  1409. }
  1410. var taskStatistics request.TaskStatistics
  1411. _ = json.Unmarshal([]byte(gameTask), &taskStatistics)
  1412. var name = taskStatistics.Remark
  1413. sendMsg[name] += "\n"
  1414. sendMsg[name] += taskStatistics.GameName
  1415. sendMsg[name] += ",付费差"
  1416. //sendMsg[name] += strconv.Itoa(data.AlsoTarget)
  1417. sendMsg[name] += fmt.Sprintf("<font color=\"warning\">%d</font>", data.AlsoTarget)
  1418. if data.TimeRate > 60*60*24 {
  1419. lastPayCompletedUpdateTimeKey := fmt.Sprintf(LastPayCompletedUpdateTimeKey, date, data.TaskId)
  1420. _ = s.cache.SetCacheStr(ctx, lastPayCompletedUpdateTimeKey, ctime) //上次付费更新时间
  1421. data.TimeRate = 60 * 60 * 2
  1422. }
  1423. // 单条异常记录
  1424. oneErrM := ""
  1425. // 5分钟数据没动报异常数据
  1426. if data.TimeRate/60 >= 2 {
  1427. if data.Rate == 0 {
  1428. lastPayAddNumKey := fmt.Sprintf(LastPayAddNumKey, date, data.TaskId)
  1429. payErrAddNumKey := fmt.Sprintf(PayErrAddNumKey, date, data.TaskId)
  1430. numErr, _ := s.cache.GetCacheNum(context.Background(), payErrAddNumKey)
  1431. lastAddFeeNumErr, _ := s.cache.GetCacheNum(context.Background(), lastPayAddNumKey)
  1432. oneErrM += taskStatistics.GameName
  1433. oneErrM += "("
  1434. if data.TimeRate/60 >= 60 {
  1435. oneErrM += strconv.Itoa(data.TimeRate / 60 / 60)
  1436. oneErrM += "小时内(+" + strconv.Itoa(numErr) + "))"
  1437. } else {
  1438. oneErrM += strconv.Itoa(data.TimeRate / 60)
  1439. oneErrM += "分钟内(+" + strconv.Itoa(numErr) + "))"
  1440. }
  1441. oneErrM += ","
  1442. oneErrM += "最后加付费时间 "
  1443. t := time.Unix(int64(data.AddPayUpdateTime), 0)
  1444. oneErrM += t.Format("15:04:05")
  1445. oneErrM += "(+" + strconv.Itoa(lastAddFeeNumErr) + ")"
  1446. errMsgZ += "\n"
  1447. errMsgZ += oneErrM
  1448. if _, ok := mpsPerson[name]; ok {
  1449. mobile = append(mobile, mpsPerson[name].MobilePhoneNumber)
  1450. }
  1451. if data.TimeRate/60 >= 30 {
  1452. PErrSendMsg[name] += s.StrMontage(data.TimeRate/60, taskStatistics.GameName, ",付费", data.AlsoTarget)
  1453. PErrSendMsg[name] += ","
  1454. PErrSendMsg[name] += "最后加付费时间 "
  1455. PErrSendMsg[name] += t.Format("15:04:05")
  1456. PErrSendMsg[name] += "(+" + strconv.Itoa(lastAddFeeNumErr) + ")"
  1457. PErrSendMsg[name] += "\n"
  1458. }
  1459. }
  1460. }
  1461. sendMsg[name] += ","
  1462. if m >= 60 {
  1463. sendMsg[name] += strconv.Itoa(m / 60)
  1464. sendMsg[name] += "小时内完成"
  1465. } else {
  1466. sendMsg[name] += strconv.Itoa(m)
  1467. sendMsg[name] += "分钟内完成"
  1468. }
  1469. //sendMsg[name] += strconv.Itoa(data.Rate)
  1470. sendMsg[name] += fmt.Sprintf("<font color=\"warning\">%d</font>", data.Rate)
  1471. }
  1472. if len(sendMsg) == 0 {
  1473. return
  1474. }
  1475. hour := time.Now().Hour()
  1476. msgType := "# 付费异常 "
  1477. go s.TaskMsgSendDirector(ctx, msgType, PErrSendMsg, mpsPerson, hour, date, 30, true)
  1478. msg := retained
  1479. for name, msg1 := range sendMsg {
  1480. msg += "\n"
  1481. msg += name
  1482. msg += msg1
  1483. }
  1484. if errMsgZ != "" {
  1485. msg += "\n"
  1486. //msg += errMsg + errMsgZ
  1487. msg += fmt.Sprintf("<font color=\"warning\">%s</font>", errMsg+errMsgZ)
  1488. }
  1489. //global.GVA_LOG.Warn(msg)
  1490. _ = s.cache.SetCacheStr(ctx, lastFreeMsgSendTimeKey, time.Now().Unix())
  1491. url := global.GVA_CONFIG.SendUrl.ComputerSendUrl
  1492. var sendData SendMsg
  1493. sendData.MsgType = "markdown"
  1494. sendData.Markdown.Content = msg
  1495. s.SendMsgData(url, sendData)
  1496. if len(mobile) != 0 {
  1497. var sendTextData SendTextMsg
  1498. sendTextData.MsgType = "text"
  1499. sendTextData.Text.MentionedMobileList = mobile
  1500. s.SendMsgData(url, sendTextData)
  1501. }
  1502. return
  1503. }
  1504. // 加付费通知 common
  1505. //func (s *SyncData) FreeSendMsg(num, target int, taskName, director string) {
  1506. // hour := time.Now().Hour()
  1507. // if hour < 8 || num < 20 {
  1508. // return
  1509. // }
  1510. // person, err := s.Person.GetUserInfoByName(director)
  1511. // if err != nil {
  1512. // global.GVA_LOG.Error("FreeSendMsg获取用户数据失败"+director, zap.Error(err))
  1513. // }
  1514. // if person.PushStatus != 1 {
  1515. // return
  1516. // }
  1517. // personMsg := "# 加付费"
  1518. // personMsg += fmt.Sprintf("<font color=\"warning\">%s</font>", time.Now().Format("2006-01-02 15:04:05"))
  1519. // personMsg += "\n"
  1520. // personMsg += taskName
  1521. // personMsg += fmt.Sprintf("<font color=\"warning\"> 加付费 %d, 当前付费目标 %d</font>", num, target)
  1522. // url := person.Url
  1523. // var sendData SendMsg
  1524. // sendData.MsgType = "markdown"
  1525. // sendData.Markdown.Content = personMsg
  1526. // s.SendMsgData(url, sendData)
  1527. //}
  1528. type TaskIdXmy struct {
  1529. TaskId int `json:"task_id"`
  1530. GameIdXmy string `json:"game_id_xmy"`
  1531. }
  1532. func (s *SyncData) getTaskData() []TaskIdXmy {
  1533. db := global.GVA_DB.Table("game_task").Where("status=?", 1)
  1534. var count int64
  1535. db.Count(&count)
  1536. var data = make([]TaskIdXmy, count)
  1537. db.Find(&data)
  1538. return data
  1539. }
  1540. type ArpuInfo struct {
  1541. Arpu string `json:"arpu"`
  1542. GameId string `json:"game_id"`
  1543. GameName string `json:"game_name"`
  1544. SheepGameId string `json:"sheep_game_id"`
  1545. }
  1546. func (s *SyncData) SyncArpu() {
  1547. url := global.GVA_CONFIG.SendUrl.GetUrlArpu
  1548. jfparams := map[string]string{}
  1549. jfbyteData, err := utils.HttpGet(url, jfparams)
  1550. if err != nil {
  1551. global.GVA_LOG.Error("SyncArpu获取arpu值失败", zap.Error(err))
  1552. }
  1553. var arpuInfo []ArpuInfo
  1554. _ = json.Unmarshal(jfbyteData, &arpuInfo)
  1555. mps := make(map[string]int, len(arpuInfo))
  1556. for _, data := range arpuInfo {
  1557. s := strings.Split(data.Arpu, ".")
  1558. arpu, _ := strconv.Atoi(s[0])
  1559. mps[data.SheepGameId] = arpu
  1560. }
  1561. data := s.getTaskData()
  1562. for _, taskInfo := range data {
  1563. if taskInfo.GameIdXmy != "" {
  1564. if _, ok := mps[taskInfo.GameIdXmy]; ok {
  1565. 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
  1566. if err != nil {
  1567. global.GVA_LOG.Error("SyncArpu更新game_target_complete失败", zap.Error(err))
  1568. }
  1569. }
  1570. }
  1571. }
  1572. }
  1573. func (s *SyncData) RemindSendOne() {
  1574. //url := "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=89460a48-e1a1-4181-86c0-533bad342628"
  1575. url := global.GVA_CONFIG.SendUrl.SendUrlOne
  1576. content := "请查看腾讯游戏是否有付费目标"
  1577. mobile := []string{global.GVA_CONFIG.SendUrl.TxSendMobile}
  1578. s.common.RemindSend(url, content, mobile)
  1579. }
  1580. func (s *SyncData) GameTaskTargetInfoPush() {
  1581. date := time.Now().Add(-time.Hour * 24).Format("2006-01-02")
  1582. s.GameTask.PushTaskToYl(date)
  1583. return
  1584. }
  1585. func (s *SyncData) RequestControlBackend(requestData []request2.GetGameTargetCompleteInfo) (d string, err error) {
  1586. //url := global.GVA_CONFIG.ExtranetDomain.Control + CreateTaskUrl
  1587. url := global.GVA_CONFIG.ExtranetDomain.YlControl + "/bpm_api/data_optimize"
  1588. requestMap := map[string]interface{}{
  1589. "jsonData": requestData,
  1590. }
  1591. data, code, err := utils.HttpPostReplyCode2(url, requestMap)
  1592. if err != nil {
  1593. global.GVA_LOG.Error("RequestControlBackend fail", zap.Error(err))
  1594. }
  1595. if code != 200 {
  1596. msg := fmt.Sprintf("status:%d,data:%s", code, string(data))
  1597. global.GVA_LOG.Warn(msg)
  1598. return string(data), errors.New(string(data))
  1599. }
  1600. msg := fmt.Sprintf("status:%d,data:%s", code, string(data))
  1601. global.GVA_LOG.Warn(msg)
  1602. return
  1603. }
  1604. func (s SyncData) CheckControlCompleteData() {
  1605. db := global.GVA_DB.Model(&task.GameTask{})
  1606. var apiList []task.GameTask
  1607. db = db.Where("is_del = ?", -1)
  1608. db = db.Where("status = ?", 1)
  1609. err := db.Order("id desc").Find(&apiList).Error
  1610. if err != nil {
  1611. global.GVA_LOG.Error("查询任务数据失败", zap.Error(err))
  1612. return
  1613. }
  1614. if len(apiList) == 0 {
  1615. global.GVA_LOG.Info("没有任务数据")
  1616. return
  1617. }
  1618. date := time.Now().Format("2006-01-02")
  1619. for _, gameTask := range apiList {
  1620. roomData, _ := s.SyncRoomData(date, gameTask.TaskId)
  1621. xmyComplete := strings.Split(roomData.CompleteNum, "/")
  1622. if len(xmyComplete) < 3 {
  1623. continue
  1624. }
  1625. xmyNewComplete, _ := strconv.Atoi(xmyComplete[0])
  1626. xmyRetainedComplete, _ := strconv.Atoi(xmyComplete[1])
  1627. controlComplete := strings.Split(roomData.CompleteLocalNum, "/")
  1628. if len(controlComplete) < 3 {
  1629. continue
  1630. }
  1631. controlNewComplete, _ := strconv.Atoi(controlComplete[0])
  1632. controlRetainedComplete, _ := strconv.Atoi(controlComplete[1])
  1633. if xmyNewComplete > 1 && controlNewComplete == 0 {
  1634. // 新增异常,推送消息
  1635. content := s.CheckControlCompleteDataMsg(gameTask.TaskId, gameTask.TaskName, "新增")
  1636. s.SendMsg(content, gameTask.User)
  1637. }
  1638. if xmyRetainedComplete > 1 && controlRetainedComplete == 0 {
  1639. // 留存异常,推送消息
  1640. content := s.CheckControlCompleteDataMsg(gameTask.TaskId, gameTask.TaskName, "留存")
  1641. s.SendMsg(content, gameTask.User)
  1642. }
  1643. }
  1644. }
  1645. func (s SyncData) CheckControlCompleteDataMsg(gameId int, gameName, typeStr string) string {
  1646. c := "# 群控数据异常"
  1647. c += fmt.Sprintf("<font color=\"warning\">%s</font>", time.Now().Format("2006-01-02 15:04:05"))
  1648. c += "\n"
  1649. c += typeStr
  1650. c += "\n"
  1651. ct := fmt.Sprintf("<font color=\"warning\"> %d, %s</font>", gameId, gameName)
  1652. ct = c + ct
  1653. return ct
  1654. }
  1655. func (s *SyncData) SendContent(content, url string) {
  1656. var sendMsg SendMsg
  1657. sendMsg.MsgType = "markdown"
  1658. sendMsg.Markdown.Content = content
  1659. s.SendMsgData(url, sendMsg)
  1660. }
  1661. func (s *SyncData) SendMsg(content string, operator string) {
  1662. mpsPerson, _ := s.Person.GetUserInfoData()
  1663. if operator != "" {
  1664. s.SendContent(content, mpsPerson[operator].Url)
  1665. url := global.GVA_CONFIG.SendUrl.ComputerSendUrl
  1666. s.SendContent(content, url)
  1667. var sendTextData SendTextMsg
  1668. sendTextData.MsgType = "text"
  1669. sendTextData.Text.MentionedMobileList = []string{mpsPerson[operator].MobilePhoneNumber}
  1670. s.SendMsgData(url, sendTextData)
  1671. }
  1672. }
  1673. type RetainedRatioData struct {
  1674. Data map[int][]RatioData `json:"data"`
  1675. Status string `json:"status"`
  1676. }
  1677. type RatioData struct {
  1678. NewDate string `json:"NewDate"`
  1679. Duration int `json:"Duration"`
  1680. Total int `json:"Total"`
  1681. }
  1682. func (s *SyncData) SyncControlRetainedRatioData() {
  1683. requestData := s.getRatioData()
  1684. if requestData.Status != "OK" {
  1685. return
  1686. }
  1687. db := global.GVA_DB.Model(&task.GameTask{})
  1688. var apiList []task.GameTask
  1689. db = db.Where("is_del = ?", -1)
  1690. db = db.Where("status = ?", 1)
  1691. err := db.Order("id desc").Find(&apiList).Error
  1692. if err != nil {
  1693. global.GVA_LOG.Error("查询任务数据失败", zap.Error(err))
  1694. return
  1695. }
  1696. if len(apiList) == 0 {
  1697. global.GVA_LOG.Info("没有任务数据")
  1698. return
  1699. }
  1700. var gameRDs []task.GameRetainedData
  1701. for _, gameTask := range apiList {
  1702. if _, ok := requestData.Data[gameTask.TaskId]; !ok {
  1703. continue
  1704. }
  1705. for _, data := range requestData.Data[gameTask.TaskId] {
  1706. var gameRD task.GameRetainedData
  1707. gameRD.GameId = gameTask.TaskId
  1708. gameRD.Total = data.Total
  1709. gameRD.Duration = data.Duration
  1710. gameRD.NewDate = data.NewDate
  1711. gameRD.RetainedDate = time.Now()
  1712. gameRDs = append(gameRDs, gameRD)
  1713. }
  1714. }
  1715. global.GVA_DB.Create(&gameRDs)
  1716. return
  1717. }
  1718. func (s SyncData) getRatioData() (requestData RetainedRatioData) {
  1719. xmyUrl := "http://xjf.lianyou.fun:8099/v1/account/retained_rate"
  1720. params := map[string]string{}
  1721. xmyByteData, err := utils.HttpGet(xmyUrl, params)
  1722. if err != nil {
  1723. return
  1724. }
  1725. _ = json.Unmarshal(xmyByteData, &requestData)
  1726. return
  1727. }
  1728. type GameRatio struct {
  1729. Id int `json:"id"`
  1730. GameId int `json:"game_id"`
  1731. Second int `json:"second"` // 次留
  1732. Third int `json:"third"` // 3留
  1733. Forth int `json:"forth"` // 4留
  1734. Fifth int `json:"fifth"` // 5留
  1735. Sixth int `json:"sixth"` // 6留
  1736. Seventh int `json:"seventh"` // 7留
  1737. Tenth int `json:"tenth"` // 10留
  1738. Fifteenth int `json:"fifteenth"` // 15留
  1739. Twentieth int `json:"twentieth"` // 20留
  1740. Thirtieth int `json:"thirtieth"` // 30留
  1741. }
  1742. func (s SyncData) getRatio(gameId int) (requestData GameRatio) {
  1743. xmyUrl := fmt.Sprintf("http://xjf.lianyou.fun:8099/v1/task_statistics/retained/%d", gameId)
  1744. params := map[string]string{}
  1745. xmyByteData, err := utils.HttpGet(xmyUrl, params)
  1746. if err != nil {
  1747. return
  1748. }
  1749. _ = json.Unmarshal(xmyByteData, &requestData)
  1750. return
  1751. }
  1752. func (s *SyncData) SyncControlRatio() {
  1753. db := global.GVA_DB.Model(&task.GameTask{})
  1754. var apiList []task.GameTask
  1755. db = db.Where("is_del = ?", -1)
  1756. db = db.Where("status = ?", 1)
  1757. err := db.Order("id desc").Find(&apiList).Error
  1758. if err != nil {
  1759. global.GVA_LOG.Error("查询任务数据失败", zap.Error(err))
  1760. return
  1761. }
  1762. if len(apiList) == 0 {
  1763. global.GVA_LOG.Info("没有任务数据")
  1764. return
  1765. }
  1766. var gameRDs []task.GameRatioData
  1767. for _, gameTask := range apiList {
  1768. requestData := s.getRatio(gameTask.TaskId)
  1769. if requestData.Id == 0 {
  1770. continue
  1771. }
  1772. var gameRD task.GameRatioData
  1773. global.GVA_DB.Where("game_id = ?", gameTask.TaskId).First(&gameRD)
  1774. gameRD.Second = requestData.Second
  1775. gameRD.Third = requestData.Third
  1776. gameRD.Forth = requestData.Forth
  1777. gameRD.Fifth = requestData.Fifth
  1778. gameRD.Sixth = requestData.Sixth
  1779. gameRD.Seventh = requestData.Seventh
  1780. gameRD.Tenth = requestData.Tenth
  1781. gameRD.Fifteenth = requestData.Fifteenth
  1782. gameRD.Twentieth = requestData.Twentieth
  1783. gameRD.Thirtieth = requestData.Thirtieth
  1784. if gameRD.GameId == 0 {
  1785. gameRD.GameId = gameTask.TaskId
  1786. gameRDs = append(gameRDs, gameRD)
  1787. } else {
  1788. global.GVA_DB.Where("game_id = ?", gameTask.TaskId).Updates(&gameRD)
  1789. }
  1790. }
  1791. if len(gameRDs) > 0 {
  1792. global.GVA_DB.Create(&gameRDs)
  1793. }
  1794. return
  1795. }