diff --git a/app/admin/models/migu.go b/app/admin/models/migu.go index 512fd6c..b5e884a 100644 --- a/app/admin/models/migu.go +++ b/app/admin/models/migu.go @@ -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 { diff --git a/cmd/api/server.go b/cmd/api/server.go index d28867e..3a1b587 100644 --- a/cmd/api/server.go +++ b/cmd/api/server.go @@ -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() }()