feat(consignment): 支持多数量拆分与份额级赠送,并对齐待抢单看板

- 匹配引擎支持一条库存按剩余数量拆给多张整单/拼单,份额数量、报酬、分配数量按实际占用计算
- 「我的寄卖」改为按占用单/份额一行 + 剩余库存行,卖家按 allocation/share/workOrder 定位确认加好友与提交凭证
- 解绑/撤销/超时按 allocation 精确回补,修复单绑定字段在多占用下被误清的问题
- 拼单好友赠送改为份额级 friend_added_at / gift_available_at(迁移 146),新增后台按份额确认加好友入口与寄卖赠送列
- 待抢单匹配看板改用新引擎:覆盖全部寄卖分类、拼单余量、精确/非精确/冲突明细,去掉手枪品类写死
- 发布押金改为该提报单全部售出/作废后才释放,避免多件库存分多单时提前退款
- 补齐集成测试与单测:拆分、多占用、份额级独立冷却与凭证、看板新旧引擎对齐
This commit is contained in:
2026-11-06 12:23:55 +08:00
parent 3f16b15c5c
commit e0a85359b6
28 changed files with 1758 additions and 125 deletions
@@ -42,7 +42,7 @@ import {
listInventoryMatchableOrders,
listWorkOrderInventoryMatchOptions,
} from '../../../services/worker-platform/consignment-fulfillment-service.js'
import { listPendingPistolMatches } from '../../../services/worker-platform/consignment-pending-match-service.js'
import { listPendingConsignmentMatches } from '../../../services/worker-platform/consignment-pending-match-service.js'
import {
listConsignmentMatchCandidatesForWorkOrder,
matchConsignmentWorkOrderManually,
@@ -366,20 +366,20 @@ router.post(
// ---------------- 匹配与履约 ----------------
// 全局待抢单匹配看板:只看非拼单的待抢单工单 × 在库待匹配现货,只读。
// 全局待抢单匹配看板:按寄卖配置匹配待抢单工单 × 在库待匹配现货,只读。
router.get(
'/worker-platform/consignment/pending-pistol-matches',
requireAdminPermission('consignment.view'),
createJsonHandler(
(req) =>
listPendingPistolMatches({
listPendingConsignmentMatches({
keyword: String(req.query.keyword || ''),
includeConflicts: String(req.query.includeConflicts || '') === 'true',
limit: Number(req.query.limit || 0) || undefined,
}),
{
successMessage: 'ok',
errorMessage: '读取待匹配手枪订单失败',
errorMessage: '读取待匹配订单失败',
scope: '[admin/consignment/pending-pistol-matches]',
},
),
@@ -8,6 +8,7 @@ import {
cancelAdminWorkOrder,
completeAdminWorkOrderGiftCooldown,
confirmAdminWorkOrderFriendAdded,
confirmAdminWorkOrderShareFriendAdded,
createAdminMockWorkOrder,
deleteAdminMockCustomShop,
deleteAdminWorkOrder,
@@ -529,6 +530,30 @@ router.post(
),
)
router.post(
'/worker-platform/orders/:workOrderId/shares/:shareId/confirm-friend',
requireAdminPermission('worker_order.manage_problem'),
createJsonHandler(
(req) =>
confirmAdminWorkOrderShareFriendAdded(
String(req.params.workOrderId || ''),
String(req.params.shareId || ''),
req.adminSession?.displayName || req.adminSession?.username || '',
),
{
successMessage: '已确认该份额加好友,赠送冷却开始',
errorMessage: '确认份额加好友失败',
scope: '[admin/worker-platform/orders/:workOrderId/shares/:shareId/confirm-friend]',
audit: (req, data) => ({
action: 'work_order_share_friend_confirmed',
targetType: 'work_order_share',
targetId: String(req.params.shareId || ''),
data: data && typeof data === 'object' ? (data as Record<string, unknown>) : {},
}),
},
),
)
router.post(
'/worker-platform/orders/:workOrderId/reset-gift-material',
requireAdminPermission('worker_order.manage_problem'),
@@ -147,6 +147,11 @@ router.post(
session.workerId,
String(req.params.submissionId || ''),
session.username || '',
{
workOrderId: req.body?.workOrderId,
shareId: req.body?.shareId,
allocationId: req.body?.allocationId,
},
)
res.json({ ok: true, data: result })
} catch (error) {