fix(worker): 不满额拼单母单显示待抢单,满额后才按份额状态推进
This commit is contained in:
@@ -99,16 +99,23 @@ const TIMEOUT_COUNT_CACHE_TTL_MS = 5_000
|
||||
const TIMEOUT_COUNT_CACHE_MAX_ENTRIES = 256
|
||||
const timeoutCountCache = new Map<string, TimeoutCountCacheEntry>()
|
||||
|
||||
/** 后台按母工单拼单参与情况计算业务状态,open 只代表大厅生命周期。 */
|
||||
/**
|
||||
* 后台按母工单拼单参与情况计算业务状态,open 只代表大厅生命周期。
|
||||
*
|
||||
* 有份额回到大厅(有效份数 < 总份数)时必须先显示「待抢单」:空位还在,
|
||||
* 母单就还没到按份额状态推进的时候。满额后才按份额状态收敛:
|
||||
* - 仍有 joined 份额 → in_progress(代练中)
|
||||
* - 无 joined 份额 → pending_acceptance(待验收)
|
||||
*/
|
||||
function adminOperationalStatusExpression(alias = 'wo', shareSummaryAlias = '') {
|
||||
if (shareSummaryAlias) {
|
||||
return `CASE
|
||||
WHEN ${alias}.status = 'open'
|
||||
AND ${alias}.sharing_enabled IS TRUE
|
||||
AND COALESCE(${shareSummaryAlias}.active_share_quantity, 0) > 0
|
||||
THEN CASE
|
||||
WHEN COALESCE(${shareSummaryAlias}.active_share_quantity, 0) >= ${alias}.sharing_total_quantity
|
||||
AND COALESCE(${shareSummaryAlias}.pending_share_count, 0) = 0
|
||||
WHEN COALESCE(${shareSummaryAlias}.active_share_quantity, 0) < ${alias}.sharing_total_quantity
|
||||
THEN 'open'
|
||||
WHEN COALESCE(${shareSummaryAlias}.pending_share_count, 0) = 0
|
||||
THEN 'pending_acceptance'
|
||||
ELSE 'in_progress'
|
||||
END
|
||||
@@ -116,13 +123,16 @@ function adminOperationalStatusExpression(alias = 'wo', shareSummaryAlias = '')
|
||||
END`
|
||||
}
|
||||
|
||||
const activeShareQuantitySql = `COALESCE((SELECT SUM(wos.quantity) FROM work_order_shares wos WHERE wos.work_order_id = ${alias}.id AND wos.status != 'cancelled'), 0)`
|
||||
const pendingShareCountSql = `COALESCE((SELECT COUNT(*) FROM work_order_shares wos WHERE wos.work_order_id = ${alias}.id AND wos.status = 'joined'), 0)`
|
||||
|
||||
return `CASE
|
||||
WHEN ${alias}.status = 'open'
|
||||
AND ${alias}.sharing_enabled IS TRUE
|
||||
AND COALESCE((SELECT SUM(wos.quantity) FROM work_order_shares wos WHERE wos.work_order_id = ${alias}.id AND wos.status != 'cancelled'), 0) > 0
|
||||
THEN CASE
|
||||
WHEN COALESCE((SELECT SUM(wos.quantity) FROM work_order_shares wos WHERE wos.work_order_id = ${alias}.id AND wos.status != 'cancelled'), 0) >= ${alias}.sharing_total_quantity
|
||||
AND COALESCE((SELECT COUNT(*) FROM work_order_shares wos WHERE wos.work_order_id = ${alias}.id AND wos.status = 'joined'), 0) = 0
|
||||
WHEN ${activeShareQuantitySql} < ${alias}.sharing_total_quantity
|
||||
THEN 'open'
|
||||
WHEN ${pendingShareCountSql} = 0
|
||||
THEN 'pending_acceptance'
|
||||
ELSE 'in_progress'
|
||||
END
|
||||
|
||||
@@ -822,7 +822,7 @@ export async function acceptWorkOrderShareAndSettle(input: {
|
||||
* 后台撤销单个拼单份额:退还该打手押金、释放这一份的占用。
|
||||
*
|
||||
* 份额取消后空出的份数必须回到接单大厅,所以这里用统一口径重算母单状态:
|
||||
* 还有其它有效份额 → open(后台按份额推导为代练中);一份不剩 → open(待抢单)。
|
||||
* 存在空位 → open(后台显示待抢单);一份不剩 → open(同样待抢单)。
|
||||
* 重算时保留原 published_at / hall_queued_at,空出的份额沿用原大厅队列位置。
|
||||
*/
|
||||
export async function cancelWorkOrderShare(input: {
|
||||
|
||||
@@ -626,9 +626,10 @@ export async function submitWorkOrderShareAcceptance(input: {
|
||||
/**
|
||||
* 按份额集合推导母单拼单状态(唯一口径,禁止各调用点各自 UPDATE work_orders.status)。
|
||||
*
|
||||
* allocated >= total && joined == 0 && submitted > 0 → pending_acceptance
|
||||
* allocated < total 或 joined > 0 → open
|
||||
* allocated == 0(全部取消) → open(重新可参与)
|
||||
* allocated >= total && joined == 0 && submitted > 0 → pending_acceptance(待验收)
|
||||
* allocated < total → open(后台显示待抢单:空位还在)
|
||||
* allocated >= total && joined > 0 → open(后台显示代练中:还有份额在做)
|
||||
* allocated == 0(全部取消) → open(待抢单,重新可参与)
|
||||
* 母单 accepted / cancelled → 不动
|
||||
*
|
||||
* 返回更新后的母单行(供调用方回给前端)。
|
||||
|
||||
Reference in New Issue
Block a user