forked from lunanting/cangku
需求:配件库存监控、MKH-BOM 资料两个页面各加一个同步按钮,任何时候点击都能 立即拉取最新数据,不必等凌晨 00:00 的定时刷新。 后端: - mkhBomService 新增 clearMkhBomCache():清空本页全部服务端缓存 (businessBom / officialBomIndex / officialBomDetail / productBom / mkhProduct / replenishIndex / workOrderIndex / pendingOrderIndex / componentStock / componentLocation),返回 syncedAt + 各缓存清除条目数。 - modularStockMonitorService 新增 syncModularStock():本页无进程内缓存 (每次请求直连副本库),同步动作 = 重新解析并返回最新监控日,前端据此重拉列表。 - 新增接口 POST /api/mkh-bom/sync、POST /api/modular-stock-monitor/sync。 前端: - api/mkhBom.js 新增 syncMkhBom;api/modularStockMonitor.js 新增 syncModularStock。 - 两个页面工具栏各加「同步最新数据」主按钮(SyncOutlined,带 loading 态), 点击 → 调后端 sync → 成功后重新拉列表(MKH-BOM 页同时清空展开明细缓存 detailCache,避免看到旧的配件明细)→ 提示「已同步最新数据」; 失败时展示后端返回的错误信息。 口径说明(重要): - 两页数据来自副本库 JSReportReplica,由上游聚水潭同步;应用层无法触发上游拉取。 本按钮的作用是「清服务端缓存 + 直连副本库重取最新」,保证看到的不是 2~15 分钟前的缓存结果,而不是重新跑一遍上游同步。 - 后端已内置的 dailyRefresh(cron 0 0 * * *,Asia/Shanghai)刷的是 summary_daily_* / summary_monthly_* 汇总表,不覆盖这两页数据源, 与本按钮既不重复也不冲突,可并存。 验证: - 后端 4 个改动文件 node --check 全部通过。 - 前端 4 个改动文件(含 2 个 jsx)用 @babel/parser 解析全部通过。 - 实测:syncModularStock 返回 monitorDate=2026-09-16; clearMkhBomCache 返回 syncedAt 与各缓存清除条目数。 - 单测 mkhBomService.test.js 40/40 通过,无回归。 - 前端 lint/build 未运行:frontend/node_modules 仍是之前被中断 npm ci 破坏的 坏目录(frontend/node_modules_broken_0917/,未纳入提交)。 合并前需在本机 npm ci 恢复后,打开两个页面确认按钮渲染与点击效果。 - 后端改动需重启服务后才生效。
50 lines
1.5 KiB
JavaScript
50 lines
1.5 KiB
JavaScript
'use strict';
|
|
|
|
const express = require('express');
|
|
const {
|
|
getModularStockList,
|
|
getModularStockFilters,
|
|
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.post('/sync', async (_req, res) => {
|
|
try {
|
|
res.json({ success: true, data: await syncModularStock() });
|
|
} catch (error) {
|
|
sendError(res, error, '同步配件库存监控数据失败');
|
|
}
|
|
});
|
|
|
|
module.exports = router;
|