fix: 优化任务管理台列表的查询速度

This commit is contained in:
cjy 2026-06-10 14:26:51 +08:00
parent 9aa2bf6459
commit 038f07f5af

View File

@ -100,6 +100,10 @@ func GetArtistUploadStatsList(req *dto.TaskQueryRequest) ([]*dto.ArtistUploadSta
bundleTaskType = req.BundleTaskType
}
taskType, _, orderFilter, latestOrderFilter := taskStatsQueryOptions(bundleTaskType)
targetOrderExtraFilter := ""
if req != nil && len(req.SubNums) > 0 {
targetOrderExtraFilter = "\n AND bor.customer_num IN ?"
}
cte := fmt.Sprintf(`WITH
-- 1. 获取当前套餐类型下参与统计的订单基础套餐取每个用户最新普通订单先用后付取所有待付款/已付款订单
@ -108,6 +112,7 @@ target_orders AS (
FROM bundle_order_records bor
WHERE bor.deleted_at IS NULL
AND bor.customer_id IS NOT NULL
%s
AND %s%s
),
@ -277,13 +282,14 @@ balance_sum AS (
cw_agg AS (
SELECT
aob.user_id,
COUNT(DISTINCT CASE WHEN cw.work_category = 2 AND cw.deleted_at = 0 AND (cw.origin_uuid = '' OR cw.origin_uuid IS NULL) AND cw.submit_time BETWEEN aob.start_at AND aob.expired_at THEN cw.uuid END) AS uploaded_video_count,
COUNT(DISTINCT CASE WHEN cw.work_category = 1 AND cw.deleted_at = 0 AND (cw.origin_uuid = '' OR cw.origin_uuid IS NULL) AND cw.submit_time BETWEEN aob.start_at AND aob.expired_at THEN cw.uuid END) AS uploaded_post_count,
COUNT(DISTINCT CASE WHEN cw.work_category = 2 AND cw.cost = 1 AND cw.deleted_at = 0 AND (cw.origin_uuid = '' OR cw.origin_uuid IS NULL) AND cw.submit_time BETWEEN aob.start_at AND aob.expired_at THEN cw.uuid END) AS released_video_consumed,
COUNT(DISTINCT CASE WHEN cw.work_category = 1 AND cw.cost = 1 AND cw.deleted_at = 0 AND (cw.origin_uuid = '' OR cw.origin_uuid IS NULL) AND cw.submit_time BETWEEN aob.start_at AND aob.expired_at THEN cw.uuid END) AS released_post_consumed
COUNT(DISTINCT CASE WHEN cw.work_category = 2 THEN cw.uuid END) AS uploaded_video_count,
COUNT(DISTINCT CASE WHEN cw.work_category = 1 THEN cw.uuid END) AS uploaded_post_count
FROM active_order_balances aob
LEFT JOIN cast_work_extra cwe ON cwe.bundle_order_uuid = aob.order_uuid AND cwe.deleted_at = 0
LEFT JOIN cast_work cw ON cw.uuid = cwe.work_uuid
AND cw.deleted_at = 0
AND (cw.origin_uuid = '' OR cw.origin_uuid IS NULL)
AND cw.submit_time BETWEEN aob.start_at AND aob.expired_at
GROUP BY aob.user_id
),
@ -291,10 +297,12 @@ cw_agg AS (
cwa_agg AS (
SELECT
aw.user_id,
COUNT(CASE WHEN cwa.deleted_at = 0 AND cwa.work_analysis_status != 1 AND cwa.submit_time BETWEEN aw.start_at AND aw.expired_at THEN 1 END) AS uploaded_data_count,
COUNT(CASE WHEN cwa.cost = 1 AND cwa.deleted_at = 0 AND cwa.work_analysis_status != 1 AND cwa.submit_time BETWEEN aw.start_at AND aw.expired_at THEN 1 END) AS released_data_consumed
COUNT(cwa.uuid) AS uploaded_data_count
FROM active_windows aw
LEFT JOIN cast_work_analysis cwa ON cwa.artist_phone = aw.phone
LEFT JOIN cast_work_analysis cwa ON cwa.artist_phone = aw.phone
AND cwa.deleted_at = 0
AND cwa.work_analysis_status != 1
AND cwa.submit_time BETWEEN aw.start_at AND aw.expired_at
GROUP BY aw.user_id
),
@ -302,10 +310,11 @@ cwa_agg AS (
ccr_agg AS (
SELECT
aw.user_id,
COUNT(CASE WHEN ccr.deleted_at = 0 AND ccr.submit_time BETWEEN aw.start_at AND aw.expired_at THEN 1 END) AS uploaded_report_count,
COUNT(CASE WHEN ccr.cost = 1 AND ccr.deleted_at = 0 AND ccr.submit_time BETWEEN aw.start_at AND aw.expired_at THEN 1 END) AS released_report_consumed
COUNT(ccr.uuid) AS uploaded_report_count
FROM active_windows aw
LEFT JOIN cast_competitive_report ccr ON ccr.artist_phone = aw.phone
LEFT JOIN cast_competitive_report ccr ON ccr.artist_phone = aw.phone
AND ccr.deleted_at = 0
AND ccr.submit_time BETWEEN aw.start_at AND aw.expired_at
GROUP BY aw.user_id
),
@ -326,11 +335,13 @@ cvs_agg AS (
tar_agg AS (
SELECT
aw.user_id,
COUNT(CASE WHEN tar.status = 1 AND tar.deleted_at = 0 AND tar.created_at BETWEEN aw.start_at AND aw.expired_at THEN 1 END) AS progress_task_count,
COUNT(CASE WHEN tar.status = 2 AND tar.deleted_at = 0 AND tar.created_at BETWEEN aw.start_at AND aw.expired_at THEN 1 END) AS complete_task_count
COUNT(CASE WHEN tar.status = 1 THEN 1 END) AS progress_task_count,
COUNT(CASE WHEN tar.status = 2 THEN 1 END) AS complete_task_count
FROM active_windows aw
LEFT JOIN `+"`"+taskSchema+"`"+`.task_assign_records tar ON tar.sub_num = aw.customer_num
AND tar.bundle_task_type = ?
AND tar.deleted_at = 0
AND tar.created_at BETWEEN aw.start_at AND aw.expired_at
GROUP BY aw.user_id
),
@ -388,7 +399,7 @@ task_mgmt AS (
GROUP BY user_id
) x ON x.user_id = t.user_id AND x.max_updated_at = t.updated_at
WHERE t.deleted_at = 0 AND t.bundle_task_type = ?
)`, orderFilter, latestOrderFilter)
)`, targetOrderExtraFilter, orderFilter, latestOrderFilter)
fromClause := `FROM active_windows aw
LEFT JOIN balance_sum bs ON bs.user_id = aw.user_id
@ -401,26 +412,34 @@ LEFT JOIN tar_agg ta ON ta.user_id = aw.user_id
LEFT JOIN assigned_pending_agg apa ON apa.user_id = aw.user_id`
whereParts := make([]string, 0, 4)
countWhereParts := make([]string, 0, 4)
countNeedTaskMgmt := false
args := make([]interface{}, 0, 6)
if req != nil && len(req.SubNums) > 0 {
args = append(args, req.SubNums)
}
args = append(args, nowMonth, taskType, taskType, taskType, taskType)
if req != nil && req.Keyword != "" {
like := "%" + req.Keyword + "%"
whereParts = append(whereParts, "(aw.customer_num LIKE ? OR aw.phone LIKE ? OR aw.user_name LIKE ?)")
countWhereParts = append(countWhereParts, "(aw.customer_num LIKE ? OR aw.phone LIKE ? OR aw.user_name LIKE ?)")
args = append(args, like, like, like)
}
if req != nil && req.LastTaskAssignee != "" {
like := "%" + req.LastTaskAssignee + "%"
whereParts = append(whereParts, "tm.last_task_assignee LIKE ?")
countWhereParts = append(countWhereParts, "tm.last_task_assignee LIKE ?")
countNeedTaskMgmt = true
args = append(args, like)
}
if req != nil && len(req.SubNums) > 0 {
whereParts = append(whereParts, "aw.customer_num IN ?")
args = append(args, req.SubNums)
}
whereClause := ""
if len(whereParts) > 0 {
whereClause = " WHERE " + strings.Join(whereParts, " AND ")
}
countWhereClause := ""
if len(countWhereParts) > 0 {
countWhereClause = " WHERE " + strings.Join(countWhereParts, " AND ")
}
// 使用事务固定同一连接,仅对本次查询的 session 设置 collation不影响其他接口
tx := app.ModuleClients.BundleDB.Begin()
@ -429,7 +448,12 @@ LEFT JOIN assigned_pending_agg apa ON apa.user_id = aw.user_id`
return nil, 0, commonErr.ReturnError(err, "设置字符集失败", "设置字符集失败: ")
}
countSQL := cte + " SELECT COUNT(DISTINCT aw.customer_num) " + fromClause + whereClause
countFromClause := "FROM active_windows aw"
if countNeedTaskMgmt {
countFromClause += "\nLEFT JOIN task_mgmt tm ON tm.user_id = aw.user_id"
}
countSQL := cte + " SELECT COUNT(DISTINCT aw.customer_num) " + countFromClause + countWhereClause
var total int64
if err := tx.Raw(countSQL, args...).Scan(&total).Error; err != nil {
return nil, 0, commonErr.ReturnError(err, "查询总数失败", "查询艺人上传统计总数失败: ")