yanhui
dff2422b34
fix: MKH-BOM 日销兜底排除 0.01 元特殊单,修复「没发过货却有日销」
背景
- 业务反馈 MKHDNZ0410260700005 从没发过货,页面却显示日销 0.6 并报缺货。
- 根因是上一版日销兜底(⑦-a)只看 send_date,把「0.01 元特殊单」当成了真实销售:
· 拼多多-亿家达书房家具官方旗舰店在 2026-09-18 10:35–10:36 **一分钟内**批量生成
18 张 MKH 订单,实付合计仅 0.18 元、免额合计 16,344 元(单张:实付 0.01 元、
商品额 908.01、免额 908 全额免),备注统一为 SSDD,标签含「特殊单」「转x00005」;
同批还有 18 张商品码为占位码 1.X00005 的 0.01 元订单。
· 这批单 status=Sent、有物流单号,但 **rpt.jst_salesOutboundInfo 里查不到对应出库记录**
(同店同时段其他订单有 6,467 行出库)—— 即系统标了「已发货」,货并没有真出。
· 后果:把 10 个 SKU 的日销从 0 抬到 0.6~1.8(共 162 件),凭空产出缺货预警。
改动
- loadOrderIndex 的**已发货分支**增加异常单过滤:命中任一即不计入日销
· pay_amount <= 0.01(0.01 元全免单)
· labels 含「特殊单」
- 查询补充取出 o.pay_amount / o.labels(两张订单表均有这两列,已确认)。
- 金额取不到(null / 空串 / 非数字)时**不排除** —— 宁可少排也别误杀,取不到就退化成旧口径。
- ⚠️ **不使用 free_amount > 0 作为判据**:正常订单普遍带折扣免额(窗口内实测 569/1086 行
free_amount > 0),按它筛会把实付 356 / 458 / 1338 元的正常单一并误杀(第一版即踩此坑)。
- 本次只作用于「已发货」分支,待发货(⑩)口径未改动。
验证
- 语法检查:151 文件通过。
- 后端测试:338 项 337 通过。唯一失败为 resilientSecretStore 权限断言(期望 0o600、
Windows 实际 0o666),平台固有,与本改动无关。mkhBomService 单测 44/44。
- 新增回归断言:实付 0.01 / 0 元及字符串金额判为异常单;标签含「特殊单」判为异常单;
**有免额的正常单不得被排除**;金额缺省/为 null/非数字时不排除。
- 订单索引用例补充:0.01 元单与「特殊单」标签行不进入 shippedBySku,而带折扣免额的
正常单照常计入(shippedBySku.size 由 1 调整为 2)。
- 真实数据端到端(业务库实时,窗口 15 天):
· 应排除的 10 个异常单 SKU(MKHDNZ0410260700001/0002/0004/0005/0007/0008/0009/
0010/0011/0012)**全部已排除**;
· 应保留的 12 个真实单 SKU **全部保留**(含本问题之外的 MKHDNZ0409260601548 等);
· 兜底生效 SKU 由 **22 → 12**;兜底日销最大值由 **1.8000 → 0.2000**
(0.2 来自 MKHDNZ0409260700483 的 3 件真实发货,属正常)。
风险与回退
- 只影响「快照日销 ≤ 0 且近 15 天有发货」的商品;快照 > 0 的商品行为完全不变。
- 实付 ≤ 0.01 元的订单在任何业务口径下都不构成正常销售,排除不会误伤真实需求。
- 回退:本提交可整体 revert,无表结构变更、无数据迁移。
- 遗留(未在本次改动内):待发货(⑩)分支同样可能被 0.01 元单驱动,
是否一并排除需业务确认;「售后 / 补发」类订单是否计入亦有待定夺。
2026-09-19 14:49:39 +08:00
..
2026-09-12 11:51:44 +08:00
2026-09-12 11:51:44 +08:00
2026-09-12 11:51:44 +08:00
2026-09-12 11:51:44 +08:00
2026-09-12 11:51:44 +08:00
2026-09-12 11:51:44 +08:00
2026-09-12 11:51:44 +08:00
2026-09-12 11:51:44 +08:00
2026-09-12 11:51:44 +08:00
2026-09-12 11:51:44 +08:00
2026-09-15 16:53:12 +08:00
2026-09-12 11:51:44 +08:00
2026-09-12 17:50:26 +08:00
2026-09-12 11:56:50 +08:00
2026-09-19 14:49:39 +08:00
2026-09-17 14:06:50 +08:00
2026-09-12 11:51:44 +08:00
2026-09-12 11:51:44 +08:00
2026-09-12 11:51:44 +08:00
2026-09-12 11:51:44 +08:00
2026-09-12 11:51:44 +08:00
2026-09-12 11:51:44 +08:00
2026-09-12 11:51:44 +08:00
2026-09-12 11:51:44 +08:00
2026-09-12 11:51:44 +08:00
2026-09-12 11:51:44 +08:00
2026-09-12 11:51:44 +08:00
2026-09-12 16:11:05 +08:00
2026-09-12 11:51:44 +08:00
2026-09-15 16:53:12 +08:00
2026-09-15 16:53:12 +08:00
2026-09-12 11:51:44 +08:00
2026-09-12 11:51:44 +08:00
2026-09-12 11:51:44 +08:00
2026-09-12 11:51:44 +08:00
2026-09-12 11:51:44 +08:00
2026-09-12 11:51:44 +08:00
2026-09-12 11:51:44 +08:00
2026-09-12 11:51:44 +08:00
2026-09-12 11:51:44 +08:00
2026-09-12 11:51:44 +08:00