package task import ( "app.yhyue.com/moapp/jybase/date" "app.yhyue.com/moapp/jybase/go-logger/logger" "app.yhyue.com/moapp/message/config" "app.yhyue.com/moapp/message/db" "app.yhyue.com/moapp/message/handler/activity" "context" "fmt" "github.com/gogf/gf/v2/os/gcfg" "github.com/gogf/gf/v2/os/gcron" "github.com/gogf/gf/v2/os/gctx" "github.com/gogf/gf/v2/os/gtime" "time" ) const ( TableWinnerInfo2210 = "winner_info_22_10" Mold1 = "1" // 中奖类型 1:小米智能音响 Mold2 = "2" // 中奖类型 2:ipad ) var ( flag = false // 是否已经查询到 monitorConfig config.OrderMonitorConfig ) func init() { // 获取配置信息 monitorConfig = config.OrderMonitorConfig{ DateSpecial: date.FormatDate(>ime.NewFromStrLayout(gcfg.Instance().MustGet(gctx.New(), "orderMonitor.dateSpecial").String(), "2006-01-02T15:04:05Z").Time, date.Date_Short_Layout), OpenCron: gcfg.Instance().MustGet(gctx.New(), "orderMonitor.openCron").String(), SelectCron: gcfg.Instance().MustGet(gctx.New(), "orderMonitor.selectCron").String(), WinNumberDaily: gcfg.Instance().MustGet(gctx.New(), "orderMonitor.winNumberDaily").Int(), WinNumbersSpecial: gcfg.Instance().MustGet(gctx.New(), "orderMonitor.winNumbersSpecial").Int(), } } // SelectOrderTask 订单监控 func SelectOrderTask() { // 活动已结束 不再启动定时任务 if time.Now().After(activity.MembershipDay.Ed) { return } var ( err error ctx = gctx.New() ) // 订单查询任务 _, err = gcron.Add(ctx, monitorConfig.SelectCron, monitor, "selectJob") if err != nil { logger.Error("定时任务selectJob添加失败", err) } if time.Now().Before(activity.MembershipDay.T2) { // 活动未开始 gcron.Stop("selectJob") // 停掉订单查询任务 等后边的定时任务开启 logger.Info("selectJob stop") } // 开启定时任务 _, err = gcron.Add(ctx, monitorConfig.OpenCron, func(ctx context.Context) { now := time.Now() if now.After(activity.MembershipDay.Ed) { // 活动已结束 移除掉任务 logger.Info("活动结束,移除任务") gcron.Remove("openCronJob") gcron.Remove("selectJob") } // 活动时间范围内 开启订单查询的定时任务 _, inTime, _ := activity.MembershipDay.InActivity() if inTime { flag = false // 重置 gcron.Start("selectJob") logger.Info("开启 selectJob 任务") } }, "openCronJob") if err != nil { logger.Error("定时任务openCronJob失败", err) } logger.Info("openCronJob 启动成功") } // 订单监控 func monitor(ctx context.Context) { logger.Info("开始本轮订单查询") _, inTime, _ := activity.MembershipDay.InActivity() if inTime { // 如果需要查第111个 日期范围内 特殊日期 if date.NowFormat(date.Date_Short_Layout) == monitorConfig.DateSpecial { logger.Info(fmt.Sprintf("开始查询第%v个人员", monitorConfig.WinNumbersSpecial)) rs111 := selectOrder(monitorConfig.WinNumbersSpecial) if rs111 != nil { logger.Info(fmt.Sprintf("查询到第%v个人员", monitorConfig.WinNumbersSpecial)) saveData := map[string]interface{}{ "phone": rs111["user_phone"], "userid": rs111["user_id"], "winnerdate": rs111["pay_time"], "mold": Mold2, "createdate": date.NowFormat(date.Date_Full_Layout), } if saveWinnerInfo(saveData) { flag = true logger.Info("中奖信息保存成功:", saveData) } else { logger.Error("中奖信息保存失败:", saveData) } } } else { rs := selectOrder(monitorConfig.WinNumberDaily) if rs != nil { // 查到了 logger.Info(fmt.Sprintf("查询到第%d个人员", monitorConfig.WinNumberDaily)) data := map[string]interface{}{ "phone": rs["user_phone"], "userid": rs["user_id"], "winnerdate": rs["pay_time"], "mold": Mold1, "createdate": date.NowFormat(date.Date_Full_Layout), } if saveWinnerInfo(data) { flag = true logger.Info("中奖信息保存成功:", data) } else { logger.Error("中奖信息保存失败:", data) } } } if flag { logger.Info("今日已查询到 暂停任务") gcron.Stop("selectJob") logger.Info("selectJob stop") } } } // 查订单表 func selectOrder(num int) map[string]interface{} { 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;" rs := db.Mysql.SelectBySql(sql, num-1) if rs != nil && len(*rs) == 1 { return (*rs)[0] } logger.Info("未查到", rs) return nil } // 保存中奖人员信息 func saveWinnerInfo(data map[string]interface{}) bool { logger.Info("save winner info ") return db.Mysql.Insert(TableWinnerInfo2210, data) > 0 }