wechat_scanner_detailed.go 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  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. err = global.GVA_DB.Create(&data).Error
  161. if err != nil {
  162. return
  163. }
  164. }
  165. }
  166. //计算微信扫码消耗
  167. //SELECT platform, COUNT(*) FROM wechat_scanner_detailed WHERE new_date = '2023-02-07' AND task_id = 888811 AND new_retained = 1 GROUP BY platform
  168. arrPlatform := []string{"海马", "浪潮"}
  169. for _, platform := range arrPlatform {
  170. var db1Ledger dataStatistics.WeChatScannerLedger
  171. db1Ledger.TaskId = k
  172. db1Ledger.TaskName = v.GameName
  173. db1Ledger.NewDate = today
  174. db1Ledger.Platform = platform
  175. var listNum []PlatformNum
  176. PriceNew := 0.00
  177. PriceRetained := 0.00
  178. UnitPriceNew := 0.00
  179. UnitPriceRetained := 0.00
  180. 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
  181. if err != nil {
  182. return
  183. }
  184. for _, e := range listNum {
  185. if e.Platform == "海马" {
  186. PriceNew = v.HmPriceNew * float64(e.Count)
  187. UnitPriceNew = v.HmPriceNew
  188. } else if e.Platform == "浪潮" {
  189. //global.GVA_LOG.Info(strconv.Itoa(e.Count))
  190. PriceNew = v.LcPriceNew * float64(e.Count)
  191. UnitPriceNew = v.LcPriceNew
  192. //global.GVA_LOG.Info(strconv.FormatFloat(PriceNew, 'f', 2, 64))
  193. }
  194. }
  195. var listNum2 []PlatformNum
  196. 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
  197. if err != nil {
  198. return
  199. }
  200. for _, e := range listNum2 {
  201. if e.Platform == "海马" {
  202. PriceRetained = v.HmPriceRetained * float64(e.Count)
  203. UnitPriceRetained = v.HmPriceRetained
  204. } else if e.Platform == "浪潮" {
  205. PriceRetained = v.LcPriceRetained * float64(e.Count)
  206. UnitPriceRetained = v.LcPriceRetained
  207. }
  208. }
  209. db1Ledger.LedgerNew = strconv.FormatFloat(PriceNew, 'f', 2, 64)
  210. db1Ledger.LedgerRetained = strconv.FormatFloat(PriceRetained, 'f', 2, 64)
  211. db1Ledger.Ledger = strconv.FormatFloat(PriceNew+PriceRetained, 'f', 2, 64)
  212. db1Ledger.UnitPriceNew = strconv.FormatFloat(UnitPriceNew, 'f', 2, 64)
  213. db1Ledger.UnitPriceRetained = strconv.FormatFloat(UnitPriceRetained, 'f', 2, 64)
  214. //global.GVA_LOG.Info(strconv.Itoa(db1Ledger.TaskId))
  215. //global.GVA_LOG.Info(db1Ledger.TaskName)
  216. //global.GVA_LOG.Info(db1Ledger.LedgerNew)
  217. //global.GVA_LOG.Info(db1Ledger.LedgerRetained)
  218. //global.GVA_LOG.Info(db1Ledger.Ledger)
  219. 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) {
  220. err = global.GVA_DB.Model(&dataStatistics.WeChatScannerLedger{}).Where("new_date = ? and task_id = ? and platform = ?", today, k, platform).Updates(db1Ledger).Error
  221. if err != nil {
  222. return
  223. }
  224. } else {
  225. err = global.GVA_DB.Create(&db1Ledger).Error
  226. if err != nil {
  227. return
  228. }
  229. }
  230. }
  231. }
  232. }
  233. // SyncGetWeChatScannerBalance 定时获取扫码平台余额
  234. //
  235. // getJfWechatOrder 获取机房后台微信订单列表信息
  236. func (s *ServiceWeChatScannerDetailed) getJfWechatOrder(gameId int, date string) (result []byte, err error) {
  237. jfUrl := "http://xjf.lianyou.fun:8099/v1/account/get_wechat_order"
  238. jfParams := map[string]string{
  239. "game_id": strconv.Itoa(gameId),
  240. "date": date,
  241. }
  242. result, err = utils.HttpGet(jfUrl, jfParams)
  243. return
  244. }