wechat_scanner_detailed.go 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. package dataStatistics
  2. import (
  3. "context"
  4. "errors"
  5. "github.com/bitly/go-simplejson"
  6. _ "github.com/bitly/go-simplejson"
  7. "go.uber.org/zap"
  8. "gorm.io/gorm"
  9. "log-server/global"
  10. "log-server/model/dataStatistics"
  11. "log-server/model/dataStatistics/request"
  12. "log-server/model/dataStatistics/response"
  13. "log-server/utils"
  14. "strconv"
  15. "strings"
  16. "time"
  17. //"time"
  18. )
  19. type ServiceWeChatScannerDetailed struct {
  20. }
  21. type WeChatGameInfo struct {
  22. GameName string
  23. LcPriceNew float64
  24. LcPriceRetained float64
  25. HmPriceNew float64
  26. HmPriceRetained float64
  27. }
  28. type PlatformNum struct {
  29. Platform string `json:"platform"`
  30. Count int `json:"count"`
  31. }
  32. func (s *ServiceWeChatScannerDetailed) WeChatScannerDetailedList(ctx context.Context, api dataStatistics.WeChatScannerDetailed, info request.PageInfo, order string, desc bool) (interface{}, int64, error) {
  33. db := global.GVA_DB.Model(&dataStatistics.WeChatScannerDetailed{})
  34. //global.GVA_LOG.Info(api.NewDate)
  35. if api.Platform != "" {
  36. db = db.Where("platform = ?", api.Platform)
  37. }
  38. if api.NewDate != "" {
  39. db = db.Where("new_date = ?", api.NewDate)
  40. }
  41. if api.TaskId != 0 {
  42. db = db.Where("task_id = ?", api.TaskId)
  43. }
  44. if api.NewRetained != 0 {
  45. if api.NewRetained == 1 {
  46. db = db.Where("new_retained = ?", api.NewRetained)
  47. } else {
  48. db = db.Where("new_retained >= ?", api.NewRetained)
  49. }
  50. }
  51. var total int64
  52. err := db.Count(&total).Error
  53. //if err != nil {
  54. // return nil, 0, err
  55. //}
  56. limit := info.PageSize
  57. offset := info.PageSize * (info.Page - 1)
  58. //var statisticsLogs []*log.LogComputer
  59. var apiList []dataStatistics.WeChatScannerDetailed
  60. db = db.Limit(limit).Offset(offset)
  61. if order != "" {
  62. var OrderStr string
  63. // 设置有效排序key 防止sql注入
  64. // 感谢 Tom4t0 提交漏洞信息
  65. orderMap := make(map[string]bool, 3)
  66. orderMap["id"] = true
  67. //orderMap["game_id"] = true
  68. //orderMap["operator"] = true
  69. if orderMap[order] {
  70. if desc {
  71. OrderStr = order + " desc"
  72. } else {
  73. OrderStr = order + " desc"
  74. }
  75. } else { // didn't matched any order key in `orderMap`
  76. global.GVA_LOG.Error("获取失败!", zap.Error(err))
  77. return apiList, total, err
  78. }
  79. err = db.Order(OrderStr).Find(&apiList).Error
  80. } else {
  81. err = db.Order("id").Find(&apiList).Error
  82. }
  83. if err != nil {
  84. return nil, 0, err
  85. }
  86. var arrayResponse []*response.WeChatScannerDetailedResponse
  87. for _, e := range apiList {
  88. oneResponse := new(response.WeChatScannerDetailedResponse)
  89. oneResponse.Id = e.Id
  90. oneResponse.NewDate = e.NewDate
  91. oneResponse.OrderId = e.OrderId
  92. oneResponse.Platform = e.Platform
  93. oneResponse.AuthorizationTime = e.AuthorizationTime
  94. oneResponse.TaskId = e.TaskId
  95. oneResponse.TaskName = e.TaskName
  96. oneResponse.NewRetained = e.NewRetained
  97. arrayResponse = append(arrayResponse, oneResponse)
  98. }
  99. return arrayResponse, total, err
  100. }
  101. // SyncTodayWeChatScannerDetailed 同步今日
  102. func (s *ServiceWeChatScannerDetailed) SyncTodayWeChatScannerDetailed() {
  103. today := time.Now().Format("2006-01-02")
  104. s.SyncWeChatScannerDetailed(today)
  105. }
  106. // SyncYesterdayWeChatScannerDetailed 0点同步昨日数据,确保数据完整性
  107. func (s *ServiceWeChatScannerDetailed) SyncYesterdayWeChatScannerDetailed() {
  108. today := time.Now()
  109. yesterday := today.AddDate(0, 0, -1).Format("2006-01-02")
  110. s.SyncWeChatScannerDetailed(yesterday)
  111. }
  112. // SyncWeChatScannerDetailed 定时批量同步微信扫码订单号明细,先将微信扫码的游戏写死
  113. func (s *ServiceWeChatScannerDetailed) SyncWeChatScannerDetailed(today string) {
  114. tencentTasks := map[int]WeChatGameInfo{
  115. 10101: {GameName: "坦克前线", LcPriceNew: 0.35, LcPriceRetained: 0.01, HmPriceNew: 0.4, HmPriceRetained: 0.01},
  116. 10360903: {GameName: "原始传奇-10360903", LcPriceNew: 0.35, LcPriceRetained: 0.01, HmPriceNew: 0.4, HmPriceRetained: 0.01},
  117. 10361913: {GameName: "原始传奇-10361913", LcPriceNew: 0.35, LcPriceRetained: 0.01, HmPriceNew: 0.4, HmPriceRetained: 0.01},
  118. 10363822: {GameName: "原始传奇-10363822", LcPriceNew: 0.35, LcPriceRetained: 0.01, HmPriceNew: 0.4, HmPriceRetained: 0.01},
  119. 6543: {GameName: "创造与魔法10361913", LcPriceNew: 0.4, LcPriceRetained: 0.01, HmPriceNew: 0.4, HmPriceRetained: 0.01},
  120. 8767: {GameName: "奶块10361913", LcPriceNew: 0.35, LcPriceRetained: 0.01, HmPriceNew: 0.4, HmPriceRetained: 0.01},
  121. 888811: {GameName: "热血合击tx-10360903 ", LcPriceNew: 0.35, LcPriceRetained: 0.01, HmPriceNew: 0.4, HmPriceRetained: 0.01},
  122. }
  123. for k, v := range tencentTasks {
  124. result := s.getJfWechatOrder(k, today)
  125. dataJson, _ := simplejson.NewJson(result)
  126. dataArr, _ := dataJson.Array()
  127. for index, _ := range dataArr {
  128. info := dataJson.GetIndex(index)
  129. //GameId, _ := info.Get("GameId").Int()
  130. WeChatOrder, _ := info.Get("WeChatOrder").String()
  131. Retained, _ := info.Get("Retained").Int()
  132. Time, _ := info.Get("Time").String()
  133. orderArr := strings.Split(WeChatOrder, "|")
  134. orderId := orderArr[0]
  135. platform := orderArr[1]
  136. var data dataStatistics.WeChatScannerDetailed
  137. data.NewDate = today
  138. data.TaskId = k
  139. data.Platform = platform
  140. data.OrderId = orderId
  141. data.NewRetained = Retained
  142. data.AuthorizationTime = Time
  143. data.TaskName = v.GameName
  144. if errors.Is(global.GVA_DB.Model(&dataStatistics.WeChatScannerDetailed{}).Where("new_date = ? and task_id = ? and order_id = ?", today, k, orderId).First(&dataStatistics.WeChatScannerDetailed{}).Error, gorm.ErrRecordNotFound) {
  145. _ = global.GVA_DB.Create(&data).Error
  146. }
  147. }
  148. //计算微信扫码消耗
  149. //SELECT platform, COUNT(*) FROM wechat_scanner_detailed WHERE new_date = '2023-02-07' AND task_id = 888811 AND new_retained = 1 GROUP BY platform
  150. arrPlatform := []string{"海马", "浪潮"}
  151. for _, platform := range arrPlatform {
  152. var db1Ledger dataStatistics.WeChatScannerLedger
  153. db1Ledger.TaskId = k
  154. db1Ledger.TaskName = v.GameName
  155. db1Ledger.NewDate = today
  156. db1Ledger.Platform = platform
  157. var listNum []PlatformNum
  158. PriceNew := 0.00
  159. PriceRetained := 0.00
  160. _ = global.GVA_DB.Model(&dataStatistics.WeChatScannerDetailed{}).Select("platform", "COUNT(*) AS count").Where("new_date = ? and task_id = ? and platform = ? and new_retained = 1", today, k, platform).First(&listNum).Error
  161. for _, e := range listNum {
  162. if e.Platform == "海马" {
  163. PriceNew = v.HmPriceNew * float64(e.Count)
  164. } else if e.Platform == "浪潮" {
  165. //global.GVA_LOG.Info(strconv.Itoa(e.Count))
  166. PriceNew = v.LcPriceNew * float64(e.Count)
  167. //global.GVA_LOG.Info(strconv.FormatFloat(PriceNew, 'f', 2, 64))
  168. }
  169. }
  170. var listNum2 []PlatformNum
  171. _ = global.GVA_DB.Model(&dataStatistics.WeChatScannerDetailed{}).Select("platform", "COUNT(*) AS count").Where("new_date = ? and task_id = ? and platform = ? and new_retained >= 2", today, k, platform).First(&listNum2).Error
  172. for _, e := range listNum2 {
  173. if e.Platform == "海马" {
  174. PriceRetained = v.HmPriceRetained * float64(e.Count)
  175. } else if e.Platform == "浪潮" {
  176. PriceRetained = v.LcPriceRetained * float64(e.Count)
  177. }
  178. }
  179. db1Ledger.LedgerNew = strconv.FormatFloat(PriceNew, 'f', 2, 64)
  180. db1Ledger.LedgerRetained = strconv.FormatFloat(PriceRetained, 'f', 2, 64)
  181. db1Ledger.Ledger = strconv.FormatFloat(PriceNew+PriceRetained, 'f', 2, 64)
  182. //global.GVA_LOG.Info(strconv.Itoa(db1Ledger.TaskId))
  183. //global.GVA_LOG.Info(db1Ledger.TaskName)
  184. //global.GVA_LOG.Info(db1Ledger.LedgerNew)
  185. //global.GVA_LOG.Info(db1Ledger.LedgerRetained)
  186. //global.GVA_LOG.Info(db1Ledger.Ledger)
  187. if !errors.Is(global.GVA_DB.Model(&dataStatistics.WeChatScannerLedger{}).Where("new_date = ? and task_id = ? and platform = ?", today, k, platform).First(&dataStatistics.WeChatScannerLedger{}).Error, gorm.ErrRecordNotFound) {
  188. _ = global.GVA_DB.Model(&dataStatistics.WeChatScannerLedger{}).Where("new_date = ? and task_id = ? and platform = ?", today, k, platform).Updates(db1Ledger).Error
  189. } else {
  190. _ = global.GVA_DB.Create(&db1Ledger).Error
  191. }
  192. }
  193. }
  194. }
  195. // SyncGetWeChatScannerBalance 定时获取扫码平台余额
  196. //
  197. // getJfWechatOrder 获取机房后台微信订单列表信息
  198. func (s *ServiceWeChatScannerDetailed) getJfWechatOrder(gameId int, date string) (result []byte) {
  199. jfUrl := "http://xjf.lianyou.fun:8099/v1/account/get_wechat_order"
  200. jfParams := map[string]string{
  201. "game_id": strconv.Itoa(gameId),
  202. "date": date,
  203. }
  204. result, _ = utils.HttpGet(jfUrl, jfParams)
  205. return
  206. }