fix: 每日进销存截图按业务日期归档,并补充幂等与执行记录测试 #47

Merged
youruo merged 1 commits from codex/daily-inventory-notify-0928 into main 2026-09-27 14:55:34 +08:00
Collaborator

目的与范围

  • 解决的问题:
    1. 定时任务凌晨 01:00 推送的是「昨日(T-1)」数据,但截图对象键原先直接取执行时刻的北京日期,导致归档目录与通知里的业务日期不一致(daily-inventory/2026-09-26/... 装的其实是 09-25 的数据),不利于按数据日期检索与核对。
    2. 按验收要求 8 补齐「配置校验、幂等逻辑、失败重试、通知对象去重」之外的关键测试:幂等记录与执行记录落库行为。
  • 修改的模块/文件:
    • backend/src/services/dailyInventoryScreenshot.js:新增 buildScreenshotNames,对象键/文件名统一使用业务日期、时间用执行时刻;captureAndUploadDailyInventory 支持 bizDate 入参。
    • backend/src/jobs/dailyInventoryNotificationJob.js:调用截图时显式传入业务日期。
    • backend/test/dailyInventoryNotification.test.js:新增 5 条测试(归档命名 3 条、幂等 1 条、执行记录 1 条)。
  • 是否使用 AI 及负责开发者:由 AI(CodeBuddy)在本任务分支内实现,仓库所有者 youruo 审核与授权合并。

同步与兼容性

  • 起始基线 SHA:f815751634924e9196444df08b0297c412678f2e
  • 最近同步的 main SHA:f815751634924e9196444df08b0297c412678f2e(git fetch origin 后 origin/main 未前进)
  • 待审核任务分支 SHA:117d59c9f0dbff89955dd7f7cc8b668284533256
  • 并行 PR、共享接口、迁移/配置影响:无并行 PR;不改动接口契约、路由、权限与数据结构。截图对象键命名变化只影响新产生的对象,历史对象不受影响。
  • 冲突及处理理由(无冲突也应说明):无冲突。任务分支基于最新 main 创建,仅含本次 3 个文件的改动。
  • 如何确认保留了其他开发者的已有行为:改动集中在每日进销存截图通知链路;chinaTimeParts 与其调用方保持不变,captureAndUploadDailyInventory 未传 bizDate 时回退原行为(执行时刻的业务日期),无破坏性变更。

验证

  • 实际执行的命令及结果:
    • npm --prefix backend run syntax:178 个文件语法检查通过
    • node --test test/dailyInventoryNotification.test.js:# tests 24 / # pass 24 / # fail 0
    • node --test test/*.test.js(全量):# tests 386 / # pass 385 / # fail 1
    • 未运行前端检查的原因:本次仅改后端文件,未触及前端代码。
  • 未运行或失败的检查及原因:
    • 全量测试中 secret backup survives outside the repository with owner-only permissions 失败,属既有失败项,与本次改动无关(Windows 文件系统不支持 POSIX owner-only 权限语义,用例校验 0o600 在本地恒不满足)。本次改动未涉及 resilientSecretStore。
  • 人工验证路径(如适用):管理员在「每日进销存 → 通知设置」点击「立即测试」,检查返回的成功状态与截图地址;对象键应为 daily-inventory/<业务日期>/daily-inventory-<YYYYMMDD>-<HHmmss>.png。本次按所有者要求未配置收件人、未执行真实推送。

风险与回退

  • 已知风险:低。仅影响截图对象键的命名格式;若定时任务未来未传业务日期,会回退到原行为,不会产生空目录。
  • 回退方式和数据兼容性:revert 本提交即可恢复旧命名;已上传对象不受影响,无需数据迁移。配置、幂等记录与执行记录结构未变更。
## 目的与范围 - 解决的问题: 1. 定时任务凌晨 01:00 推送的是「昨日(T-1)」数据,但截图对象键原先直接取执行时刻的北京日期,导致归档目录与通知里的业务日期不一致(`daily-inventory/2026-09-26/...` 装的其实是 09-25 的数据),不利于按数据日期检索与核对。 2. 按验收要求 8 补齐「配置校验、幂等逻辑、失败重试、通知对象去重」之外的关键测试:幂等记录与执行记录落库行为。 - 修改的模块/文件: - `backend/src/services/dailyInventoryScreenshot.js`:新增 `buildScreenshotNames`,对象键/文件名统一使用业务日期、时间用执行时刻;`captureAndUploadDailyInventory` 支持 `bizDate` 入参。 - `backend/src/jobs/dailyInventoryNotificationJob.js`:调用截图时显式传入业务日期。 - `backend/test/dailyInventoryNotification.test.js`:新增 5 条测试(归档命名 3 条、幂等 1 条、执行记录 1 条)。 - 是否使用 AI 及负责开发者:由 AI(CodeBuddy)在本任务分支内实现,仓库所有者 youruo 审核与授权合并。 ## 同步与兼容性 - 起始基线 SHA:f815751634924e9196444df08b0297c412678f2e - 最近同步的 main SHA:f815751634924e9196444df08b0297c412678f2e(`git fetch origin` 后 origin/main 未前进) - 待审核任务分支 SHA:117d59c9f0dbff89955dd7f7cc8b668284533256 - 并行 PR、共享接口、迁移/配置影响:无并行 PR;不改动接口契约、路由、权限与数据结构。截图对象键命名变化只影响新产生的对象,历史对象不受影响。 - 冲突及处理理由(无冲突也应说明):无冲突。任务分支基于最新 main 创建,仅含本次 3 个文件的改动。 - 如何确认保留了其他开发者的已有行为:改动集中在每日进销存截图通知链路;`chinaTimeParts` 与其调用方保持不变,`captureAndUploadDailyInventory` 未传 `bizDate` 时回退原行为(执行时刻的业务日期),无破坏性变更。 ## 验证 - 实际执行的命令及结果: - `npm --prefix backend run syntax`:178 个文件语法检查通过 - `node --test test/dailyInventoryNotification.test.js`:# tests 24 / # pass 24 / # fail 0 - `node --test test/*.test.js`(全量):# tests 386 / # pass 385 / # fail 1 - 未运行前端检查的原因:本次仅改后端文件,未触及前端代码。 - 未运行或失败的检查及原因: - 全量测试中 `secret backup survives outside the repository with owner-only permissions` 失败,属既有失败项,与本次改动无关(Windows 文件系统不支持 POSIX owner-only 权限语义,用例校验 `0o600` 在本地恒不满足)。本次改动未涉及 `resilientSecretStore`。 - 人工验证路径(如适用):管理员在「每日进销存 → 通知设置」点击「立即测试」,检查返回的成功状态与截图地址;对象键应为 `daily-inventory/<业务日期>/daily-inventory-<YYYYMMDD>-<HHmmss>.png`。本次按所有者要求未配置收件人、未执行真实推送。 ## 风险与回退 - 已知风险:低。仅影响截图对象键的命名格式;若定时任务未来未传业务日期,会回退到原行为,不会产生空目录。 - 回退方式和数据兼容性:revert 本提交即可恢复旧命名;已上传对象不受影响,无需数据迁移。配置、幂等记录与执行记录结构未变更。
youruo added 1 commit 2026-09-27 14:54:14 +08:00
定时任务在凌晨 01:00 推送的是「昨日」数据,但截图对象键原先直接取执行时刻的北京日期,
导致归档目录与通知里的业务日期不一致(daily-inventory/2026-09-26/... 装的是 09-25 的数据)。
现改为由定时任务显式传入业务日期,目录与文件名统一用业务日期、时间仍用执行时刻:
  daily-inventory/2026-09-25/daily-inventory-20260925-010000.png

另补充验收要求 8 的测试:
  · buildScreenshotNames 归档命名(含业务日期与执行日期不同的场景)
  · markNotified / hasNotified 幂等:同业务日同用户只成功一次,跨日期互不影响
  · appendRunRecord 保留执行时间、截图地址、通知对象与失败原因
Author
Collaborator

合并授权(仓库所有者/管理员)

  • 授权人:youruo(仓库所有者,通过会话明确指令授权)
  • 授权范围:将本 PR 合并到 main,并按《服务器部署规范》更新生产环境
  • 授权时最终提交 SHA:117d59c9f0dbff89955dd7f7cc8b668284533256
  • 说明:已确认任务分支基于最新 main(f815751634924e9196444df08b0297c412678f2e)创建,无冲突;后端语法检查通过,通知相关单测 24/24 通过,全量测试 385/386 通过(唯一失败项为与本次改动无关的既有 Windows 权限用例)。
**合并授权(仓库所有者/管理员)** - 授权人:youruo(仓库所有者,通过会话明确指令授权) - 授权范围:将本 PR 合并到 `main`,并按《服务器部署规范》更新生产环境 - 授权时最终提交 SHA:`117d59c9f0dbff89955dd7f7cc8b668284533256` - 说明:已确认任务分支基于最新 main(`f815751634924e9196444df08b0297c412678f2e`)创建,无冲突;后端语法检查通过,通知相关单测 24/24 通过,全量测试 385/386 通过(唯一失败项为与本次改动无关的既有 Windows 权限用例)。
youruo merged commit 9e0612b7f3 into main 2026-09-27 14:55:34 +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#47
No description provided.