diff --git a/internal/dao/taskBalanceSync.go b/internal/dao/taskBalanceSync.go index be88c4e..2dffc71 100644 --- a/internal/dao/taskBalanceSync.go +++ b/internal/dao/taskBalanceSync.go @@ -2,6 +2,7 @@ package dao import ( "errors" + "fmt" "time" "gorm.io/gorm" @@ -40,36 +41,31 @@ func RunInitialTaskBalanceSync() error { return nil } - // 获取当前有效(未过期且已支付)的艺人及其最新订单 - validArtists, err := GetValidArtistList() - if err != nil { + // 直接获取所有BundleBalance记录进行同步,不再依赖GetValidArtistList的严格过滤 + var bundleBalances []model.BundleBalance + if err := app.ModuleClients.BundleDB.Find(&bundleBalances).Error; err != nil { return err } - if len(validArtists) == 0 { + + if len(bundleBalances) == 0 { _ = app.ModuleClients.TaskBenchDB.Create(&model.TaskSyncStatus{ SyncKey: model.InitialSyncKey, ExecutedAt: time.Now(), - Remark: "skipped: no valid artists", + Remark: "skipped: no bundle_balance records found", }).Error return nil } // 构造待插入的 TaskBalance 列表 - tasks := make([]model.TaskBalance, 0, len(validArtists)) - for _, a := range validArtists { - // 根据 user_id + order_uuid 获取 BundleBalance 明细 - var bb model.BundleBalance - if err := app.ModuleClients.BundleDB.Where("user_id = ? AND order_uuid = ?", a.UserID, a.OrderUUID).First(&bb).Error; err != nil { - // 若未查到则跳过该条 - if err == gorm.ErrRecordNotFound { - continue - } - return err - } + tasks := make([]model.TaskBalance, 0, len(bundleBalances)) + skippedCount := 0 + for _, bb := range bundleBalances { subNum, telNum, err := fetchIdentityForBundle(&bb) if err != nil { - // 无法获取身份信息则跳过该条 + // 无法获取身份信息则跳过该条,但记录跳过数量 + fmt.Println("跳过 BundleBalance ID:", bb.ID, "错误:", err) + skippedCount++ continue } @@ -100,10 +96,17 @@ func RunInitialTaskBalanceSync() error { return err } } + + // 记录同步结果 + remark := "initial sync executed" + if skippedCount > 0 { + remark = fmt.Sprintf("initial sync executed with %d records skipped due to missing identity info", skippedCount) + } + if err := tx.Create(&model.TaskSyncStatus{ SyncKey: model.InitialSyncKey, ExecutedAt: time.Now(), - Remark: "initial sync executed", + Remark: remark, }).Error; err != nil { tx.Rollback() return err @@ -156,27 +159,33 @@ func SyncTaskBalanceFromBundleBalance(bb model.BundleBalance) error { // fetchIdentityForBundle 根据 BundleBalance 拿到 sub_num 与 tel_num func fetchIdentityForBundle(bb *model.BundleBalance) (string, string, error) { // tel_num 来自 micro-account.user - type userRow struct { - Tel string `gorm:"column:tel_num"` - } - var ur userRow + var telNum string if err := app.ModuleClients.BundleDB.Table("`micro-account`.`user`").Unscoped(). - Select("tel_num").Where("id = ?", bb.UserId).First(&ur).Error; err != nil { + Select("tel_num").Where("id = ?", bb.UserId).Scan(&telNum).Error; err != nil { return "", "", err } + // customer_num 来自 bundle_order_records(按 order_uuid) - type orderRow struct { - Customer string `gorm:"column:customer_num"` + // 添加容错机制:如果order_uuid为空或查询失败,使用user_id作为备用方案 + var customerNum string + + if bb.OrderUUID != "" { + type orderRow struct { + Customer string `gorm:"column:customer_num"` + } + var or orderRow + if err := app.ModuleClients.BundleDB.Table("bundle_order_records"). + Select("customer_num").Where("uuid = ?", bb.OrderUUID).First(&or).Error; err != nil { + // 如果查询失败(如记录不存在),使用user_id作为备用customer_num + customerNum = fmt.Sprintf("user_%d", bb.UserId) + } else { + customerNum = or.Customer + } + } else { + // 如果order_uuid为空,使用user_id作为备用customer_num + customerNum = fmt.Sprintf("user_%d", bb.UserId) } - var or orderRow - if bb.OrderUUID == "" { - return "", "", errors.New("bundle order_uuid missing") - } - if err := app.ModuleClients.BundleDB.Table("bundle_order_records"). - Select("customer_num").Where("uuid = ?", bb.OrderUUID).First(&or).Error; err != nil { - return "", "", err - } - return or.Customer, ur.Tel, nil + return customerNum, telNum, nil } // UpdateTaskBalance 每月批量更新任务余额 @@ -348,6 +357,11 @@ func copyBundleToTaskBalance(tb *model.TaskBalance, bb *model.BundleBalance) { tb.TaskMonthlyBundleVideoConsumptionNumber = bb.MonthlyBundleVideoConsumptionNumber tb.TaskMonthlyIncreaseVideoConsumptionNumber = bb.MonthlyIncreaseVideoConsumptionNumber tb.TaskMonthlyLimitVideoQuotaNumber = bb.MonthlyLimitVideoQuotaNumber + // 手动扩展(视频) + tb.TaskManualVideoNumber = bb.ManualVideoNumber + tb.TaskManualVideoConsumptionNumber = bb.ManualVideoConsumptionNumber + tb.TaskMonthlyNewManualVideoNumber = bb.MonthlyNewManualVideoNumber + tb.TaskMonthlyManualVideoConsumptionNumber = bb.MonthlyManualVideoConsumptionNumber // ===== 图片类 ===== tb.TaskBundleImageNumber = bb.BundleImageNumber @@ -373,6 +387,11 @@ func copyBundleToTaskBalance(tb *model.TaskBalance, bb *model.BundleBalance) { tb.TaskMonthlyBundleImageConsumptionNumber = bb.MonthlyBundleImageConsumptionNumber tb.TaskMonthlyIncreaseImageConsumptionNumber = bb.MonthlyIncreaseImageConsumptionNumber tb.TaskMonthlyLimitImageQuotaNumber = bb.MonthlyLimitImageQuotaNumber + // 手动扩展(图片) + tb.TaskManualImageNumber = bb.ManualImageNumber + tb.TaskManualImageConsumptionNumber = bb.ManualImageConsumptionNumber + tb.TaskMonthlyNewManualImageNumber = bb.MonthlyNewManualImageNumber + tb.TaskMonthlyManualImageConsumptionNumber = bb.MonthlyManualImageConsumptionNumber // ===== 数据分析类 ===== tb.TaskBundleDataAnalysisNumber = bb.BundleDataAnalysisNumber @@ -398,6 +417,15 @@ func copyBundleToTaskBalance(tb *model.TaskBalance, bb *model.BundleBalance) { tb.TaskMonthlyBundleDataAnalysisConsumptionNumber = bb.MonthlyBundleDataAnalysisConsumptionNumber tb.TaskMonthlyIncreaseDataAnalysisConsumptionNumber = bb.MonthlyIncreaseDataAnalysisConsumptionNumber tb.TaskMonthlyLimitDataAnalysisQuotaNumber = bb.MonthlyLimitDataAnalysisQuotaNumber + // 手动扩展(数据分析) + tb.TaskManualDataAnalysisNumber = bb.ManualDataAnalysisNumber + tb.TaskManualDataAnalysisConsumptionNumber = bb.ManualDataAnalysisConsumptionNumber + tb.TaskMonthlyNewManualDataAnalysisNumber = bb.MonthlyNewManualDataAnalysisNumber + tb.TaskMonthlyManualDataAnalysisConsumptionNumber = bb.MonthlyManualDataAnalysisConsumptionNumber + + // 其他字段 + tb.TaskMonthlyNewDurationNumber = bb.MonthlyNewDurationNumber + tb.TaskExpansionPacksNumber = bb.ExpansionPacksNumber } func ExtendTaskBalanceByUserId(userId int, imageNumber int, dataAnalysisNumber int, videoNumber int, durationNumber int) error {