yanhui 0e0fcbb378 fix: MKH-BOM 日销兜底增加出库校验,标了「已发货」但无实际出库的单不计销量
业务口径:标了「已发货」但没有实际出库的 SKU,不需要出现缺货预警。
即在 ⑦-a 的金额/标签判据之上,再以出库表为准判定「有没有真出货」。

已发货分支计入销量需同时满足(待发货分支不变):
  1. 非样品/测试店铺(⑦-a)
  2. 非异常单:pay_amount <= 0.01 或 labels 含「特殊单」(⑦-a)
  3. 出库表能查到该 o_id:rpt.jst_salesOutboundInfo / rpt.jst_qmcust_salesoutbound

两个必须豁免的情形(否则会大面积误杀真实单):
  · 拆分单(status='Split'):出库记录挂在子单上,父单必然查不到。
    实测窗口内 40 张 Split 单 100% 无出库记录;不豁免会误杀
    「京东-HX旗舰店104 09-19 实付 1194.14 元」这类真实单
  · 今天发货的单:当天出库尚未同步完(09-19 全天出库表仅 1 行,09-18 有 14,690 行)。
    豁免只到「昨天」为止——09-18 的 18 张无出库 Sent 单 100% 是特殊单,
    且出库表 09-18 数据完整,豁免 09-18 会放过刷单
  豁免只免「出库校验」,金额/标签判据照样生效。

真实数据验收(近 15 天窗口,1,086 张已发货 MKH 单):
  · 出库表命中 889 张 → 197 张无出库 = 40 张拆分单 + 157 张 Sent
  · 157 张里 131 张是 ≤0.01 元或「特殊单」(即 ⑦-a 已排除的刷单),
    唯一 1 张正常金额的是 09-05 的 388 元单(标签「发货后取消/发货后售后/风控订单」)
  · 兜底生效 SKU = 12 个(与只按金额/标签判据一致),兜底日销最大值 = 0.2
  · 10 个异常单 SKU 在预警列表中零出现;总预警 27 条(缺货 21 + 仅预警 6)

性能:1086 个订单号分 2 块并行 UNION 查询,冷缓存约 0.4~1.4s;
      整窗口拉全量 DISTINCT o_id 实测要 8s,故不采用。

降级策略:出库数据取不到时整体跳过出库校验(退化成只按金额/标签判据)并标 degraded。
漏杀只是多报一条预警,错杀会让真实缺货彻底隐身。

注意:jst_salesOutboundInfo.qty 全表 1,119,606 行恒为 0,只能判「有没有出库行」,
不能用 SUM(qty)(永远得 0)。

验证:check-syntax 151 文件通过;node --test 338/339(唯一失败是既有的
resilientSecretStore Windows 权限断言,与本改动无关);mkhBomService.test.js 45/45。
2026-09-19 17:53:16 +08:00
..