feat(consignment): 确认加好友后现货作废不回池,撤销履约押金可选并结算打手押金

现货口径(严):已确认加好友 = 买家好友已加上、货随时可能送出去,回池会被下一个工单
再次占用(等于二次出货)。收口在 releaseConsignmentInventoryBindingForWorkOrderWithClient:
解绑前读工单 acceptance_mode/friend_added_at,命中则 archived + allow_matching=FALSE + 留痕,
否则仍回池。所有解绑路径自动继承,发单系统接口未动。

撤销寄售履约(寄卖专属入口)支持两笔押金各自可选,默认按规则自动:
- 打手履约押金:auto / refund / forfeit
- 卖家发布押金:auto / keep_frozen / forfeit
策略抽成 domain/consignment-deposit-policy.ts 纯函数;覆盖时原因照旧必填,选项与金额写进
工单事件便于对账。

顺带修掉两个 bug:
1. 撤销寄售履约从不结算打手履约押金——只清 assigned_worker_id、只处理卖家押金,
   worker_deposit 单撤销后打手押金永久冻结。现按选项结算(退还/没收)。
2. detachConsignmentMaterialFromWorkOrderWithClient 里 $1 既作 $1::text(detachedAt)
   又赋值给 updated_at,Postgres 整体推断成 text → 42804。凡解绑现货摘寄售标记的路径
   (取消指派/撤单/退单/售后/撤销履约/人工回库)在真实库上必然 500,假 client 单测抓不到。
   已显式 ::timestamptz,并补类级静态护栏扫同类写法。

验证:真实库(全回滚)——已确认加好友解绑 → archived/allow_matching=false;
未确认 → 仍 in_stock;打手押金冻结 3000 → 退还 3000(重复结算 0)→ 再冻 2500 → 没收 2500
(可用余额不变、冻结归零、流水 deposit_deduction)。后端 432 例(新增 5 例)全绿。
This commit is contained in:
yml2213
2026-09-17 10:21:38 +08:00
parent a47c243421
commit d158cc91bc
12 changed files with 577 additions and 29 deletions
@@ -20,6 +20,10 @@ import {
revokeWorkOrderConsignmentFulfillment,
} from '../../../services/worker-platform/consignment-fulfillment-service.js'
import { createJsonHandler, requireAdminPermission } from '../session.js'
import {
normalizeConsignmentDepositHandling,
normalizeWorkerDepositHandling,
} from '../../../domain/consignment-deposit-policy.js'
const router = Router()
@@ -251,6 +255,9 @@ router.post(
? 'archive_inventory'
: 'reopen',
reason: String(req.body?.reason || ''),
// 押金处置由运营显式选择,非法值一律归一成"按规则自动"
workerDeposit: normalizeWorkerDepositHandling(req.body?.workerDeposit),
consignmentDeposit: normalizeConsignmentDepositHandling(req.body?.consignmentDeposit),
actorName: req.adminSession?.username || 'admin',
}),
{