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