配件库存监控: - 列表「实时库存」后新增「采购在途数量」列,口径 SUM(MAX(0, jst_purchaseItem.qty - inQty)) - 顶部「实时库存合计」后新增可点击「采购在途」卡片,弹窗展示在途明细 (商品编码/商品名称/采购数量/已入库/在途数量/计划到货日期/采购单号),支持关键词、排序、分页 - 新增后端接口 GET /api/modular-stock-monitor/purchase-in-transit - 筛选器品类改直查 jst_sku 主表,避免新增 OUTER APPLY 拖慢筛选 - 采购在途列仅取数展示,不参与 ORDER BY / 聚合(规避 MSSQL 对 OUTER APPLY 列的灾难性执行计划) MKH-BOM 补货预警: - 日销驱动与已排产分支改用「结余库存 = 现有库存 - 待发货件数」判定可用天数与预警等级 - 建议补货量按 ceil(3 天日销 + 待发货件数 - 现有库存) 计算 - 新增 scope=work-order 范围筛选;列表新增「结余库存」列 - 打印模板剥离公司名前缀,打印字号调大 测试:mkhBomService 单测新增结余库存缓冲/紧张用例与回归用例
60 lines
1.8 KiB
JavaScript
60 lines
1.8 KiB
JavaScript
'use strict';
|
|
|
|
const express = require('express');
|
|
const {
|
|
getModularStockList,
|
|
getModularStockFilters,
|
|
getPurchaseInTransitList,
|
|
syncModularStock,
|
|
} = require('../services/modularStockMonitorService');
|
|
|
|
const router = express.Router();
|
|
|
|
function sendError(res, error, fallback) {
|
|
const status = Number(error?.statusCode) || 500;
|
|
console.error('[ModularStockMonitor]', {
|
|
message: error?.message || fallback,
|
|
code: error?.code || null,
|
|
status,
|
|
});
|
|
res.status(status).json({ success: false, error: error.message || fallback });
|
|
}
|
|
|
|
// 配件库存监控明细列表(默认仅「简尚-崔桥工厂半成品包装项目仓」)
|
|
router.get('/list', async (req, res) => {
|
|
try {
|
|
res.json({ success: true, data: await getModularStockList(req.query || {}) });
|
|
} catch (error) {
|
|
sendError(res, error, '加载配件库存监控列表失败');
|
|
}
|
|
});
|
|
|
|
// 筛选下拉选项(品类 / 预警等级)
|
|
router.get('/filters', async (_req, res) => {
|
|
try {
|
|
res.json({ success: true, data: await getModularStockFilters() });
|
|
} catch (error) {
|
|
sendError(res, error, '加载配件库存监控筛选选项失败');
|
|
}
|
|
});
|
|
|
|
// 采购在途明细列表:目标仓全部「采购数量 > 已入库数量」的采购单明细
|
|
router.get('/purchase-in-transit', async (req, res) => {
|
|
try {
|
|
res.json({ success: true, data: await getPurchaseInTransitList(req.query || {}) });
|
|
} catch (error) {
|
|
sendError(res, error, '加载采购在途明细失败');
|
|
}
|
|
});
|
|
|
|
// 手动同步:重新取最新监控日,前端「同步」按钮调用后再拉一次列表即拿到最新快照
|
|
router.post('/sync', async (_req, res) => {
|
|
try {
|
|
res.json({ success: true, data: await syncModularStock() });
|
|
} catch (error) {
|
|
sendError(res, error, '同步配件库存监控数据失败');
|
|
}
|
|
});
|
|
|
|
module.exports = router;
|