# V2.1.7 条件分支指定退回 —— PRD 草案

> 版本：v0.1 草案 ｜ 状态：待评审 ｜ 关联规则：`V2.1.7条件分支指定退回_修正版规则.md`
> 本文结论全部来自与 CPO（海哥）2026-08-02~03 的逐条拍板，规则侧已 100% 收敛。

---

## 1. 背景

现有流程引擎支持正常向下流转，但缺少「审批人/管理员指定退回到任意历史节点」的能力，导致纠错只能整单重提，体验差、审计断。

早期原型稿（流程设计 v2_1_7）存在三处自相矛盾，已废弃：
- **M1** 条件重算口径不一（总述说重算、场景2 说不重算）
- **M2** 并行其他分支处理打架（继续处理 / 全部重置 / 不受影响 三种说法并存）
- **M3** 重算后分支切换方式与本次拍板冲突（原稿自动切换，本次定方案 A 拦截）

本 PRD 以锁定结论为准重写，消除 M1/M2/M3，补齐子流程、权限、日志。

---

## 2. 目标与 Non-goals

### 目标
1. 提供「退回到已执行任意节点」能力，覆盖**条件分支 / 并行分支 / 子流程**三类结构。
2. 退回后流程状态**一致、可恢复**，审计链完整。
3. 通过**权限分层**（节点级 + 监控干预级）控制大回退风险。

### 🔴 Non-goals（防范围蔓延）
- ❌ 不做「重算后自动切换分支 / 静默改路径」（采用方案 A 拦截 + 提示重选）。
- ❌ 不做退回的 undo/redo。
- ❌ v1 **不支持退回子流程中间节点**（仅支持已执行的子流程入口/节点，中间节点留 v2）。
- ❌ 不改动正常向下流转逻辑（本能力只影响「退回」动作）。
- ❌ 不做退回原因的智能推荐/模板（仅做必填输入框）。

---

## 3. 用户故事

| 角色 | 故事 |
|---|---|
| 审批人 | 作为审批人，我希望把单据退回到前序节点纠错，以便**不整单重提**就能修正问题。 |
| 发起人 | 作为发起人，退回后改了表单数据，我希望分支能**按最新数据重算**，流程走对路。 |
| 流程管理员 | 作为管理员，我希望能**全局干预退回并绕过拦截**，以便处理异常卡单。 |
| 审计方 | 作为审计方，我希望每次退回都有**不可篡改的日志**，以便追溯责任链。 |

---

## 4. 功能需求（EARS 原则）

### 4.1 可退回范围（Ubiquitous）
- The system shall 仅允许退回到「当前流程实例已执行过的节点」。
- When 用户选择未执行 / 被条件跳过的节点为目标，the system shall 禁用该节点并提示不可达。

### 4.2 条件分支重算（Event-driven）
- When 退回路径**跨越**条件网关节点，the system shall 按当前最新表单数据重算该网关及下游分支。
- If 重算后原目标节点不在「重算后有效路径」上，then the system shall **拦截退回**，提示：「条件已变更，原目标节点当前不可达，请重新选择退回节点」。

### 4.3 并行分支内退回（State-driven + 冻结）
- When 退回目标位于某并行分支**内部**，the system shall 重置该分支目标任务，并将其**他并行分支任务冻结（纯暂停）**。
- While 其他并行分支处于冻结状态，the system shall 不取消其任务、不触发重审。
- When 目标分支到达当前汇聚节点，the system shall 解除冻结、原任务继续，且各分支**不重算**。
- If 冻结超过 **24 小时（可配置）**，then the system shall 自动取消被冻结任务并通知当事人。

### 4.4 退到并行之前（结果复用）
- When 退回目标位于并行分支**之前**（含开始/发起节点），the system shall 重置目标节点并按**结果复用**重跑：各并行分支上一轮已通过节点直接标记完成、不发任务不重审；仅未通过 / 条件失效节点补发任务或按 4.2 拦截。

### ⭐ 4.5 策略 Y（Optional，默认开启）
- Where 流程配置开启「仅管理员全重置重跑」，the system shall **禁止普通审批人**退到并行之前，仅允许**干预角色（管理员）**退回且走全分支重置重跑。
- 默认开启；配置路径：流程设计 → 高级设置。

### 4.6 子流程退回（Event-driven）
- When 退回目标为生效子流程内部节点，the system shall **恢复子流程实例状态**（变量 / 已填表单 / 历史审批记录保留），仅目标节点重审，**不清空**。

### 4.7 权限（Ubiquitous）
- The system shall 在节点级提供「允许指定退回」开关与「可退回范围」配置（已有）。
- The system shall 在**流程监控模块**提供干预角色全局退回权限（已有），且可**绕过 4.2 拦截**，但须记录强制理由。

### 4.8 审批日志（Ubiquitous）
- The system shall 追加操作日志：「操作人 + 因 X 原因 + 退回到 Y 节点 + 时间」。
- 历史审批记录**不可修改**：原「已通过 / 已驳回」保留作审计，新重审记录追加其后。

### 4.9 退回原因（Ubiquitous）
- The system shall **全局强制退回原因必填**。

### 4.10 多审批人重审（State-driven）
- When 退回目标为多人审批节点，the system shall 仅通知**原处理人**重新审批（非全员重审）。

---

## 5. 核心规则速查表

| 维度 | 规则 |
|---|---|
| 可退回范围 | 已执行节点；✅开始/子流程节点 ❌被跳过节点；并行仅汇聚后可跨分支 |
| 条件重算 | 跨网关才重算；失效则拦截（方案 A） |
| 并行内退回 | 目标分支重置 + 其余冻结（24h 超时取消） |
| 退到并行之前 | 结果复用（已过不重审） |
| ⭐策略 Y | 默认开启；普通审批人禁退并行之前，仅管理员全重置重跑 |
| 子流程退回 | 恢复实例状态、仅目标重审、不清空 |
| 权限 | 节点级开关 + 监控干预角色（可绕拦截） |
| 日志 | 追加不改历史 |
| 退回原因 | 全局必填 |
| 多审批人 | 仅原处理人重审 |

---

## 6. 边界场景与异常处理

| 编号 | 场景 | 预期处理 |
|---|---|---|
| B1 | 退到开始节点后改数据，原分支失效 | 4.2 拦截，提示重选 |
| B2 | 并行内退回，其他分支冻结超 24h | 自动取消冻结任务 + 通知当事人 |
| B3 | 管理员强退到重算后无效节点 | 隐含接受重算，按新路径执行（绕拦截须记录理由） |
| B4 | 多审批人节点退回 | 仅原处理人重审，其余人不出现待办 |
| B5 | 退回到子流程内部节点 | 恢复实例状态，不清空；中间节点 v1 不支持 |
| ⚠️ B6 | 子流程实例状态恢复成本 | **研发评审定**，变量/附件/草稿恢复边界待评估 |

---

## 7. 交互说明（前端）

- **退回弹窗**：左侧节点树（仅显示可退回节点、置灰不可达节点）+ 原因输入框（必填）+ 确认。
- **拦截提示**：toast/弹窗「条件已变更，原目标节点当前不可达，请重新选择退回节点」。
- **流程图**：绘制退回线并高亮；冻结分支显示「冻结中」标识；恢复后消除。
- **流程监控模块**：干预角色专属退回入口，强退须填强制理由。
- **策略 Y 配置**：流程设计 → 高级设置 → 并行前退回策略开关。

---

## 8. 数据指标与埋点

| 指标类型 | 指标 | 说明 |
|---|---|---|
| 北极星 | **退回一次解决率** | 退回后不再二次退回的比例，越高越好 |
| 驱动 | 退回发起次数 / 拦截次数 | 监控拦截率，过高说明分支设计有问题 |
| 驱动 | 冻结触发 / 超时次数 | 监控并行冻结健康度 |
| 健康 | 结果复用命中率 | 退到并行之前时复用已过节点的比例 |
| 埋点 | 每次退回记录：操作人、目标节点、原因、是否强退、是否复用 | 落审计日志 |

---

## 9. 验收标准（AC）

- [ ] **AC1** 普通审批人无法退到未执行 / 被跳过节点。
- [ ] **AC2** 跨越条件分支时重算；目标失效则拦截并提示。
- [ ] **AC3** 并行内退回：其他分支冻结、目标分支到汇聚后恢复。
- [ ] **AC4** 退到并行之前：结果复用，已过节点不重审、不发任务。
- [ ] **AC5** ⭐策略 Y 默认开启，普通审批人不可退到并行之前。
- [ ] **AC6** 子流程退回恢复实例状态、不清空、仅目标重审。
- [ ] **AC7** 日志追加不改历史审批记录。
- [ ] **AC8** 退回原因必填；多审批人节点仅原处理人重审。

---

## 10. 待研发评审项

1. **子流程实例状态恢复**技术成本（B6）——变量/附件/草稿恢复边界。
2. **结果复用时「条件仍匹配」判定口径**——如何判定一个已通过节点在新数据下仍有效。
3. **冻结态持久化**——冻结状态在数据库/运行时如何存储与恢复，超时任务调度实现。
4. **策略 Y 默认开启**的管理端配置项落库。

---

## 11. 关联文档
- 规则底稿：`V2.1.7条件分支指定退回_修正版规则.md`
- 矛盾分析（过程留底）：`V2.1.7条件分支退回_矛盾分析.md`
