ordermonitor.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  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. "app.yhyue.com/moapp/message/handler/activity"
  8. "context"
  9. "fmt"
  10. "github.com/gogf/gf/v2/os/gcfg"
  11. "github.com/gogf/gf/v2/os/gcron"
  12. "github.com/gogf/gf/v2/os/gctx"
  13. "github.com/gogf/gf/v2/os/gtime"
  14. "time"
  15. )
  16. const (
  17. TableWinnerInfo2210 = "winner_info_22_10"
  18. Mold1 = "1" // 中奖类型 1:小米智能音响
  19. Mold2 = "2" // 中奖类型 2:ipad
  20. )
  21. var (
  22. flag11 = false // 是否需要查询第11个名单
  23. flag111 = false // 是否需查询第111个名单
  24. monitorConfig config.OrderMonitorConfig
  25. )
  26. func init() {
  27. // 获取配置信息
  28. monitorConfig = config.OrderMonitorConfig{
  29. DateSpecial: date.FormatDate(&gtime.NewFromStrLayout(gcfg.Instance().MustGet(gctx.New(), "orderMonitor.dateSpecial").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. WinNumberDaily: gcfg.Instance().MustGet(gctx.New(), "orderMonitor.winNumberDaily").Int(),
  33. WinNumbersSpecial: gcfg.Instance().MustGet(gctx.New(), "orderMonitor.winNumbersSpecial").Int(),
  34. }
  35. }
  36. // SelectOrderTask 订单监控
  37. func SelectOrderTask() {
  38. // 活动已结束 不再启动定时任务
  39. if time.Now().After(activity.MembershipDay.Ed) {
  40. return
  41. }
  42. var (
  43. err error
  44. ctx = gctx.New()
  45. )
  46. // 订单查询任务
  47. _, err = gcron.Add(ctx, monitorConfig.SelectCron, monitor, "selectJob")
  48. if err != nil {
  49. logger.Error("定时任务selectJob添加失败", err)
  50. }
  51. if time.Now().Before(activity.MembershipDay.T2) { // 活动未开始
  52. gcron.Stop("selectJob") // 停掉订单查询任务 等后边的定时任务开启
  53. logger.Info("selectJob stop")
  54. }
  55. // 开启定时任务
  56. _, err = gcron.Add(ctx, monitorConfig.OpenCron, func(ctx context.Context) {
  57. now := time.Now()
  58. if now.After(activity.MembershipDay.Ed) { // 活动已结束 移除掉任务
  59. logger.Info("活动结束,移除任务")
  60. gcron.Remove("openCronJob")
  61. gcron.Remove("selectJob")
  62. }
  63. // 活动时间范围内 开启订单查询的定时任务
  64. _, inTime, _ := activity.MembershipDay.InActivity()
  65. if inTime {
  66. flag11 = false // 重置
  67. flag111 = false
  68. gcron.Start("selectJob")
  69. logger.Info("开启 selectJob 任务")
  70. }
  71. }, "openCronJob")
  72. if err != nil {
  73. logger.Error("定时任务openCronJob失败", err)
  74. }
  75. logger.Info("openCronJob 启动成功")
  76. }
  77. // 订单监控
  78. func monitor(ctx context.Context) {
  79. logger.Info("开始本轮订单查询")
  80. _, inTime, _ := activity.MembershipDay.InActivity()
  81. if inTime {
  82. // 查订单表
  83. // 查第11个
  84. if !flag11 {
  85. rs := selectOrder(monitorConfig.WinNumberDaily)
  86. if rs != nil { // 查到了
  87. logger.Info(fmt.Sprintf("查询到第%d个人员", monitorConfig.WinNumberDaily))
  88. data := map[string]interface{}{
  89. "phone": rs["user_phone"],
  90. "userid": rs["user_id"],
  91. "winnerdate": rs["pay_time"],
  92. "mold": Mold1,
  93. "createdate": date.NowFormat(date.Date_Full_Layout),
  94. }
  95. if saveWinnerInfo(data) {
  96. flag11 = true
  97. logger.Info("中奖信息保存成功:", data)
  98. } else {
  99. logger.Error("中奖信息保存失败:", data)
  100. }
  101. }
  102. }
  103. // 需要查第111个 日期范围内 特殊日期
  104. if date.NowFormat(date.Date_Short_Layout) == monitorConfig.DateSpecial {
  105. logger.Info(fmt.Sprintf("开始查询第%v个人员", monitorConfig.WinNumbersSpecial))
  106. rs111 := selectOrder(monitorConfig.WinNumbersSpecial)
  107. if rs111 != nil {
  108. logger.Info(fmt.Sprintf("查询到第%v个人员", monitorConfig.WinNumbersSpecial))
  109. saveData := map[string]interface{}{
  110. "phone": rs111["user_phone"],
  111. "userid": rs111["user_id"],
  112. "winnerdate": rs111["pay_time"],
  113. "mold": Mold2,
  114. "createdate": date.NowFormat(date.Date_Full_Layout),
  115. }
  116. if saveWinnerInfo(saveData) {
  117. flag111 = true
  118. } else {
  119. logger.Error("中奖信息保存失败:", saveData)
  120. }
  121. }
  122. } else {
  123. logger.Info(fmt.Sprintf("未到%s日,不需要查第%v名", monitorConfig.DateSpecial, monitorConfig.WinNumbersSpecial))
  124. flag111 = true
  125. }
  126. if flag111 && flag11 {
  127. logger.Info("今日已查询到 暂停任务")
  128. gcron.Stop("selectJob")
  129. logger.Info("selectJob stop")
  130. }
  131. }
  132. }
  133. // 查订单表
  134. func selectOrder(num int) map[string]interface{} {
  135. 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;"
  136. rs := db.Mysql.SelectBySql(sql, num-1)
  137. if rs != nil && len(*rs) == 1 {
  138. return (*rs)[0]
  139. }
  140. logger.Info("未查到", rs)
  141. return nil
  142. }
  143. // 保存中奖人员信息
  144. func saveWinnerInfo(data map[string]interface{}) bool {
  145. logger.Info("save winner info ")
  146. return db.Mysql.Insert(TableWinnerInfo2210, data) > 0
  147. }