diff --git a/app/admin/models/migu.go b/app/admin/models/migu.go index 4eccdbd..6e2a341 100644 --- a/app/admin/models/migu.go +++ b/app/admin/models/migu.go @@ -72,6 +72,22 @@ type MgOrder struct { IsOneHourCancel int `json:"is_one_hour_cancel"` // 是否1小时内退订 1-是 其他-否 } +// MgOrderLog 订单管理表对应的结构体 +type MgOrderLog struct { + Model + ProductID int64 `json:"product_id"` // 产品ID + ChannelCode string `gorm:"size:255" json:"channel_code"` // 渠道编码 + OrderSerial string `gorm:"size:255;not null" json:"order_serial"` // 订单流水号 + SubscribeTime *time.Time `json:"subscribe_time"` // 订阅时间 + PhoneNumber string `gorm:"size:20;not null" json:"phone_number"` // 手机号 + SM4PhoneNumber string `gorm:"size:255" json:"sm4_phone_number"` // SM4加密手机号 + ExternalOrderID string `gorm:"size:255" json:"external_order_id"` // 外部平台订单号(如咪咕等) + ChannelTradeNo string `gorm:"size:255" json:"channel_trade_no"` // 渠道订单号 + State int `gorm:"size:255" json:"state"` // 用户订阅状态 1-订阅成功 2-已取消订阅 + UnsubscribeTime *time.Time `json:"unsubscribe_time"` // 取消订阅时间 + IsOneHourCancel int `json:"is_one_hour_cancel"` // 是否1小时内退订 1-是 其他-否 +} + type MgOrderCopy struct { Model ProductID int64 `json:"product_id"` // 产品ID diff --git a/app/admin/models/migu_music.go b/app/admin/models/migu_music.go index 371e2c7..cccf405 100644 --- a/app/admin/models/migu_music.go +++ b/app/admin/models/migu_music.go @@ -199,7 +199,7 @@ func Login(channelCode, loginType, callBackUrl, msisdn string) (LoginResponse, e return respData, nil } -// CheckMusicOrderState 定时任务,检查咪咕音乐的订单是否有退订 +// CheckMusicOrderState 定时任务,检查咪咕音乐的订单是否有退订(回调接口记录的订单) func CheckMusicOrderState() { logger.Info("****** CheckMusicOrderState start ******") fmt.Println("****** CheckMusicOrderState start ******") @@ -210,7 +210,7 @@ func CheckMusicOrderState() { } // 查询订单列表中未退订的用户,查询其是否退订;如果退订,则更新退订时间 - var orderList []MgOrder + var orderList []MgOrderLog err := database.Db.Where("state = 1"). Where("product_id = ?", MusicProductID). @@ -244,7 +244,7 @@ func CheckMusicOrderState() { logger.Info("****** CheckMusicOrderState end ******") } -func attemptLogin(token *string, order MgOrder) bool { +func attemptLogin(token *string, order MgOrderLog) bool { for j := 0; j < MaxRetries; j++ { resp, err := Login(order.ChannelCode, LoginType, "", order.PhoneNumber) if err != nil || resp.ResCode != "000000" { @@ -267,7 +267,122 @@ func attemptLogin(token *string, order MgOrder) bool { return false } -func checkSubscriptionStatus(token string, order MgOrder) bool { +func checkSubscriptionStatus(token string, order MgOrderLog) bool { + for j := 0; j < MaxRetries; j++ { + resp, err := MonthlySubscriptionQuery(token, ServiceId, order.ChannelCode) + if err != nil || resp.ResCode != "000000" { + if err != nil { + fmt.Println("MonthlySubscriptionQuery failed:", err.Error()) + logger.Error("MonthlySubscriptionQuery failed:", err.Error()) + } else { + fmt.Println("MonthlySubscriptionQuery failed, MonthlySubscriptionResp:", resp.ResCode) + logger.Error("MonthlySubscriptionQuery failed, MonthlySubscriptionResp:", resp.ResCode) + } + + if j < MaxRetries-1 { + continue + } + return false + } + + if resp.Status == "0" { + return true + } else if resp.Status == "1" { + if order.State == SubscribeOK { + subscribeTime := order.CreatedAt + unsubTime := time.Now().Format("2006-01-02 15:04:05") + cancelFlag := 0 + + if IsWithinOneHourCancel(subscribeTime, unsubTime) { + cancelFlag = 1 + } + + 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("Failed to update order:", err.Error()) + logger.Error("Failed to update order:", err.Error()) + } + return false + } + } + } + return false +} + +// CheckAIMusicOrderState 定时任务,检查咪咕音乐的订单是否有退订(悠然同步的订单) +func CheckAIMusicOrderState() { + logger.Info("****** CheckMusicOrderState start ******") + fmt.Println("****** CheckMusicOrderState start ******") + if database.Db == nil { + logger.Error("Database connection is nil") + fmt.Println("Database connection is nil") + return + } + + // 查询订单列表中未退订的用户,查询其是否退订;如果退订,则更新退订时间 + var orderList []MgOrder + + err := database.Db.Where("state = 1"). + Where("product_id = ?", MusicProductID). + Order("created_at desc"). + Find(&orderList).Error + + if err != nil { + fmt.Println("query mg_order err:", err.Error()) + logger.Error("query mg_order err:", err.Error()) + return + } + + fmt.Println("orderList size is:", len(orderList)) + logger.Info("orderList size is:", len(orderList)) + + for _, order := range orderList { + var token string + + // 登录接口调用 + if !attemptLoginAI(&token, order) { + continue + } + + // 订阅状态查询 + if !checkSubscriptionStatusAI(token, order) { + continue + } + } + + fmt.Println("****** CheckMusicOrderState end ******") + logger.Info("****** CheckMusicOrderState end ******") +} + +func attemptLoginAI(token *string, order MgOrder) bool { + for j := 0; j < MaxRetries; j++ { + resp, err := Login(order.ChannelCode, LoginType, "", order.PhoneNumber) + if err != nil || resp.ResCode != "000000" { + if err != nil { + fmt.Println("Login failed:", err.Error()) + logger.Error("Login failed:", err.Error()) + } else { + fmt.Println("Login failed, loginResp:", resp) + logger.Error("Login failed, loginResp:", resp) + } + + if j < MaxRetries-1 { + continue + } + return false + } + *token = resp.Token + return true + } + return false +} + +func checkSubscriptionStatusAI(token string, order MgOrder) bool { for j := 0; j < MaxRetries; j++ { resp, err := MonthlySubscriptionQuery(token, ServiceId, order.ChannelCode) if err != nil || resp.ResCode != "000000" { diff --git a/cmd/api/server.go b/cmd/api/server.go index f457694..38d4809 100644 --- a/cmd/api/server.go +++ b/cmd/api/server.go @@ -94,13 +94,20 @@ func run() error { s := gocron.NewScheduler() if config.ApplicationConfig.Name == "migu_music_admin_server" { // 咪咕音乐 - // 咪咕音乐订阅数据检测 - err := s.Every(1).Day().At("00:30").Do(models.CheckMusicOrderState) + // 咪咕音乐订阅数据检测(悠然回传) + err := s.Every(1).Day().At("00:30").Do(models.CheckAIMusicOrderState) + if err != nil { + fmt.Println("err:", err) + } + + // 咪咕音乐订阅数据检测(回调接口记录订单) + err = s.Every(1).Day().At("04:00").Do(models.CheckMusicOrderState) if err != nil { fmt.Println("err:", err) } } else { // 每小时更新1次历史汇总数据 + //err := s.Every(1).Day().At("10:03").Do(models.UpdateHistoricalSummaryCache) err := s.Every(1).Hour().Do(models.UpdateHistoricalSummaryCache) if err != nil { fmt.Println("err:", err)