diff --git a/apps/backend/src/repositories/worker-platform/work-order-repo.ts b/apps/backend/src/repositories/worker-platform/work-order-repo.ts index 6c975d33..60c8a080 100644 --- a/apps/backend/src/repositories/worker-platform/work-order-repo.ts +++ b/apps/backend/src/repositories/worker-platform/work-order-repo.ts @@ -1292,24 +1292,14 @@ export async function listWorkOrders({ const offset = (page - 1) * pageSize const orderBy = sort === 'worker_claimed_at_desc' && workerSharingId - ? (() => { - params.push(workerSharingId) - const workerIdPlaceholder = `$${params.length}` - return `COALESCE( + ? `COALESCE( CASE - WHEN wo.assigned_worker_id = ${workerIdPlaceholder} THEN wo.assigned_at + WHEN wo.assigned_worker_id = $1 THEN wo.assigned_at END, - ( - SELECT wos.created_at - FROM work_order_shares wos - WHERE wos.work_order_id = wo.id - AND wos.worker_id = ${workerIdPlaceholder} - AND wos.status != 'cancelled' - ORDER BY wos.created_at DESC - LIMIT 1 - ) + CASE + WHEN worker_share.status != 'cancelled' THEN worker_share.created_at + END ) DESC NULLS LAST, wo.id DESC` - })() : 'wo.id DESC' const effectiveOrderBy = pinnedFirst ? `wo.pinned_at DESC NULLS LAST, ${orderBy}` : orderBy params.push(pageSize, offset) @@ -1326,7 +1316,7 @@ export async function listWorkOrders({ /** 按筛选条件汇总工单,统计范围不受当前分页影响。 */ export async function getWorkOrderStatistics(input: ListInput = {}): Promise { - const { whereClause, params } = buildWorkOrderWhere(input) + const { joins, whereClause, params } = buildWorkOrderWhere(input) const vipEvidencePendingWhere = ` wo.status = 'accepted' AND wo.acceptance_json->>'reviewMode' = 'vip_auto' @@ -1362,6 +1352,7 @@ export async function getWorkOrderStatistics(input: ListInput = {}): Promise 'open' + OR EXISTS ( + SELECT 1 + FROM work_order_events timeout_event + WHERE timeout_event.work_order_id = historical.id + AND timeout_event.event_type = 'timeout_reopen' + ) + ) + UNION + SELECT share_source.work_order_id + FROM work_order_shares share_source + WHERE share_source.worker_id = ${workerSharePlaceholder} + AND share_source.status != 'cancelled' + ) worker_visible ON worker_visible.work_order_id = wo.id LEFT JOIN work_order_shares worker_share ON worker_share.work_order_id = wo.id AND worker_share.worker_id = ${workerSharePlaceholder}` @@ -4451,24 +4465,6 @@ function buildWorkOrderWhere({ params.push(categoryId) filters.push(`wo.category_id = $${params.length}`) } - if (workerSharingId) { - filters.push( - `(wo.assigned_worker_id = ${workerSharePlaceholder} - OR ( - wo.last_assigned_worker_id = ${workerSharePlaceholder} - AND ( - wo.status <> 'open' - OR EXISTS ( - SELECT 1 - FROM work_order_events timeout_event - WHERE timeout_event.work_order_id = wo.id - AND timeout_event.event_type = 'timeout_reopen' - ) - ) - ) - OR (worker_share.work_order_id IS NOT NULL AND worker_share.status != 'cancelled'))`, - ) - } if (visibleAfterIso) { params.push(visibleAfterIso) filters.push(`(wo.published_at IS NULL OR wo.published_at <= $${params.length})`)