fix(wle): 转仓代发(转x00005)不再计入原仓发货量 #85

Merged
yanhui merged 1 commits from yanhui-wle-transfer-denominator-20261024 into main 2026-10-24 12:26:44 +08:00
Collaborator

背景

PR #84 上线时,转仓代发(转x00005)按「只摘异常、保留发货分母」处理——和现场拦截同类。
业务 2026-10-24 补充:货不是从记账仓走的,原仓的发货量也不该算。
记在原仓分母里,只会把分母做大、把异常率稀释。

改动

把转仓判定从「异常判定之后」提到发货分母计数之前,改成整单不计:

改前(PR #84) 改后
算异常 ❌ ❌
进原仓发货分母 ✅ ❌
页脚归类 独立一行「另有 N 单属转仓代发」 并入「本批已剔除 N 单(……转仓代发 N 单)」

matchTransferWarehouse() 本身没变(仍是 /转\s*[xX]\s*\d{3,}/,不写死 转x00005),
只挪了判定位置。

三处文案同步

  • 前端页脚:删掉「仍计入发货分母、只是不再报异常」的独立段落;口径句改为
    「转仓代发(标签如「转x00005」,货由目标仓发出)—— 不算本仓异常,也不算本仓发货量」。
  • 钉钉正文:转仓代发并入「已剔除 N 个包裹(承运商 / 已终止 / 刷单·信誉单 / 转仓代发)」。
  • registry 注释:明确写清与现场拦截的区别 —— 现场拦截是本仓发的货(留分母),转仓代发不是。

验证

  • 后端单测 50/50。转仓代发整单不计 用例改为断言
    exceptionPackages=1 / packageCount=1(不是 2)/ shippedOrders=1,
    崔桥仓 shippedOrders=1 / exceptionOrders=1。
  • 全量 npm run check 474 项 / 472 过(2 项既有环境失败:Windows 权限位、负缓存需隧道故障态)。
  • 前端 eslint 0;npm run build 通过(含 router lazy 静态检查)。
  • 真实库(10-23 批):
发货包裹 packageCount  5337 → 5332   (扣掉 5 个转仓包裹)
异常包裹 exceptionPkgs   15 → 15
异常率 exceptionRate    0.3%
转仓剔除 packages=5 orders=5 {"转x00005":5}
崔桥工厂仓 发货单 2824 / 异常 6 / 0.2%

影响面

  • 分母略微变小(本批 -5 个包裹,约 0.09%),异常率理论上有微幅上升,
    但剔掉的本来就是「必然报异常」的假单,整体更准。
  • 与现场拦截的口径现在明确分家:现场拦截留分母,转仓代发不留。
## 背景 PR #84 上线时,转仓代发(`转x00005`)按「只摘异常、保留发货分母」处理——和现场拦截同类。 业务 2026-10-24 补充:**货不是从记账仓走的,原仓的发货量也不该算**。 记在原仓分母里,只会把分母做大、把异常率稀释。 ## 改动 把转仓判定从「异常判定之后」**提到发货分母计数之前**,改成**整单不计**: | | 改前(PR #84) | 改后 | |---|---|---| | 算异常 | ❌ | ❌ | | 进原仓发货分母 | ✅ | **❌** | | 页脚归类 | 独立一行「另有 N 单属转仓代发」 | 并入「本批已剔除 N 单(……转仓代发 N 单)」 | `matchTransferWarehouse()` 本身没变(仍是 `/转\s*[xX]\s*\d{3,}/`,不写死 `转x00005`), 只挪了判定位置。 ### 三处文案同步 - **前端页脚**:删掉「仍计入发货分母、只是不再报异常」的独立段落;口径句改为 「转仓代发(标签如「转x00005」,货由目标仓发出)—— 不算本仓异常,也不算本仓发货量」。 - **钉钉正文**:转仓代发并入「已剔除 N 个包裹(承运商 / 已终止 / 刷单·信誉单 / 转仓代发)」。 - **registry 注释**:明确写清与现场拦截的区别 —— 现场拦截是本仓发的货(留分母),转仓代发不是。 ## 验证 - **后端单测 50/50**。`转仓代发整单不计` 用例改为断言 `exceptionPackages=1` / **`packageCount=1`**(不是 2)/ `shippedOrders=1`, 崔桥仓 `shippedOrders=1 / exceptionOrders=1`。 - 全量 `npm run check` 474 项 / 472 过(2 项既有环境失败:Windows 权限位、负缓存需隧道故障态)。 - 前端 eslint 0;`npm run build` 通过(含 router lazy 静态检查)。 - **真实库(10-23 批)**: ``` 发货包裹 packageCount 5337 → 5332 (扣掉 5 个转仓包裹) 异常包裹 exceptionPkgs 15 → 15 异常率 exceptionRate 0.3% 转仓剔除 packages=5 orders=5 {"转x00005":5} 崔桥工厂仓 发货单 2824 / 异常 6 / 0.2% ``` ## 影响面 - 分母略微变小(本批 -5 个包裹,约 0.09%),异常率理论上有微幅上升, 但剔掉的本来就是「必然报异常」的假单,整体更准。 - 与现场拦截的口径现在明确分家:**现场拦截留分母,转仓代发不留**。
yanhui added 1 commit 2026-10-24 12:26:06 +08:00
业务 2026-10-24 补充口径:转仓单的货不是从记账仓(原仓)走的,
原仓的发货量也不该算 —— 记在原仓分母里只会把分母做大、把异常率稀释。

## 改了什么

原先 PR #84 把转仓代发当「只摘异常、保留分母」(与现场拦截同类)。
这次把判定从「异常判定之后」**提到发货分母计数之前**,改成**整单不计**:

| | 改前(PR #84) | 改后 |
|---|---|---|
| 算异常 | ❌ | ❌ |
| 进原仓发货分母 | ✅ | ❌ |
| 归类 | 独立一行「另有 N 单」 | 并入「本批已剔除 N 单」 |

判定逻辑只挪了位置,`matchTransferWarehouse()` 本身没变
(`/转\s*[xX]\s*\d{3,}/`,仍不写死 `转x00005`)。

## 三处文案同步

- 前端页脚:删掉原来「仍计入发货分母、只是不再报异常」的独立段落,
  改为并入「本批已剔除 N 单(……转仓代发 N 单)」,口径句也改成
  「不算本仓异常,也不算本仓发货量」。
- 钉钉正文:转仓代发并入「已剔除 N 个包裹(承运商 / 已终止 / 刷单·信誉单 / 转仓代发)」,
  删掉「另有 N 个包裹属转仓代发」那一行。
- registry 注释同步更新,明确写清**与现场拦截的区别**:
  现场拦截是本仓发的货(留分母),转仓代发不是(不留分母)。

## 验证

- 后端单测 50/50。`转仓代发整单不计` 用例改为断言:
  `exceptionPackages=1`、**`packageCount=1`**(不是 2)、`shippedOrders=1`,
  崔桥仓 `shippedOrders=1 / exceptionOrders=1`。
- 全量 `npm run check` 474 项 / 472 过(2 项为既有环境失败:Windows 权限位、负缓存需隧道故障态)
- 前端 eslint 0;`npm run build` 通过
- **真实库(10-23 批)**:发货包裹 5337 → **5332**(扣掉 5 个转仓包裹),
  异常 15 单不变,异常率 0.3%;转仓剔除 `packages=5 orders=5 {"转x00005":5}`;
  崔桥工厂仓 发货单 2824 / 异常 6 / 0.2%。

## 影响面

- 分母会略微变小(10-23 批 -5 个包裹,约 0.09%),异常率理论上有微幅上升,
  但剔掉的本来就是「必然异常」的假单,整体更准。
- 与现场拦截的口径现在明确分家:**现场拦截留分母,转仓代发不留**。
yanhui merged commit a839d78d56 into main 2026-10-24 12:26:44 +08:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: lunanting/cangku#85
No description provided.