10 KiB
10 KiB
审批动作面板 KISS 收敛与层叠遗留清理
Goal
收敛 PC 报销审批右栏:正常状态只保留决策动作和按需展开的理由输入,异常状态在禁用动作紧邻上方解释阻断原因;同时删除已无产品消费者的旧“更多”层叠 CSS 与漂移断言。保持预算快照三态、转审入口、通用审批页面和所有业务行为不变,以最小改动形成一个候选、一次部署。
Background and Confirmed Facts
- 生产
d63ccdf77c60的报销审批右栏仍显示“节点 / 状态 / 审批角色 / 完整内容已就绪”。处理历史已位于右栏动作之后,状态已由报销页头StatusBadge表达,审批角色属于权限实现细节;正常 readiness 不需要解释。 ReimbursementApprovalAdapter.tsx:283构造固定statusSummary,在:428传给BusinessDetailActionPanel.summary。BusinessDetailActionPanel已能识别空节点,但调用方仍应以null/省略明确表达无摘要,避免休眠 UI 路径。- 预算快照提示已经只在
snapshot?.budgetCheckStatus === "missing"时出现;available与not_applicable不提示。本任务只补负向保护,不修改判断。 - 内容未加载、快照解析失败、离线、金额 mismatch 或金额 unavailable 时,报销审批已有 fail-closed;当前成功/失败 readiness 位于动作后的 summary,失败原因需要移到禁用动作紧邻上方。
- 历史提交
94f1bad为原生<details class="workflow-action-more">的“更多”浮层增加.workflow-action-panel { relative z-30 },并以.workflow-action-more的绝对定位和 z-index 防遮挡。 - B-2b 提交
abdd250已删除两个审批页的<details>/“更多”菜单。当前BusinessDetailActionPanel.moreActions只平铺调用方传入的“转审”按钮;产品代码没有.workflow-action-panel或.workflow-action-more消费者。 - 因当前不存在菜单或浮层,本任务不需要菜单展开/层叠测试。
.workflow-action-panel和整组.workflow-action-moreCSS 已成为死代码;paymentProcessingProgress.test.js:137与 wave3 对旧 class/CSS 的正向断言属于测试漂移。 - 既有 spec 写有“转审默认进入更多”,而当前实现为常驻按钮。转审是否被真实使用、应保持常驻、进入更多或按条件隐藏,是独立产品判断;本任务只登记,不改变当前入口。
Scope
- 删除 PC 报销审批动作面板的三行重复元数据和正常 readiness 文案。
- 将各类 fail-closed 原因移到禁用动作紧邻上方,保持原因准确且与二次拦截一致。
- 保持预算快照
missing逻辑不动,补available/not_applicable负向断言。 - 删除
.workflow-action-panel、.workflow-action-more整组死 CSS 及对应漂移断言。 - 静态/合成复核请假、补卡、采购、差旅通用审批页在删除死 CSS 后视觉和动作可达性无变化。
Requirements
R1 正常报销审批右栏只保留决策内容
- PC 报销审批动作面板不得显示“节点:…”“状态:…”“审批角色:…”或“完整内容已就绪”。
- 无异常、无展开编辑器且决策已就绪时,只显示现有动作,不增加“0 项”“一切正常”或系统说明。
- 报销 adapter 不再构造
statusSummary,并对BusinessDetailActionPanel.summary显式传null或省略;动作区不得留下空 summary 容器、分隔线或 padding。 - 报销页头状态和右栏处理历史保持原位置,不为删除的三行另找位置重复展示。
- “退回 / 驳回 / 转审”继续按现有点击行为渐进展开理由/目标输入;不得新增常驻审批意见框。
R2 fail-closed 原因紧邻禁用动作
- 内容未加载完整、提交快照无法解析、离线、权威总额不一致、明细金额无法解析五类情况继续使通过、退回、驳回、转审 fail-closed,并保留 handler 二次拦截。
- 阻断提示必须位于对应禁用动作组的紧邻上方,在同一动作卡或同一失败卡中,无需到主列或右栏其他区块寻找原因。
- 内容查询失败使用“报销内容未加载完整,暂不能审批,请刷新后重试”;快照、离线、mismatch、unavailable 继续使用各自准确原因,不得统一成模糊的“内容未就绪”。
- 展示提示与 handler 二次拦截应由同一阻断原因投影产生,避免两个位置口径漂移;不增加或删除
decisionReady条件。 - 正常 ready 不显示阻断或成功提示,四类动作按原 allowedActions 与权限可用。
R3 预算快照三态保持原合同
budgetCheckStatus === "missing"时继续显示一次“该次提交未留存预算快照”。available与not_applicable必须保持零预算缺失提示,不得因本轮条件收敛被误判。- 预算提示位置、快照解析和费用/预算业务口径均不修改。
R4 删除无消费者的旧层叠实现
- 删除
.workflow-action-panel规则和.workflow-action-more及其summary/open/button子规则,不保留“以防万一”的休眠样式。 - 更新
server/tests/unit/services/paymentProcessingProgress.test.js:137和client/tests/e2e/pc-detail-mobile-visual-wave3.spec.ts:1252,删除对旧 class/CSS 的正向要求;继续验证BusinessDetailActionPanel的既有 sticky 合同。 - 产品代码、CSS 和结构测试中
.workflow-action-panel、.workflow-action-more的定义/消费应为 0。 - 不补回 class,不新增 DropdownMenu,不恢复“更多”菜单,也不改变当前常驻“转审”按钮。
R5 通用审批页只做无变化回归
- 请假、补卡、采购、差旅仍由通用审批页渲染,1280px 下详情、处理历史和动作面板正常可见,无横向溢出或遮挡。
- 因四类页面当前都不消费被删 CSS,只需静态零消费者证明和代表性合成页面回归;不要求不存在的菜单展开态或顶部/滚动中段十态测试。
- 不修改通用审批页 JSX、动作排列、摘要、权限或 mutation。
R6 交付与业务边界
- 以上改动形成一个候选、一次部署;提交后 diff 复核、push/provenance 和部署后复核按既有门禁连续推进,但不得省略任何门禁。
- 切换前运行
check-ui-design-rules --strict;部署后核公网 build marker、文案、正常/失败报销动作面板及四类通用审批。 - 不修改 API、workflow、权限、状态机、schema、migration、feature flag、seed 或生产数据。
- 本任务不替代
0016/0017/0018员工重提与财务复审;父任务 AC11 继续开放。
Acceptance Criteria
- AC1:PC 正常报销审批右栏不包含“节点 / 状态 / 审批角色 / 完整内容已就绪”,动作区无空 summary 容器或分隔线;adapter 静态证明
statusSummary已删除且 summary 为null/省略。 - AC2:正常报销无 readiness 解释且四动作按权限可用;五类 fail-closed fixture 均显示准确原因,原因位于禁用动作紧邻上方,按钮禁用和 handler 二次拦截同时成立。
- AC3:预算
available/not_applicable零缺失提示,只有missing显示一次既有文案;实现中的三态判断未改。 - AC4:产品代码、CSS 和结构测试中
.workflow-action-panel、.workflow-action-more定义/消费均为 0;付款进度既有失败消失,sticky 动作面板合同仍有有效断言。 - AC5:请假、补卡、采购、差旅在 1280px 合成详情中摘要、历史和动作面板正常,无横向溢出/遮挡;其页面产品代码 diff 为 0。
- AC6:报销处理历史位置、正文、退回引用、B2 未归属恢复、移动审批、离线 fail-closed 和当前转审入口均无回归。
- AC7:通过 typecheck/build、相关 Playwright、
paymentProcessingProgress.test.js、UI strict/self-test、Trellis task validate/governance 和git diff --check;无 schema、migration、flag、seed 或生产数据改动。
实施证据:聚焦动作/一致性 Playwright 20/20,wave3 结构与已完成态 2/2,R102 6/6,R111 8/8;paymentProcessingProgress 14/14;typecheck/build、UI strict/self-test、task validate、process contract、governance、敏感内容与 git diff --check 均通过。移动离线专项 3 项因本机缺少 Playwright WebKit 可执行文件未进入产品流程,沿用既有环境边界,故 AC6/AC7 留待具备 WebKit 的门禁或部署复核收口。
Test Plan
- 结构:报销 adapter 无四类正常态解释和
statusSummary;summary 无空 DOM;旧 class/CSS/断言零残留;通用审批页源文件无改动。 - 报销:正常 ready 负向断言;五类失败的原因顺序、四动作禁用与 handler 二次拦截;退回引用和转审现状回归。
- 预算:
missing正例,available/not_applicable负向断言。 - 通用审批:请假、补卡、采购、差旅 1280px 合成页面可见性、动作可达和无横向溢出;不执行不存在的菜单展开测试。
- 工程:前端 typecheck/build、相关 Playwright、付款进度聚焦测试、UI strict/self-test、task validate、process contract、Trellis governance 和
git diff --check。 - 部署后:
/ready、bundle marker、0 公网文案 findings;正常报销零解释/动作可用、失败原因邻近动作;四类通用审批正常;B2 与三张 rejected 单据只读状态不变。
Risks and Deferred Items
BusinessDetailActionPanel是共享组件;若为阻断原因增加动作前插槽,必须保持未注入该插槽的现有消费者 DOM 顺序不变。- 转审入口与现行 spec 存在漂移,但没有真实使用证据支持“恢复更多”或“隐藏”。另行确认转审使用记录后,再在独立产品任务中决定:保持常驻、进入更多或按条件隐藏。
- 通用审批页为密集 JSX;本任务不借静态回归顺手格式化或重构。
Out of Scope
- 新增或恢复“更多”菜单、Radix DropdownMenu 或任何浮层。
- 改变转审可见性、权限、理由规则、确认流程或 mutation。
- 修改通用审批页布局/摘要/动作,或重做移动端动作区。
- 重做处理历史、报销正文、预算判断、金额完整性或 B2 门禁。
- 处理
--no-deps、.gitignore、错误色 token 或其他技术债。