|
@@ -64,11 +64,11 @@
|
|
|
|
|
|
|
|
- 推导规则(后端统一):
|
|
- 推导规则(后端统一):
|
|
|
1. `productType == "virtual"` → 虚拟商品(**不进入手动发货流程,见 3.3**)
|
|
1. `productType == "virtual"` → 虚拟商品(**不进入手动发货流程,见 3.3**)
|
|
|
- 2. `deliveryMethod == 1` 或 `deliveryMethod == 3`(用户选了快递)→ 快递
|
|
|
|
|
|
|
+ 2. `deliveryMethod == 1` → 快递
|
|
|
3. `deliveryMethod == 2` → 自提
|
|
3. `deliveryMethod == 2` → 自提
|
|
|
4. `deliveryMethod == 6`(同城配送,新增)→ 同城配送
|
|
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 四种方式的行为矩阵
|
|
### 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 条件。
|
|
`syncShippingInfoToWechat` 改造:参数加入 shipType;不再「无条件跳过自提」;仅保留买家 openid 缺失、test-mode/开关/mch-id 缺失等 fail-open 条件。
|
|
|
|
|
|