1.新增批量定时查询函数(未启用);
2.CheckAllOrderState中循环次数改为3次;增加对"服务调用失败"的判断,这种不划入退订; 3.CheckCancelOrderState缩短查询时间,只查最近2天的所有退订订单有无误判为退订的情况; 4.新增查询1小时退订有无误判的函数(未启用);
This commit is contained in:
parent
016979b882
commit
60f318961c
|
@ -970,6 +970,131 @@ func GetChannelInfoByChannelCode(channel string, db *gorm.DB) (MgChannel, error)
|
||||||
return channelInfo, nil
|
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 定时任务,检查历史订阅用户有无退订
|
// CheckAllOrderState 定时任务,检查历史订阅用户有无退订
|
||||||
func CheckAllOrderState() {
|
func CheckAllOrderState() {
|
||||||
if database.Db == nil {
|
if database.Db == nil {
|
||||||
|
@ -984,13 +1109,16 @@ func CheckAllOrderState() {
|
||||||
err := database.Db.Where("state = 1").Order("created_at desc").
|
err := database.Db.Where("state = 1").Order("created_at desc").
|
||||||
Find(&orderList).Error
|
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 {
|
if err != nil {
|
||||||
fmt.Println("query mg_order err:", err.Error())
|
fmt.Println("query mg_order err:", err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
for i, _ := range orderList {
|
for i, _ := range orderList {
|
||||||
for j := 0; j < 5; j++ {
|
for j := 0; j < 3; j++ {
|
||||||
var req QueryRightsInfoReq
|
var req QueryRightsInfoReq
|
||||||
req.AppChannelList = append(req.AppChannelList, ChannelCode)
|
req.AppChannelList = append(req.AppChannelList, ChannelCode)
|
||||||
req.Mobile = orderList[i].PhoneNumber
|
req.Mobile = orderList[i].PhoneNumber
|
||||||
|
@ -1029,7 +1157,7 @@ func CheckAllOrderState() {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if j == 4 {
|
if j == 2 && resp.ReturnCode != "000010" && resp.Message != "服务调用失败" {
|
||||||
var cancelFlag int
|
var cancelFlag int
|
||||||
subscribeTime := orderList[i].CreatedAt
|
subscribeTime := orderList[i].CreatedAt
|
||||||
unsubTime := time.Now().Format("2006-01-02 15:04:05")
|
unsubTime := time.Now().Format("2006-01-02 15:04:05")
|
||||||
|
@ -1066,10 +1194,75 @@ func CheckCancelOrderState() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// 查询订单列表已退订且不是1小时内退订的用户
|
// 查询订单列表已退订的用户
|
||||||
var orderList []MgOrder
|
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
|
Find(&orderList).Error
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -102,6 +102,16 @@ func run() error {
|
||||||
fmt.Println("err:", err)
|
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()
|
<-s.Start()
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user