bugfix: 修复初次同步

This commit is contained in:
cjy 2025-10-22 10:23:44 +08:00
parent 7748878608
commit 854cb61551

View File

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