feat: 客退数据监控五仓看板 + 本地运行稳定性加固 #40
Loading…
x
Reference in New Issue
Block a user
No description provided.
Delete Branch "codex/cangku-returns-monitor-001"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
目的与范围
「客退上架仓」在库情况无法查看、无法导出。
本 PR 内置「导入聚水潭导出文件」通道来覆盖创建时间/件数/供应商。
隧道在非交互式启动时 ssh 找不到、业务库 DATETIME 显示整体 +8 小时。
src/api/returnStockWarning.js、returnMonitor.js、returnInventoryWarning.js;src/services/returnStockWarningService.js、returnStockWarehouseRegistry.js、returnStockWarningImport.js、returnStockWarningSchema.js、returnMonitorService.js、returnMonitorSchema.js、exportWorkbook.js;src/jobs/returnMonitorJob.js;src/index.js(路由 + 全局 JSON 错误兜底 + /api JSON 404);src/config/cloudDatabase.js(useUTC: false)。src/pages/ReturnsInventoryWarning/*、src/router/index.jsx、src/config/sidebarNavigation.js、src/layouts/BasicLayout.jsx、src/api/request.js(自动重连)、src/utils/tableExport.js。scripts/start-remote.mjs(ssh 绝对路径 + 窗口隐藏)。同步与兼容性
6b0bf59e744cfa8a04f41a68a2d4a493f6fb313011ef98b8c1893e6b6054ba660c56e83031293461(含 #25 ~ #38,2026-09-24 再次同步)90fa54b(分支codex/cangku-returns-monitor-001)backend/src/index.js、frontend/src/router/index.jsx:采用「双方注册内容都保留」的方式合并,已逐行核对远程的
modularStockMonitor / mkhBom 与本地的 return-monitor / return-stock-warning 均在。
/api/return-monitor、/api/return-stock-warning、/api/return-inventory-warning,均挂在
authMiddleware之后,不影响既有接口。backend/src/config/cloudDatabase.js(7 处):与上游38fa3f2「隧道断线自愈 + 修复配置负缓存」是同一问题的两份实现
(本地
cloudConfigRetryAftervs 上游cachedCloudConfigExpiresAt)。采用上游实现(已合入且带单测
test/cloudDatabaseConfigCache.test.js),并清掉本地残留引用。本地独有改动
useUTC: false予以保留。scripts/start-remote.mjs(1 处):ServerAliveCountMax/ConnectTimeout取值不同;上游测试
test/remote-access.test.mjs断言了CountMax=3/ConnectTimeout=10,故取上游值。本地独有的
resolveSshBinary()与windowsHide保留。backend/src/index.js无文本冲突(双方各自的路由注册行自动合并)。backend/src/index.js、frontend/src/router/index.jsx、frontend/src/config/sidebarNavigation.js、frontend/src/layouts/BasicLayout.jsx。这 4 处均由 CRLF/LF 行尾差异放大成「全文冲突」(冲突标记从第 1 行跨到最后一行),
实质仍只是插入点不同。处理:
git checkout --ours取本分支版本,再逐项补回 main 独有的内容 —— dailyInventory 的 require /
app.use/ lazy import / 路由、侧边栏
large-stock-monitor分组(order 200)+daily-inventory项、BasicLayout 的
'daily-inventory'路由映射。BasicLayout.jsx保留本分支的递归SidebarNavNode(支持任意层级),main 版本是「分组 + 一层子项」的硬编码写法,已被递归版取代。
另在
frontend/src/constants/sidebarPages.js补齐 5 个客退看板的权限条目(原清单只有 3 项,新增页面未登记则管理员无法在权限页配置)。
modularStockMonitor/mkhBomrequire 与app.use仍在,本地三条客退路由与全局错误处理器也仍在;远程新增测试全部通过。
数据库证据(按仓库规范 3.1)
表规模假设:查询对象为第三方副本库
JSReportReplica(MSSQL218.93.9.21:1433),jst_inventoryInfo按wms_co_id分仓;退货明细(售后单 + 奇门退款单)量级约 131 万行。本 PR 不在第三方库执行 DDL、不建索引、不写入。
新增本地表与索引(均为 MySQL 本地系统库,主键/唯一键保证幂等):
return_stock_warning_importPRIMARY (warehouse_key, product_code)idx_rswi_batch (batch_id)return_stock_warning_import_batchPRIMARY (batch_id)idx_rswibatch_time (imported_at)、idx_rswibatch_wh (warehouse_key, imported_at)return_monitor_inboundUNIQUE uk_rm_inbound_line (warehouse_key, return_no, product_code, inbound_date)idx_rm_inbound_status (warehouse_key,status,inbound_date)、idx_rm_inbound_code、idx_rm_inbound_datereturn_monitor_stockPRIMARY (warehouse_key, stat_date, product_code)idx_rm_stock_code (warehouse_key, product_code)return_monitor_discrepancyUNIQUE uk_rm_discrepancy_code (warehouse_key, product_code)idx_rm_discrepancy_status (warehouse_key,status,last_seen_date)return_monitor_job_logPRIMARY (id)idx_rm_job_log_date (warehouse_key, biz_date, created_at)查询边界与耗时证据:
first_inCTE 必须写成sku_id IN (SELECT product_code FROM stock)(stock CTE 在前),否则会对两张退货明细大表全量
GROUP BY。实测 17.8s → 2.9s。口径/排序/分页/关键字全在内存做,只有显式
refresh=true才回源,避免页面请求反复扫描远程大表。
returnMonitorJob.js默认每天 07:00 一轮,按biz_date幂等;首次接入回填 180 天历史。
迁移与回退:建表全部用
CREATE TABLE IF NOT EXISTS,列/索引变更走information_schema探测后再ALTER,可重复执行。回退:删除上述 6 张本地表(不影响第三方库),并移除前端路由与后端
app.use注册即可;无不可逆数据迁移。验证
backend/npm run syntax→ 通过 165 个 JavaScript 文件frontend/npm run build→ ✓ built in 16.16s,产物同时���Monitor(客退看板)与
DailyInventory(上游每日进销存)两个 chunk,证明双方模块都在/api/return-stock-warning、/api/return-monitor、/api/return-inventory-warning、/api/daily-inventory、/api/mkh-bom的 ping 全部 401(= 路由已注册且鉴权生效);前端 5173 返回 200
backend/node scripts/check-syntax.js→ 通过 163 个 JavaScript 文件(首次同步时)node --test test/*.test.js→ 346 个测试,345 通过backend/test/cloudDatabaseConfigCache.test.js→ 2/2 通过(直接验证本次冲突解法)frontend/vite build→ ✓ built(含上游 #24 的 vite.config.js 改动后重跑)frontend/scripts/verify-planning-entry.mjs→ Verified planning entrytest/resilientSecretStore.test.js的「secret backup survives outside the repository with owner-only permissions」失败
(期望 384=0o600,实际 438=0o666)。原因:Windows 不支持 Unix 权限位,
chmod(0o600)无效。该文件在本次合并前就存在(提交9b173a0引入),本次未改动,Linux 环境不受影响。
核对 KPI、按编码汇总、导出 xlsx;切换其余四仓;上传聚水潭导出的
「箱及仓位库存」文件验证创建时间被覆盖。
风险与回退
customize_qty_1、山东
customize_qty_2、河南当前为 0),若聚水潭侧调整仓位绑定需同步改returnStockWarehouseRegistry.js的returnSlot。2025-12-02/03 的期初批量建账时间;真实箱级上架时间只能靠导入。
frontend/node_modules/vite为 7.2.5,而package.json锁定 7.2.7(上游 #24 引入的补丁版差异),本地未重装,构建通过;生产部署脚本会自行安装。
DELETE /api/return-stock-warning/import清除,清除后页面自动回落到副本推算值,不残留脏数据。