From 0e284a8d6f64c943f0be484ef0c61efe0d614134 Mon Sep 17 00:00:00 2001 From: cjy Date: Wed, 22 Oct 2025 12:45:54 +0800 Subject: [PATCH] =?UTF-8?q?bugfix=EF=BC=9A=20=E4=BF=AE=E5=A4=8D=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E5=BE=85=E5=8F=91=E6=95=B0=E9=87=8F=E3=80=81=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E5=88=9D=E6=AC=A1=E5=90=AF=E5=8A=A8=E6=97=B6=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=90=8C=E6=AD=A5=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/dao/taskBalanceSync.go | 94 +++++++++++++++------------------ internal/dao/taskDao.go | 54 ++++++++++++++++--- 2 files changed, 90 insertions(+), 58 deletions(-) diff --git a/internal/dao/taskBalanceSync.go b/internal/dao/taskBalanceSync.go index 2dffc71..018ab74 100644 --- a/internal/dao/taskBalanceSync.go +++ b/internal/dao/taskBalanceSync.go @@ -41,31 +41,34 @@ func RunInitialTaskBalanceSync() error { return nil } - // 直接获取所有BundleBalance记录进行同步,不再依赖GetValidArtistList的严格过滤 - var bundleBalances []model.BundleBalance - if err := app.ModuleClients.BundleDB.Find(&bundleBalances).Error; err != nil { + // 获取当前有效(未过期且已支付)的艺人及其最新订单 + validArtists, err := GetValidArtistList() + if err != nil { return err } - - if len(bundleBalances) == 0 { - _ = app.ModuleClients.TaskBenchDB.Create(&model.TaskSyncStatus{ - SyncKey: model.InitialSyncKey, - ExecutedAt: time.Now(), - Remark: "skipped: no bundle_balance records found", - }).Error + fmt.Println(validArtists) + if len(validArtists) == 0 { + // 不写入已执行标记,留待后续有数据时再次执行 + fmt.Println("无数据更新") return nil } // 构造待插入的 TaskBalance 列表 - tasks := make([]model.TaskBalance, 0, len(bundleBalances)) - skippedCount := 0 + 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 + } - for _, bb := range bundleBalances { subNum, telNum, err := fetchIdentityForBundle(&bb) if err != nil { - // 无法获取身份信息则跳过该条,但记录跳过数量 - fmt.Println("跳过 BundleBalance ID:", bb.ID, "错误:", err) - skippedCount++ + // 无法获取身份信息则跳过该条 continue } @@ -82,7 +85,7 @@ func RunInitialTaskBalanceSync() error { tasks = append(tasks, tb) } - // 原子写入:插入 TaskBalance + 插入标记 + // 原子写入:插入 TaskBalance + 插入标记(确保有插入才写标记) tx := app.ModuleClients.TaskBenchDB.Begin() defer func() { if r := recover(); r != nil { @@ -90,23 +93,20 @@ func RunInitialTaskBalanceSync() error { } }() - if len(tasks) > 0 { - if err := tx.Create(&tasks).Error; err != nil { - tx.Rollback() - return err - } + if len(tasks) == 0 { + // 没有可插入的数据,不写标记,直接返回 + tx.Rollback() + return nil } - // 记录同步结果 - 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(&tasks).Error; err != nil { + tx.Rollback() + return err } - if err := tx.Create(&model.TaskSyncStatus{ SyncKey: model.InitialSyncKey, ExecutedAt: time.Now(), - Remark: remark, + Remark: "initial sync executed", }).Error; err != nil { tx.Rollback() return err @@ -159,33 +159,27 @@ 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 - var telNum string + type userRow struct { + Tel string + } + var ur userRow if err := app.ModuleClients.BundleDB.Table("`micro-account`.`user`").Unscoped(). - Select("tel_num").Where("id = ?", bb.UserId).Scan(&telNum).Error; err != nil { + Select("tel_num AS tel").Where("id = ?", bb.UserId).Limit(1).Scan(&ur).Error; err != nil { return "", "", err } - // customer_num 来自 bundle_order_records(按 order_uuid) - // 添加容错机制:如果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) + type orderRow struct { + Customer string } - return customerNum, telNum, nil + 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 AS customer").Where("uuid = ?", bb.OrderUUID).Limit(1).Scan(&or).Error; err != nil { + return "", "", err + } + return or.Customer, ur.Tel, nil } // UpdateTaskBalance 每月批量更新任务余额 diff --git a/internal/dao/taskDao.go b/internal/dao/taskDao.go index 92ece43..177aa29 100644 --- a/internal/dao/taskDao.go +++ b/internal/dao/taskDao.go @@ -1,10 +1,12 @@ package dao import ( + "fmt" "micro-bundle/internal/model" "micro-bundle/pkg/app" commonErr "micro-bundle/pkg/err" "time" + "strings" "github.com/google/uuid" "gorm.io/gorm" @@ -1071,7 +1073,7 @@ func GetTaskAssignRecordsList(req *TaskAssignRecordsQueryRequest) ([]*model.Task } // GetValidArtistList 查询套餐状态为有效中的艺人数据列表 -// 根据BundleOrderRecords表查询过期时间大于当前时间且状态为已支付的艺人详细信息 +// 根据BundleOrderRecords表查询过期时间大于当前时间且状态为已支付,同时已激活的艺人详细信息 func GetValidArtistList() ([]ValidArtistInfo, error) { // 构建子查询,获取每个用户的最新订单记录 subQuery := app.ModuleClients.BundleDB.Table("bundle_order_records as bor1"). @@ -1083,7 +1085,7 @@ func GetValidArtistList() ([]ValidArtistInfo, error) { ) bor2 ON bor1.customer_id = bor2.customer_id AND bor1.created_at = bor2.max_created_time`) // 主查询,关联用户表和实名信息表 - session := app.ModuleClients.BundleDB.Table("`micro-account`.`user` AS u"). + session := app.ModuleClients.BundleDB.Table("`micro-account`.`user` AS u").Unscoped(). Select(`u.id as user_id, bor.customer_num, rn.name as user_name, u.tel_num as user_phone_number, bor.bundle_name, bor.expiration_time, bor.status, bor.uuid as order_uuid, @@ -1098,11 +1100,14 @@ func GetValidArtistList() ([]ValidArtistInfo, error) { bb.expansion_packs_number`). Joins("LEFT JOIN `micro-account`.real_name rn ON u.real_name_id = rn.id"). Joins("LEFT JOIN (?) as bor ON bor.customer_id = u.id", subQuery). - Joins("LEFT JOIN bundle_balance bb ON u.id = bb.user_id AND bb.order_uuid = bor.uuid"). + Joins("LEFT JOIN fiee_bundle.bundle_balance bb ON u.id = bb.user_id AND bb.order_uuid = bor.uuid"). + Joins("LEFT JOIN bundle_activate bc ON bc.user_id = u.id"). Where("rn.name IS NOT NULL"). Where("u.deleted_at = 0"). - Where("bor.expiration_time > ?", time.Now().Format("2006-01-02 15:04:05")). - Where("bor.status = ?", 2). // 2:已签已支付 + Where("bor.deleted_at IS NULL"). + Where("bb.expired_at > ?", time.Now()). + Where("bc.activate = ?", 2). + Where("bb.month = ?", time.Now().Format("2006-01")). Order("bor.expiration_time desc") var data []ValidArtistInfo @@ -1111,6 +1116,7 @@ func GetValidArtistList() ([]ValidArtistInfo, error) { return nil, commonErr.ReturnError(err, "查询有效艺人失败", "查询有效艺人失败: ") } + fmt.Println(data) return data, nil } @@ -1182,11 +1188,14 @@ func GetPendingTaskList(req *TaskQueryRequest, validArtist []ValidArtistInfo) ([ return nil, 0, commonErr.ReturnError(err, "查询待指派任务记录失败", "查询待指派任务记录失败: ") } - // 统计总数(分页前) - total := int64(len(tmList)) + // 构建已存在的 sub_num 集合,用于补充缺失的有效艺人 + existingSubNums := make(map[string]struct{}, len(tmList)) + for _, t := range tmList { + existingSubNums[t.SubNum] = struct{}{} + } // 映射为响应结构(基础字段) - resp := make([]*TaskQueryResponse, 0, len(tmList)) + resp := make([]*TaskQueryResponse, 0, len(tmList)+len(validArtist)) for _, t := range tmList { resp = append(resp, &TaskQueryResponse{ SubNum: t.SubNum, @@ -1197,5 +1206,34 @@ func GetPendingTaskList(req *TaskQueryRequest, validArtist []ValidArtistInfo) ([ }) } + // 追加:对在 TaskManagement 中不存在的有效艺人构建基础记录 + for _, a := range validArtist { + if a.CustomerNum == "" { + continue + } + if _, ok := existingSubNums[a.CustomerNum]; ok { + continue + } + // 关键词过滤(与查询条件保持一致) + if req.Keyword != "" { + kw := strings.ToLower(req.Keyword) + if !(strings.Contains(strings.ToLower(a.CustomerNum), kw) || + strings.Contains(strings.ToLower(a.UserPhoneNumber), kw) || + strings.Contains(strings.ToLower(a.UserName), kw)) { + continue + } + } + resp = append(resp, &TaskQueryResponse{ + SubNum: a.CustomerNum, + TelNum: a.UserPhoneNumber, + ArtistName: a.UserName, + LastTaskAssignee: "", + TaskAssigneeNum: "", + }) + } + + // 统计总数(分页前) + total := int64(len(resp)) + return resp, total, nil }