ordermonitor.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. package task
  2. import (
  3. "app.yhyue.com/moapp/jybase/date"
  4. "app.yhyue.com/moapp/jybase/go-logger/logger"
  5. "app.yhyue.com/moapp/message/config"
  6. "app.yhyue.com/moapp/message/db"
  7. "context"
  8. "github.com/gogf/gf/v2/os/gcfg"
  9. "github.com/gogf/gf/v2/os/gcron"
  10. "github.com/gogf/gf/v2/os/gctx"
  11. "github.com/gogf/gf/v2/os/gtime"
  12. "time"
  13. )
  14. const (
  15. TableWinnerInfo2210 = "winner_info_22_10"
  16. Mold1 = "1" // 中奖类型 1:小米智能音响
  17. Mold2 = "2" // 中奖类型 2:ipad
  18. )
  19. var (
  20. flag11 = false // 是否需要查询第11个名单
  21. flag111 = false // 是否需查询第111个名单
  22. monitorConfig config.OrderMonitorConfig
  23. )
  24. func init() {
  25. // 获取配置信息
  26. monitorConfig = config.OrderMonitorConfig{
  27. StartTime: gtime.NewFromStrLayout(gcfg.Instance().MustGet(gctx.New(), "orderMonitor.startTime").String(), "2006-01-02T15:04:05Z").Time,
  28. EndTime: gtime.NewFromStrLayout(gcfg.Instance().MustGet(gctx.New(), "orderMonitor.endTime").String(), "2006-01-02T15:04:05Z").Time,
  29. Date111: date.FormatDate(&gtime.NewFromStrLayout(gcfg.Instance().MustGet(gctx.New(), "orderMonitor.date111").String(), "2006-01-02T15:04:05Z").Time, date.Date_Short_Layout),
  30. OpenCron: gcfg.Instance().MustGet(gctx.New(), "orderMonitor.openCron").String(),
  31. SelectCron: gcfg.Instance().MustGet(gctx.New(), "orderMonitor.selectCron").String(),
  32. }
  33. }
  34. // SelectOrderTask 订单监控
  35. func SelectOrderTask() {
  36. // 活动已结束 不再启动定时任务
  37. if time.Now().After(monitorConfig.EndTime) {
  38. return
  39. }
  40. var (
  41. err error
  42. ctx = gctx.New()
  43. )
  44. // 订单查询任务
  45. _, err = gcron.Add(ctx, monitorConfig.SelectCron, monitor, "selectJob")
  46. if err != nil {
  47. logger.Error("定时任务selectJob添加失败", err)
  48. }
  49. if time.Now().Before(monitorConfig.StartTime) { // 活动未开始
  50. gcron.Stop("selectJob") // 停掉订单查询任务 等后边的定时任务开启
  51. logger.Info("selectJob stop")
  52. }
  53. // 开启定时任务
  54. _, err = gcron.Add(ctx, monitorConfig.OpenCron, func(ctx context.Context) {
  55. now := time.Now()
  56. if now.After(monitorConfig.EndTime) { // 活动已结束 移除掉任务
  57. logger.Info("活动结束,移除任务")
  58. gcron.Remove("openCronJob")
  59. gcron.Remove("selectJob")
  60. }
  61. // 活动时间范围内 开启订单查询的定时任务
  62. if now.After(monitorConfig.StartTime) && now.Before(monitorConfig.EndTime) {
  63. flag11 = false // 重置
  64. flag111 = false
  65. gcron.Start("selectJob")
  66. logger.Info("selectJob start")
  67. }
  68. }, "openCronJob")
  69. if err != nil {
  70. logger.Info("定时任务openCronJob失败", err)
  71. }
  72. logger.Info("openCronJob 启动成功")
  73. }
  74. // 订单监控
  75. func monitor(ctx context.Context) {
  76. logger.Info("开始本轮订单查询")
  77. now := time.Now()
  78. if now.After(monitorConfig.StartTime) && now.Before(monitorConfig.EndTime) {
  79. // 查订单表
  80. // 查第11个
  81. if !flag11 {
  82. rs := selectOrder(11)
  83. if rs != nil { // 查到了
  84. logger.Info("查询到第11个人员")
  85. data := map[string]interface{}{
  86. "phone": rs["user_phone"],
  87. "userid": rs["user_id"],
  88. "winnerdate": rs["pay_time"],
  89. "mold": Mold1,
  90. "createdate": date.NowFormat(date.Date_Full_Layout),
  91. }
  92. if saveWinnerInfo(data) {
  93. flag11 = true
  94. logger.Info("中奖信息保存成功:", data)
  95. } else {
  96. logger.Error("中奖信息保存失败:", data)
  97. }
  98. }
  99. }
  100. // 需要查第111个 日期范围内
  101. if date.NowFormat(date.Date_Short_Layout) == monitorConfig.Date111 {
  102. logger.Info("开始查询第111个人员")
  103. rs111 := selectOrder(111)
  104. if rs111 != nil {
  105. logger.Info("查询到第111个人员")
  106. saveData := map[string]interface{}{
  107. "phone": rs111["user_phone"],
  108. "userid": rs111["user_id"],
  109. "winnerdate": rs111["pay_time"],
  110. "mold": Mold2,
  111. "createdate": date.NowFormat(date.Date_Full_Layout),
  112. }
  113. if saveWinnerInfo(saveData) {
  114. flag111 = true
  115. } else {
  116. logger.Error("中奖信息保存失败:", saveData)
  117. }
  118. }
  119. } else {
  120. logger.Info("未到11日,不需要查第111名")
  121. flag111 = true
  122. }
  123. if flag111 && flag11 {
  124. logger.Info("今日已查询到 暂停任务")
  125. gcron.Stop("selectJob")
  126. logger.Info("selectJob stop")
  127. }
  128. }
  129. }
  130. // 查订单表
  131. func selectOrder(num int) map[string]interface{} {
  132. sql := "SELECT user_phone,user_id,pay_time FROM `dataexport_order` WHERE product_type in ('VIP订阅','大会员','数据流量包') and pay_time !=null and order_status = 1 and is_backstage_order=0 AND TO_DAYS(create_time) = to_days(now()) ORDER BY pay_time limit ?,1;"
  133. rs := db.Mysql.SelectBySql(sql, num-1)
  134. if rs != nil && len(*rs) == 1 {
  135. return (*rs)[0]
  136. }
  137. logger.Info("未查到", rs)
  138. return nil
  139. }
  140. // 保存中奖人员信息
  141. func saveWinnerInfo(data map[string]interface{}) bool {
  142. logger.Info("save winner info ")
  143. return db.Mysql.Insert(TableWinnerInfo2210, data) > 0
  144. }