forked from lunanting/cangku
## 问题 页面「在途加工单 / 已排产」只显示 9 个,且全是 2026-11-03 的僵尸单; 业务在聚水潭看到的是 18 个,且那 9 个早已加工入库完成。 ## 根因 旧数据源是链接服务器快照表 `LS_JS_DMP(192.168.1.209).JSDataMiddlePlatform.dbo.bi_processing_work_orders`: - 表内**无任何时间列**,实测按加工日期自 2026-11-03 10:49 起 **8 天 0 行** (1,370 行 / MAX(Id)=1370 不再增长,而此前每天都有 5~34 行); - 且**数据陈旧不会报错** —— `workOrderDegraded` 只反映「查询失败」, 停更期间恒为 false,页面完全无告警。 结果:9 行残留「已确认/未入库」把对应成品永久锁成「已排产」压住补货预警, 而 11-04 之后新开的加工单一条都没进库(在途量按 0 算,缺货会被误报)。 ## 改动 数据源改为聚水潭原生加工单三表(业务库本实例,随主库小时级刷新),主键 `po_id` 关联: - `rpt.jst_manufactureInfo` 单头:status / wms_co_id(加工仓) / receipt_wms_co_id(收货仓) - `rpt.jst_manufactureItem` 成品明细:sku_id / qty / io_qty(已入库) / delivery_date - `rpt.jst_manufactureRaw` 原料明细(本次不参与在途核算,配件占用仍走 BOM 单台用量) 口径保持业务确认的语义,只换算字段: - 加工仓:中文名 `加工仓储方` → `wms_co_id = 15718196`(ID 比名称稳定) - 作废:`'作废'` → `'Cancelled'` - 完成:`'全部入库'` → `'Finished'` - 剩余量:`数量 − 已入库数量` → `qty − io_qty` - ETA:`预计加工完成时间` → `delivery_date`(实测 18 单全能解析) - 查询从 `getPool()` 四段名改为 `cloudDatabase.query()`(表名已带 rpt. 前缀,不受 dbo→rpt 重写影响) ## 验证 - 真实库实跑(生产 13333 隧道)SQL 与服务层 `loadPendingWorkOrderIndex()`: 命中 **18 个 SKU / 18 单 / 在途 175 件**,`degraded=false`,ETA 2026-11-24 ~ 11-25; 热态耗时 **0.7~1.5s**(冷启动 5s,结果进 10 分钟缓存)。 - 状态一致性:`Finished` 1,149 单的 1,173 行明细**零剩余**;`Cancelled` 178 单 io_qty 全 0; `Confirmed` 18 单 io_qty 全 0 → 剩余量判据自身即可区分完成,状态只用来剔作废。 - `node --test test/mkhBomService.test.js` **56/56 通过**;全量 505 项 502 通过, 3 项失败均为既有环境问题(secretStore Windows 权限、cloudDatabase 负缓存 TTL、 WST 用例在并发下的时序抖动,单独跑均通过)。 - `check-syntax` 196 文件通过。 ## 风险与回退 - 只换数据源、不动预警优先级与结余口径,接口字段名全部保持不变(`pendingWorkOrderQty/Count/Eta/No`), 前端零改动。 - 回退:单文件还原 `mkhBomService.js` 即可,无数据迁移、无 DDL。