1.新增批量定时查询函数(未启用);

2.CheckAllOrderState中循环次数改为3次;增加对"服务调用失败"的判断,这种不划入退订;
3.CheckCancelOrderState缩短查询时间,只查最近2天的所有退订订单有无误判为退订的情况;
4.新增查询1小时退订有无误判的函数(未启用);
This commit is contained in:
chenlin 2024-12-05 19:13:42 +08:00
parent 016979b882
commit 60f318961c
2 changed files with 207 additions and 4 deletions

View File

@ -970,6 +970,131 @@ func GetChannelInfoByChannelCode(channel string, db *gorm.DB) (MgChannel, error)
return channelInfo, nil
}
// 模拟的数据库操作
func updateOrderState(order MgOrder, cancelFlag int, unsubTime string) error {
err := database.Db.Table("mg_order").Where("order_serial = ?", order.OrderSerial).Updates(map[string]interface{}{
"state": UnsubscribeOK,
"is_one_hour_cancel": cancelFlag,
"unsubscribe_time": unsubTime,
"updated_at": time.Now(),
}).Error
if err != nil {
fmt.Println("CheckOrderState update mg_order err:", err.Error())
logger.Errorf("CheckOrderState update mg_order err:", err.Error())
logger.Errorf("CheckOrderState order_serial:", order.OrderSerial)
return err
}
return nil
}
// processBatch 处理批次
func processBatch(batch []MgOrder, wg *sync.WaitGroup) {
defer wg.Done()
for _, order := range batch {
for j := 0; j < 3; j++ {
var req QueryRightsInfoReq
req.AppChannelList = append(req.AppChannelList, ChannelCode)
req.Mobile = order.PhoneNumber
resp, err := MiGuQueryRightsInfo(&req)
if err != nil {
fmt.Println("CheckOrderState MiGuQueryRightsInfo err:", err.Error())
logger.Errorf("CheckOrderState MiGuQueryRightsInfo err:", err.Error())
continue
}
// 有退订数据
if len(resp.ResultData) != 0 {
if resp.ResultData[0].IsUnsub == 1 { // 已退订
var cancelFlag int
subscribeTime := order.CreatedAt
// 检查 subscribeTime 是否为 nil
if IsWithinOneHourCancel(subscribeTime, resp.ResultData[0].UnsubTime) {
cancelFlag = 1
}
err = updateOrderState(order, cancelFlag, resp.ResultData[0].UnsubTime)
if err != nil {
fmt.Println("CheckOrderState update mg_order err:", err.Error())
logger.Errorf("CheckOrderState update mg_order err:", err.Error())
logger.Errorf("CheckOrderState order_serial:", order.OrderSerial)
continue
}
break
} else if resp.ResultData[0].IsUnsub == 0 { // 没有退订
break
}
} else {
if j == 2 && resp.ReturnCode != "000010" && resp.Message != "服务调用失败" {
var cancelFlag int
subscribeTime := order.CreatedAt
unsubTime := time.Now().Format("2006-01-02 15:04:05")
// 检查 subscribeTime 是否为 nil
if IsWithinOneHourCancel(subscribeTime, unsubTime) {
cancelFlag = 1
}
err = updateOrderState(order, cancelFlag, unsubTime)
if err != nil {
fmt.Println("CheckOrderState update mg_order err:", err.Error())
logger.Errorf("CheckOrderState update mg_order err:", err.Error())
logger.Errorf("CheckOrderState order_serial:", order.OrderSerial)
continue
}
break
}
continue
}
}
}
}
// CheckAllOrderStateBatch 定时任务,批量检查历史订阅用户有无退订
func CheckAllOrderStateBatch() {
if database.Db == nil {
log.Println("Database connection is nil")
fmt.Println("Database connection is nil")
return
}
// 查询订单列表中未退订的用户查询其是否退订如果退订则更新退订时间判断是否为1小时内退订
var orderList []MgOrder
err := database.Db.Where("state = 1").Order("created_at desc").
Find(&orderList).Error
//err := database.Db.Where("state = 1 and created_at >= ? and created_at <= ?", "2024-12-01 00:00:00", "2024-12-30 23:59:59").Order("created_at desc").
// Find(&orderList).Error
if err != nil {
fmt.Println("query mg_order err:", err.Error())
return
}
// 控制每次处理的批次大小
batchSize := 100
totalOrders := len(orderList)
var wg sync.WaitGroup
// 按批次分割处理
for i := 0; i < totalOrders; i += batchSize {
end := i + batchSize
if end > totalOrders {
end = totalOrders
}
batch := orderList[i:end]
wg.Add(1)
go processBatch(batch, &wg)
// 控制批次之间的延时,避免同时过多请求
time.Sleep(500 * time.Millisecond) // 控制批次间隔
}
wg.Wait() // 等待所有 goroutines 完成
}
// CheckAllOrderState 定时任务,检查历史订阅用户有无退订
func CheckAllOrderState() {
if database.Db == nil {
@ -984,13 +1109,16 @@ func CheckAllOrderState() {
err := database.Db.Where("state = 1").Order("created_at desc").
Find(&orderList).Error
//err := database.Db.Where("state = 1 and created_at >= ? and created_at <= ?", "2024-10-01 00:00:00", "2024-10-31 23:59:59").Order("created_at desc").
// Find(&orderList).Error
if err != nil {
fmt.Println("query mg_order err:", err.Error())
return
}
for i, _ := range orderList {
for j := 0; j < 5; j++ {
for j := 0; j < 3; j++ {
var req QueryRightsInfoReq
req.AppChannelList = append(req.AppChannelList, ChannelCode)
req.Mobile = orderList[i].PhoneNumber
@ -1029,7 +1157,7 @@ func CheckAllOrderState() {
break
}
} else {
if j == 4 {
if j == 2 && resp.ReturnCode != "000010" && resp.Message != "服务调用失败" {
var cancelFlag int
subscribeTime := orderList[i].CreatedAt
unsubTime := time.Now().Format("2006-01-02 15:04:05")
@ -1066,10 +1194,75 @@ func CheckCancelOrderState() {
return
}
// 查询订单列表已退订且不是1小时内退订的用户
// 查询订单列表已退订的用户
var orderList []MgOrder
err := database.Db.Where("state = 2 and is_one_hour_cancel != 1").Order("created_at desc").
// 获取当前时间前2个小时
twoDaysAgo := time.Now().Add(-48 * time.Hour)
err := database.Db.Where("state = 2").
Where("created_at >= ?", twoDaysAgo).
Order("created_at desc").
Find(&orderList).Error
if err != nil {
fmt.Println("query mg_order err:", err.Error())
return
}
for i, _ := range orderList {
for j := 0; j < 5; j++ {
var req QueryRightsInfoReq
req.AppChannelList = append(req.AppChannelList, ChannelCode)
req.Mobile = orderList[i].PhoneNumber
resp, err := MiGuQueryRightsInfo(&req)
if err != nil {
fmt.Println("CheckOrderState MiGuQueryRightsInfo err:", err.Error())
logger.Errorf("CheckOrderState MiGuQueryRightsInfo err:", err.Error())
continue
}
// 有退订数据
if len(resp.ResultData) != 0 {
if resp.ResultData[0].IsUnsub == 1 { // 已退订
break
} else if resp.ResultData[0].IsUnsub == 0 { // 没有退订
fmt.Println("**********CheckCancelOrderState get:", orderList[i].PhoneNumber)
var unsubTime *time.Time = nil
err = database.Db.Table("mg_order").Where("order_serial = ?", orderList[i].OrderSerial).Updates(map[string]interface{}{
"state": SubscribeOK,
"is_one_hour_cancel": 0,
"unsubscribe_time": unsubTime,
"updated_at": time.Now(),
}).Error
break
}
} else {
if j == 1 {
break
}
continue
}
}
}
}
// CheckOneHourCancelOrderState 定时任务检查1小时内退订的用户是否有误判
func CheckOneHourCancelOrderState() {
if database.Db == nil {
log.Println("Database connection is nil")
fmt.Println("Database connection is nil")
return
}
// 查询订单列表1小时内退订的用户
var orderList []MgOrder
//err := database.Db.Where("is_one_hour_cancel = 1 and created_at >= ? and created_at <= ?", "2024-11-01 00:00:00", "2024-11-30 23:59:59").Order("created_at desc").
// Find(&orderList).Error
err := database.Db.Where("is_one_hour_cancel = 1").Order("created_at desc").
Find(&orderList).Error
if err != nil {

View File

@ -102,6 +102,16 @@ func run() error {
fmt.Println("err:", err)
}
//err = s.Every(1).Day().At("09:50").Do(models.CheckOneHourCancelOrderState)
//if err != nil {
// fmt.Println("err:", err)
//}
//err := s.Every(1).Day().At("11:47").Do(models.CheckAllOrderStateBatch)
//if err != nil {
// fmt.Println("err:", err)
//}
<-s.Start()
}()