fix: 优化任务管理台列表的查询速度
This commit is contained in:
parent
9aa2bf6459
commit
038f07f5af
@ -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, "查询总数失败", "查询艺人上传统计总数失败: ")
|
||||
|
||||
Loading…
Reference in New Issue
Block a user