2026-07-23-oa-or-and-sign-display-design.md 7.5 KB

OA 或签 / 会签 · 审批进度与 PDF 展示设计

项 内容
状态 已确认
日期 2026-07-23
范围 web-admin 审批详情「审批进度」、打印 PDF「审批流程」中多人节点(signMode=or\|and)
Demo docs/mockups/oa-or-and-sign-progress-display-demo.html
关联 2026-07-15-oa-approval-progress-timeline-design.md(同节点展示修订);2026-07-15-oa-approval-print-pdf-design.md(流程行内容修订)

1. 背景

流程设计器审批节点支持 或签(signMode=or)与 会签(signMode=and)。引擎侧同节点多人已合并为一张进度卡(build_progress_items → people[]),但:

  1. 界面「审批进度」主要靠 chip + 节点级 commentText 拼接,未按人展开「姓名 意见 时间」。
  2. 打印 PDF「审批流程」将多人姓名逗号拼接成一行,意见未按人分行。
  3. 旧进度设计曾写「同节点一人一条、不合并」;实现已改为合并卡片,本文件以合并卡片 + 卡内文本行为准,废止旧文「一人一条独立节点」对该场景的约束。

产品期望(已确认):

  • 或签:未批展示全部候选人;一人审批后高亮实际操作人,其余人仍列出但不高亮(文案「无需处理」)。
  • 会签:始终展示全部人;每人审批信息都要可见。
  • 行格式统一为纯文本,不要表格列表头。

2. 目标与非目标

目标

  • 界面与 PDF 对多人节点使用同一套行语义。
  • 或签 / 会签差异仅体现在高亮与「无需处理 / 待处理」文案,不拆成两套组件模型。
  • 复用现有 progress[].people[](nickName / status / commentText / timestamp),优先前端拼装;后端仅在字段缺失时补齐。

非目标

  • 不改变或签/会签引擎收口规则(一人通过取消同节点 pending → done 等)。
  • 不改造发起页「审批流程」预览(仍为配置态 chip)。
  • 不引入「一人一条独立时间轴节点」回退。
  • 不加签、转交等其它操作类型的专用版式(可后续扩展同一行格式)。

3. 统一行格式(SHALL)

每人一行,空格分隔,无表头、无多列表格:

情形 行文案
已处理(同意 / 拒绝 / 打回等) {姓名} {审批意见} {审批时间}
尚未处理 {姓名} 待处理
或签免处理(任务 done 等) {姓名} 无需处理

规则:

  1. 审批意见:取该人 commentText。若已处理且意见非空 → 中间段用意见原文。若已处理但意见为空 → 中间段用状态文案(已同意 / 已拒绝 / 已打回),例如 甲 已同意 2026-07-23 10:05:00。禁止空意见导致 甲 2026-07-23… 双空格歧义。
  2. 审批时间:取该人操作时间(timestamp / 任务 updateTime);未处理、无需处理不写时间。
  3. 姓名:nickName,缺省回退 userId。
  4. 多行顺序:与 people[] 顺序一致(树序任务组内顺序)。

示例:

甲 同意 2026-07-23 10:01:00
乙 无异议 2026-07-23 10:20:00
丙 待处理

或签一人已批:

甲 同意,材料齐全 2026-07-23 10:05:00
乙 无需处理
丙 无需处理

4. 按签批模式的展示规则(SHALL)

4.1 或签(signMode=or)

节点状态 节点卡 人员行
进行中(无人已操作) 徽章「或签」+「进行中」;chip 均可为待处理高亮 每人 {姓名} 待处理(界面可用 chip 代替行,或 chip + 行二选一;PDF 必须出行)
已有人同意/拒绝/打回 节点总状态按聚合;实际操作人 chip 高亮,其余 chip 灰显 操作人完整行;其余 {姓名} 无需处理(必须仍列出,选项 A 已确认)

高亮定义:

  • 高亮:实际产生审批结果的人(approved / rejected / returned 等)。
  • 不高亮:同节点被或签取消的人(done / 文案「无需处理」),灰显。

4.2 会签(signMode=and)

节点状态 节点卡 人员行
未批 / 部分 / 完成 徽章「会签」+ 聚合状态;可选「n/m 已处理」 始终每人一行;已批写意见+时间,未批写「待处理」

会签不出现「无需处理」(除非引擎另有取消语义;当前会签应等人人处理)。

4.3 单人节点

people.length === 1 时仍可用同一行格式;可不强制展开,允许沿用今日 chip + 节点级意见(实现宜统一走行格式,减少分支)。


5. 作用面

5.1 界面 · 审批进度

  • 组件:web-admin/src/components/oa-approval/OaProgressChain.vue
  • 节点标题行:保留节点名、或签/会签徽章、节点状态、(可选)chip。
  • 节点下方新增 person-lines 区域:按 §3 渲染纯文本行;已处理行可用主色字重,待处理琥珀,无需处理 muted。

5.2 打印 PDF · 审批流程

  • 组装:web-admin/src/utils/oa-approval-print.ts → buildFlowItems
  • 模板:OaApprovalPrintSheet.vue(或等价渲染)
  • 每个多人任务节点:
    • 标题行仍可:【节点名·或签|会签】 {节点状态}
    • 正文:§3 多行文本(替换「姓名逗号拼接 + 单条 comment」)
  • 抄送聚合行、发起人行、终态行规则不变。

5.3 数据

  • 权威:GET 实例详情 progress 中 kind=task|pending_node 的 people[]。
  • 后端 build_progress_items 已写入每人 status / commentText / timestamp;实现时核对或签 done 映射为「无需处理」、会签 pending 映射为「待处理」。
  • 节点级 commentText(多人用「甲:意见;乙:意见」拼接)在界面有 person-lines 后可不再重复展示节点级意见块,避免双份;PDF 以行为准。

6. 与既有文档的关系

文档 关系
2026-07-15-oa-approval-progress-timeline-design.md §4.1「同节点多人:一人一条、不合并」 对本需求废止:改为「同节点合并一张卡 + 卡内每人一行」
同文件 P0 树序、终态不挂未达 仍有效
2026-07-15-oa-approval-print-pdf-design.md 修订审批流程多人节点内容为本文 §3–§5.2;版式/印章/页脚不变

7. 验收要点

  1. 或签未批:界面与 PDF 均能看到全部候选人。
  2. 或签一人同意后:仅操作人高亮;乙丙仍出现且为「无需处理」灰显;意见行仅操作人含意见与时间。
  3. 会签部分完成:已批人有「姓名 意见 时间」;未批人为「姓名 待处理」。
  4. 会签全部完成:每人一行完整意见与时间。
  5. 行格式无表头三列;界面与 PDF 语义一致。
  6. 单人审批、抄送、终态既有行为不回归。

8. 实现提示(非规范,供计划引用)

  • 建议抽共享函数:formatProgressPersonLines(people, signMode) → string[],供 OaProgressChain 与 buildFlowItems 共用(可放 web-admin/src/utils/oa-progress-person-lines.ts)。
  • 状态 → 文案映射与 chip 的 personStatusHint 对齐:pending|running→待处理,done→无需处理,approved→意见优先否则「已同意」,等。
  • 单测:对 formatProgressPersonLines 与 buildFlowItems 或签/会签样例做前端单元测试(若仓库已有 vitest);后端可不改则仅回归 test_or_sign_same_node_merged_into_one_card。