# 实施计划:审批退回驳回语义与动作布局 ## 实施顺序 1. 为 `listAllowedActionsForTask` 增加实体动作矩阵,报销不再宣告 reject,其他四类保持现状。 2. 更新服务端聚焦测试,覆盖五类实体的正向与负向 allowedActions,并保留 reject/return endpoint 的兼容测试。 3. 收敛 `ReimbursementApprovalAdapter` 的 PC 动作组:通过与退回修改同组,删除报销可见驳回入口,转审不动。 4. 收敛移动报销 sticky action bar:退回修改与通过并列;退回意见、引用清单和确认仍渐进展开;删除离线时强制渲染驳回的旧分支。 5. 更新报销 PC/移动 E2E fixtures 和断言:无驳回、动作同组、退回展开、fail-closed、离线禁用、历史 rejected 兼容。 6. 回归通用审批页的请假、补卡、采购、差旅动作集合与确认流程,确认共享组件 DOM 未漂移。 7. 仅在稳定合同确有变化时更新 `docs/需求-统一审批中心规约.md` 与 `.trellis/spec/hyb-oa/approval-workflow.md`,明确报销用“退回修改”、其他实体按后果保留驳回。 ## 风险文件 - `server/src/routes/workflow.js`:共享工作流动作投影,必须覆盖五类实体。 - `client/src/pages/reimbursement-workspace/ReimbursementApprovalAdapter.tsx`:PC/移动和离线分支集中,不能误删 return 引用能力或 fail-closed。 - `client/src/pages/MobileApprovalsPage.tsx`:通用移动审批回归面,原则上不改。 - `client/src/components/patterns/BusinessDetailTemplate.tsx`:共享动作面板,原则上不改。 - `client/src/lib/workflowActionConfirm.ts`:通用后果文案,原则上不改;报销仅不再进入 reject 分支。 ## 验证命令 ```bash cd server && npm run prisma:validate cd server && node --check src/routes/workflow.js cd server && npm test -- tests/unit/routes/workflow.permissions.test.js tests/unit/routes/workflow.batch.test.js tests/unit/routes/workflow.travel.test.js cd server && npm test -- tests/unit/routes/reimbursements.detail.test.js tests/unit/routes/reimbursements.invoice-item-link.test.js cd client && npm run build cd client && npx playwright test tests/e2e/reimbursement-content-consistency.spec.ts --workers=1 --reporter=list cd client && npx playwright test tests/e2e/workflow-action-confirm-ui.spec.ts --workers=1 --reporter=list cd client && npx playwright test tests/e2e/mobile-approvals-offline.spec.ts --grep '报销证据不进入 IndexedDB' --workers=1 --reporter=list node scripts/qa/check-ui-design-rules.mjs --strict node scripts/qa/check-ui-design-rules.mjs --self-test node scripts/qa/check-process-contract.mjs --baseline --json node scripts/qa/audit-docs.mjs --check-registry node scripts/qa/check-trellis-governance.mjs python3 ./.trellis/scripts/task.py validate 09-04-approval-return-reject-actions git diff --check ``` ## 验证结果 - Prisma schema 与 `workflow.js` 语法检查通过。 - 服务端动作矩阵、旧 reject 兼容及四类非报销回归共 24/24 通过;历史报销详情与 rejected 可维护证据回归 48/48 通过。 - 前端 typecheck、生产构建通过;报销静态契约 9/9、审批动作浏览器回归 11/11 通过。 - 移动报销离线专项未进入断言:本机缺 Playwright WebKit executable;保留为环境边界,不记为产品失败,也未安装新浏览器或更改测试配置。 - UI strict 扫描 155 文件、0 findings;self-test PASS。 - process contract、Trellis governance、task validate 与 `git diff --check` 通过。 - docs registry 审计为 0 error / 1 warning;warning 为仓库既有 22 个未注册 docs 文件,本任务未新增该类文件。 ## 人工验收 1. PC 报销审批右栏:通过与退回修改同组、无驳回、转审位置不变;1280px 无溢出。 2. 移动报销审批:底部直接显示退回修改与通过;点击退回后才展开意见与引用清单。 3. 任一报销 fail-closed fixture:原因紧邻动作,所有可见动作均禁用。 4. 历史 rejected 报销仍显示已驳回、仍可修改重提;历史 timeline/打印无丢失。 5. 请假、补卡、采购、差旅各打开一个:动作数量、文案和确认流程无变化。 ## 提交与部署边界 - commit 使用中文并引用 `09-04-approval-return-reject-actions`。 - 实施后先做只读 review;用户批准后才能提交。 - push、生产部署和生产数据检查均需分别获得明确授权。 - 无 migration/schema/seed/flag/生产数据写入;回滚到上一构建即可。