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

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-more CSS 已成为死代码;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 或其他技术债。