wechat_scanner_detailed.go 8.9 KB

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