# 审批引擎 PRD

> 产品需求文档 - 定义审批引擎的功能需求和验收标准

---

## 📋 背景与目标

### 背景

1. **现有问题**
   - 每个业务模块都要重复实现审批逻辑
   - 审批流程变更需要修改代码和重新部署
   - 审批历史记录散落在各个业务表中
   - 复杂审批规则（会签、或签、退回）难以实现
   - 流程可视化需要单独开发

2. **业务场景**
   - **HR 类**: 加班申请、请假申请、转正审批
   - **财务类**: 报销申请、预算审批
   - **采购类**: 采购申请、合同审批
   - **通用类**: 任何需要多级审批的业务

### 目标

构建一个通用审批引擎，实现：

1. **统一审批** - 所有业务复用同一套审批引擎
2. **配置驱动** - 流程定义数据化，支持在线配置和版本管理
3. **功能丰富** - 会签、或签、条件分支、退回、转发等开箱即用
4. **可视化** - 内置流程图生成和进度追踪
5. **高可靠** - 基于 Temporal 工作流引擎，保证流程可靠执行
6. **表单集成** - 与表单引擎无缝集成，实现完整的业务流程

### Temporal 工作流引擎约定

> 审批引擎使用 Temporal 作为底层工作流引擎，实现流程的可靠执行和状态管理。

| 概念 | 映射关系 | 说明 |
|------|----------|------|
| ApprovalInstance | Temporal Workflow | 每个流程实例对应一个 Workflow 实例 |
| 审批操作 | Temporal Signal | 通过/驳回/退回等操作通过 Signal 触发 |
| 状态查询 | Temporal Query | 流程进度查询使用 Query 实现 |
| 超时处理 | Temporal Timer | 节点超时、催办使用 Timer 实现 |
| 重试/补偿 | Temporal 内置 | 自动重试和故障恢复由 Temporal 提供 |

```
┌─────────────────────────────────────────────────────────────────────┐
│                    Temporal Workflow Mapping                        │
├─────────────────────────────────────────────────────────────────────┤
│                                                                      │
│  ApprovalInstance                                                     │
│  ├── workflowId: `approval-{businessType}-{businessId}-{timestamp}` │
│  ├── workflowRunId: Temporal 自动生成                               │
│  └── taskQueue: 'approval-queue'                                    │
│                                                                      │
│  审批操作 → Signal                                                   │
│  ├── approve(taskId, comment)                                       │
│  ├── reject(taskId, comment)                                        │
│  ├── return(taskId, targetNodeId, comment)                          │
│  ├── forward(taskId, targetUserId, comment)                         │
│  └── withdraw(initiatorId)                                          │
│                                                                      │
│  状态查询 → Query                                                    │
│  ├── getStatus() → ProcessStatus                                    │
│  ├── getCurrentNode() → ApprovalNodeInstance                                │
│  └── getHistory() → ApprovalHistory[]                               │
│                                                                      │
│  超时处理 → Timer                                                    │
│  ├── nodeTimeout: workflow.sleep(timeoutHours)                      │
│  ├── reminder: workflow.sleep(remindBeforeHours)                    │
│  └── escalation: workflow.sleep(escalateAfterHours)                 │
│                                                                      │
└─────────────────────────────────────────────────────────────────────┘
```

### ⚠️ 边界声明

> **审批引擎仅负责「流程编排」与「任务管理」，不负责业务逻辑和表单定义。**
>
> - ❌ 不处理业务数据存储（由业务系统负责）
> - ❌ 不负责业务规则校验（如：金额限制、时间校验）
> - ❌ 不负责表单结构定义和渲染（由 **表单引擎** 负责）
> - ❌ 不负责表单数据采集和验证（由 **表单引擎** 负责）
>
> 审批引擎通过 `businessType` + `businessId` 与业务系统松耦合。

---

## 🔗 与表单引擎的关系

### 架构定位

```
┌─────────────────────────────────────────────────────────────────────┐
│                         业务系统                                     │
├─────────────────────────────────────────────────────────────────────┤
│  加班申请 │ 报销申请 │ 请假申请 │ 采购申请 │ ...                      │
└─────────────────────────────────────────────────────────────────────┘
                               │
                               ▼
┌─────────────────────────────────────────────────────────────────────┐
│                         表单引擎                                     │
├─────────────────────────────────────────────────────────────────────┤
│  职责：                                                              │
│  ✅ 表单结构定义（JSON Schema）                                      │
│  ✅ 可视化表单设计器                                                 │
│  ✅ 表单数据采集与验证                                               │
│  ✅ 表单版本管理                                                     │
│  ✅ 表单实例存储                                                     │
│                                                                      │
│  输出：FormInstance（表单实例）                                      │
└─────────────────────────────────────────────────────────────────────┘
                               │
                               │ requiresApproval = true
                               │ approvalProcessKey = 'xxx'
                               ▼
┌─────────────────────────────────────────────────────────────────────┐
│                         审批引擎                                     │
├─────────────────────────────────────────────────────────────────────┤
│  职责：                                                              │
│  ✅ 审批流程定义与版本管理                                           │
│  ✅ 流程实例创建与执行                                               │
│  ✅ 审批任务分配与管理                                               │
│  ✅ 审批操作（通过/驳回/退回/转发）                                  │
│  ✅ 流程图可视化与进度追踪                                           │
│  ✅ Temporal 工作流编排                                              │
│                                                                      │
│  输出：审批结果回调 → 更新 FormInstance.status                       │
└─────────────────────────────────────────────────────────────────────┘
```

### 职责划分

| 功能 | 表单引擎 | 审批引擎 |
|------|:--------:|:--------:|
| 表单结构定义 | ✅ | ❌ |
| 可视化设计器 | ✅ | ❌ |
| 表单数据采集 | ✅ | ❌ |
| 数据验证 | ✅ | ❌ |
| 表单实例存储 | ✅ | ❌ |
| 审批流程定义 | ❌ | ✅ |
| 流程节点编排 | ❌ | ✅ |
| 审批人解析 | ❌ | ✅ |
| 审批任务管理 | ❌ | ✅ |
| 审批操作处理 | ❌ | ✅ |
| 流程图可视化 | ❌ | ✅ |

### 集成方式

1. **表单配置审批流程**
   ```typescript
   // FormDefinition 中配置
   {
     key: 'overtime-request',
     name: '加班申请',
     requiresApproval: true,              // 启用审批
     approvalProcessKey: 'OVERTIME_APPROVAL'  // 关联审批流程
   }
   ```

2. **表单提交触发审批**
   ```typescript
   // 表单引擎提交时
   async submitForm(formInstance: FormInstance) {
     const form = await getFormDefinition(formInstance.formDefinitionId);
     
     if (form.requiresApproval) {
       // 调用审批引擎启动流程
       const approval = await approvalService.startApproval({
         processDefinitionKey: form.approvalProcessKey,
         businessType: 'FORM_INSTANCE',
         businessId: formInstance.id,
         businessKey: formInstance.businessKey,
         variables: {
           formKey: form.key,
           formData: formInstance.data,
         },
         initiatorId: formInstance.submittedBy,
       });
       
       // 更新表单实例
      formInstance.approvalInstanceId = approval.instanceId;
       formInstance.status = 'PENDING_APPROVAL';
     }
   }
   ```

3. **审批结果回调**
   ```typescript
   // 审批引擎完成后回调
   async onApprovalCompleted(event: ApprovalCompletedEvent) {
     if (event.businessType === 'FORM_INSTANCE') {
       await formInstanceService.updateApprovalStatus(
         event.businessId,
         event.result === 'APPROVED' ? 'APPROVED' : 'REJECTED'
       );
     }
   }
   ```

### 状态同步

| FormInstance.status | ApprovalInstance.status | 说明 |
|---------------------|-------------------------|------|
| `DRAFT` | - | 草稿（未提交） |
| `SUBMITTED` | - | 已提交（无需审批） |
| `PENDING_APPROVAL` | `RUNNING` | 审批中 |
| `APPROVED` | `APPROVED` | 审批通过 |
| `REJECTED` | `REJECTED` | 审批驳回 |
| `CANCELLED` | `WITHDRAWN` 或 `TERMINATED` | 用户撤回或管理员终止 |

---

## 🔄 核心流程

### 完整业务流程（表单引擎 + 审批引擎）

```
┌─────────────────────────────────────────────────────────────────────────────┐
│                              用户操作                                        │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                              │
│   [选择表单] ──> [填写表单] ──> [提交表单] ──> [等待审批] ──> [查看结果]      │
│       │              │             │              │              │          │
│       ▼              ▼             ▼              ▼              ▼          │
│   表单引擎      表单引擎       表单引擎       审批引擎       表单引擎        │
│   (表单列表)   (动态渲染)    (数据存储)     (流程执行)    (状态展示)        │
│                                                                              │
└─────────────────────────────────────────────────────────────────────────────┘
```

### 审批流程生命周期

```
┌─────────────┐     ┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│  表单提交    │ ──> │  流程启动    │ ──> │  节点执行    │ ──> │  流程完成    │
│  (表单引擎)  │     │  (审批引擎)  │     │  (审批引擎)  │     │  (回调通知)  │
└─────────────┘     └─────────────┘     └─────────────┘     └─────────────┘
                                               │
                                               ├── 通过 → 下一节点
                                               ├── 驳回 → 流程终止
                                               └── 退回 → 指定节点
```

### 数据流（与表单引擎集成）

```
┌─────────────────────────────────────────────────────────────────────┐
│                         表单引擎                                     │
├─────────────────────────────────────────────────────────────────────┤
│  1. 用户填写表单（FormRenderer 动态渲染）                            │
│  2. 前端验证 + 后端验证（基于 JSON Schema）                          │
│  3. 创建 FormInstance，生成 businessKey                             │
│  4. 检查 requiresApproval 配置                                       │
│  5. 调用审批引擎 startApproval()                                     │
│  6. 保存 approvalInstanceId 到 FormInstance                         │
└─────────────────────────────────────────────────────────────────────┘
                               ↓
┌─────────────────────────────────────────────────────────────────────┐
│                         审批引擎                                     │
├─────────────────────────────────────────────────────────────────────┤
│  1. 查找流程定义（ApprovalDefinition）                                 │
│  2. 获取默认版本（ApprovalVersion）                                   │
│  3. 创建流程实例（ApprovalInstance）                                  │
│  4. 启动 Temporal 工作流                                             │
│  5. 创建审批任务（ApprovalTask）                                     │
│  6. 等待审批人处理                                                   │
└─────────────────────────────────────────────────────────────────────┘
                               ↓
┌─────────────────────────────────────────────────────────────────────┐
│                         审批人操作                                   │
├─────────────────────────────────────────────────────────────────────┤
│  查看表单详情（FormRenderer readonly 模式）                          │
│                               ↓                                      │
│  通过 / 驳回 / 退回 / 转发 / 加签                                    │
│                               ↓                                      │
│  发送 Signal 到 Temporal 工作流                                      │
│                               ↓                                      │
│  工作流继续执行 → 下一节点 / 流程结束                                 │
└─────────────────────────────────────────────────────────────────────┘
                               ↓
┌─────────────────────────────────────────────────────────────────────┐
│                         流程完成回调                                 │
├─────────────────────────────────────────────────────────────────────┤
│  发送事件通知表单引擎                                                │
│  表单引擎更新 FormInstance.status（APPROVED / REJECTED）             │
│  (可选) 触发业务系统后续处理                                         │
└─────────────────────────────────────────────────────────────────────┘
```

---

## 👤 用户角色与故事

### 角色定义

| 角色 | 权限 | 说明 |
|------|------|------|
| 发起人 | `form:use` + `approval:start` | 填写表单并发起审批流程 |
| 审批人 | `approval:approve` | 可处理分配给自己的审批任务 |
| 执行人 | `approval:execute` | 可填写审批节点指定字段（如财务填写付款信息） |
| 表单设计者 | `form:design` | 设计表单结构（表单引擎） |
| 流程管理员 | `approval:admin` | 配置审批流程、查看所有流程 |

### 权限边界说明

| 操作 | 发起人 | 审批人 | 执行人 | 管理员 |
|------|:------:|:------:|:------:|:------:|
| 查看表单详情 | ✅ | ✅（只读） | ✅（只读） | ✅ |
| 修改表单数据 | ✅（退回后） | ❌ | ✅（指定字段） | ❌ |
| 审批操作 | ❌ | ✅ | ❌ | ✅（代审批） |
| 撤回申请 | ✅ | ❌ | ❌ | ✅（强制） |
| 强制结束流程 | ❌ | ❌ | ❌ | ✅ |
| 催办 | ✅ | ❌ | ❌ | ✅ |

> **安全约束**:
> - 审批人默认只能查看表单数据，不能修改（修改需退回到表单引擎）
> - 管理员「代审批」和「强制结束」操作需记录详细审计日志
> - 「任务认领」候选人列表来源于：角色（`role:xxx`）、部门（`dept:xxx`）、群组（`group:xxx`）

### 发起人

```
作为 发起人
我希望 选择需要的表单并填写内容
以便 提交业务申请
```

```
作为 发起人
我希望 提交表单后自动启动审批流程
以便 申请能够按照预设流程流转审批
```

```
作为 发起人
我希望 查看我发起的申请的审批进度
以便 了解申请当前在哪个环节
```

```
作为 发起人
我希望 在审批未完成时撤回申请
以便 修改错误或取消不需要的申请
```

### 审批人

```
作为 审批人
我希望 查看待我处理的审批任务列表
以便 及时处理审批任务
```

```
作为 审批人
我希望 查看表单详情（只读模式）和审批历史
以便 了解申请内容和之前的审批意见
```

```
作为 审批人
我希望 通过或驳回审批申请并填写意见
以便 完成审批决策
```

```
作为 审批人
我希望 将任务退回给发起人或上一节点
以便 让申请人补充材料后重新提交
```

```
作为 审批人
我希望 将任务转发给其他人处理
以便 在我无法处理时由代理人审批
```

### 流程管理员

```
作为 流程管理员
我希望 通过可视化页面配置审批流程
以便 无需编写代码即可新增或修改流程
```

```
作为 流程管理员
我希望 管理流程的多个版本
以便 支持流程升级和快速回滚
```

```
作为 流程管理员
我希望 将审批流程与表单关联
以便 表单提交后自动启动对应的审批流程
```

---

## 📦 功能需求

### F1: 流程管理

| 功能点 | 优先级 | 状态 | 说明 |
|--------|--------|------|------|
| F1.1 流程定义 | P0 | ✅ | 创建、更新、删除流程定义 |
| F1.2 版本管理 | P0 | ✅ | 多版本共存、设置默认版本 |
| F1.3 可视化配置 | P0 | ✅ | 通过表单管理页面配置流程 |
| F1.4 集成设计器 | P0 | ✅ | 表单设计与流程设计一体化 |
| F1.5 版本回滚 | P1 | ✅ | 回滚到指定版本 |
| F1.6 流程归档 | P2 | ✅ | 归档不再使用的流程 |
| F1.7 版本升级策略 | P0 | ✅ | 新版本只影响新实例，运行中实例按原版本执行 |

> **版本管理约束**:
> - 流程定义升级/回滚只影响**新创建**的流程实例
> - 已运行中的实例继续按**原版本**执行，保证行为一致性
> - 支持「从某节点重新发起」需单独配置（默认不支持）

### F2: 流程执行

| 功能点 | 优先级 | 状态 | 说明 |
|--------|--------|------|------|
| F2.1 发起流程 | P0 | ✅ | 启动审批流程实例 |
| F2.2 串行审批 | P0 | ✅ | A → B → C 顺序审批 |
| F2.3 并行审批 | P0 | ✅ | A + B 同时审批 |
| F2.4 条件分支 | P0 | ✅ | 根据变量选择分支 |
| F2.5 会签（AND） | P0 | ✅ | 所有人都要通过 |
| F2.6 或签（OR） | P0 | ✅ | 任一人通过即可 |
| F2.7 流程暂停/恢复 | P2 | 📋 | 暂停运行中的流程 |
| F2.8 节点超时配置 | P1 | 📋 | 支持 `timeoutHours` 配置，超时触发自动处理 |
| F2.9 超时自动处理 | P1 | 📋 | 超时后自动通过/拒绝/升级审批人 |

### F3: 审批操作

| 功能点 | 优先级 | 状态 | 说明 |
|--------|--------|------|------|
| F3.1 通过 | P0 | ✅ | 同意当前节点 |
| F3.2 驳回 | P0 | ✅ | 拒绝申请，流程结束 |
| F3.3 退回 | P0 | ✅ | 退回到指定节点 |
| F3.4 转发 | P0 | ✅ | 转给其他人处理 |
| F3.5 撤回（发起人） | P0 | ✅ | 发起人取消申请 |
| F3.6 撤回（审批人） | P0 | 📋 | 审批人撤回已通过的审批 |
| F3.7 加签 | P1 | ✅ | 动态添加审批人 |
| F3.8 减签 | P2 | 📋 | 移除审批人 |
| F3.9 抄送 | P2 | 📋 | 知会相关人员 |
| F3.10 催办 | P1 | 📋 | 手动/自动发送催办提醒 |
| F3.11 代审批 | P2 | 📋 | 管理员代替审批人处理（需审计） |
| F3.12 强制结束 | P2 | 📋 | 管理员强制终止流程（需审计） |

#### 撤回功能详解

##### 发起人撤回（F3.5）

> 发起人在流程未完成前可撤回申请，撤回后流程终止。

| 配置项 | 说明 | 默认值 |
|--------|------|--------|
| `allowWithdraw` | 是否允许撤回 | `true` |
| `withdrawBeforeNode` | 允许撤回的节点范围 | 所有节点 |
| `withdrawReason` | 是否必须填写撤回原因 | `false` |

```yaml
# 撤回配置示例
settings:
  withdraw:
    allowWithdraw: true
    withdrawBeforeNode: ['manager_approval']  # 只能在主管审批前撤回
    withdrawReason: true                       # 必须填写撤回原因
```

##### 审批人撤回（F3.6）

> 审批人在通过审批后，如果下一级审批人尚未处理，可撤回自己的审批操作。

| 场景 | 是否可撤回 | 说明 |
|------|:----------:|------|
| 下一节点未开始处理 | ✅ | 可撤回，流程回到当前节点 |
| 下一节点已有人处理 | ❌ | 不可撤回，需联系下一级审批人退回 |
| 下一节点已完成 | ❌ | 不可撤回 |
| 流程已结束 | ❌ | 不可撤回 |
| 超过撤回时限 | ❌ | 不可撤回（可配置时限） |

```yaml
# 审批人撤回配置
settings:
  approverWithdraw:
    enabled: true                    # 启用审批人撤回
    timeLimit: 24                    # 撤回时限（小时），0 表示不限制
    requireReason: true              # 必须填写撤回原因
    notifyInitiator: true            # 撤回时通知发起人
```

**撤回流程**:

```
┌─────────────────────────────────────────────────────────────────────┐
│                    审批人撤回流程                                    │
├─────────────────────────────────────────────────────────────────────┤
│                                                                      │
│  审批人 A 点击"撤回"                                                 │
│       │                                                              │
│       ▼                                                              │
│  检查下一节点状态                                                    │
│       │                                                              │
│       ├── 下一节点未处理 → 允许撤回                                  │
│       │       │                                                      │
│       │       ├── 取消下一节点的待办任务                             │
│       │       ├── 恢复当前节点为"待处理"状态                         │
│       │       ├── 记录撤回日志                                       │
│       │       └── 通知相关人员                                       │
│       │                                                              │
│       └── 下一节点已处理 → 拒绝撤回                                  │
│               │                                                      │
│               └── 返回错误：下一级已处理，无法撤回                    │
│                                                                      │
└─────────────────────────────────────────────────────────────────────┘
```

##### 连续审批中的撤回

> 在连续上级审批（`managerChain`）场景中，任一已审批的审批人都可以撤回自己的审批。

```
审批链: 组长 → 经理 → 总监 → 部门负责人

场景1: 经理已通过，总监待审批
- 经理可以撤回 ✅
- 组长不能撤回 ❌（经理已处理）

场景2: 总监已通过，部门负责人待审批
- 总监可以撤回 ✅
- 经理不能撤回 ❌
- 组长不能撤回 ❌
```

### F4: 任务管理

| 功能点 | 优先级 | 状态 | 说明 |
|--------|--------|------|------|
| F4.1 我的待办 | P0 | ✅ | 待我审批的任务 |
| F4.2 我发起的 | P0 | ✅ | 我提交的申请 |
| F4.3 我已处理 | P0 | ✅ | 我处理过的任务 |
| F4.4 抄送我的 | P1 | 📋 | 抄送给我的流程 |
| F4.5 任务认领 | P1 | ✅ | 从候选人中认领任务 |
| F4.6 批量审批 | P2 | 📋 | 批量通过/驳回 |

### F5: 查询监控

| 功能点 | 优先级 | 状态 | 说明 |
|--------|--------|------|------|
| F5.1 流程状态查询 | P0 | ✅ | 查询流程当前状态 |
| F5.2 审批历史查询 | P0 | ✅ | 查询完整审批记录 |
| F5.3 流程图可视化 | P0 | ✅ | 显示流程图和进度 |
| F5.4 统计报表 | P2 | 📋 | 审批效率统计 |
| F5.5 超时预警 | P1 | 📋 | 即将超时任务预警 |
| F5.6 催办记录查询 | P2 | 📋 | 查询催办历史 |

### F6: 审批人解析

| 功能点 | 优先级 | 状态 | 说明 |
|--------|--------|------|------|
| F6.1 指定用户 | P0 | ✅ | `user:xxx` |
| F6.2 指定角色 | P0 | ✅ | `role:MANAGER` |
| F6.3 指定部门 | P1 | ✅ | `dept:HR` |
| F6.4 发起人上级 | P0 | ✅ | `initiator:manager` |
| F6.5 发起人连续上级 | P0 | 📋 | `initiator:managerChain`，默认到部门负责人 |
| F6.6 连续审批人自动通过 | P0 | 📋 | 同一审批人连续出现时自动通过 |
| F6.7 流程变量 | P1 | ✅ | `variable:approver` |
| F6.8 自定义解析器 | P2 | 📋 | 扩展解析逻辑 |

#### 连续上级审批配置

> **场景**: 审批需要从发起人的直属上级开始，逐级向上审批，**默认到部门负责人为止**。可通过配置修改终止条件。

##### 审批人表达式语法

| 表达式 | 说明 | 默认行为 |
|--------|------|----------|
| `initiator:manager` | 发起人的直属上级 | 单级审批 |
| `initiator:manager[2]` | 发起人的第 2 级上级 | 指定层级 |
| `initiator:manager[n]` | 发起人的第 n 级上级 | 动态层级 |
| `initiator:managerChain` | 发起人连续上级审批 | **默认到部门负责人** |
| `initiator:managerChain:role:DIRECTOR` | 连续上级审批至指定角色 | 总监为终点 |
| `initiator:managerChain:level:3` | 连续上级审批至组织层级 | 第 3 层级为终点 |

##### 连续上级审批模式

```yaml
# 方式一：固定层级审批（手动配置每一级）
nodes:
  - id: level1_approval
    name: 直属主管审批
    type: USER_TASK
    assignee: 'initiator:manager'        # 第 1 级上级
    
  - id: level2_approval
    name: 部门经理审批
    type: USER_TASK
    assignee: 'initiator:manager[2]'     # 第 2 级上级
    
  - id: level3_approval
    name: 总监审批
    type: USER_TASK
    assignee: 'initiator:manager[3]'     # 第 3 级上级
```

```yaml
# 方式二：动态连续审批（推荐，默认到部门负责人）
nodes:
  - id: manager_chain_approval
    name: 逐级审批
    type: USER_TASK
    assignee: 'initiator:managerChain'   # 默认到部门负责人
    approvalMode: SEQUENTIAL             # 顺序审批
    chainConfig:
      # stopCondition: 'deptHead'        # 默认值，可省略
      autoApprove: 'sameApprover'        # 同一审批人自动通过
      maxLevels: 10                      # 最多 10 级（安全上限）
```

```yaml
# 方式三：指定终止条件
nodes:
  - id: until_director_approval
    name: 逐级审批至总监
    type: USER_TASK
    assignee: 'initiator:managerChain:role:DIRECTOR'  # 到总监为止
    chainConfig:
      includeTerminator: true            # 包含终止人（总监也要审批）
      autoApprove: 'sameApprover'        # 同一审批人自动通过
```

##### 连续审批人自动通过

> **场景**: 在连续上级审批中，如果某一级审批人与上一级是同一人（如组长兼任经理），或者审批人是发起人本人，可配置自动通过。

| 自动通过模式 | 说明 |
|-------------|------|
| `none` | 不自动通过，每级都需要审批 |
| `sameApprover` | 同一审批人连续出现时，后续自动通过 |
| `initiator` | 审批人是发起人时自动通过 |
| `both` | 同一审批人或发起人时都自动通过（默认） |

```yaml
# 自动通过配置示例
nodes:
  - id: manager_chain
    name: 逐级审批
    type: USER_TASK
    assignee: 'initiator:managerChain'
    chainConfig:
      autoApprove: 'both'                # 同一人或发起人自动通过
      autoApproveComment: '系统自动通过（审批人重复）'  # 自动通过时的备注
```

**自动通过示例**:

```
组织架构:
技术总监 张三 (deptHead: true)
└── 开发经理 李四
    └── 开发组长 李四（兼任）  ← 李四同时担任组长和经理
        └── 开发工程师 小明 ← 发起人

配置: initiator:managerChain, autoApprove: 'sameApprover'

审批流程:
1. 李四（开发组长）→ 需要审批 ✋
2. 李四（开发经理）→ 自动通过 ✅（同一审批人）
3. 张三（技术总监）→ 需要审批 ✋
```

##### 连续审批配置详解

```typescript
interface ManagerChainConfig {
  // 终止条件（默认: 'deptHead'）
  stopCondition: 
    | 'deptHead'           // 部门负责人（默认）
    | 'orgHead'            // 组织负责人
    | `role:${string}`     // 指定角色
    | `level:${number}`    // 组织层级
    | `user:${string}`;    // 指定用户
  
  // 行为配置
  includeTerminator: boolean;  // 是否包含终止人审批（默认 true）
  skipSelf: boolean;           // 发起人是管理者时跳过自己（默认 true）
  
  // 自动通过配置
  autoApprove: 'none' | 'sameApprover' | 'initiator' | 'both';  // 默认 'both'
  autoApproveComment?: string;  // 自动通过时的备注
  
  // 安全配置
  maxLevels: number;           // 最大审批层级（默认 10，防止无限循环）
  
  // 空审批人处理
  emptyHandler: 
    | 'skip'               // 跳过该级
    | 'fail'               // 流程失败
    | 'fallback:user:xxx'; // 降级到指定用户
}
```

##### 审批链解析示例

```
组织架构:
CEO (level: 1)
└── CTO (level: 2, role: DIRECTOR)
    └── 技术总监 张三 (level: 3, deptHead: true)
        └── 开发经理 李四 (level: 4)
            └── 开发组长 王五 (level: 5)
                └── 开发工程师 小明 (level: 6) ← 发起人

配置: initiator:managerChain（默认到部门负责人）

解析结果（审批链）:
1. 王五（开发组长）
2. 李四（开发经理）
3. 张三（技术总监，部门负责人）← 终止

配置: initiator:managerChain:role:DIRECTOR

解析结果（审批链）:
1. 王五（开发组长）
2. 李四（开发经理）
3. 张三（技术总监）
4. CTO（总监角色）← 终止
```

##### 特殊场景处理

| 场景 | 处理方式 |
|------|----------|
| 发起人没有上级 | 根据 `emptyHandler` 配置处理 |
| 发起人是部门负责人 | `skipSelf: true` 时跳过，流程直接完成或到上级部门 |
| 连续审批人是同一人 | `autoApprove: 'sameApprover'` 时自动通过 |
| 审批人是发起人 | `autoApprove: 'initiator'` 时自动通过 |
| 找不到终止条件 | 达到 `maxLevels` 后停止，记录警告 |
| 上级已离职/禁用 | 自动跳过，继续向上查找 |

### F7: 表单引擎集成

| 功能点 | 优先级 | 状态 | 说明 |
|--------|--------|------|------|
| F7.1 表单关联流程 | P0 | ✅ | 表单配置 `approvalProcessKey` |
| F7.2 自动启动流程 | P0 | ✅ | 表单提交时自动启动审批 |
| F7.3 状态同步回调 | P0 | ✅ | 审批结果同步到表单实例 |
| F7.4 表单数据传递 | P0 | ✅ | 表单数据作为流程变量 |
| F7.5 只读详情展示 | P0 | ✅ | 审批时展示表单详情 |
| F7.6 业务单号关联 | P1 | ✅ | `businessKey` 关联查询 |
| F7.7 审批人填写字段 | P1 | 📋 | 审批人可填写指定字段（如审批金额） |

### F8: 超时与催办策略

| 功能点 | 优先级 | 状态 | 说明 |
|--------|--------|------|------|
| F8.1 节点超时配置 | P1 | 📋 | 每个节点可配置 `timeoutHours` |
| F8.2 超时提醒 | P1 | 📋 | 超时前 N 小时发送提醒 |
| F8.3 自动催办 | P1 | 📋 | 超时后自动发送催办通知 |
| F8.4 催办次数限制 | P2 | 📋 | 配置最大催办次数 |
| F8.5 升级策略 | P1 | 📋 | 超时后升级到更高层级审批人 |
| F8.6 自动处理 | P2 | 📋 | 超时后自动通过/拒绝 |
| F8.7 多渠道通知 | P1 | 📋 | 支持邮件/钉钉/飞书/站内信 |

> **说明**: 超时与催办功能基于 Temporal Timer 实现，可精确控制时间触发逻辑。

#### 超时策略配置示例

```yaml
nodes:
  - id: manager_approval
    name: 主管审批
    type: USER_TASK
    timeout:
      hours: 48                    # 超时时间
      remindBeforeHours: 4         # 超时前 4 小时提醒
      actions:
        - type: REMIND             # 超时后催办
          maxCount: 3              # 最多催办 3 次
          intervalHours: 8         # 每 8 小时催办一次
        - type: ESCALATE           # 升级策略
          afterRemindCount: 2      # 催办 2 次后升级
          escalateTo: 'initiator:manager.manager'  # 升级到上级的上级
        - type: AUTO_APPROVE       # 自动通过（可选）
          afterHours: 120          # 120 小时后自动通过
```

### F9: 多区域/多租户支持

| 功能点 | 优先级 | 状态 | 说明 |
|--------|--------|------|------|
| F9.1 区域范围 | P2 | 📋 | 流程定义支持 `regionScope` |
| F9.2 租户隔离 | P2 | 📋 | 流程定义支持 `tenantId` |
| F9.3 区域版本 | P2 | 📋 | 同一流程不同区域使用不同版本 |
| F9.4 组织范围 | P2 | 📋 | 流程定义支持 `orgScope` |

> **说明**: 与表单引擎的 `regionScope`、`allowedRegions` 配置呼应，支持不同区域使用不同审批流程。

#### 多区域配置示例

```yaml
# 中国区加班审批流程
key: OVERTIME_APPROVAL
name: 加班申请审批
regionScope: CN                    # 仅中国区可用
nodes:
  - id: manager_approval
    name: 主管审批
  - id: hr_approval
    name: HR 审批                   # 中国区需要 HR 审批

---

# 美国区加班审批流程（更简化）
key: OVERTIME_APPROVAL
name: Overtime Request Approval
regionScope: US                    # 仅美国区可用
nodes:
  - id: manager_approval
    name: Manager Approval          # 美国区只需主管审批
```

### F10: 流程设计器（可视化）

| 功能点 | 优先级 | 状态 | 说明 |
|--------|--------|------|------|
| F10.1 画布与布局 | P1 | 📋 | 拖拽式画布，支持缩放、平移、网格对齐 |
| F10.2 节点组件库 | P1 | 📋 | 开始/结束/审批/条件/并行等节点组件 |
| F10.3 连线编辑 | P1 | 📋 | 可视化连接节点，支持条件分支标注 |
| F10.4 节点属性面板 | P1 | 📋 | 配置审批人、超时、表单字段等属性 |
| F10.5 流程验证 | P1 | 📋 | 实时校验流程完整性和正确性 |
| F10.6 预览与测试 | P2 | 📋 | 模拟流程执行，预览各分支路径 |
| F10.7 版本对比 | P2 | 📋 | 可视化对比不同版本差异 |
| F10.8 导入导出 | P1 | 📋 | 支持 YAML/JSON 格式导入导出 |
| F10.9 与表单设计器集成 | P1 | 📋 | 在表单设计器中直接配置关联流程 |
| F10.10 流程模板 | P2 | 📋 | 预置常用流程模板，一键创建 |

> **说明**: 流程设计器与表单设计器采用相似的交互模式，降低用户学习成本。

#### 设计器架构

```
┌─────────────────────────────────────────────────────────────────────────────┐
│                           流程设计器 (ProcessDesigner)                        │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                              │
│  ┌──────────────┐  ┌────────────────────────────────┐  ┌──────────────────┐ │
│  │   节点面板    │  │          设计画布               │  │    属性面板      │ │
│  │  NodePalette │  │       DesignCanvas             │  │  PropertyPanel   │ │
│  ├──────────────┤  ├────────────────────────────────┤  ├──────────────────┤ │
│  │              │  │                                │  │                  │ │
│  │  ○ 开始节点  │  │    ┌───┐      ┌───┐           │  │  节点名称: ___   │ │
│  │  ◇ 条件网关  │  │    │ S │──────│ A │           │  │  审批人: ___     │ │
│  │  □ 审批节点  │  │    └───┘      └─┬─┘           │  │  审批模式: ___   │ │
│  │  ◇ 并行网关  │  │                 │             │  │  超时配置: ___   │ │
│  │  ● 结束节点  │  │           ┌─────┴─────┐       │  │  表单字段: ___   │ │
│  │              │  │           │           │       │  │                  │ │
│  │  ─ 服务任务  │  │        ┌──┴──┐     ┌──┴──┐    │  │  ┌────────────┐  │ │
│  │  ⊕ 子流程   │  │        │  B  │     │  C  │    │  │  │ 高级配置   │  │ │
│  │              │  │        └──┬──┘     └──┬──┘    │  │  └────────────┘  │ │
│  │              │  │           └─────┬─────┘       │  │                  │ │
│  │              │  │              ┌──┴──┐          │  │  ┌────────────┐  │ │
│  │              │  │              │  E  │          │  │  │ 删除节点   │  │ │
│  │              │  │              └─────┘          │  │  └────────────┘  │ │
│  │              │  │                                │  │                  │ │
│  └──────────────┘  └────────────────────────────────┘  └──────────────────┘ │
│                                                                              │
│  ┌──────────────────────────────────────────────────────────────────────┐   │
│  │  工具栏: [保存] [预览] [验证] [导出] [版本] [撤销] [重做] [缩放]       │   │
│  └──────────────────────────────────────────────────────────────────────┘   │
│                                                                              │
└─────────────────────────────────────────────────────────────────────────────┘
```

#### 节点类型

| 节点类型 | 图标 | 说明 | 属性配置 |
|----------|------|------|----------|
| START | ○ | 流程开始 | 触发条件 |
| END | ● | 流程结束 | 结束状态（通过/拒绝） |
| USER_TASK | □ | 人工审批节点 | 审批人、审批模式、超时、表单字段 |
| SERVICE_TASK | ─ | 自动服务节点 | 服务类型、参数配置 |
| EXCLUSIVE_GATEWAY | ◇ | 排他网关（条件分支） | 分支条件表达式 |
| PARALLEL_GATEWAY | ◇+ | 并行网关 | 汇聚模式（全部/任一） |
| INCLUSIVE_GATEWAY | ◇○ | 包容网关 | 条件表达式 |
| SUB_PROCESS | ⊕ | 子流程 | 子流程 Key |

#### 审批节点属性配置

```typescript
interface ApprovalNodeConfig {
  // 基本信息
  id: string;
  name: string;
  description?: string;
  
  // 审批人配置
  assignee: {
    type: 'user' | 'role' | 'dept' | 'initiator' | 'variable' | 'expression';
    value: string;  // e.g., 'user:xxx', 'role:MANAGER', 'initiator:manager'
  };
  candidateUsers?: string[];  // 候选人列表（任务认领模式）
  
  // 审批模式
  approvalMode: 'SINGLE' | 'AND' | 'OR' | 'SEQUENTIAL';
  
  // 超时配置
  timeout?: {
    hours: number;
    remindBeforeHours?: number;
    actions?: TimeoutAction[];
  };
  
  // 表单字段配置（审批人可填写的字段）
  editableFields?: string[];
  requiredFields?: string[];
  
  // 操作权限
  allowedActions: ('APPROVE' | 'REJECT' | 'RETURN' | 'FORWARD' | 'ADD_SIGN')[];
  
  // 退回配置
  returnTargets?: string[];  // 可退回的目标节点
}
```

#### 条件分支配置

```typescript
interface ConditionConfig {
  // 分支条件
  conditions: {
    targetNodeId: string;
    expression: string;  // e.g., '${amount > 10000}', '${dept == "HR"}'
    label?: string;      // 分支标签，显示在连线上
    priority?: number;   // 优先级（多条件匹配时）
  }[];
  
  // 默认分支
  defaultTarget?: string;
}
```

#### 与表单设计器集成

```
┌─────────────────────────────────────────────────────────────────────────────┐
│                        表单设计器 + 流程设计器 集成                           │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                              │
│  ┌─────────────────────────────────────────────────────────────────────┐    │
│  │                         表单设计器                                    │    │
│  │  ┌─────────────────────────────────────────────────────────────┐    │    │
│  │  │  表单字段设计 ...                                            │    │    │
│  │  └─────────────────────────────────────────────────────────────┘    │    │
│  │                                                                      │    │
│  │  ┌─────────────────────────────────────────────────────────────┐    │    │
│  │  │  审批配置 Tab                                                │    │    │
│  │  │  ┌─────────────────────────────────────────────────────┐    │    │    │
│  │  │  │  ☑ 需要审批                                          │    │    │    │
│  │  │  │                                                      │    │    │    │
│  │  │  │  关联流程: [OVERTIME_APPROVAL ▼] [编辑流程] [新建]    │    │    │    │
│  │  │  │                                                      │    │    │    │
│  │  │  │  ┌─────────────────────────────────────────────┐    │    │    │    │
│  │  │  │  │  流程预览（只读）                            │    │    │    │    │
│  │  │  │  │  ○ ─── □ 主管审批 ─── □ HR审批 ─── ●        │    │    │    │    │
│  │  │  │  └─────────────────────────────────────────────┘    │    │    │    │
│  │  │  └─────────────────────────────────────────────────────┘    │    │    │
│  │  └─────────────────────────────────────────────────────────────┘    │    │
│  └─────────────────────────────────────────────────────────────────────┘    │
│                                                                              │
│  点击 [编辑流程] 后:                                                         │
│  ┌─────────────────────────────────────────────────────────────────────┐    │
│  │                    流程设计器（弹窗/抽屉）                            │    │
│  │  ┌───────────────────────────────────────────────────────────────┐  │    │
│  │  │  完整的流程设计画布 ...                                        │  │    │
│  │  │  可访问表单字段列表，用于条件分支和审批人配置                    │  │    │
│  │  └───────────────────────────────────────────────────────────────┘  │    │
│  │                                              [取消] [保存并关联]     │    │
│  └─────────────────────────────────────────────────────────────────────┘    │
│                                                                              │
└─────────────────────────────────────────────────────────────────────────────┘
```

#### 流程验证规则

| 验证项 | 规则 | 错误提示 |
|--------|------|----------|
| 开始节点 | 有且仅有一个 | "流程必须有一个开始节点" |
| 结束节点 | 至少一个 | "流程必须有结束节点" |
| 孤立节点 | 所有节点必须连通 | "节点 {name} 未连接到流程" |
| 审批人配置 | 审批节点必须配置审批人 | "节点 {name} 未配置审批人" |
| 条件分支 | 网关必须有出口 | "网关 {name} 缺少分支配置" |
| 循环检测 | 检测潜在的无限循环 | "检测到潜在的无限循环: {path}" |
| 表单字段引用 | 条件表达式中的字段必须存在 | "字段 {field} 在表单中不存在" |

#### 流程模板

| 模板名称 | 适用场景 | 节点结构 |
|----------|----------|----------|
| 单级审批 | 简单申请 | 开始 → 主管审批 → 结束 |
| 两级审批 | 一般申请 | 开始 → 主管审批 → 部门经理审批 → 结束 |
| 金额分级 | 报销/采购 | 开始 → 条件(金额) → [主管/经理/总监] → 结束 |
| 会签审批 | 多人协同 | 开始 → 并行(多人会签) → 结束 |
| HR 流程 | 人事相关 | 开始 → 主管审批 → HR审批 → 结束 |

---

## 🗄️ 数据模型

### 核心概念

```
ApprovalDefinition (流程定义)
    ├── 基本信息：key, name, category, status
    ├── 关联 ApprovalVersion[]
    └── 生命周期：ACTIVE → SUSPENDED → ARCHIVED

ApprovalVersion (流程版本)
    ├── 版本号：version
    ├── 流程模型：processModel (JSON)
    ├── 状态：DRAFT → DEPLOYED → SUPERSEDED
    └── 是否默认：isDefault

ApprovalInstance (流程实例)
    ├── 业务关联：businessType, businessKey
    ├── 工作流：workflowId, workflowRunId
    ├── 状态：RUNNING → APPROVED / REJECTED / WITHDRAWN / TERMINATED
    └── 关联 ApprovalNodeInstance[], ApprovalTask[]

ApprovalNodeInstance (节点实例)
    ├── 节点信息：nodeId, nodeName, nodeType
    ├── 审批配置：assignees, approvalMode
    └── 状态：ACTIVE → COMPLETED / CANCELLED

ApprovalTask (审批任务)
    ├── 任务信息：name, type, status
    ├── 处理人：assignee, candidateUsers
    └── 关联 ApprovalTaskActionLog[]

ApprovalTaskActionLog (操作日志)
    ├── 操作信息：action, operatorId, comment
    └── 审计信息：ipAddress, userAgent, actionTime
```

---

## 📐 非功能需求

### 性能

| 指标 | 要求 |
|------|------|
| 流程启动 | < 100ms |
| 审批操作 | < 50ms |
| 查询接口 | < 30ms |
| 并发支持 | 1000+ TPS |

### 可靠性

| 指标 | 要求 |
|------|------|
| 数据一致性 | ACID 事务保证 |
| 故障恢复 | Temporal 自动重试 |
| 审计完整性 | 100% 操作可追溯 |
| 幂等性 | 所有审批操作幂等处理 |
| 回调可靠性 | 失败重试 + 补偿队列 |

### 幂等性与并发控制

> **核心原则**: 所有审批操作必须幂等处理，防止重复操作和并发冲突。

| 场景 | 处理策略 |
|------|----------|
| 同一任务被多人同时操作 | 乐观锁 + 版本号检查，后到请求返回冲突错误 |
| 对已完成节点的操作 | 返回 `TASK_ALREADY_COMPLETED` 错误，记录日志 |
| 对已终止流程的操作 | 返回 `PROCESS_ALREADY_TERMINATED` 错误，记录日志 |
| 重复提交相同操作 | 基于 `requestId` 去重，返回已有结果 |

```typescript
// 幂等性检查示例
async function handleApprovalAction(taskId: string, action: ApprovalAction) {
  const task = await findTask(taskId);
  
  // 状态检查
  if (task.status !== 'PENDING') {
    throw new BusinessException('TASK_ALREADY_COMPLETED', {
      taskId,
      currentStatus: task.status,
      attemptedAction: action,
    });
  }
  
  // 乐观锁检查
  const updated = await updateTaskWithVersion(taskId, task.version, action);
  if (!updated) {
    throw new BusinessException('CONCURRENT_MODIFICATION', {
      taskId,
      message: '任务已被其他人处理',
    });
  }
}
```

### 异步回调失败处理

> **核心原则**: 审批流程完成状态与业务回调解耦，回调失败不影响审批结果。

| 场景 | 处理策略 |
|------|----------|
| 回调表单引擎失败 | 自动重试 3 次（指数退避） |
| 重试仍失败 | 写入补偿队列，后台任务定期重试 |
| 最终失败 | 发送告警通知，人工介入 |

```
┌─────────────────────────────────────────────────────────────────────┐
│                    回调失败处理流程                                  │
├─────────────────────────────────────────────────────────────────────┤
│                                                                      │
│  审批完成 → 回调表单引擎                                             │
│              │                                                       │
│              ├── 成功 → 结束                                         │
│              │                                                       │
│              └── 失败 → 重试（最多 3 次，指数退避）                   │
│                          │                                           │
│                          ├── 成功 → 结束                             │
│                          │                                           │
│                          └── 失败 → 写入补偿队列                     │
│                                      │                               │
│                                      ├── 后台定期重试                │
│                                      │                               │
│                                      └── 超过阈值 → 告警 + 人工介入  │
│                                                                      │
└─────────────────────────────────────────────────────────────────────┘
```

> **重要**: 审批流程的最终状态（`APPROVED`/`REJECTED`/`WITHDRAWN`/`TERMINATED`）一旦设置，不因回调失败而回滚。回调失败是独立的补偿问题。

### 流程循环保护

> **核心原则**: 防止流程配置错误导致的无限循环，保护系统资源。

| 保护机制 | 配置 | 说明 |
|----------|------|------|
| 节点最大执行次数 | `maxNodeExecutions: 10` | 单个节点最多执行 10 次 |
| 流程最大节点数 | `maxTotalNodeExecutions: 100` | 整个流程最多执行 100 个节点 |
| 退回次数限制 | `maxReturnCount: 5` | 同一节点最多被退回 5 次 |

```yaml
# 流程配置示例
key: OVERTIME_APPROVAL
settings:
  maxNodeExecutions: 10       # 单节点最大执行次数
  maxTotalNodeExecutions: 100 # 流程最大节点执行总数
  maxReturnCount: 5           # 最大退回次数
  
nodes:
  - id: manager_approval
    # ...
```

**超限处理**:
- 达到限制时，流程自动进入 `FAILED` 状态
- 记录详细日志，包括循环路径
- 发送告警通知给流程管理员
- 支持管理员手动干预（强制结束或调整配置后重试）

### 安全性

| 指标 | 要求 |
|------|------|
| 权限控制 | 基于 RBAC |
| 数据隔离 | 用户只能看到相关流程 |
| 操作审计 | 所有操作记录日志 |

---

## ✅ 验收标准

### 流程管理验收

- [ ] 可通过表单管理页面配置流程
- [ ] 表单设计与流程设计一体化
- [ ] 支持多版本共存
- [ ] 可设置默认版本
- [ ] 可回滚到历史版本
- [ ] 新版本只影响新创建的实例
- [ ] 运行中实例按原版本执行

### 流程执行验收

- [ ] 可启动审批流程
- [ ] 支持串行、并行审批
- [ ] 支持条件分支
- [ ] 支持会签（所有人通过）
- [ ] 支持或签（任一人通过）
- [ ] 支持节点超时配置
- [ ] 超时后触发自动处理

### 审批人解析验收

- [ ] 支持指定用户 `user:xxx`
- [ ] 支持指定角色 `role:xxx`
- [ ] 支持指定部门 `dept:xxx`
- [ ] 支持发起人直属上级 `initiator:manager`
- [ ] 支持发起人第 N 级上级 `initiator:manager[n]`
- [ ] 支持连续上级审批 `initiator:managerChain`（默认到部门负责人）
- [ ] 支持连续上级审批至指定角色 `initiator:managerChain:role:xxx`
- [ ] 同一审批人连续出现时自动通过
- [ ] 审批人是发起人时可配置自动通过
- [ ] 支持审批至部门负责人 `initiator:managerUntil:deptHead`
- [ ] 支持审批至指定角色 `initiator:managerUntil:role:xxx`
- [ ] 正确处理发起人无上级的情况
- [ ] 正确跳过重复审批人
- [ ] 达到最大层级时正确停止

### 审批操作验收

- [ ] 审批人可通过/驳回
- [ ] 审批人可退回到指定节点
- [ ] 审批人可转发给他人
- [ ] 发起人可撤回申请
- [ ] 审批人可撤回已通过的审批（下一级未处理时）
- [ ] 撤回时限配置生效
- [ ] 审批人可加签
- [ ] 支持手动/自动催办
- [ ] 管理员可代审批（需审计）
- [ ] 管理员可强制结束流程（需审计）
- [ ] 并发操作返回冲突错误（幂等性）
- [ ] 已完成任务的重复操作被正确拒绝

### 任务管理验收

- [ ] 可查看待我处理的任务
- [ ] 可查看我发起的申请
- [ ] 可查看我已处理的任务
- [ ] 支持分页和筛选
- [ ] 任务认领支持角色/部门/群组候选人

### 查询监控验收

- [ ] 可查询流程状态
- [ ] 可查看审批历史
- [ ] 可显示流程图和当前进度
- [ ] 可查看超时预警
- [ ] 可查询催办记录

### 超时与催办验收（M6）

- [ ] 可配置节点超时时间
- [ ] 超时前发送提醒通知
- [ ] 超时后自动催办
- [ ] 催办次数可配置上限
- [ ] 支持升级到更高层级审批人
- [ ] 支持多渠道通知（邮件/钉钉/飞书）

### 流程设计器验收（M6）

- [ ] 拖拽式画布正常工作
- [ ] 支持所有节点类型（开始/结束/审批/条件/并行等）
- [ ] 节点连线可视化编辑
- [ ] 属性面板配置审批人、超时等
- [ ] 实时流程验证（完整性、循环检测）
- [ ] 支持 YAML/JSON 导入导出
- [ ] 与表单设计器集成（审批配置 Tab）
- [ ] 流程预览功能正常
- [ ] 版本对比可视化
- [ ] 预置流程模板可用

### 多区域支持验收（M9）

- [ ] 流程定义支持区域范围配置
- [ ] 同一流程不同区域可使用不同版本
- [ ] 支持租户隔离

### 可靠性验收

- [ ] 审批操作幂等处理（重复请求返回一致结果）
- [ ] 并发操作正确处理（乐观锁/版本号）
- [ ] 回调失败自动重试（最多 3 次）
- [ ] 重试失败写入补偿队列
- [ ] 补偿队列有后台处理任务
- [ ] 超限告警通知正常发送

### 循环保护验收

- [ ] 单节点执行次数超限时流程失败
- [ ] 总节点执行次数超限时流程失败
- [ ] 退回次数超限时流程失败
- [ ] 超限时记录详细日志
- [ ] 超限时发送告警通知

---

## 📅 里程碑

| 阶段 | 内容 | 状态 |
|------|------|------|
| M1: MVP | 基础流程定义、执行、审批操作 | ✅ 已完成 |
| M2: 高级功能 | 会签/或签、条件分支、退回/转发 | ✅ 已完成 |
| M3: 配置管理 | YAML 配置、版本管理、自动同步 | ✅ 已完成 |
| M4: 可视化 | 流程图、进度追踪 | ✅ 已完成 |
| M5: 表单集成 | 与表单引擎无缝集成 | ✅ 已完成 |
| M6: 流程设计器 | 可视化流程设计、与表单设计器集成 | 📋 规划中 |
| M7: 超时与催办 | 节点超时、自动催办、升级策略 | 📋 规划中 |
| M8: 增强功能 | 抄送、批量审批、统计报表 | 📋 规划中 |
| M9: 多区域支持 | 区域/租户隔离、区域版本 | 📋 规划中 |

---

## 📚 相关文档

### 审批引擎文档
- [架构设计](ARCHITECTURE.md)
- [API 接口文档](API.md)
- [开发待办](TODO.md)
- [变更记录](CHANGELOG.md)
- [流程配置指南](PROCESS_CONFIG_GUIDE.md)
- [性能优化指南](PERFORMANCE_OPTIMIZATION.md)
- [国际化指南](I18N_GUIDE.md)

### 表单引擎文档
- [表单引擎 PRD](../form-engine/PRD.md)
- [表单引擎架构](../form-engine/ARCHITECTURE.md)
- [表单引擎 API](../form-engine/API.md)

---

**创建日期**: 2024-11-15  
**最后更新**: 2025-12-06  
**版本**: v3.5
