文件
hyb-oa/.trellis/tasks/archive/2026-08/08-07-business-routing-regression-repair/implement.md
T

5.9 KiB
原始文件 Blame 文件历史

实施计划

当前状态:in_progress。用户已批准最终规划摘要,任务已由 task.py start 激活。

1. 实施前固定现场

  • 记录 HEAD、当前 task 与 git status --porcelain,确认只有本任务规划文件和父任务 child link 变化。
  • 复读 PRD、design、.trellis/spec/hyb-oa/frontend-react-vite-design.md 的未保存保护与 list-to-detail route migration 场景。
  • 只读确认本地 Prisma migration status 仍 current;若数据库再次漂移,真实 API 回归标 PAUSED,本任务不得执行任何 migration/reset/seed。

2. 修复共享 guard 的成功保存导航

  • 在 UnsavedChangesProvider 内抽取单次 allow-next 执行函数,复用现有 ref + microtask 恢复语义。
  • 暴露语义收窄的 post-save hook/方法,不改变现有 useUnsavedChangesGuard 调用者契约。
  • 普通 dirty navigation、确认、取消、browser back 与 beforeunload 逻辑保持原样。

3. 修复资产创建成功链路

  • 创建成功后先完成成功态更新并通过 post-save 入口 replace 到 canonical detail,保留 backSource。
  • 将资产 list/detail invalidation 移出关键导航等待路径;后台刷新失败不得触发创建失败 toast 或阻止跳转。
  • 编辑既有资产的保存刷新行为不做无关重构。
  • API 失败路径继续保留表单与 dirty state。

4. 测试与证据维护

  • assets-flow.spec.ts 增加/保留“无 unsaved dialog + canonical URL + history”断言。
  • procurement-flow.spec.ts 将英文 Employee 改为 EMPLOYEE.name,保留“申请人”语义断言;并同步现行筛选/状态控件。
  • 追加两个归档任务的 post-archive delta,分别记录产品回归与测试侧失败。
  • 更新 frontend spec 的 post-save bypass 合同、错误矩阵、Good/Bad 和测试要求。
  • 不修改其余 8 条会话/mock 失败相关实现或断言。

5. 验证顺序

  • cd client && npm run typecheck
  • cd client && npm run build
  • cd client && npx playwright test tests/e2e/business-detail-routing.spec.ts --workers=1 --reporter=list
  • cd client && npx playwright test tests/e2e/r103-cross-page-ui-consistency.spec.ts --grep "资产长表单切回记录列表" --workers=1 --reporter=list(1 passed / 0 failed / 0 skipped)
  • 在回环本地、migration current、后台任务关闭且服务配置完整的当前 checkout 上运行: cd client && E2E_MODE=local E2E_BASE_URL=http://127.0.0.1:3000 npx playwright test tests/e2e/assets-flow.spec.ts tests/e2e/procurement-flow.spec.ts --workers=1 --reporter=list
  • 记录真实 2 passed / 0 failed / 0 skipped;第一次运行暴露的视口/筛选控件漂移已在目标 spec 内最小同步,未修改范围外失败。

6. 质量与收口

  • 使用 trellis-check 复核共享 guard API 是否只在成功保存后使用,并搜索所有调用点。
  • python3 ./.trellis/scripts/task.py validate 08-07-business-routing-regression-repair
  • node scripts/qa/check-trellis-governance.mjs --json
  • git diff --check
  • 确认无 server、Prisma、权限、合同 task、其余会话 fixture 或生产配置改动。
  • 提交前给出中文 commit 计划并获得用户明确批准;不 push、不部署。

7. 停止条件

  • migration status 非 current、目标非回环或本地服务缺必要安全配置 → PAUSED,不执行数据库修复。
  • 资产 POST 未成功或未返回 ID → 先归因 API/数据,不启用 bypass 掩盖失败。
  • post-save 入口需要全局关闭 guard、修改路由权限或影响其他表单保存语义 → 返回规划复核。
  • 真实 E2E 出现本任务范围外新产品失败 → 记录并回来确认,不扩大范围。

8. 执行记录

  • 起始 HEAD:892b313;任务启动前只有本任务规划目录与父任务 child link 变化。
  • 迁移基线:只读 prisma migrate status 为 current;未执行 migration、reset、seed、数据清理或手工 DDL。
  • 共享 guard:新增 usePostSaveNavigation(),内部复用原同步 allow-next ref 与 microtask 恢复;client/src 只有资产创建成功回调一个 post-save 调用点,显式放弃仍走 Provider 私有执行函数。
  • 资产链路:POST 成功且 ID 有效后先 replace 到 canonical 详情,再后台失效资产 list/detail cache;无 ID 与请求失败不启用 bypass。
  • 聚焦回归:
    • business-detail-routing.spec.ts:5 passed / 0 failed / 0 skipped。
    • r103-cross-page-ui-consistency.spec.ts --grep "资产长表单切回记录列表":1 passed / 0 failed / 0 skipped,覆盖未保存取消/放弃、成功保存无弹窗/history,以及合成 400 后保留输入与 dirty guard。
  • 真实主链路:assets-flow.spec.ts 与 procurement-flow.spec.ts 合计 2 passed / 0 failed / 0 skipped;真实资产链路继续完成领用、归还、调拨与盘点,采购链路完成提单、审批与归档。
  • 初次真实补跑暴露两个测试侧漂移:资产用例在 1024px 继续查找桌面侧栏入口;采购用例仍操作已迁移的常驻范围按钮/状态下拉。仅在两份目标 spec 内做最小同步,未修改产品代码来迎合旧断言。
  • 静态与构建:npm run typecheck PASS;npm run build PASS(仅有既有 Browserslist 数据提示)。
  • 流程门禁:task validate PASS;flow coverage blockingGapCount=0、10/10 core bundles、9 acceptance specs;process contract PASS 0/0;Trellis governance PASS 0/0;git diff --check PASS。
  • 文档审计:0 errors / 1 warning;警告为仓库既有 22 个未注册 docs 文件,本任务未新增 docs 文件。
  • 边界:无 server/、Prisma、权限、合同 task、其余 8 条会话失败对应测试、生产配置、部署或公网改动;真实 E2E 合成记录按批准保留,未清理。
  • 工作提交:c14b40a(修复: 08-07-business-routing-regression-repair 关闭资产创建跳转回归);未 push、未部署。