10 KiB
10 KiB
采购与资产详情独立路由化
Goal
把采购、资产两个已有业务台账从“列表页用 ?id= 填充详情态”迁移为“列表查找、独立详情处理”,让记录可深链、筛选可恢复、返回可预测;资产新建使用独立创建路由,避免把完整长表单重新塞回台账列表。
Confirmed Facts
- 报销、项目和审批任务已有独立详情路由与安全
state.from返回约定,可作为仓库内成熟模式。 - 采购、资产都已有完整详情/编辑能力,并以列表页
?id=、本地 selected ID 和 searchParams 双向同步驱动;本任务是搬迁既有信息结构,不重做业务详情。 - 采购“新建采购”会先创建草稿并取得实体 ID,因此创建成功后可直接进入
/purchase-requests/:purchaseRequestId,不需要采购新建路由。 - 资产“新增资产”在提交前只有本地长表单、没有实体 ID;历史任务已确认“新建资产卡片进入独立创建视图”,本轮采用
/assets/new。 - 两个列表的筛选目前主要存在组件本地 state;拆出详情后若不把可恢复筛选写入 URL,返回列表会丢失用户上下文。
- 两页都已使用
useUnsavedChangesGuard,路由迁移必须保留取消离开与确认离开的既有语义。 - 项目详情、全局搜索和 PC 通知仍存在旧采购/资产入口:项目详情生成采购
?id=,全局搜索依赖服务端href,PC 通知生成未被页面消费的highlight。 - 现有采购/资产 E2E 和人工 witness 多处直接访问
?id=,需要兼容重定向并同步结构化路由证据。 - 合同没有 selected ID 或详情态,属于从零建设详情页;已拆到
08-05-contract-detail-workspace。 - 完整差旅已冻结;付款批次和请假继续保持既有页面边界,均不纳入本任务。
Scope
- 仅迁移采购、资产两个已有
?id=详情态到独立实体详情路由,并新增资产独立创建路由/assets/new。 - 包含列表纯化、可恢复筛选 URL 化、详情/创建页拆分、旧链接兼容、现有前端关联入口更新、权限 guard、返回/深链和未保存保护。
- 资产列表保留现有资产分类管理等列表级工具;“纯列表”指不再承载某条资产或采购记录的详情/编辑工作区。
- 不新建合同详情信息结构,不恢复差旅,不改付款批次或请假页面。
Requirements
- R1:
/purchase-requests与/assets只承载标题、创建入口、可恢复筛选、列表/卡片、分页或现有列表级工具,不渲染单条记录详情工作区。 - R2:采购详情固定为
/purchase-requests/:purchaseRequestId,资产详情固定为/assets/:assetId;均支持直接打开、刷新、复制链接和正确页面元数据。 - R3:资产创建固定为
/assets/new,仅asset.manage可访问;创建成功后替换为新资产详情路由,浏览器返回不得重新进入已提交的创建表单。 - R4:采购状态、范围、供应商、公司、成本中心、页码,以及资产搜索、状态、类型、敏感级别、分类、公司、成本中心、归属人和范围等可恢复筛选以 URL 为事实源;无效值回落到安全默认,不扩大数据范围。
- R5:只搬迁现有详情、编辑、附件、审计、状态动作、资产流转和权限显隐,不新增合同式信息结构或改变业务能力。
- R6:从列表或资产创建页进入详情时保留经过校验的返回来源;从项目、全局搜索和通知等现有入口进入详情时使用新 URL。浏览器后退沿历史返回,显式返回在无安全来源时回到对应模块列表。
- R7:路由离开、显式返回、浏览器后退或跳转其他记录时存在未保存修改,必须沿用现有 dirty-form 保护;取消后保留当前 URL、记录与输入。
- R8:旧
/purchase-requests?id=<id>、/assets?id=<id>使用 replace 进入新详情路由,并把移除id后的安全列表查询保留为返回来源;空 ID 不触发详情,无效/无权限 ID 不泄露记录摘要。 - R9:详情 403/404 使用统一自然中文安全错误态,仅说明“记录可能不存在或无权查看”并提供返回列表入口,不区分可用于资源枚举的敏感细节。
- R10:新列表、详情和创建路由沿用现有权限与服务端数据范围;资产
/assets/new使用比资产列表更窄的asset.manageguard,不得把列表可见权限误当创建权限。 - R11:采购创建成功、采购/资产列表行、项目关联、全局搜索结果解析、PC 通知解析和受影响测试改用统一的采购/资产详情路径构造;
client/src不再新增业务性的采购/资产?id=或highlight详情链接,兼容入口除外。 - R12:合同、差旅、付款、请假明确排除,不做顺手重构;移动采购详情保持现状,资产 PC 新路由在移动工作台偏好环境中仍安全回落到既有移动资产扫码页。
Acceptance Criteria
/purchase-requests与/assets首屏均为列表态,且不请求单条记录详情;资产分类管理等现有列表级工具仍可用。/purchase-requests/:purchaseRequestId与/assets/:assetId可直接访问、刷新和复制,页面标题、导航激活、权限 guard 与安全错误态正确。/assets/new展示现有资产创建表单,非asset.manage用户不能直接访问;创建成功后 URL 变为/assets/:assetId,返回不会回到已提交表单。— PAUSED:路由、权限与静态优先级已在 Chromium 通过;真实创建成功与历史栈因既有本地数据库列缺失未执行。- 采购和资产的全部可恢复列表筛选可由 URL 还原;列表进入详情再返回时筛选、范围和采购页码保持一致,筛选变更不会污染浏览器返回历史。
- 旧
?id=链接 replace 到对应新详情路由,返回时不丢失移除id后的安全筛选;空 ID 留在列表,无效或无权限 ID 不出现空白、错误对象或敏感摘要。 - 编辑、附件、状态动作、审计、资产流转和确认能力与迁移前等价,未保存保护覆盖详情返回、创建取消、浏览器后退和跨路由离开。— PAUSED:mock 路由与未保存保护已通过;真实采购附件/状态及资产流转等价回归受本地数据库缺口阻塞。
- 采购创建成功直接进入新详情;项目关联、全局搜索和 PC 通知中的采购/资产记录均进入新详情 URL,不再依赖未消费的
highlight。— PAUSED:项目、搜索与通知入口已验证;真实采购创建成功链路受本地数据库缺口阻塞。 /assets/new不被动态资产详情路由当成assetId,详情路由不加载完整列表,列表路由不加载详情。- 移动采购详情路由不回退;移动工作台偏好环境访问资产列表、详情或创建 URL 时继续进入既有
/mobile/assets/scan,不新增移动资产详情能力。 - 合同、差旅、付款和请假代码不因本任务发生功能性修改;后端 endpoint、payload、权限/数据逻辑和数据库均不改变。
- 聚焦 Playwright 覆盖列表进入、筛选深链、详情刷新、返回恢复、旧链兼容、资产创建、无权限/不存在、dirty-form 取消与确认,以及项目/搜索/通知入口。— PAUSED:29 项 mock Chromium 回归已通过;真实资产创建和完整业务链仍受本地数据库缺口阻塞。
cd client && npm run typecheck && npm run build、相关现有 E2E、任务校验与 Trellis 门禁通过。— PAUSED:类型、构建、mock E2E 与全部治理门禁已通过;procurement-flow、assets-flow和真实权限直连用例未能在当前本地数据库执行。
Out of Scope
- 合同详情页或合同文件能力。
- 差旅、付款批次、请假详情路由。
- 采购独立新建路由;采购继续先创建草稿再进入详情。
- 新移动资产详情页、移动资产创建页或移动导航重写。
- 后端 API endpoint/payload、状态机、权限模型、数据库 schema 或真实数据迁移。
- 模块冻结、一级导航调整、功能下线、详情信息架构重做或视觉换肤。
Test Plan
cd client && npm run typecheck && npm run build- 聚焦 Playwright 覆盖采购/资产筛选 URL、列表进入详情、深链刷新、显式返回与浏览器后退、旧
?id=replace、无权限/不存在和 dirty-form 取消/确认。 - 覆盖
/assets/new的权限、未保存取消、创建成功 replace、new静态路由优先级,以及采购创建成功后的详情导航。 - 更新并运行
procurement-flow.spec.ts、assets-flow.spec.ts、r103-cross-page-ui-consistency.spec.ts、pc-detail-mobile-visual-wave3.spec.ts、global-search.spec.ts、通知链接与移动路由受影响用例;必要时增加聚焦路由合同 spec。 - 用代码搜索确认
client/src中业务入口不再产生采购/资产?id=或highlight详情链接,只保留明确命名的兼容解析逻辑。 - 运行
python3 ./.trellis/scripts/task.py validate 08-05-business-detail-routing、node scripts/qa/check-process-contract.mjs --baseline --json、node scripts/qa/audit-docs.mjs --check-registry、node scripts/qa/check-trellis-governance.mjs和git diff --check。
Post-Archive Delta · 2026-08-07
- 原资产创建验收项继续保留当时的
PAUSED标记与发现时间线;迁移基线恢复后,真实 API 回归证明该项曾被证伪:POST 已成功返回实体 ID,但/assets/new的同步navigate被共享未保存保护拦截。 - 后续任务
08-07-business-routing-regression-repair已修复该产品回归:新增仅限服务端保存成功后的单次 post-save 导航放行,资产创建先replace到/assets/:assetId,再后台失效缓存;普通 dirty navigation、失败路径和权限边界未改变。 - 2026-08-07 有效验证:聚焦未保存保护 mock 用例
1 passed / 0 failed / 0 skipped;真实assets-flow.spec.ts与procurement-flow.spec.ts合计2 passed / 0 failed / 0 skipped。资产链路覆盖创建详情跳转、无未保存弹窗、后退/前进及后续流转。 - 采购主链路中的英文
Employee断言已改为 fixture 中文姓名;同次真实回归发现的视口/筛选控件测试漂移也仅在目标 E2E 文件内做了最小同步,不代表产品范围扩张。 - 本 delta 不把历史
PAUSED记录倒写为当时已通过;企业微信真机、生产/公网和其余独立会话夹具问题仍按原边界处理。