fix(consignment): 退库后不再带出上一单买家资料,撤单清掉上一手验收痕迹

现货退回仓库后只留卖家提报,不再挂买家角色、赠送凭证和店铺;工单撤单、退回、抢单时清掉验收与备注,买家下单资料仍保留。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
yml2213
2026-10-05 14:55:42 +08:00
co-authored by Cursor
parent dbdafd3dc4
commit eae78aae34
10 changed files with 152 additions and 51 deletions
@@ -6,7 +6,7 @@ import { ensureWorkerWalletWithClient, getWorkerWalletWithClient } from './share
import { createWorkOrderEventWithClient } from './work-order-event-repo.js'
import { getWorkOrderByIdWithClient } from './work-order-query-repo.js'
import { getOutstandingDepositAmountWithClient } from './work-order-deposit-repo.js'
import { RESET_GIFT_FLOW_SQL } from './work-order-gift-repo.js'
import { CLEAR_DELIVERY_RESIDUE_SQL, RESET_GIFT_FLOW_SQL } from './work-order-gift-repo.js'
import type { WorkOrderRow } from './types.js'
export async function cancelWorkerWorkOrder(input: {
@@ -51,6 +51,7 @@ export async function cancelWorkerWorkOrder(input: {
assigned_at = NULL,
deadline_at = NULL,
hall_queued_at = $1,
${CLEAR_DELIVERY_RESIDUE_SQL},
${RESET_GIFT_FLOW_SQL},
updated_at = $1
WHERE id = $2
@@ -158,6 +159,7 @@ export async function unassignWorkOrder(input: {
assigned_worker_id = NULL,
assigned_at = NULL,
deadline_at = NULL,
${CLEAR_DELIVERY_RESIDUE_SQL},
${RESET_GIFT_FLOW_SQL},
updated_at = $1
WHERE id = $2
@@ -281,6 +283,7 @@ export async function returnAssignedWorkOrderToHall(input: {
deadline_at = NULL,
published_at = $1,
hall_queued_at = $1,
${CLEAR_DELIVERY_RESIDUE_SQL},
${RESET_GIFT_FLOW_SQL},
updated_at = $1
WHERE id = $2
@@ -404,6 +407,7 @@ export async function cancelAssignedWorkOrder(input: {
assigned_at = NULL,
deadline_at = NULL,
published_at = NULL,
${CLEAR_DELIVERY_RESIDUE_SQL},
${RESET_GIFT_FLOW_SQL},
updated_at = $1
WHERE id = $2
@@ -518,11 +522,7 @@ export async function reopenCancelledWorkOrder(input: {
assigned_worker_id = NULL,
assigned_at = NULL,
deadline_at = NULL,
acceptance_json = '{}'::jsonb,
draft_acceptance_json = '{}'::jsonb,
submitted_at = NULL,
accepted_at = NULL,
problem_note = '',
${CLEAR_DELIVERY_RESIDUE_SQL},
published_at = NULL,
pinned_at = NULL,
${RESET_GIFT_FLOW_SQL},
@@ -38,6 +38,19 @@ export const RESET_GIFT_FLOW_SQL = `
gift_available_at = NULL
`
/**
* 脱离上一手交付(撤单、退回大厅、取消指派、超时、重新接单)时清掉验收与备注痕迹。
* 买家下单资料(material.collect)和寄售履约留痕(consignmentHistory)不在这里动。
*/
export const CLEAR_DELIVERY_RESIDUE_SQL = `
submitted_at = NULL,
accepted_at = NULL,
acceptance_json = '{}'::jsonb,
draft_acceptance_json = '{}'::jsonb,
problem_note = '',
worker_note = ''
`
export function parseWorkOrderMaterial(workOrder: {
material_json?: unknown
}): Record<string, unknown> {
@@ -1,4 +1,5 @@
import { withTransaction } from '../../db/client.js'
import { CLEAR_DELIVERY_RESIDUE_SQL } from './work-order-gift-repo.js'
import { ensureWorkerWalletWithClient, getWorkerWalletWithClient } from './shared.js'
import { createWorkOrderEventWithClient } from './work-order-event-repo.js'
import {
@@ -66,6 +67,7 @@ export async function grabWorkOrder(input: {
booster_material_json = '{}'::jsonb,
friend_added_at = NULL,
gift_available_at = NULL,
${CLEAR_DELIVERY_RESIDUE_SQL},
updated_at = $2
WHERE id = $4
AND status = 'open'
@@ -190,6 +192,7 @@ export async function assignWorkOrderToWorker(input: {
booster_material_json = '{}'::jsonb,
friend_added_at = NULL,
gift_available_at = NULL,
${CLEAR_DELIVERY_RESIDUE_SQL},
updated_at = $2
WHERE id = $4
`,
@@ -6,7 +6,7 @@ import { ensureWorkerWalletWithClient, getWorkerWalletWithClient } from './share
import { createWorkOrderEventWithClient } from './work-order-event-repo.js'
import { getWorkOrderByIdWithClient } from './work-order-query-repo.js'
import { getOutstandingDepositAmountWithClient } from './work-order-deposit-repo.js'
import { RESET_GIFT_FLOW_SQL } from './work-order-gift-repo.js'
import { CLEAR_DELIVERY_RESIDUE_SQL, RESET_GIFT_FLOW_SQL } from './work-order-gift-repo.js'
import type { ProblemWorkOrderResolutionAction, WorkOrderRow } from './types.js'
/** 问题单退回打手时,按标记前状态恢复;异常历史数据回退单人单进行中。 */
@@ -172,9 +172,12 @@ export async function resolveProblemWorkOrder(input: {
status = $1,
assigned_worker_id = CASE WHEN $2 THEN NULL ELSE assigned_worker_id END,
assigned_at = CASE WHEN $2 THEN NULL ELSE assigned_at END,
acceptance_json = CASE WHEN $3 THEN '{}'::jsonb ELSE acceptance_json END,
submitted_at = CASE WHEN $3 THEN NULL ELSE submitted_at END,
problem_note = CASE WHEN $2 THEN '' ELSE problem_note END,
acceptance_json = CASE WHEN $1 IN ('open', 'cancelled') OR $3 THEN '{}'::jsonb ELSE acceptance_json END,
draft_acceptance_json = CASE WHEN $1 IN ('open', 'cancelled') THEN '{}'::jsonb ELSE draft_acceptance_json END,
submitted_at = CASE WHEN $1 IN ('open', 'cancelled') OR $3 THEN NULL ELSE submitted_at END,
accepted_at = CASE WHEN $1 IN ('open', 'cancelled') THEN NULL ELSE accepted_at END,
problem_note = CASE WHEN $2 OR $1 IN ('open', 'cancelled') THEN '' ELSE problem_note END,
worker_note = CASE WHEN $1 IN ('open', 'cancelled') THEN '' ELSE worker_note END,
deadline_at = CASE
WHEN $1 = 'in_progress' AND timeout_minutes > 0 THEN
CASE
@@ -348,9 +351,7 @@ export async function settleOverdueWorkOrder(input: {
assigned_worker_id = NULL,
assigned_at = NULL,
deadline_at = NULL,
acceptance_json = CASE WHEN $1 = 'open' THEN '{}'::jsonb ELSE acceptance_json END,
submitted_at = CASE WHEN $1 = 'open' THEN NULL ELSE submitted_at END,
problem_note = CASE WHEN $1 = 'open' THEN '' ELSE problem_note END,
${CLEAR_DELIVERY_RESIDUE_SQL},
published_at = CASE WHEN $1 = 'open' THEN $2 ELSE published_at END,
hall_queued_at = CASE WHEN $1 = 'open' THEN $2 ELSE hall_queued_at END,
${RESET_GIFT_FLOW_SQL},
@@ -7,6 +7,7 @@ import {
resolveWorkOrderShareCancellationStatus,
resolveWorkOrderSharingCancellationPlan,
} from './shared.js'
import { CLEAR_DELIVERY_RESIDUE_SQL, RESET_GIFT_FLOW_SQL } from './work-order-gift-repo.js'
import { createWorkOrderEventWithClient } from './work-order-event-repo.js'
import { getWorkOrderByIdWithClient } from './work-order-query-repo.js'
import {
@@ -807,7 +808,12 @@ export async function cancelWorkOrderShare(input: {
await client.query(
`UPDATE work_order_shares
SET status = 'cancelled', updated_at = $1
SET status = 'cancelled',
acceptance_json = '{}'::jsonb,
draft_acceptance_json = '{}'::jsonb,
submitted_at = NULL,
accepted_at = NULL,
updated_at = $1
WHERE id = $2`,
[input.now, input.shareId],
)
@@ -963,14 +969,22 @@ export async function cancelWorkOrderSharing(input: {
]
await client.query(
`UPDATE work_order_shares
SET status = 'cancelled', updated_at = $1
SET status = 'cancelled',
acceptance_json = '{}'::jsonb,
draft_acceptance_json = '{}'::jsonb,
submitted_at = NULL,
accepted_at = NULL,
updated_at = $1
WHERE id = ANY($2::bigint[])`,
[input.now, cancelledShareIds],
)
if (input.action === 'return_to_hall') {
await client.query(
`UPDATE work_orders
SET status = 'open', submitted_at = NULL, published_at = COALESCE(published_at, $1),
SET status = 'open',
${CLEAR_DELIVERY_RESIDUE_SQL},
${RESET_GIFT_FLOW_SQL},
published_at = COALESCE(published_at, $1),
hall_queued_at = $1, updated_at = $1
WHERE id = $2`,
[input.now, input.workOrderId],
@@ -979,7 +993,9 @@ export async function cancelWorkOrderSharing(input: {
await client.query(
`UPDATE work_orders
SET status = 'cancelled', assigned_worker_id = NULL, assigned_at = NULL, deadline_at = NULL,
submitted_at = NULL, published_at = NULL, pinned_at = NULL, updated_at = $1
${CLEAR_DELIVERY_RESIDUE_SQL},
${RESET_GIFT_FLOW_SQL},
published_at = NULL, pinned_at = NULL, updated_at = $1
WHERE id = $2`,
[input.now, input.workOrderId],
)
@@ -9,6 +9,7 @@ import {
getWorkerWalletWithClient,
resolveWorkOrderShareCancellationStatus,
} from './shared.js'
import { CLEAR_DELIVERY_RESIDUE_SQL, RESET_GIFT_FLOW_SQL } from './work-order-gift-repo.js'
import { createWorkOrderEventWithClient } from './work-order-event-repo.js'
import {
getOutstandingDepositAmountWithClient,
@@ -531,13 +532,24 @@ export async function reviewWorkerCancelRequest(input: {
)
}
await client.query(
`UPDATE work_order_shares SET status = 'cancelled', updated_at = $1 WHERE id = $2`,
`UPDATE work_order_shares
SET status = 'cancelled',
acceptance_json = '{}'::jsonb,
draft_acceptance_json = '{}'::jsonb,
submitted_at = NULL,
accepted_at = NULL,
updated_at = $1
WHERE id = $2`,
[input.now, share.id],
)
await client.query(
`UPDATE work_orders
SET status = 'open', submitted_at = NULL, published_at = COALESCE(published_at, $1),
hall_queued_at = COALESCE(hall_queued_at, $1), updated_at = $1
SET status = 'open',
${CLEAR_DELIVERY_RESIDUE_SQL},
${RESET_GIFT_FLOW_SQL},
published_at = COALESCE(published_at, $1),
hall_queued_at = COALESCE(hall_queued_at, $1),
updated_at = $1
WHERE id = $2`,
[input.now, workOrder.id],
)
@@ -565,18 +577,20 @@ export async function reviewWorkerCancelRequest(input: {
),
Number(wallet?.frozen_deposit_amount || 0),
)
await client.query(
`UPDATE work_orders
SET status = 'open', assigned_worker_id = NULL, assigned_at = NULL, deadline_at = NULL,
published_at = $1, hall_queued_at = $1, updated_at = $1
WHERE id = $2`,
[input.now, workOrder.id],
)
// 打手退单申请通过:工单回到大厅,被本工单占用的寄卖现货同时放回在库池。
// 先按当前 friend_added_at 解绑现货,再清交付痕迹。清空之后再解绑会丢掉「已加好友」判断。
await releaseConsignmentInventoryBindingForWorkOrderWithClient(client, workOrder.id, {
now: input.now,
reason: '打手退单申请通过',
})
await client.query(
`UPDATE work_orders
SET status = 'open', assigned_worker_id = NULL, assigned_at = NULL, deadline_at = NULL,
${CLEAR_DELIVERY_RESIDUE_SQL},
${RESET_GIFT_FLOW_SQL},
published_at = $1, hall_queued_at = $1, updated_at = $1
WHERE id = $2`,
[input.now, workOrder.id],
)
if (releasedDepositAmount > 0) {
const nextAvailable =
Number(wallet?.available_amount || 0) + (forfeitGiftDeposit ? 0 : releasedDepositAmount)