# 采购与资产详情独立路由化 ## Goal 把采购、资产两个结构同构的业务台账从“列表页用 `?id=` 填充已有详情态”迁移为“纯列表查找、独立详情处理”,让详情可深链、浏览器返回可预测,并在切换对象时保留未保存保护。 ## Confirmed Facts - 报销、项目和审批任务已有独立详情路由,可作为仓库内成熟模式。 - 采购、资产都已经具有完整详情/编辑状态,并以列表页 `?id=`、本地 selected ID 和 searchParams 双向同步驱动。 - 采购、资产未发现首屏自动选中第一条记录;本任务是搬迁既有详情态,不新增业务信息结构。 - 两页都已使用 `useUnsavedChangesGuard`,路由迁移必须保留 dirty-form 取消与确认语义。 - 现有采购/资产 E2E 和人工 witness 多处直接访问 `?id=`,需要兼容重定向并同步结构化路由证据。 - 合同没有 selected ID 或详情态,属于从零建设详情页;已拆到 `08-05-contract-detail-workspace`。 - 完整差旅已冻结,`/travel-requests` 与差旅报销指南无关;其自动选中缺陷归入低风险子任务,不做路由化。 - 付款批次和请假继续保持既有页面边界,不纳入本任务。 ## Scope - 仅迁移采购、资产两个已有 `?id=` 详情态台账到独立实体详情路由。 - 包含列表纯化、详情页拆分、旧链接兼容、关联入口更新、权限 guard、返回/深链和 dirty-form 保护。 - 不新建合同详情信息结构,不恢复差旅,不改付款批次或请假页面。 ## Requirements - R1:`/purchase-requests` 与 `/assets` 只负责标题、创建入口、常用筛选、列表/卡片和进入详情,不渲染记录详情工作区。 - R2:采购与资产分别使用稳定的实体 ID 详情路由,支持直接打开、刷新、复制链接和浏览器返回;页面元数据识别详情层级。 - R3:只搬迁现有详情、编辑、附件、审计、状态动作和权限显隐,不新增合同式信息结构或改变业务能力。 - R4:从列表进入详情、从项目/通知/搜索等关联入口进入详情和返回列表时保留必要来源;浏览器后退不得直接跳出业务模块。 - R5:路由离开、返回或切换对象存在未保存修改时,必须沿用现有 dirty-form 保护;取消后保留原记录和输入。 - R6:旧 `/purchase-requests?id=`、`/assets?id=` 深链在过渡期重定向到新详情路由,并保留无关筛选参数;无效/无权限 ID 使用自然中文错误与安全返回入口。 - R7:权限 guard 与服务端数据范围保持不变;不得因拆分路由扩大可访问范围。 - R8:更新列表行、项目关联、全局搜索、审批/通知跳转和现有测试中的采购/资产详情链接,不继续产生新的 `?id=` 链接。 - R9:合同、差旅、付款、请假明确排除,不做顺手重构。 ## Acceptance Criteria - [ ] 采购和资产台账首屏均为纯列表,未选择记录时不渲染详情工作区。 - [ ] 两个模块都有可刷新、可复制、可直接访问的详情 URL,并具有正确标题、权限 guard 和安全错误态。 - [ ] 列表筛选来源可在详情返回后合理恢复,浏览器前进/后退行为可预测。 - [ ] 旧 `?id=` 链接兼容重定向到对应新路由,不出现静默空白、错误对象或丢失无关筛选条件。 - [ ] 编辑、附件、状态动作、审计和确认能力与迁移前等价,未保存保护覆盖返回和路由离开。 - [ ] 项目关联、搜索、通知/审批等仓库内入口不再生成新的采购/资产 `?id=` 详情链接。 - [ ] 合同、差旅、付款和请假代码不因本任务发生功能性修改。 - [ ] 聚焦 Playwright 覆盖两个模块的列表进入、深链刷新、返回恢复、旧链兼容、无权限/不存在、dirty-form 取消与确认。 - [ ] `cd client && npm run typecheck && npm run build`、相关现有 E2E 与 Trellis 门禁通过。 ## Out of Scope - 合同详情页或合同文件能力。 - 差旅、付款批次、请假详情路由。 - 后端状态机、权限模型、数据库 schema 或真实数据迁移。 - 全站所有配置页和移动端路由重写。 - 模块冻结、一级导航调整、功能下线或视觉换肤。 ## Test Plan - `cd client && npm run typecheck && npm run build` - 聚焦 Playwright 覆盖采购/资产列表进入、详情深链刷新、旧 `?id=` 重定向、筛选返回、无权限/不存在和 dirty-form 取消/确认。 - 更新并运行 `procurement-flow.spec.ts`、`assets-flow.spec.ts`、`r103-cross-page-ui-consistency.spec.ts` 及受影响的关联入口用例。 - 运行 `python3 ./.trellis/scripts/task.py validate 08-05-business-detail-routing`、process contract、docs registry、Trellis governance 和 `git diff --check`。