diff --git a/internal/dao/taskDao.go b/internal/dao/taskDao.go index ddad430..0afb52c 100644 --- a/internal/dao/taskDao.go +++ b/internal/dao/taskDao.go @@ -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, "查询总数失败", "查询艺人上传统计总数失败: ")