fix:撤单之后 重新指派给你同一个打手 同一个订单 不显示订单号不显示任何信息

This commit is contained in:
2026-10-26 12:41:07 +08:00
parent 6a5a8d70b0
commit 2c9f741873
3 changed files with 38 additions and 5 deletions
@@ -1256,6 +1256,9 @@ export function buildWorkOrderWhere({
FROM work_order_shares wos
WHERE wos.work_order_id = wo.id
AND wos.worker_id = ${workerSharePlaceholder}::bigint
-- 当前接单人就是本人时,旧的已取消份额不能再代表这张单:
-- 撤单后把同一单重新指派给同一打手,否则列表会一直判成「已取消」。
AND NOT (wos.status = 'cancelled' AND wo.assigned_worker_id = ${workerSharePlaceholder}::bigint)
ORDER BY
CASE wos.status
WHEN 'joined' THEN 0
@@ -167,11 +167,14 @@ export async function listWorkerMyOrders(query: JsonObject = {}, session: Worker
const cancelledShare = cancelledShareByOrderId.get(workOrderId)
const timeoutEvent = timeoutEventsByOrderId.get(workOrderId)
const assignedToMe =
item.assigned_worker_id != null && Number(item.assigned_worker_id) === Number(worker.id)
// 当前接单人就是本人时,旧的已取消份额只作历史留痕,不能再参与状态判定:
// 撤单后重新指派给同一打手,否则会被映射成「已取消」,按钮全部不可用。
const fallbackCancelledShare = assignedToMe ? null : cancelledShare
// 判断当前打手是否仍持有该单(任一有效份额即算持有)
const isOwnerCurrently =
(item.assigned_worker_id != null &&
Number(item.assigned_worker_id) === Number(worker.id)) ||
activeShares.length > 0
const isOwnerCurrently = assignedToMe || activeShares.length > 0
// 若不是当前持有人,但有该打手的超时事件或取消份额,则判定为该打手的已超时历史单
const isTimedOutForMe =
@@ -219,7 +222,7 @@ export async function listWorkerMyOrders(query: JsonObject = {}, session: Worker
...mapWorkOrderForWorker(
item,
permissions,
activeShare || cancelledShare || null,
activeShare || fallbackCancelledShare || null,
noteByOrderId.get(workOrderId) || '',
viewedAtByOrderId.get(workOrderId) || null,
{ isTimedOutForMe, timeoutNotice, myShares: activeShares },
@@ -3547,3 +3547,30 @@ test('取消部分:只取消未验收份额并保留已验收,剩余份数
)
assert.ok(mapperSrc.includes('canCancelSharingPart:'), '前端按钮依赖 canCancelSharingPart 能力位')
})
test('撤单后重派同一打手:旧已取消份额不得把当前接单状态判成已取消', () => {
const querySrc = fs.readFileSync(
new URL('../../repositories/worker-platform/work-order-query-repo.ts', import.meta.url),
'utf8',
)
assert.ok(
querySrc.includes(
"AND NOT (wos.status = 'cancelled' AND wo.assigned_worker_id = ${workerSharePlaceholder}::bigint)",
),
'当前接单人就是本人时,代表份额必须排除已取消份额,否则列表会判成「已取消」',
)
const serviceSrc = fs.readFileSync(
new URL('./worker-my-order-service.ts', import.meta.url),
'utf8',
)
assert.ok(
serviceSrc.includes('const assignedToMe =') &&
serviceSrc.includes('const fallbackCancelledShare = assignedToMe ? null : cancelledShare'),
'当前接单人就是本人时,不得把已取消份额当 myShare 传给映射',
)
assert.ok(
serviceSrc.includes('activeShare || fallbackCancelledShare || null'),
'列表映射必须使用排除后的已取消份额兜底',
)
})