forked from lunanting/cangku
业务 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%),异常率理论上有微幅上升, 但剔掉的本来就是「必然异常」的假单,整体更准。 - 与现场拦截的口径现在明确分家:**现场拦截留分母,转仓代发不留**。