Просмотр исходного кода

docs(spec): 后台多渠道发货设计(自提/快递/虚拟/同城配送)——待审查

- 对齐微信小程序后台四种发货方式:logistics_type 1快递/2同城/3虚拟/4自提
- 虚拟商品支付成功自动发货(autoShipVirtualOrder + 支付回调挂接,幂等 fail-open)
- 自提不再跳过微信同步(logistics_type=4)
- deliveryMethod 增加编码 6=同城配送(含 schema COMMENT 迁移)
- 发现并修正 upload_shipping_info URL 缺 /wxa 前缀问题(08c4c0662 引入)
- cfc-web 发货对话框按类型切换;Controller 新增 shipType/receiverContact
Sisyphus Agent 3 недель назад
Родитель
Сommit
45e6563597

+ 2 - 0
docs/superpowers/PROJECT-OVERVIEW.md

@@ -8,6 +8,7 @@
 **健康方案删除(✅ 全栈完成:后端级联删除接口含每日实例二次删除 + 小程序/管理端删除按钮 + 确认弹窗;见 `specs/2026-10-17-health-plan-deletion-design.md` 与 `plans/2026-10-17-health-plan-deletion.md`)**
 **菌群知识并入 dan_knowledge_base(🔄 实施中:809 篇文章以 source_type='article' 并入统一知识表 + 后端 sourceType/excludeSourceType 过滤 + langgraph 三源重建 + 管理端统一展示,见 `specs/2026-10-20-knowledge-unify-design.md` 与 `plans/2026-10-20-knowledge-unify.md`)**
 **限时特价(扫码闪购)(✅ 全栈完成:迁移389/390 → SpecialPriceService 7 方法 + 双控制器(公开 info 白名单 + admin 6 接口)→ 特价下单 createSpecialDealOrder + cancel/approveRefund/OrderTimeoutCancelTask 三处 releaseQuota 回滚 + 供应商改价拒绝 + 小程序商品页 sp 解析/倒计时/特价区块/checkout 透传 + cfc-web SpecialPriceManage.vue;5 个测试类 31 case 全过;见 `specs/2026-10-20-limited-time-special-price-design.md` 与 `plans/2026-10-20-limited-time-special-price.md`)**
+**后台多渠道发货(🟡 设计稿待审查:管理端发货对齐微信小程序后台四种方式——快递 logistics_type=1 / 同城配送 2(deliveryMethod 新增编码 6)/ 用户自提 4(不再跳过微信同步)/ 虚拟商品 3(支付成功自动发货 autoShipVirtualOrder,幂等 fail-open);另修正 upload_shipping_info URL 缺 /wxa 前缀;cfc-web 发货对话框按类型切换;见 `specs/2026-10-22-fulfillment-multi-mode-design.md`)**
 **维护:** 所有需求变更需更新本文档
 
 ---
@@ -339,6 +340,7 @@
 | `2026-07-05-supply-distribution-system-design.md` | 🟡 待实施 | 供应商销售体系 |
 | `2026-06-20-dimension-knowledge-base-design.md` | ✅ 已实施(KnowledgeBaseController + LanggraphSyncService) | 维度知识库平台 |
 | `2026-10-20-knowledge-unify-design.md` | 🔄 实施中(809 篇菌群文章并入 dan_knowledge_base) | 知识库统一 |
+| `2026-10-22-fulfillment-multi-mode-design.md` | 🟡 设计稿待审查(发货四方式:快递/同城配送/用户自提对齐微信 upload_shipping_info logistics_type=1/2/4,虚拟商品支付成功自动发货 logistics_type=3;deliveryMethod 新增 6=同城配送;URL 修正 /wxa 前缀) | 后台多渠道发货 |
 | `2026-06-20-web-permission-system-design.md` | 🔄 已暂停(未实现,待重新规划) | Web权限系统 |
 | `2026-06-26-health-dimensions-design-spec.md` | 🟡 设计稿 | 身体健康7维模型 |
 | `2026-06-22-growth-record-rebuild-design.md` | ✅ 后端已实现(HealthGrowthRecord + HealthGrowthRecordController + HealthGrowthRecordService) | 成长档案重建 |

+ 7 - 9
docs/superpowers/specs/2026-10-22-fulfillment-multi-mode-design.md

@@ -64,11 +64,11 @@
 
 - 推导规则(后端统一):
   1. `productType == "virtual"` → 虚拟商品(**不进入手动发货流程,见 3.3**)
-  2. `deliveryMethod == 1` 或 `deliveryMethod == 3`(用户选了快递)→ 快递
+  2. `deliveryMethod == 1` → 快递
   3. `deliveryMethod == 2` → 自提
   4. `deliveryMethod == 6`(同城配送,新增)→ 同城配送
-  5. `deliveryMethod == 3`(两者皆可且后台无法判定)/4/5 → 返回明确业务错误,要求前端显式传 `shipType`
-- Controller 层新增可选参数 `shipType`(express/local/virtual/selfPickup/null),非空时显式覆盖推导。虚拟商品也允许商家后台「补发货」(兜底幂等)。
+  5. `deliveryMethod == 3 / 4 / 5` 或 NULL → 订单层面无法判定(正常链路里 3 已被 `validateFulfill` 转成用户选的 1/2,出现 3 属老数据;4/5 是线上服务履约)→ 返回明确业务错误,要求前端显式传 `shipType`(仅限 express/selfPickup)
+- Controller 层新增可选参数 `shipType`(express/local/virtual/selfPickup/null),非空时显式覆盖推导。虚拟商品也允许商家后台「补发货」(兜底幂等,见 3.3)。
 
 ### 3.2 四种方式的行为矩阵
 
@@ -150,12 +150,10 @@ public Result<String> ship(String orderNo, String shipType,
 ```
 
 行为:
-1. 订单不存在 / 非 `paid`(虚拟补发货直接按 3.3 幂等放行:非 paid 且非 virtual 拒绝)→ 明确错误
-2. `resolveShipType` 推导/校验
-3. 校验入参(3.2 表)
-4. 按类型落库 + 状态流转(excp 更新 `fulfill_status`:虚拟直接 completed;其余 `confirmed_by_vendor`)
-5. `syncShippingInfoToWechat(order, shipType, trackingNo, company, receiverContact)` — 按 shipType 取 logisticsType
-6. 返回 `Result.success(...)`
+1. 订单状态 `completed` 且 `productType == "virtual"` → 补发货调用 `autoShipVirtualOrder`(幂等直接返回提示)【3.3】
+2. 订单不存在 / 状态非 `paid` 且非 `virtual` 已终态 → 明确错误
+3. 订单状态 `paid` 且 `productType == "virtual"` → 按幂等流程(状态补完 + upload_shipping_info logistics_type=3)【3.3】
+4. 其余 `paid` 订单:`resolveShipType` 推导/校验 + 入参校验(3.2 矩阵:快递/同城必填单号公司,自提拒收单号)→ 按类型落库状态流转(`fulfill_status`:虚拟 completed;其余 `confirmed_by_vendor`)→ `syncShippingInfoToWechat(order, shipType, trackingNo, company, receiverContact)` 取对应 logisticsType → `Result.success(...)`
 
 `syncShippingInfoToWechat` 改造:参数加入 shipType;不再「无条件跳过自提」;仅保留买家 openid 缺失、test-mode/开关/mch-id 缺失等 fail-open 条件。