文件
hyb-oa/.trellis/tasks/09-03-approval-action-panel-kiss-layering/design.md
T

50 行
2.6 KiB
Markdown

# Design:审批动作面板 KISS 收敛与层叠遗留清理
## 1. Scope Boundary
保持页面壳、workflow API、allowedActions、权限、mutation、确认弹窗、转审入口和移动端行为不变。产品代码只允许修改报销审批 adapter、共享动作面板的最小展示插槽和旧 CSS;通用审批页不得产生产品代码 diff。
## 2. Action-Adjacent Blocking Notice
`BusinessDetailActionPanel` 增加可选的动作前展示插槽,例如 `beforeActions?: ReactNode`,渲染顺序为:
```text
title/status
beforeActions(异常锚点 + 阻断原因;空则不渲染)
primary / secondary / more actions
children(点击后展开的理由或转审输入)
summary(其他业务页现有摘要)
```
插槽只负责布局,不读取 mode、角色、权限或 readiness。它使用既有 `hasVisibleNode` 逻辑,未传插槽的消费者 DOM 顺序不变。
报销 PC adapter 删除 `statusSummary`,使用:
```tsx
beforeActions = issueAnchors + decisionBlockNotice
summary = null
children = actionError + active action editor
```
正常 ready 时 `decisionBlockNotice=null`。模型尚未形成的早退失败卡继续维持“原因 → 禁用动作”顺序。
## 3. Single Blocking-Reason Projection
在报销 adapter 内从既有 readiness 事实投影唯一主因:离线、金额完整性异常、快照解析失败、详情查询失败/加载中。金额继续复用 `reimbursementAmountIntegrityMessage`;详情查询失败使用新批准文案。
展示和 `requestAction`/mutation 二次拦截复用同一原因函数或值,不改变 `decisionReady` 条件,避免按钮说明与实际拦截漂移。
## 4. Budget Snapshot Compatibility
预算快照提示仍只由 `snapshot?.budgetCheckStatus === "missing"` 控制,不并入新的 readiness 文案投影。测试固定 `missing` 正例与 `available/not_applicable` 负例;不修改费用政策、预算或快照数据流。
## 5. Dead Layering Cleanup
删除 `.workflow-action-panel` 和完整 `.workflow-action-more` CSS。两者没有产品消费者,删除不会改变当前 DOM。付款进度单测和 wave3 结构测试移除旧 class 正向断言,保留对共享动作面板 `lg:sticky lg:top-24` 的有效合同。
不创建 Radix 菜单,不进行菜单展开测试。四类通用审批用现有合成 fixture 验证页面/动作可见和无横向溢出即可。
## 6. Rollout and Rollback
报销减法、邻近阻断提示、死 CSS 和测试更新作为一个候选。部署前 UI strict;部署后用公网真实 bundle + 合成 API 复核正常/失败报销和四类通用审批。失败时整体回滚到 `d63ccdf`,不操作数据、migration 或 flag。