1、AI视频彩铃增加临时表的记录和数据检测;

This commit is contained in:
chenlin 2025-05-14 18:05:35 +08:00
parent 69748b530b
commit 1b1f0ed785
3 changed files with 144 additions and 6 deletions

View File

@ -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

View File

@ -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" {

View File

@ -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)