feat(consignment): 规格口径定案——互通通配 + 后台全量/发布端按物品展示

业务定案:
- 操作后台全量:系统 苹果/安卓/通用,区服 微信区/QQ区/互通;提报审核与
  库存编辑的系统/区服从自由文本改为受控下拉(单一来源 utils/consignment-spec.ts)
- 打手端发布按物品类型展示:苏尔南系统二选一(必须区分端),区服唯一
  「互通」选项且默认选中;后续其他品类在共享常量按品类加条目
- 匹配引擎通配符对称化:区服通配=互通(通用/全区/不限归一化为别名),
  系统通配=通用(双端/全端同理);订单侧写通配同样放行,只增不减匹配面;
  差异描述不把通配对当冲突
- 提报白名单校验(API 层):系统只收 苹果/安卓,区服只收 微信/QQ/互通,
  旧页面缓存或直调接口绕不过
- 物品名拼接:区服为互通时不拼入(对买家无信息量),前后端同口径

后端 481(+互通双向匹配/通配不算差异/真冲突仍排除/白名单校验)、
前端 54(+选项口径/表单引用/默认值)测试全绿;typecheck/lint/format/check:sql 通过
docs/寄卖系统优化方案.md 记录批次 W
This commit is contained in:
yml2213
2026-09-17 13:01:59 +08:00
parent b666a9c951
commit f8101c1730
10 changed files with 265 additions and 21 deletions
+23
View File
@@ -21,6 +21,7 @@
| `632dddc4` | 上一轮:H5 渠道整体下线 + 凭据字段修复 + 状态机封闭(撤销守卫 / 库存绑定唯一性 / 生命周期解绑)+ 押金归属取台账 | 迁移 `079`、`consignment-*` 五个文件、`work-order-*` 三个仓库、两个前端面板 |
| `5d11bf20` | 批次 C+D:指派部分成功补偿、凭证核销如实反馈、空规格不放行 + 履约/指派服务端规格复检 | `consignment-fulfillment-service.ts`、`consignment-matching-service.ts`、`consignment-repo.ts`、履约路由、`WorkOrdersPanel.tsx` |
| `d6f6219f` | 批次 F1:内部现货履约停在「待加好友」,客服确认后才进赠送冷却 + 备注快捷项 | `work-order-gift-repo.ts`、履约服务、`WorkOrdersPanel.tsx`、`utils/gift-phase.ts` |
| 本批提交(批次 W,同一提交内含本文档,故不写自身 hash) | 批次 W:规格口径定案——后台全量(系统 苹果/安卓/通用,区服 微信/QQ/互通),打手端按物品展示(苏尔南:系统二选一、区服唯一「互通」默认选中);「互通」为区服通配值,匹配引擎通配符对称化 | `utils/consignment-spec.ts`、`WorkerConsignmentPage.tsx`、两个面板、`consignment-matching-service.ts`、`consignment-worker-service.ts` |
| 本批提交(批次 V,同一提交内含本文档,故不写自身 hash) | 批次 V:复核遗留——拼单份额验收收官补寄卖钩子(押金释放+供货货款)、手动匹配弹窗 409 刷新/关键字透传/无打手禁指派、核销反馈抽共享出口 | `work-order-settlement-repo.ts`、`ConsignmentManualMatchModal.tsx`、`utils/voucher-consume.ts` |
| 本批提交(批次 U,同一提交内含本文档,故不写自身 hash) | 批次 U:复核修复——占库 allocation_status 撞 080 CHECK(真实库必 500)、指派非供货卖家时货款双付、手动匹配入口按 fulfill 权限门控 | `consignment-repo.ts`、`consignment-fulfillment-service.ts`、两个面板、三个测试文件 |
| 本批提交(批次 S,同一提交内含本文档,故不写自身 hash) | 批次 S:手动指定现货匹配(判定/差异/强制留痕 + 双向入口 + 共享弹窗) | `consignment-matching-service.ts`、`consignment-fulfillment-service.ts`、`ConsignmentManualMatchModal.tsx` |
@@ -290,6 +291,28 @@
规格冲突 → 409 `consignment_spec_mismatch`;非 exact 且未显式传 `allowPartial` → 409 `consignment_spec_partial_requires_confirm`。
前端在"部分匹配"候选上先 `modal.confirm` 危险确认,再带 `allowPartial: true` 重试,高配充低配的合法玩法保留但不可误触。
3. ⏳ 匹配下推 SQL + 批量匹配接口 + 工单列表角标(P2-8)未做:当前仍是"取全量在库 → 内存比对"。
### 批次 W · 规格口径:互通通配 + 后台全量/发布端分物品展示(本轮)
**业务定案**:
1. **操作后台全量选项**:系统 苹果/安卓/通用;区服 微信区/QQ区/互通。提报审核与库存编辑
的系统/区服从自由文本 Input 改为受控下拉(单一来源 `utils/consignment-spec.ts`)。
2. **打手端发布按物品类型展示**:苏尔南 = 系统只有 苹果/安卓(必须区分端,不给「通用」),
区服**只展示「互通」一个选项且默认选中**(互通 = QQ/微信都能收)。后续其他品类规则不同
(有的不分端),在共享常量里按品类加条目即可。
3. **匹配引擎通配符对称化**:`compareSpec` 支持按字段传通配值集合——区服通配 =「互通」
(订单文案里的「通用/全区/不限」归一化成通配别名),系统通配 =「通用」(「双端/全端」同理)。
以前只认**库存侧**是通用件;现在订单侧写通配值(买家不限)同样放行,只增不减匹配面。
`describeConsignmentSpecDifferences` 同口径:通配对不算差异,不再吓唬客服。
4. **提报白名单校验(API 层)**:系统只收 苹果/安卓(400 `consignment_system_invalid`),
区服只收 微信区/QQ区/互通(400 `consignment_server_zone_invalid`)——旧页面缓存/直调接口绕不过。
5. **物品名拼接**:区服为「互通」时不拼进默认物品名("安卓互通暗潮…"对买家无信息量),
前端自动拼名与后端默认拼名同口径。
**验证**:后端 481 测试(互通双向匹配/通配不算差异/真冲突仍排除/白名单校验均有用例)、
前端 54 测试(选项口径/表单引用/默认值静态钉住)全绿;两侧 `typecheck` / `lint:check` /
`format:check` / `check:sql` 通过。
### 批次 V · 复核遗留:份额验收钩子 + 手动匹配弹窗三处(本轮)
1. ✅ **拼单份额全部验收(母单转已验收)补寄卖钩子**:`acceptWorkOrderShareAndSettle` 里最后一个份额把母单转 `accepted` 的分支,此前既不释放发布押金也不结算供货货款(两个钩子只在统一验收里)。现在与 `acceptWorkOrderAndSettle` 同口径:有 `material.consignment.sourceSubmissionId` 就释放发布押金;供货货款固定传 `assignedWorkerId: 0`(拼单母单没有单一接单人,份额打手已各自按 share_reward 结算,不会重复)。