feat: 仓储中心发货时效独立页面 + 口径定版(审核时间分轮/快递剔除/停更告警) #69

Merged
yanhui merged 1 commits from codex/warehouse-ship-timeliness-rules-1021 into main 2026-10-21 07:55:56 +08:00
Collaborator

目的与范围

  • 解决的问题:
    1. 「仓储中心 24 小时发货时效」原为 MKH-BOM 页面内的一个侧栏,内容变多后页面拥挤、无法独立访问 —— 抽成独立页面 /planning/operation/warehouse-ship-timeliness。
    2. 业务(yanhui)2026-10-20 多次纠偏后的口径定版:轮次归属改用聚水潭「审核时间」而不是创建时间;去掉「满 24 小时」门槛;18:00 轮覆盖「截止 16:00 前审核 + 今天之前未发的历史单」;山东两仓 15:00、河南洛宁 13:00 仓级例外。
    3. 明细列「创建时间」改为「发货时间」;自提 / 中铁 / 壹米滴答 三家快递不做未发考核。
    4. 已发货却仍显示未发货的误判:一是「已发」判定改用聚水潭销售订单口径(状态表 send_time 非空 OR 订单表 status='Sent'),二是状态镜像表停更时页面必须显式告警,避免用户以为数据是对的。
  • 修改的模块/文件:
    • backend/src/services/warehouseShipTimelinessService.js(分桶 / 已发判定 / 快递剔除 / freshness 实算)
    • backend/src/services/warehouseShipTimelinessRegistry.js(windowEndHourByRound 仓级例外)
    • backend/test/warehouseShipTimeliness.test.js(17 用例)
    • frontend/src/pages/WarehouseShipTimeliness/{index.jsx,style.css}(新增独立页面)
    • frontend/src/pages/MkhBomData/{index.jsx,style.css} + 删除 WarehouseShipTimelinessSidebar.jsx
    • frontend/src/router/index.jsx、frontend/src/config/sidebarNavigation.js、frontend/src/layouts/BasicLayout.jsx(各 1~5 行入口)
  • 是否使用 AI 及负责开发者:AI 辅助实现,负责开发者 yanhui。

同步与兼容性

  • 起始基线 SHA:6833b7bc797242d2c232f80c2c6c3a9334f7ba33(origin/main,含 PR #68)
  • 最近同步的 main SHA:6833b7bc797242d2c232f80c2c6c3a9334f7ba33
  • 待审核任务分支 SHA:530d1ad27a56593df568dffa340c478b74b5ea64
  • 并行 PR、共享接口、迁移/配置影响:无并行 PR;不涉及数据库迁移、环境变量、依赖变更。改动仅落在新增的发货时效模块与前端页面,MKH-BOM 主流程只被摘除了侧栏 UI(不涉及其取数逻辑)。
  • 冲突及处理理由(无冲突也应说明):本地提交前 git fetch 后 git log --left-right HEAD...origin/main 仅一条 main 独有的合并提交(PR #68),本分支基于它之上,git merge-tree 无需演练(远端未再前进);grep -rn "^<<<<<<< \|^>>>>>>> \|^=======$" 扫描 backend/src、frontend/src 无冲突标记。
  • 如何确认保留了其他开发者的已有行为:git diff -- AGENTS.md "仓库提交与合并规范.md" "服务器部署规范.md" README.md --stat 输出为空(未触碰规范文档);git diff --cached --stat 逐文件人工核对 11 个文件均为本次任务范围内文件,未夹带 .env / 凭据 / node_modules / outputs/。

验证

  • 实际执行的命令及结果:
    • node --test backend/test/warehouseShipTimeliness.test.js → 17 tests / 17 pass / 0 fail(含仓级例外、重审取 last_oa、中铁/壹米滴答剔除 carrierSkipped=2、status='Sent' 判已发、coversDeadline 告警断言)
    • npx eslint 对改动的 5 个前端文件 → 0 error, 0 warning
    • 本地后端(4002)重启后实测 GET /api/warehouse-ship-timeliness/list?round=AFTERNOON&force=1 → 18:00 轮 103 → 101 单(剔除 2 单中铁/壹米滴答),freshness 正确给出「数据未覆盖核验时刻」���告警
    • Playwright 真实渲染截图(1366 / 1920 两档)确认告警与「已打单 · 未揽收」标签正常
  • 未运行或失败的检查及原因:未跑全量 npm run check(后端全量测试要连外部库、耗时数十分钟);已针对本次改动文件跑单文件测试 + 前端 lint 覆盖。
  • 人工验证路径:规划 → 运营 → 仓储中心 24 小时发货时效,切换 13:00 / 18:00 两轮查看。

风险与回退

  • 已知风险:
    1. 口径改为按审核时间分轮后,单量会与旧版(按创建时间)不同,属预期变化,不是回归。
    2. 依赖 jst_order_express_details 的刷新;该表 2026-10-20 15:48 起曾整表停更数小时 —— 页面已加黄/红两级告警提示,不会静默给出错误结论。
    3. 快递剔除按 logistic_company_name 包含匹配「自提 / 中铁 / 壹米滴答」;若上游改名需同步维护该常量。
  • 回退方式和数据兼容性:纯前端展示 + 只读查询,无写库、无迁移;回退直接 revert 合并提交即可,任务分支 codex/warehouse-ship-timeliness-rules-1021 保留不删。
## 目的与范围 - 解决的问题: 1. 「仓储中心 24 小时发货时效」原为 MKH-BOM 页面内的一个侧栏,内容变多后页面拥挤、无法独立访问 —— 抽成独立页面 `/planning/operation/warehouse-ship-timeliness`。 2. 业务(yanhui)2026-10-20 多次纠偏后的**口径定版**:轮次归属改用聚水潭「审核时间」而不是创建时间;去掉「满 24 小时」门槛;18:00 轮覆盖「截止 16:00 前审核 + 今天之前未发的历史单」;山东两仓 15:00、河南洛宁 13:00 仓级例外。 3. 明细列「创建时间」改为「发货时间」;自提 / 中铁 / 壹米滴答 三家快递不做未发考核。 4. 已发货却仍显示未发货的误判:一是「已发」判定改用聚水潭销售订单口径(状态表 `send_time` 非空 OR 订单表 `status='Sent'`),二是状态镜像表停更时页面必须显式告警,避免用户以为数据是对的。 - 修改的模块/文件: - `backend/src/services/warehouseShipTimelinessService.js`(分桶 / 已发判定 / 快递剔除 / freshness 实算) - `backend/src/services/warehouseShipTimelinessRegistry.js`(`windowEndHourByRound` 仓级例外) - `backend/test/warehouseShipTimeliness.test.js`(17 用例) - `frontend/src/pages/WarehouseShipTimeliness/{index.jsx,style.css}`(新增独立页面) - `frontend/src/pages/MkhBomData/{index.jsx,style.css}` + 删除 `WarehouseShipTimelinessSidebar.jsx` - `frontend/src/router/index.jsx`、`frontend/src/config/sidebarNavigation.js`、`frontend/src/layouts/BasicLayout.jsx`(各 1~5 行入口) - 是否使用 AI 及负责开发者:AI 辅助实现,负责开发者 yanhui。 ## 同步与兼容性 - 起始基线 SHA:`6833b7bc797242d2c232f80c2c6c3a9334f7ba33`(origin/main,含 PR #68) - 最近同步的 main SHA:`6833b7bc797242d2c232f80c2c6c3a9334f7ba33` - 待审核任务分支 SHA:`530d1ad27a56593df568dffa340c478b74b5ea64` - 并行 PR、共享接口、迁移/配置影响:无并行 PR;不涉及数据库迁移、环境变量、依赖变更。改动仅落在新增的发货时效模块与前端页面,MKH-BOM 主流程只被摘除了侧栏 UI(不涉及其取数逻辑)。 - 冲突及处理理由(无冲突也应说明):本地提交前 `git fetch` 后 `git log --left-right HEAD...origin/main` 仅一条 main 独有的合并提交(PR #68),本分支基于它之上,`git merge-tree` 无需演练(远端未再前进);`grep -rn "^<<<<<<< \|^>>>>>>> \|^=======$"` 扫描 `backend/src`、`frontend/src` 无冲突标记。 - 如何确认保留了其他开发者的已有行为:`git diff -- AGENTS.md "仓库提交与合并规范.md" "服务器部署规范.md" README.md --stat` 输出为空(未触碰规范文档);`git diff --cached --stat` 逐文件人工核对 11 个文件均为本次任务范围内文件,未夹带 `.env` / 凭据 / `node_modules` / `outputs/`。 ## 验证 - 实际执行的命令及结果: - `node --test backend/test/warehouseShipTimeliness.test.js` → **17 tests / 17 pass / 0 fail**(含仓级例外、重审取 last_oa、中铁/壹米滴答剔除 `carrierSkipped=2`、`status='Sent'` 判已发、`coversDeadline` 告警断言) - `npx eslint` 对改动的 5 个前端文件 → **0 error, 0 warning** - 本地后端(4002)重启后实测 `GET /api/warehouse-ship-timeliness/list?round=AFTERNOON&force=1` → 18:00 轮 103 → 101 单(剔除 2 单中铁/壹米滴答),`freshness` 正确给出「数据未覆盖核验时刻」���告警 - Playwright 真实渲染截图(1366 / 1920 两档)确认告警与「已打单 · 未揽收」标签正常 - 未运行或失败的检查及原因:未跑全量 `npm run check`(后端全量测试要连外部库、耗时数十分钟);已针对本次改动文件跑单文件测试 + 前端 lint 覆盖。 - 人工验证路径:规划 → 运营 → 仓储中心 24 小时发货时效,切换 13:00 / 18:00 两轮查看。 ## 风险与回退 - 已知风险: 1. 口径改为按审核时间分轮后,单量会与旧版(按创建时间)不同,属预期变化,不是回归。 2. 依赖 `jst_order_express_details` 的刷新;该表 2026-10-20 15:48 起曾整表停更数小时 —— 页面已加黄/红两级告警提示,不会静默给出错误结论。 3. 快递剔除按 `logistic_company_name` 包含匹配「自提 / 中铁 / 壹米滴答」;若上游改名需同步维护该常量。 - 回退方式和数据兼容性:纯前端展示 + 只读查询,无写库、无迁移;回退直接 revert 合并提交即可,任务分支 `codex/warehouse-ship-timeliness-rules-1021` 保留不删。
yanhui added 1 commit 2026-10-21 07:55:18 +08:00
一、前端:从 MkhBomData 侧栏抽成独立页面
- 新增 frontend/src/pages/WarehouseShipTimeliness/{index.jsx,style.css},
  路由 /planning/operation/warehouse-ship-timeliness,侧栏导航与 BasicLayout 各加 1 行入口。
- 删除 frontend/src/pages/MkhBomData/WarehouseShipTimelinessSidebar.jsx,
  并把 MkhBomData/index.jsx、style.css 里相关代码与样式一并摘除(-131 / -277 行)。

二、业务口径(2026-10-20 业务多次纠偏后的定版)
- 轮次归属改用「审核时间」= jst_order_express_details.last_oa_confirm_time
  (聚水潭订单列表「审核时间」列,最后一次审核,重审会刷新):
  13:00 轮 = 今天 07:00 前审核 + 历史未发;18:00 轮 = 截止 16:00 前审核 + 历史未发。
  不再按「创建时间」切自然日窗口,也不再有「满 24 小时」门槛。
- 仓级例外(仅 18:00 轮):山东青岗集仓 / 山东品牌仓 15:00 前审核、河南洛宁仓 13:00 前审核,
  核验时刻仍为 18:00(registry 新增 windowEndHourByRound)。
- 明细去掉「创建时间」,改显示「发货时间」(send_time);未发但有运单号的标「已打单 · 未揽收」。

三、已发判定与不考核快递
- 已发 = 状态表 send_time 非空 OR 订单表 status='Sent'(对齐聚水潭销售订单口径)。
  不再用运单号反推(已发货与未揽收单都会出现运单号,判不出来)。
- 自提 / 中铁 / 壹米滴答 三家快递不做未发考核,剔除量计入 summary.carrierSkipped。

四、数据源停更必须让用户看见
- freshness 由写死 stale:false 改为实算:快照距今 >90 分钟 → 黄告警;
  快照早于本轮核验时刻 → 红告警「数据未覆盖核验时刻,超时单量偏大」。

五、测试
- backend/test/warehouseShipTimeliness.test.js 扩到 17 用例(仓级例外、重审取 last_oa、
  快递剔除、Sent 判已发、coversDeadline 告警)。
Author
Collaborator

PR #69 合并授权记录(规范第 6 节 · 路径二)

  • 授权人:yanhui(仓库所有者,同时是本次提交的开发者)
  • 授权时间:2026-10-21 07:50 (GMT+8)
  • 授权原话:

    推送更新到 git 仓库安全合并主仓库并拉取更新到本地,然后服务器拉取更新

  • 授权范围:仅本次 PR #69(codex/warehouse-ship-timeliness-rules-1021 → main,
    11 个文件,均为仓储中心发货时效模块 + 前端页面),不含其他 PR、不含强推 main。
  • 授权时最终提交 SHA:530d1ad27a56593df568dffa340c478b74b5ea64
  • 基线 main SHA:6833b7bc797242d2c232f80c2c6c3a9334f7ba33
  • 说明:
    规范默认要求「至少一名非提交者审核」。本 PR 的提交由 AI 辅助、开发者为 yanhui 本人,
    无第三方审核者可用;仓库所有者给出上述明确合并指令,按规范 6.1 以所有者书面授权代替独立审核。
    AI 未自审自合,授权记录已同步写入 PR 评论。
  • 合并前已完成的检查:
    • node --test backend/test/warehouseShipTimeliness.test.js → 17 / 17 pass
    • npx eslint(改动的 5 个前端文件)→ 0 error, 0 warning
    • grep -rn "^<<<<<<< \|^>>>>>>> \|^=======$" 扫描 backend/src、frontend/src → 无冲突标记
    • git diff -- AGENTS.md "仓库提交与合并规范.md" "服务器部署规范.md" README.md --stat → 空(未回退他人内容)
    • PR mergeable = true、head_sha == 本地 HEAD、base_sha == 当前 origin/main
# PR #69 合并授权记录(规范第 6 节 · 路径二) - **授权人**:yanhui(仓库所有者,同时是本次提交的开发者) - **授权时间**:2026-10-21 07:50 (GMT+8) - **授权原话**: > 推送更新到 git 仓库安全合并主仓库并拉取更新到本地,然后服务器拉取更新 - **授权范围**:仅本次 PR #69(`codex/warehouse-ship-timeliness-rules-1021` → `main`, 11 个文件,均为仓储中心发货时效模块 + 前端页面),不含其他 PR、不含强推 main。 - **授权时最终提交 SHA**:`530d1ad27a56593df568dffa340c478b74b5ea64` - **基线 main SHA**:`6833b7bc797242d2c232f80c2c6c3a9334f7ba33` - **说明**: 规范默认要求「至少一名非提交者审核」。本 PR 的提交由 AI 辅助、开发者为 yanhui 本人, 无第三方审核者可用;仓库所有者给出上述明确合并指令,按规范 6.1 以所有者书面授权代替独立审核。 AI 未自审自合,授权记录已同步写入 PR 评论。 - **合并前已完成的检查**: - `node --test backend/test/warehouseShipTimeliness.test.js` → 17 / 17 pass - `npx eslint`(改动的 5 个前端文件)→ 0 error, 0 warning - `grep -rn "^<<<<<<< \|^>>>>>>> \|^=======$"` 扫描 `backend/src`、`frontend/src` → 无冲突标记 - `git diff -- AGENTS.md "仓库提交与合并规范.md" "服务器部署规范.md" README.md --stat` → 空(未回退他人内容) - PR `mergeable = true`、`head_sha` == 本地 HEAD、`base_sha` == 当前 `origin/main`
yanhui merged commit 4b02ad212d into main 2026-10-21 07:55:56 +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#69
No description provided.