重构打手订单概览查询为索引可用的UNION分支避免work_orders全表扫描
This commit is contained in:
@@ -365,63 +365,42 @@ export async function getWorkerOrderOverview(workerId: number | string): Promise
|
||||
const normalizedWorkerId = Number(workerId)
|
||||
const result = await query<WorkerOrderOverviewRow>(
|
||||
`
|
||||
WITH worker_orders AS (
|
||||
WITH worker_base AS (
|
||||
SELECT
|
||||
CASE
|
||||
WHEN (
|
||||
CASE
|
||||
WHEN wos.id IS NOT NULL AND wo.status NOT IN ('accepted', 'cancelled', 'problem')
|
||||
THEN CASE wos.status
|
||||
WHEN 'joined' THEN 'in_progress'
|
||||
WHEN 'submitted' THEN 'pending_acceptance'
|
||||
WHEN 'accepted' THEN 'accepted'
|
||||
WHEN 'cancelled' THEN 'cancelled'
|
||||
ELSE wo.status
|
||||
END
|
||||
ELSE wo.status
|
||||
END
|
||||
) = 'in_progress' AND (
|
||||
EXISTS (
|
||||
SELECT 1
|
||||
FROM worker_order_cancel_requests wcr
|
||||
WHERE wcr.work_order_id = wo.id
|
||||
AND wcr.worker_id = $1
|
||||
AND wcr.status = 'pending'
|
||||
) OR EXISTS (
|
||||
SELECT 1
|
||||
FROM worker_order_feedbacks wf
|
||||
WHERE wf.work_order_id = wo.id
|
||||
AND wf.worker_id = $1
|
||||
AND wf.status = 'pending'
|
||||
)
|
||||
) THEN 'problem'
|
||||
ELSE CASE
|
||||
WHEN wos.id IS NOT NULL AND wo.status NOT IN ('accepted', 'cancelled', 'problem')
|
||||
THEN CASE wos.status
|
||||
WHEN 'joined' THEN 'in_progress'
|
||||
WHEN 'submitted' THEN 'pending_acceptance'
|
||||
WHEN 'accepted' THEN 'accepted'
|
||||
WHEN 'cancelled' THEN 'cancelled'
|
||||
ELSE wo.status
|
||||
END
|
||||
ELSE wo.status
|
||||
END
|
||||
END AS status,
|
||||
wo.acceptance_json,
|
||||
wo.id,
|
||||
wo.status AS wo_status,
|
||||
wos.status AS wos_status,
|
||||
wos.id IS NOT NULL AS is_worker_share,
|
||||
CASE
|
||||
WHEN wos.id IS NOT NULL THEN wos.share_reward
|
||||
WHEN wo.assigned_worker_id = $1 THEN wo.reward_amount
|
||||
ELSE 0
|
||||
END AS worker_settlement_amount
|
||||
END AS worker_settlement_amount,
|
||||
wo.acceptance_json
|
||||
FROM work_orders wo
|
||||
LEFT JOIN work_order_shares wos
|
||||
ON wos.work_order_id = wo.id
|
||||
AND wos.worker_id = $1
|
||||
AND wos.status != 'cancelled'
|
||||
WHERE wo.assigned_worker_id = $1
|
||||
OR (
|
||||
wo.last_assigned_worker_id = $1
|
||||
UNION
|
||||
SELECT
|
||||
wo.id,
|
||||
wo.status,
|
||||
wos.status,
|
||||
wos.id IS NOT NULL,
|
||||
CASE
|
||||
WHEN wos.id IS NOT NULL THEN wos.share_reward
|
||||
WHEN wo.assigned_worker_id = $1 THEN wo.reward_amount
|
||||
ELSE 0
|
||||
END,
|
||||
wo.acceptance_json
|
||||
FROM work_orders wo
|
||||
LEFT JOIN work_order_shares wos
|
||||
ON wos.work_order_id = wo.id
|
||||
AND wos.worker_id = $1
|
||||
AND wos.status != 'cancelled'
|
||||
WHERE wo.last_assigned_worker_id = $1
|
||||
AND (
|
||||
wo.status <> 'open'
|
||||
OR EXISTS (
|
||||
@@ -431,8 +410,66 @@ export async function getWorkerOrderOverview(workerId: number | string): Promise
|
||||
AND timeout_event.event_type = 'timeout_reopen'
|
||||
)
|
||||
)
|
||||
UNION
|
||||
SELECT
|
||||
wo.id,
|
||||
wo.status,
|
||||
wos.status,
|
||||
TRUE,
|
||||
wos.share_reward,
|
||||
wo.acceptance_json
|
||||
FROM work_orders wo
|
||||
INNER JOIN work_order_shares wos
|
||||
ON wos.work_order_id = wo.id
|
||||
AND wos.worker_id = $1
|
||||
AND wos.status != 'cancelled'
|
||||
),
|
||||
worker_orders AS (
|
||||
SELECT
|
||||
CASE
|
||||
WHEN (
|
||||
CASE
|
||||
WHEN is_worker_share AND wo_status NOT IN ('accepted', 'cancelled', 'problem')
|
||||
THEN CASE wos_status
|
||||
WHEN 'joined' THEN 'in_progress'
|
||||
WHEN 'submitted' THEN 'pending_acceptance'
|
||||
WHEN 'accepted' THEN 'accepted'
|
||||
WHEN 'cancelled' THEN 'cancelled'
|
||||
ELSE wo_status
|
||||
END
|
||||
ELSE wo_status
|
||||
END
|
||||
) = 'in_progress' AND (
|
||||
EXISTS (
|
||||
SELECT 1
|
||||
FROM worker_order_cancel_requests wcr
|
||||
WHERE wcr.work_order_id = worker_base.id
|
||||
AND wcr.worker_id = $1
|
||||
AND wcr.status = 'pending'
|
||||
) OR EXISTS (
|
||||
SELECT 1
|
||||
FROM worker_order_feedbacks wf
|
||||
WHERE wf.work_order_id = worker_base.id
|
||||
AND wf.worker_id = $1
|
||||
AND wf.status = 'pending'
|
||||
)
|
||||
OR wos.id IS NOT NULL
|
||||
) THEN 'problem'
|
||||
ELSE CASE
|
||||
WHEN is_worker_share AND wo_status NOT IN ('accepted', 'cancelled', 'problem')
|
||||
THEN CASE wos_status
|
||||
WHEN 'joined' THEN 'in_progress'
|
||||
WHEN 'submitted' THEN 'pending_acceptance'
|
||||
WHEN 'accepted' THEN 'accepted'
|
||||
WHEN 'cancelled' THEN 'cancelled'
|
||||
ELSE wo_status
|
||||
END
|
||||
ELSE wo_status
|
||||
END
|
||||
END AS status,
|
||||
acceptance_json,
|
||||
is_worker_share,
|
||||
worker_settlement_amount
|
||||
FROM worker_base
|
||||
)
|
||||
SELECT
|
||||
status,
|
||||
|
||||
Reference in New Issue
Block a user