ordermonitor.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  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. flag = false // 是否已经查询到
  23. monitorConfig config.OrderMonitorConfig
  24. )
  25. func init() {
  26. // 获取配置信息
  27. monitorConfig = config.OrderMonitorConfig{
  28. DateSpecial: date.FormatDate(&gtime.NewFromStrLayout(gcfg.Instance().MustGet(gctx.New(), "orderMonitor.dateSpecial").String(), "2006-01-02T15:04:05Z").Time, date.Date_Short_Layout),
  29. OpenCron: gcfg.Instance().MustGet(gctx.New(), "orderMonitor.openCron").String(),
  30. SelectCron: gcfg.Instance().MustGet(gctx.New(), "orderMonitor.selectCron").String(),
  31. WinNumberDaily: gcfg.Instance().MustGet(gctx.New(), "orderMonitor.winNumberDaily").Int(),
  32. WinNumbersSpecial: gcfg.Instance().MustGet(gctx.New(), "orderMonitor.winNumbersSpecial").Int(),
  33. }
  34. }
  35. // SelectOrderTask 订单监控
  36. func SelectOrderTask() {
  37. // 活动已结束 不再启动定时任务
  38. if time.Now().After(activity.MembershipDay.Ed) {
  39. return
  40. }
  41. var (
  42. err error
  43. ctx = gctx.New()
  44. )
  45. // 订单查询任务
  46. _, err = gcron.Add(ctx, monitorConfig.SelectCron, monitor, "selectJob")
  47. if err != nil {
  48. logger.Error("定时任务selectJob添加失败", err)
  49. }
  50. if time.Now().Before(activity.MembershipDay.T2) { // 活动未开始
  51. gcron.Stop("selectJob") // 停掉订单查询任务 等后边的定时任务开启
  52. logger.Info("selectJob stop")
  53. }
  54. // 开启定时任务
  55. _, err = gcron.Add(ctx, monitorConfig.OpenCron, func(ctx context.Context) {
  56. now := time.Now()
  57. if now.After(activity.MembershipDay.Ed) { // 活动已结束 移除掉任务
  58. logger.Info("活动结束,移除任务")
  59. gcron.Remove("openCronJob")
  60. gcron.Remove("selectJob")
  61. }
  62. // 活动时间范围内 开启订单查询的定时任务
  63. _, inTime, _ := activity.MembershipDay.InActivity()
  64. if inTime {
  65. flag = false // 重置
  66. gcron.Start("selectJob")
  67. logger.Info("开启 selectJob 任务")
  68. }
  69. }, "openCronJob")
  70. if err != nil {
  71. logger.Error("定时任务openCronJob失败", err)
  72. }
  73. logger.Info("openCronJob 启动成功")
  74. }
  75. // 订单监控
  76. func monitor(ctx context.Context) {
  77. logger.Info("开始本轮订单查询")
  78. _, inTime, _ := activity.MembershipDay.InActivity()
  79. if inTime {
  80. // 如果需要查第111个 日期范围内 特殊日期
  81. if date.NowFormat(date.Date_Short_Layout) == monitorConfig.DateSpecial {
  82. logger.Info(fmt.Sprintf("开始查询第%v个人员", monitorConfig.WinNumbersSpecial))
  83. rs111 := selectOrder(monitorConfig.WinNumbersSpecial)
  84. if rs111 != nil {
  85. logger.Info(fmt.Sprintf("查询到第%v个人员", monitorConfig.WinNumbersSpecial))
  86. saveData := map[string]interface{}{
  87. "phone": rs111["user_phone"],
  88. "userid": rs111["user_id"],
  89. "winnerdate": rs111["pay_time"],
  90. "mold": Mold2,
  91. "createdate": date.NowFormat(date.Date_Full_Layout),
  92. }
  93. if existWinnerInfo() {
  94. logger.Info("当日已存在中奖信息")
  95. flag = true
  96. } else {
  97. if saveWinnerInfo(saveData) {
  98. flag = true
  99. logger.Info("中奖信息保存成功:", saveData)
  100. } else {
  101. logger.Error("中奖信息保存失败:", saveData)
  102. }
  103. }
  104. }
  105. } else {
  106. rs := selectOrder(monitorConfig.WinNumberDaily)
  107. if rs != nil { // 查到了
  108. logger.Info(fmt.Sprintf("查询到第%d个人员", monitorConfig.WinNumberDaily))
  109. data := map[string]interface{}{
  110. "phone": rs["user_phone"],
  111. "userid": rs["user_id"],
  112. "winnerdate": rs["pay_time"],
  113. "mold": Mold1,
  114. "createdate": date.NowFormat(date.Date_Full_Layout),
  115. }
  116. if existWinnerInfo() {
  117. logger.Info("当日已存在中奖信息")
  118. flag = true
  119. } else {
  120. if saveWinnerInfo(data) {
  121. flag = true
  122. logger.Info("中奖信息保存成功:", data)
  123. } else {
  124. logger.Error("中奖信息保存失败:", data)
  125. }
  126. }
  127. }
  128. }
  129. if flag {
  130. logger.Info("今日已查询到 暂停任务")
  131. gcron.Stop("selectJob")
  132. logger.Info("selectJob stop")
  133. }
  134. }
  135. }
  136. // 查订单表
  137. func selectOrder(num int) map[string]interface{} {
  138. sql := `SELECT
  139. order_code,
  140. user_phone,
  141. user_id,
  142. pay_time
  143. FROM
  144. dataexport_order
  145. WHERE order_status = 1 and
  146. product_type IN (
  147. "VIP订阅",
  148. "大会员",
  149. "数据流量包"
  150. )
  151. AND is_backstage_order = 0
  152. AND TO_DAYS(pay_time) = to_days(now())
  153. ORDER BY
  154. pay_time
  155. LIMIT ?,1
  156. `
  157. rs := db.Mysql.SelectBySql(sql, num-1)
  158. if rs != nil && len(*rs) == 1 {
  159. return (*rs)[0]
  160. }
  161. logger.Info("未查到", rs)
  162. return nil
  163. }
  164. // 保存中奖人员信息
  165. func saveWinnerInfo(data map[string]interface{}) bool {
  166. logger.Info("save winner info ")
  167. return db.Mysql.Insert(TableWinnerInfo2210, data) > 0
  168. }
  169. func existWinnerInfo() bool {
  170. logger.Info("save winner info ")
  171. return db.Mysql.CountBySql("SELECT count(id) as count FROM jianyu.winner_info_22_10 where TO_DAYS(createdate) = TO_DAYS(NOW());") > 0
  172. }