50 行
2.6 KiB
Markdown
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。
|