实现 B-2b 统一报销工作台迁移(reimbursement-form-shared-component-migration)
这个提交包含在:
@@ -1,22 +1,68 @@
|
||||
# Implementation Plan:B-2b 报销填写态共享组件迁移
|
||||
# Implementation Plan:B-2b 统一报销工作台迁移
|
||||
|
||||
## Entry Gate
|
||||
## Before Development
|
||||
|
||||
- [ ] B-2a 已部署并取得至少一次真人审批反馈。
|
||||
- [ ] 回填本任务最终 drawer/sheet 交互与字段顺序。
|
||||
- [ ] 用户重新批准更新后的 B-2b planning summary。
|
||||
- [x] 用户批准最新 `prd.md`、`design.md`、`implement.md`。
|
||||
- [x] 切换当前 Trellis task 到 B-2b 并运行 `task.py start`;实施前加载 `trellis-before-dev`。
|
||||
- [x] 读取 frontend、approval workflow、reimbursement/OCR、security/privacy、code reuse 与 route manifest 规约。
|
||||
- [x] 冻结现有 PC/移动三模式、权限/状态、路由/返回和打印页回归矩阵。
|
||||
- [x] 记录 B-2a 当前 DOM/test-id、公共 projection、IndexedDB 投影与可回滚提交基线。
|
||||
|
||||
## Planned Sequence
|
||||
## Implementation Order
|
||||
|
||||
1. [ ] 为 B-2a 共享组件接入 edit capability,保持 review/readonly 零维护动作。
|
||||
2. [ ] PC 填写态迁移明细、票据和就近检查。
|
||||
3. [ ] 移动填写态迁移相同语义结构与安全区操作。
|
||||
4. [ ] 接入票据抽屉和未归属票据恢复。
|
||||
5. [ ] 接入提交前摘要与服务端错误就近定位。
|
||||
6. [ ] 删除被替代的旧明细/材料/只读展示分支。
|
||||
7. [ ] 完成状态/权限矩阵、全量前端门禁和独立部署验证。
|
||||
1. [x] 先在 `scripts/qa/check-ui-design-rules.mjs` 建立 error 级结构门禁:PC/移动布局壳禁止 query/mutation/API/role/status/mode 请求分支;通用审批页最终禁止报销业务渲染;旧分支允许清单仅覆盖分派器,并补 self-test。
|
||||
2. [x] 抽取统一报销头、异常模型、快照/实时差异和三模式共享展示 projection 纯函数;补正常/异常/缺失边界测试。
|
||||
3. [x] 建立无业务状态的 PC/移动布局壳,共享模型、区块顺序、`ReimbursementItemEvidenceList` 与 capability 合同;PC 实现右栏 sticky,移动实现卡片 + 底部安全区,不复用同一 DOM 或引入 `isMobile` 业务分支。
|
||||
4. [x] 在 PC/移动 task route 建立唯一 task detail 查询和授权后实体分派;把同一 query result/refetch 入口移交渲染器,报销进入 approval adapter,非报销继续通用详情;避免重复 task 查询和通用页闪现。
|
||||
5. [x] 建立 approval adapter:消费已移交的 task detail,另取实时报销 detail,迁移 allowedActions、快照、task 刷新策略、fail-closed、退回引用、材料查看与 IndexedDB/离线合同。
|
||||
6. [x] 删除 `WorkflowTaskDetailPage` 与 `MobileApprovalsPage` 的报销业务内容、检查、右栏摘要和休眠兜底;立即跑非报销审批回归。
|
||||
7. [x] 建立 readonly adapter,把获准只读报销详情、材料查看和处理进度接入同一工作台,不请求参与人 precheck,不注入 mutation。
|
||||
8. [x] 建立 edit adapter,迁移表头/明细/票据/附件维护、票据抽屉、未归属恢复、提交前检查和 B2 阻断后再次提交;所有能力通过 capability 注入。
|
||||
9. [x] 删除 PC/移动旧明细表格、旧报销材料分组和被替代 helper/test fixture;确保最终候选无双实现或 feature flag 兜底。
|
||||
10. [x] 落实七条信息收敛:紧凑头、唯一事由、正常项隐藏、异常就近、差异条件显示、右栏去重、动作解释按需;补可访问性和锚点/focus 回归。
|
||||
11. [x] 回归 `/reimbursements/:id/print`,证明打印页未被工作台拆分误伤且没有获得交互 mutation。
|
||||
12. [x] 更新与新合同冲突的父任务、frontend/approval/reimbursement spec 或产品事实源;不顺带处理无关治理债。
|
||||
|
||||
## Rollback
|
||||
## Verification Matrix
|
||||
|
||||
- 独立于 B-2a 形成候选与回滚点。
|
||||
- 不改变 B2 服务端门禁或既有票据关联数据;代码回滚恢复旧填写 UI,不删除业务数据。
|
||||
### Structural
|
||||
|
||||
- [x] `check-ui-design-rules.mjs --strict` 对 PC/移动壳中的 `useQuery|useMutation|api/|roleCodes|hasPermission|workflow status|reimbursement status|mode ===` 命中报 error(仅显式视觉 allowlist 可例外),并由 self-test 证明规则有效。
|
||||
- [x] task route 每次详情加载只发一份授权 task detail 查询;approval adapter 复用该结果和 refetch 入口,不产生同 key 重复请求。
|
||||
- [x] 三适配器 capability 快照准确:edit 有维护/提交、approval 有查看/引用/决策、readonly 只有查看。
|
||||
- [x] 通用 PC/移动审批详情不再导入报销证据组件或包含报销摘要/检查文案;唯一 `reimbursement` 判断位于授权分派层允许清单。
|
||||
- [x] 旧明细表/材料布局与休眠测试 fixture 删除,没有双实现 flag。
|
||||
|
||||
### Behavior
|
||||
|
||||
- [x] PC/移动 edit:draft/rejected 新增/编辑/删除明细、PDF 发票上传/选择、关联/解绑、未归属恢复、附件维护、提交预检、B2 阻断、修复后再次提交。
|
||||
- [x] PC/移动 readonly:参与人 reviewing 与非参与人获准查看;无维护、无审批能力;材料权限/审计不变。
|
||||
- [x] PC/移动 approval:pending/已处理、快照 ready/missing/invalid、detail failure、材料单项 failure、退回引用、approve/return/reject/transfer 和联网 fail-closed。
|
||||
- [x] 非报销 workflow:请假、补卡、采购、差旅通用详情和移动离线草稿保持基线。
|
||||
- [x] 路由:列表进入、通知深链、刷新、后退、移动分流、无权 403/不泄露、无返回循环。
|
||||
- [x] 信息:正常 fixture 无“0 条”检查/常驻动作解释;异常 fixture 每项都有对象、原因、影响、下一步和可聚焦锚点;只有快照/实时不一致时出现差异。
|
||||
|
||||
### Commands
|
||||
|
||||
- [x] 相关前端单元/组件/Playwright;`cd client && npm run typecheck && npm run build`。
|
||||
- [x] `node scripts/qa/check-ui-design-rules.mjs --strict` 与 `--self-test`。
|
||||
- [x] route manifest/candidate gate、相关后端 B2/workflow/detail/material tests、`cd server && npm run prisma:validate`。
|
||||
- [x] `python3 ./.trellis/scripts/task.py validate 09-01-reimbursement-form-shared-component-migration`。
|
||||
- [x] `node scripts/qa/check-process-contract.mjs --baseline --json`、`node scripts/qa/check-trellis-governance.mjs`、敏感内容检查、docs registry(如需)、`git diff --check`。
|
||||
- [x] 因涉及 workflow 分派、权限/状态和报销动作,实施后执行只读 review;inline 模式由主会话完成,不派发 implement/check 子代理。
|
||||
|
||||
验证说明:移动离线专项的默认 iPhone 设备配置会选择本机未安装的 WebKit;本轮按既有口径改用 Chromium + iPhone 视口执行,3/3 通过。该结果验证 IndexedDB、离线分流和 fail-closed 合同,不替代 Safari/WebView 渲染验收。
|
||||
|
||||
## Commit and Deployment Boundary
|
||||
|
||||
- [ ] 代码检查通过后按中文 task 引用提交;task 元数据回填独立提交,不 amend。
|
||||
- [ ] 未经明确授权不 push、不部署、不写生产数据。
|
||||
- [ ] 部署候选无 migration/schema/flag/seed;使用既有生产入口与独立回滚基线。
|
||||
- [ ] 公网用合成三模式任务验证,不碰 `0016/0017/0018` 或其他真人单据。
|
||||
- [ ] 部署与真人反馈完成前,B-2b 和父任务都不得归档。
|
||||
|
||||
## Rollback Points
|
||||
|
||||
- 适配器接线或非报销回归失败:停止在本地,不删除旧分支,修正后重新验证。
|
||||
- 最终旧分支删除后检查失败:回到本任务候选前提交,不引入运行时双轨 flag。
|
||||
- 公网验收失败:回滚到 B-2a 生产基线,保留数据库与业务数据不变。
|
||||
|
||||
在新工单中引用
屏蔽一个用户