feat: MKH-BOM 补货预警(订单驱动 + 配件不足)与日销口径改近 15 天 #16

Merged
yanhui merged 12 commits from codex/mkh-alert-export-0917 into main 2026-09-18 17:56:13 +08:00
2 changed files with 24 additions and 19 deletions
Showing only changes of commit 0bb7c5905d - Show all commits

View File

@ -50,13 +50,18 @@ const WARNING_LEVEL = Object.freeze({
NORMAL: '正常',
});
// 模块化配置状态(2026-09-17 业务确认口径):
// 「已配置MKH」= 该 SKU 作为配件被某个 MKH 模块化成品引用
// (业务库 jst_comboProductItem 中 src_sku_id = 该 SKU
// 且 combine_sku_id 以 'MKH' 开头,即 MKH 组合装 / 成品档案)
// 「未配置MKH」= 未被任何 MKH 模块化成品引用
// 实测目标仓 794 个 SKU 中 29 个命中(32 个被任意组合装引用,其中 29 个属 MKH 体系)。
// ⚠️ 之前的「产品资料系统数据库商品档案」口径(661/794)已废弃,改用组合装引用口径。
// 模块化配置状态(2026-09-17 业务确认口径,2026-09-17 晚修正):
// 「已配置MKH」= 该 SKU 作为「配件商品编码」出现在聚水潭 SKU 级 BOM 维护中,
// 被某个 MKH 模块化成品引用:
// 业务库 rpt.jst_skuBomItem 中 map_outer_sku_id = 该 SKU
// 且父项 sku_id 以 'MKH' 开头(即 MKH 成品档案,如 MKHSJZ0033260600001)。
// 「未配置MKH」= 未出现在任何 MKH 成品的 BOM 配件清单中。
// 实测目标仓 794 个 SKU 中 **699** 个命中(按 map_outer_sku_id 匹配、父项 MKH 过滤)。
// ⚠️ 历史口径均已废弃:
// · 早期「产品资料系统数据库商品档案」口径(661/794)—— 覆盖面过宽、与 BOM 无关;
// · 上一版「jst_comboProductItem 组合装引用」口径(29/794)—— 仅命中 MKH- 组合装,
// 漏掉了真正以 MKH 成品为父项的 BOM 配件,数量明显偏低。
// ✅ 当前采用 rpt.jst_skuBomItem(聚水潭 SKU BOM 明细,含配件商品编码 map_outer_sku_id)。
const MKH_STATUS = Object.freeze({
CONFIGURED: '已配置MKH',
UNCONFIGURED: '未配置MKH',
@ -76,15 +81,15 @@ const SORTABLE_FIELDS = Object.freeze({
});
/**
* 「已配置MKH」判定表达式(2026-09-17 口径):
* 该 SKU 作为配件被某个 MKH 模块化成品引用,即业务库 jst_comboProductItem 中
* src_sku_id = 该 SKU 且 combine_sku_id 以 'MKH' 开头(MKH 组合装 / 成品档案)。
* 「已配置MKH」判定表达式(2026-09-17 晚修正口径):
* 该 SKU 作为「配件商品编码」(map_outer_sku_id)出现在聚水潭 SKU 级 BOM 维护
* rpt.jst_skuBomItem 中,且父项 sku_id 以 'MKH' 开头(即被某个 MKH 模块化成品引用)。
*/
const buildConfiguredExistsSql = () => (
`EXISTS (
SELECT 1 FROM dbo.jst_comboProductItem x
WHERE x.src_sku_id = s.sku_id
AND x.combine_sku_id LIKE N'MKH%'
SELECT 1 FROM rpt.jst_skuBomItem x
WHERE x.map_outer_sku_id = s.sku_id
AND x.sku_id LIKE N'MKH%'
)`
);
@ -268,10 +273,10 @@ async function attachProductImages(rows = []) {
}
/**
* 「已配置MKH」判定说明(2026-09-17):
* 直接由 buildBaseSql 的 cfg 子查询判定(jst_comboProductItem.src_sku_id
* 命中且 combine_sku_id 以 'MKH' 开头),不再依赖产品资料系统数据库。
* 产品资料库仅用于补齐商品图片(见 attachProductImages)。
* 「已配置MKH」判定说明(2026-09-17 晚修正):
* 直接由 buildBaseSql 的 cfg 子查询判定,数据源为聚水潭 SKU 级 BOM 维护
* rpt.jst_skuBomItem(map_outer_sku_id = 该 SKU 且父项 sku_id 以 'MKH' 开头),
* 不再依赖产品资料系统数据库。产品资料库仅用于补齐商品图片(见 attachProductImages)。
*/
const mapRow = (row = {}) => {

View File

@ -157,7 +157,7 @@ const AccessoryStockPanel = () => {
{
title: <TipTitle
title="状态"
tip="该商品是否被 MKH 模块化成品作为配件引用。已配置MKH = 业务库 jst_comboProductItem 中 src_sku_id 命中该商品编码且 combine_sku_id 以 MKH 开头(被某 MKH 组合装/成品引用为配件);未配置MKH = 未被任何 MKH 模块化成品引用"
tip="该商品(配件)是否作为「配件商品编码」出现在聚水潭 SKU 级 BOM 维护中、被某 MKH 模块化成品引用。已配置MKH = 业务库 rpt.jst_skuBomItem 中 map_outer_sku_id 命中该商品编码、且父项 sku_id 以 MKH 开头(被某 MKH 成品 BOM 引用为配件);未配置MKH = 未出现在任何 MKH 成品 BOM 的配件清单中"
/>,
dataIndex: 'mkhStatus',
width: 110,
@ -411,7 +411,7 @@ const ModularStockMonitor = () => (
图片取自「产品资料系统数据库」商品档案(业务库图片字段均为空)。
注:日均发货量 2026-09-17 起由近 7 天改为近 15 天(业务原要求 30 天,但业务库无 30 天日销,最长只到 15 天);
库存可用天数仍沿用监控表 jsUseDays(源系统口径),故两者并非同一时间窗。
状态列:基于「产品资料系统数据库」判断该 SKU 是否已建立商品档案——已配置MKH = 资料库中可查到该 SKU;未配置MKH = 查不到。
状态列:基于聚水潭 SKU 级 BOM 维护(rpt.jst_skuBomItem)判断该商品是否作为「配件商品编码」被某 MKH 成品 BOM 引用——已配置MKH = 出现在某 MKH 成品的 BOM 配件清单中;未配置MKH = 未出现。
</Text>
</div>
</header>