feat: 每日进销存改为全部从数据库取数(期初按本地快照滚动) #32

Merged
youruo merged 4 commits from codex/daily-inventory-snapshot-0924 into main 2026-09-27 08:11:26 +08:00
Collaborator

目的与范围

  • 解决的问题:每日进销存的「期初数量」原先依赖仓库内硬编码 baseline 常量,无法随日期滚动。本次改为全部从数据库取数:期初取本地快照库中上一业务日的期末结存(逐日滚动),期末与各分级指标仍从业务库实时取数。
  • 修改的模块/文件:
    • 后端:backend/src/config/dailyInventorySnapshotDb.js(新增,快照表读写)、backend/src/jobs/dailyInventorySnapshotJob.js(新增,每日 01:30 落库)、backend/src/api/dailyInventory.js、backend/src/config/dailyInventoryBaseline.js(瘦身为纯仓库映射)、backend/src/index.js(注册快照任务)、backend/scripts/sync-daily-inventory-snapshot.cjs(新增,手工回填)
    • 前端:frontend/src/pages/DailyInventory/index.jsx、frontend/src/constants/dailyInventory.js、frontend/src/api/dailyInventory.js、style.css
    • 文档:docs/库存流水单据表需求.md(向 DBA 提出补单据表需求)
  • 是否使用 AI 及负责开发者:由 AI(WorkBuddy)在 youruo 的账号与独立工作目录完成,负责人 youruo。

同步与兼容性

  • 起始基线 SHA:db2362307d9e9f300e9f1a40f039a981876f8609
  • 最近同步的 main SHA:28cfb1b33069d91b203bd4e2d5b205d1ca1ed6dd(PR #40、#41 已合入,本分支已同步)
  • 待审核任务分支 SHA:734b974f45fa96224ade9c8bc58ed0df3d978a2c
  • 并行 PR、共享接口、迁移/配置影响:新增本地系统库表 daily_inventory_snapshot(MySQL,CREATE TABLE IF NOT EXISTS,上线自动建表);新增每日 01:30 后台任务;不动第三方云库结构。
  • 冲突及处理理由:合并 main 时 backend/src/index.js 冲突。main 侧(他人 PR #40、#41)新增崔桥工厂仓客退三类路由的 require 与注册、统一 404 与 JSON 错误处理中间件;本分支仅新增快照任务的 require 与 startDailyInventorySnapshotScheduler() 调用。采用 main 版本文件后补回本分支两处改动,双方行为均保留。
  • 如何确认保留了其他开发者的已有行为:合并后 git diff MERGE_HEAD 显示 index.js 仅剩本分支两处新增;未修改客退、MKH、BOM、权限、路由等他人模块。

数据库负载证据(按 3.1 节)

  • 表规模假设:daily_inventory_snapshot 每天约 26 行(26 个仓库),一年约 1 万行,体量极小。
  • 索引定义:UNIQUE KEY uk_date_wh (biz_date, wms_co_id) 保证按「业务日期 + 仓库」幂等 UPSERT;KEY idx_date (biz_date) 供按日查询。
  • 对应查询:页面与任务均按 biz_date 等值取全部仓库行,命中 uk_date_wh / idx_date,扫描行数约 26 行。
  • 同步任务边界:每日 01:30 单实例执行一次,按仓库分批 upsert,只取必要列;业务云库查询限定时间范围,结果落本地库,页面不重复扫描远程大表。
  • 迁移与回退:新增表为 CREATE TABLE IF NOT EXISTS,可重复执行;回退只需 revert 合并提交,快照表保留不影响其它功能。

验证

  • 实际执行的命令及结果:
    • npm --prefix backend run check → 365 项测试,364 通过;唯一失败 resilientSecretStore.test.js「secret backup survives outside the repository with owner-only permissions」为 Windows 文件权限语义导致的既有失败,与本改动无关。
    • npm --prefix frontend run check → lint 通过、21 项测试通过、build 成功,构建日志无 Circular chunk 警告。
  • 未运行或失败的检查及原因:无。
  • 人工验证路径:登录 → 计划/每日进���存,确认期初日期与库存快照日、期初数量来自快照表、12 个流水列显示「—」并有口径说明。

风险与回退

  • 已知风险:1) 12 个流水列因业务库缺少调拨/盘点/加工/其它出入库单据表暂显示「—」,已提交补表需求;2) 首次上线时快照表为空,需在部署后执行一次 node backend/scripts/sync-daily-inventory-snapshot.cjs 回填当天快照,次日 01:30 起自动滚动。
  • 回退方式:revert 合并提交即可回到 baseline 常量口径;快照表数据保留,不影响其他模块。
## 目的与范围 - 解决的问题:每日进销存的「期初数量」原先依赖仓库内硬编码 baseline 常量,无法随日期滚动。本次改为全部从数据库取数:期初取本地快照库中上一业务日的期末结存(逐日滚动),期末与各分级指标仍从业务库实时取数。 - 修改的模块/文件: - 后端:backend/src/config/dailyInventorySnapshotDb.js(新增,快照表读写)、backend/src/jobs/dailyInventorySnapshotJob.js(新增,每日 01:30 落库)、backend/src/api/dailyInventory.js、backend/src/config/dailyInventoryBaseline.js(瘦身为纯仓库映射)、backend/src/index.js(注册快照任务)、backend/scripts/sync-daily-inventory-snapshot.cjs(新增,手工回填) - 前端:frontend/src/pages/DailyInventory/index.jsx、frontend/src/constants/dailyInventory.js、frontend/src/api/dailyInventory.js、style.css - 文档:docs/库存流水单据表需求.md(向 DBA 提出补单据表需求) - 是否使用 AI 及负责开发者:由 AI(WorkBuddy)在 youruo 的账号与独立工作目录完成,负责人 youruo。 ## 同步与兼容性 - 起始基线 SHA:db2362307d9e9f300e9f1a40f039a981876f8609 - 最近同步的 main SHA:28cfb1b33069d91b203bd4e2d5b205d1ca1ed6dd(PR #40、#41 已合入,本分支已同步) - 待审核任务分支 SHA:734b974f45fa96224ade9c8bc58ed0df3d978a2c - 并行 PR、共享接口、迁移/配置影响:新增本地系统库表 daily_inventory_snapshot(MySQL,CREATE TABLE IF NOT EXISTS,上线自动建表);新增每日 01:30 后台任务;不动第三方云库结构。 - 冲突及处理理由:合并 main 时 backend/src/index.js 冲突。main 侧(他人 PR #40、#41)新增崔桥工厂仓客退三类路由的 require 与注册、统一 404 与 JSON 错误处理中间件;本分支仅新增快照任务的 require 与 startDailyInventorySnapshotScheduler() 调用。采用 main 版本文件后补回本分支两处改动,双方行为均保留。 - 如何确认保留了其他开发者的已有行为:合并后 git diff MERGE_HEAD 显示 index.js 仅剩本分支两处新增;未修改客退、MKH、BOM、权限、路由等他人模块。 ## 数据库负载证据(按 3.1 节) - 表规模假设:daily_inventory_snapshot 每天约 26 行(26 个仓库),一年约 1 万行,体量极小。 - 索引定义:UNIQUE KEY uk_date_wh (biz_date, wms_co_id) 保证按「业务日期 + 仓库」幂等 UPSERT;KEY idx_date (biz_date) 供按日查询。 - 对应查询:页面与任务均按 biz_date 等值取全部仓库行,命中 uk_date_wh / idx_date,扫描行数约 26 行。 - 同步任务边界:每日 01:30 单实例执行一次,按仓库分批 upsert,只取必要列;业务云库查询限定时间范围,结果落本地库,页面不重复扫描远程大表。 - 迁移与回退:新增表为 CREATE TABLE IF NOT EXISTS,可重复执行;回退只需 revert 合并提交,快照表保留不影响其它功能。 ## 验证 - 实际执行的命令及结果: - npm --prefix backend run check → 365 项测试,364 通过;唯一失败 resilientSecretStore.test.js「secret backup survives outside the repository with owner-only permissions」为 Windows 文件权限语义导致的**既有失败**,与本改动无关。 - npm --prefix frontend run check → lint 通过、21 项测试通过、build 成功,构建日志无 Circular chunk 警告。 - 未运行或失败的检查及原因:无。 - 人工验证路径:登录 → 计划/每日进���存,确认期初日期与库存快照日、期初数量来自快照表、12 个流水列显示「—」并有口径说明。 ## 风险与回退 - 已知风险:1) 12 个流水列因业务库缺少调拨/盘点/加工/其它出入库单据表暂显示「—」,已提交补表需求;2) 首次上线时快照表为空,需在部署后执行一次 node backend/scripts/sync-daily-inventory-snapshot.cjs 回填当天快照,次日 01:30 起自动滚动。 - 回退方式:revert 合并提交即可回到 baseline 常量口径;快照表数据保留,不影响其他模块。
youruo added 3 commits 2026-09-24 12:10:16 +08:00
- 期初数量改由本地快照表 daily_inventory_snapshot 提供(上一业务日期末),
  每日 01:30 定时任务落库,接口侧缺失时补写兜底,逐日自动滚动
- 新增 dailyInventorySnapshotDb / dailyInventorySnapshotJob 与手动补跑脚本
- dailyInventoryBaseline 瘦身为纯仓库映射,去掉所有硬编码业务数值
- 12 个流水列因业务库缺单据表返回空值,前端灰底显示「—」
- 修复 qty 全为 0 的仓库期末显示 null 的缺陷
- 新增 docs/库存流水单据表需求.md 给 DBA
列出每日进销存 12 个流水列无法从业务库还原的具体原因、
缺失的 4 类单据表、以及已有采购/销售单据口径不一致的实测偏差,供 DBA 补齐。
youruo closed this pull request 2026-09-26 12:11:29 +08:00
youruo reopened this pull request 2026-09-26 12:11:34 +08:00
youruo added 1 commit 2026-09-27 08:10:06 +08:00
冲突文件:backend/src/index.js
处理理由:main 侧(他人 PR #40、#41)新增崔桥工厂仓客退三类路由 require 与注册、统一 404 与 JSON 错误处理中间件;
本分支仅新增每日进销存快照任务的 require 与 startDailyInventorySnapshotScheduler() 调用。
采用 main 版本文件并补回本分支两处改动,双方行为均保留。
youruo merged commit 3f382b49d5 into main 2026-09-27 08:11:26 +08:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: lunanting/cangku#32
No description provided.