# 审批引擎 - 测试场景

> **版本**: v1.1  
> **最后更新**: 2026-01-06

---

## 📋 测试场景概述

本文档整合了审批引擎的所有测试场景和测试数据设置指南。

---


## 审批中心测试准备

> 快速开始审批中心功能测试

---

## 📚 文档说明

本文件即为审批中心主要测试文档，包含完整测试流程：
- 测试数据准备（组织架构、用户、角色）
- 表单创建和流程配置的详细步骤
- 审批人配置方法（发起人上级、连续上级审批、部门主管等）
- 测试场景和预期结果

### [审批引擎测试数据（通过 AI 直接创建）](./审批引擎测试数据（通过 AI 直接创建）) - 快速设置脚本
使用 REST Client 一键创建测试数据：
1. 安装 VS Code 扩展：[REST Client](https://marketplace.visualstudio.com/items?itemName=humao.rest-client)
2. 打开 `审批引擎测试数据（通过 AI 直接创建）`
3. 配置 `@baseUrl` 和 `@adminToken`
4. 依次执行每个请求

### 审批人配置说明（本文件内）
本文件后续章节已包含审批人配置说明与使用场景。

---

## 🚀 快速开始

### 方式1：使用快速脚本（推荐）

1. 执行 `审批引擎测试数据（通过 AI 直接创建）` 创建组织和用户
2. 阅读本文件的测试流程与数据准备
3. 按照本文创建表单并配置审批流程
4. 开始测试

### 方式2：手动创建

直接按照本文件中的步骤，通过前端界面创建所有数据。

---

## ✅ 测试数据清单

完成以下数据准备后即可开始测试：

- [ ] 组织架构：技术中心 → 开发部
- [ ] 用户：张总、李总监、王总监、陈经理、赵组长、小明
- [ ] 汇报关系：小明 → 赵组长 → 陈经理 → 王总监
- [ ] 部门负责人：开发部(王总监)、技术中心(李总监)
- [ ] 测试表单：加班申请、工时记录、报销申请

详细配置步骤请查看本文件后续章节

---

## 🔧 常见问题

### Q1: 如何获取管理员 Token？

**方法1：登录接口**
```http
POST {{baseUrl}}/auth/login
Content-Type: application/json

{
  "username": "admin",
  "password": "your-admin-password"
}
```

从响应中复制 `access_token`

**方法2：浏览器控制台**
1. 登录前端
2. 打开开发者工具 (F12)
3. Application → Local Storage
4. 找到 `auth_token` 或类似字段

---

### Q2: 如何确定中国区的 regionId？

**问题**：系统中可能有多个区域，如何确保获取到的是中国区？

**解决方案**：

1. 执行请求获取所有区域：
```http
GET {{baseUrl}}/organization/regions
Authorization: Bearer {{adminToken}}
```

2. 查看返回结果，找到 `code` 为 `"CN"` 的区域：
```json
{
  "data": [
    { "id": "uuid-cn", "code": "CN", "name": "中国" },  // <- 这是中国区
    { "id": "uuid-us", "code": "US", "name": "美国" }
  ]
}
```

3. 复制中国区的 `id`，在 `审批引擎测试数据（通过 AI 直接创建）` 中替换：
```http
@regionId = uuid-cn  # 替换为实际的中国区ID
```

---

### Q3: Department Manager 角色ID 是什么？

执行以下请求查看所有角色：
```http
GET {{baseUrl}}/organization/roles
Authorization: Bearer {{adminToken}}
```

找到 `code` 为 `DepartmentManager` 的角色，复制其 `id`

---

### Q4: 用户创建后无法登录？

**检查项**：
1. 用户状态是否为 `ACTIVE`
2. 密码是否正确（区分大小写）
3. 是否已添加部门归属

---

### Q5: 审批人看不到待办任务？

**可能原因**：
1. 用户未分配 Department Manager 角色
2. 汇报关系未正确设置
3. 流程配置的审批人解析规则错误

**解决方案**：
参考本文件的“常见问题/故障排除”章节

---

## 📞 需要帮助？

- 📖 详细步骤：见本文件“测试环境准备”与“常见问题”
- 🐛 常见问题：上方"常见问题"章节
- 💬 技术支持：联系开发团队

---

**创建日期**: 2025-12-24  
**维护团队**: 开发团队


---

# 审批中心测试文档

> 审批中心功能测试指南 - 基于 PRD 需求编写

---

---

## 📋 测试环境准备

### 1. 测试数据准备

#### 1.1 组织架构

**重要说明**：
- ✅ `managerId`: 用于 `initiator:manager` 规则，**仅支持同部门**
- ✅ `headId`: 用于 `department:head` 规则，**支持跨部门**（通过 `department:parent:head`）

确保系统中有以下组织架构（通过组织管理模块创建）：

```
技术中心 (head: 李总监)
├─ 张总 (title: CEO, managerId: 无)
└─ 李总监 (title: CTO, managerId: 张总) [部门负责人 headId]
    
    开发部 (head: 王总监, parentId: 技术中心)
    ├─ 王总监 (title: 技术总监, managerId: 无) [部门负责人 headId]
    ├─ 陈经理 (title: 开发经理, managerId: 王总监)
    ├─ 赵组长 (title: 开发组长, managerId: 陈经理)
    └─ 小明 (title: 开发工程师, managerId: 赵组长) [测试发起人]
```

**汇报关系**（managerId - 同部门）：
- 小明 → 赵组长 → 陈经理 → 王总监

**部门关系**（headId - 可跨部门）：
- 开发部 head: 王总监
- 技术中心 head: 李总监（开发部的 parent）

#### 1.2 用户角色
| 用户 | 角色 | 部门 | 用途 |
|------|------|------|------|
| 小明 | EMPLOYEE | 开发部 | 发起人 |
| 赵组长 | TEAM_LEADER | 开发部 | 一级审批人 |
| 陈经理 | MANAGER | 开发部 | 二级审批人 |
| 王总监 | DIRECTOR | 开发部 | 部门负责人 |
| 李总监 | DIRECTOR | 技术中心 | 高级审批人 |

#### 1.3 创建测试表单并配置审批流程

以下是完整的表单创建和流程配置步骤。

---

### 📝 表单1: 加班申请（测试固定层级审批）

#### 步骤1：创建表单

1. 登录系统，进入**表单管理**
2. 点击"新建表单"
3. 填写表单信息：
   - **表单名称**: 加班申请
   - **表单标识**: `overtime_request`
   - **归属组织**: 选择"开发部"（可选，留空则为平台级表单）
4. 添加表单字段：
   ```
   字段标签         字段标识(key)    字段类型    必填    说明
   加班日期         date            date       是      
   加班时长         hours           number     是      
   加班原因         reason          textarea   是      
   加班类型         type            select     否      工作日/周末/节假日
   ```
5. 点击"保存"

#### 步骤2：配置审批流程

1. 在表单详情页，点击"流程设计"或"配置审批流程"
2. 进入流程设计器界面（钉钉风格）

**节点1：组长审批**
- 点击"发起人"节点后的 `+` 按钮
- 选择"添加审批人"
- 配置审批人：
  - 审批人设置: **发起人上级**
  - 上级层级: **直属上级（第 1 级）**
  - 多人审批方式: 或签
- 节点名称: "组长审批"

**节点2：经理审批**
- 点击"组长审批"节点后的 `+` 按钮
- 选择"添加审批人"
- 配置审批人：
  - 审批人设置: **发起人上级**
  - 上级层级: **第 2 级上级**
  - 多人审批方式: 或签
- 节点名称: "经理审批"

3. 保存流程

**预期审批人**：
- 小明提交 → 赵组长审批 → 陈经理审批

---

### 📝 表单2: 工时记录（测试连续上级审批）

#### 步骤1：创建表单

1. 进入**表单管理** → "新建表单"
2. 填写表单信息：
   - **表单名称**: 工时记录
   - **表单标识**: `timesheet`
   - **归属组织**: 开发部（可选）
3. 添加表单字段：
   ```
   字段标签         字段标识(key)    字段类型    必填    说明
   项目名称         project         text       是      
   工时             hours           number     是      单位：小时
   工作内容         content         textarea   是      
   日期             date            date       是      
   ```
4. 保存表单

#### 步骤2：配置审批流程

1. 进入流程设计器

**节点1：逐级审批**
- 点击"发起人"节点后的 `+` 按钮
- 选择"添加审批人"
- 配置审批人：
  - 审批人设置: **连续上级审批**
  - 审批终点条件: **直到部门负责人**
  - 最大审批层级: 10
  - 多人审批方式: **依次审批**（连续上级审批必须是依次）
- 节点名称: "逐级审批"

2. 保存流程

**预期审批人**：
- 小明提交 → 赵组长审批 → 陈经理审批 → 王总监审批（部门负责人，停止）

---

### 📝 表单3: 报销申请（测试条件分支）

#### 步骤1：创建表单

1. 进入**表单管理** → "新建表单"
2. 填写表单信息：
   - **表单名称**: 报销申请
   - **表单标识**: `expense_request`
   - **归属组织**: 开发部（可选）
3. 添加表单字段：
   ```
   字段标签         字段标识(key)    字段类型    必填    说明
   报销金额         amount          number     是      用于条件判断
   报销类型         type            select     否      交通费/餐费/住宿费/其他
   发票附件         attachment      file       否      
   报销说明         description     textarea   是      
   ```
   
   ⚠️ **重要**：字段标识（key）用于条件表达式，必须是英文字母和下划线
   
4. 保存表单

#### 步骤2：配置审批流程（带条件分支）

1. 进入流程设计器

**节点1：条件分支**
- 点击"发起人"节点后的 `+` 按钮
- 选择"添加条件分支"

**分支1：小额报销（≤ 1000元）**
- 条件设置: `${amount} <= 1000`
  - `amount` 对应表单字段标识（报销金额字段的 key）
  - 使用 `${}` 包裹字段名
- 添加审批节点：
  - 审批人设置: **发起人上级**
  - 上级层级: **直属上级（第 1 级）**
  - 节点名称: "组长审批"

**分支2：大额报销（> 1000元）**
- 条件设置: `${amount} > 1000`
- 添加审批节点：
  - 审批人设置: **发起人上级**
  - 上级层级: **第 2 级上级**
  - 节点名称: "经理审批"

2. 保存流程

**预期审批人**：
- 金额 ≤ 1000元 → 赵组长审批
- 金额 > 1000元 → 陈经理审批

**条件表达式说明**：
- 使用 `${字段标识}` 引用表单字段值
- 支持运算符：`>` `<` `>=` `<=` `==` `!=`
- 示例：`${amount} >= 5000`、`${type} == '交通费'`

---

### 📝 表单4: 跨部门审批测试

#### 步骤1：创建表单

1. 进入**表单管理** → "新建表单"
2. 填写表单信息：
   - **表单名称**: 技术方案审批
   - **表单标识**: `tech_proposal`
3. 添加表单字段：
   ```
   字段标签         字段标识(key)    字段类型    必填    说明
   方案名称         title           text       是      
   技术栈           tech_stack      text       否      
   方案说明         description     textarea   是      
   ```
4. 保存表单

#### 步骤2：配置审批流程

**节点1：部门负责人审批**
- 审批人设置: **部门主管**
- 节点名称: "部门负责人审批"

**节点2：上级部门负责人审批**
- 审批人设置: **部门接口人**（需要自定义配置）
- 或者使用工作流角色配置 `department:parent:head`
- 节点名称: "技术中心负责人审批"

**预期审批人**：
- 小明提交 → 王总监（开发部负责人）→ 李总监（技术中心负责人）

---

## 🔧 审批人配置详解

### 1. 发起人上级（固定层级）

**使用场景**: 明确知道需要第几级上级审批

**配置步骤**:
1. 选择"发起人上级"
2. 选择层级（第1级、第2级、第3级，或自定义）
3. 后端表达式：`initiator:manager` 或 `initiator:manager[N]`

**示例**:
- 第1级: 赵组长
- 第2级: 陈经理
- 第3级: 王总监

### 2. 连续上级审批（动态审批链）

**使用场景**: 需要逐级审批，直到满足某个条件

**配置步骤**:
1. 选择"连续上级审批"
2. 选择审批终点条件：
   - 直到部门负责人（最常用）
   - 直到组织最高负责人
   - 直到第 N 级上级
3. 设置最大审批层级（防止无限循环）
4. 多人审批方式必须选择"依次审批"

**示例**: 小明 → 赵组长 → 陈经理 → 王总监（部门负责人，停止）

### 3. 部门主管

**使用场景**: 需要部门负责人审批

**配置步骤**:
1. 选择"部门主管"
2. 后端表达式：`department:head`

**示例**: 小明所在开发部的 headId → 王总监

### 4. 指定成员

**使用场景**: 固定的审批人（如：财务、HR）

**配置步骤**:
1. 选择"指定成员"
2. 点击"选择审批人"
3. 从用户列表中选择
4. 配置多人审批方式（会签/或签/依次审批）

### 5. 指定角色

**使用场景**: 根据系统角色分配审批人

**配置步骤**:
1. 选择"指定角色"
2. 从角色下拉列表中选择（如：Department Manager、Administrator）
3. 系统会自动解析该角色下的所有用户

---

#### 1.4 流程配置参考（YAML格式）

以下是后端流程定义的参考格式：

**流程1: 加班申请审批流程**（测试 `initiator:manager`）
```yaml
nodes:
  - id: start
    type: START
  
  - id: team_leader_approval
    type: USER_TASK
    name: 组长审批
    assignee: 'initiator:manager'  # 小明 → 赵组长 (managerId)
  
  - id: manager_approval
    type: USER_TASK
    name: 经理审批
    assignee: 'initiator:manager[2]'  # 小明 → 陈经理 (managerId 链)
  
  - id: end
    type: END
```

**预期审批人解析**：
- 发起人：小明
- 第1节点：赵组长（`initiator:manager`）
- 第2节点：陈经理（`initiator:manager[2]`）

**流程2: 逐级审批流程**（测试 `initiator:managerChain` - 连续上级审批）
```yaml
nodes:
  - id: start
    type: START
  
  - id: manager_chain_approval
    type: USER_TASK
    name: 逐级审批
    assignee: 'initiator:managerChain'  # 连续上级审批，默认到部门负责人
    approvalMode: SEQUENTIAL            # 顺序审批
    chainConfig:
      stopCondition: 'deptHead'         # 停止条件：部门负责人
      autoApprove: 'both'               # 同一人或发起人自动通过
      maxLevels: 10                     # 最多10级（安全上限）
  
  - id: end
    type: END
```

**预期审批人解析**：
- 发起人：小明
- 自动创建多个顺序审批任务（从直属上级开始，逐级向上）：
  1. 赵组长（Level 1，小明的直属上级）
  2. 陈经理（Level 2，赵组长的上级）
  3. 王总监（Level 3，陈经理的上级，同时是部门负责人 - 停止）

**配置说明**：
- 前端 UI：选择"连续上级审批"类型，审批终点选择"直到部门负责人"
- 后端表达式：`initiator:managerChain` 或 `initiator:managerChain:level:N`
- 解析逻辑：从发起人的直属上级开始，逐级向上，直到满足停止条件
- 审批模式：必须设置为 `SEQUENTIAL`（顺序审批）

**流程3: 金额分级审批**（测试条件分支 + 固定层级）
```yaml
nodes:
  - id: start
    type: START
  
  - id: amount_gateway
    type: EXCLUSIVE_GATEWAY
    name: 金额判断
  
  - id: small_amount_approval
    type: USER_TASK
    name: 组长审批
    assignee: 'initiator:manager'        # 第 1 级上级
    condition: '${amount <= 1000}'
  
  - id: large_amount_approval
    type: USER_TASK
    name: 经理审批
    assignee: 'initiator:manager[2]'     # 第 2 级上级
    condition: '${amount > 1000}'
  
  - id: end
    type: END
```

**预期审批人解析**：
- 发起人：小明
- 金额 ≤ 1000：赵组长（第 1 级上级）
- 金额 > 1000：陈经理（第 2 级上级）

**配置说明**：
- 使用条件分支网关根据表单字段（金额）路由到不同审批节点
- 每个审批节点使用固定层级上级规则

---

**流程4: 跨部门审批**（测试 `department:parent:head`）✨ **新增**
```yaml
nodes:
  - id: start
    type: START
  
  - id: dept_head_approval
    type: USER_TASK
    name: 部门负责人审批
    assignee: 'department:head'
  
  - id: parent_dept_head_approval
    type: USER_TASK
    name: 上级部门负责人审批
    assignee: 'department:parent:head'  # 跨部门审批
  
  - id: end
    type: END
```

**预期审批人解析**：
- 发起人：小明（开发部成员）
- 第1节点：王总监（开发部 `headId`）
- 第2节点：李总监（技术中心 `headId`）✨ **跨部门！**

**验证要点**：
- ✅ 李总监不是开发部成员
- ✅ 但李总监是技术中心（父部门）负责人
- ✅ `department:parent:head` 规则正确解析

---

**流程5: 混合审批规则**（综合测试）✨ **新增**
```yaml
nodes:
  - id: start
    type: START
  
  - id: manager_approval
    type: USER_TASK
    name: 直属上级审批
    assignee: 'initiator:manager'  # 基于 managerId
  
  - id: dept_head_approval
    type: USER_TASK
    name: 部门负责人审批
    assignee: 'department:head'  # 基于 department.headId
  
  - id: cto_approval
    type: USER_TASK
    name: CTO审批
    assignee: 'department:parent:head'  # 跨部门
  
  - id: end
    type: END
```

**预期审批人解析**：
- 发起人：小明
- 第1节点：赵组长（`managerId`）
- 第2节点：王总监（开发部 `headId`）
- 第3节点：李总监（技术中心 `headId`）

---

## 🧪 测试场景

### 场景1: 表单提交与审批流程启动

#### 测试目标
验证表单提交后能否正确启动审批流程

#### 测试步骤
1. 以"小明"身份登录系统
2. 点击"审批中心" → "发起新申请"
3. 选择"加班申请"表单
4. 填写表单内容:
   - 加班日期: 2025-12-25
   - 加班时长: 4小时
   - 加班原因: 项目紧急上线
   - 加班类型: 工作日加班
5. 点击"提交"按钮

#### 预期结果
- ✅ 表单提交成功
- ✅ 显示"提交成功，等待审批"提示
- ✅ 跳转到"我发起的"列表
- ✅ 列表中显示刚提交的申请
- ✅ 申请状态为"审批中" (RUNNING)
- ✅ 当前节点显示为"组长审批"

#### 验证点
```javascript
// 控制台应输出
[ApprovalCenter] ✅ 审批详情加载完成
formKey: 'overtime_request'
businessType: 'FORM_INSTANCE'
status: 'RUNNING'
currentNode: '组长审批'
```

---

### 场景2: 查看待办任务

#### 测试目标
验证审批人能否看到待审批的任务

#### 测试步骤
1. 退出"小明"账号
2. 以"赵组长"身份登录
3. 进入"审批中心"
4. 默认显示"待我审批"标签

#### 预期结果
- ✅ "待我审批"标签有数字角标（显示待办数量）
- ✅ 列表中显示小明提交的加班申请
- ✅ 显示完整信息:
  - 标题: "加班申请 - form_xxx_2025_0001"
  - 状态: RUNNING
  - 发起人: 小明
  - 提交时间: 2025年12月23日
  - 当前节点: 组长审批

---

### 场景3: 查看表单详情

#### 测试目标
验证点击审批任务后能否正确加载表单数据

#### 测试步骤
1. 在"待我审批"列表中
2. 点击小明的加班申请

#### 预期结果
- ✅ 右侧显示表单详情区域
- ✅ 正确显示表单字段和值:
  - 加班日期: 2025-12-25
  - 加班时长: 4小时
  - 加班原因: 项目紧急上线
  - 加班类型: 工作日加班
- ✅ 表单字段为只读状态（不可编辑）
- ✅ 底部显示审批按钮: "通过"、"驳回"、"退回"
- ✅ 有评论输入框

#### 控制台验证
```javascript
[ApprovalCenter] 7️⃣ 通过 businessId 获取表单实例数据
[ApprovalCenter] 8️⃣ 获取到表单实例: { data: {...}, status: 'PENDING_APPROVAL' }
[ApprovalCenter] 9️⃣ 提取的表单数据: { overtimeDate: '2025-12-25', ... }
[ApprovalCenter] 🔟 最终组装的详情数据
```

---

### 场景4: 审批通过操作

#### 测试目标
验证审批人通过操作是否正常

#### 测试步骤
1. 在表单详情页
2. 在评论框输入: "同意加班申请，注意休息"
3. 点击"通过"按钮

#### 预期结果
- ✅ 显示"审批成功"提示
- ✅ 该任务从"待我审批"列表消失
- ✅ 出现在"我已处理"列表中
- ✅ 状态标记为"已通过"
- ✅ 记录评论内容

#### 后续验证
1. 以"陈经理"身份登录
2. 进入"审批中心" → "待我审批"
3. 应该看到该申请（进入到第二级审批）
4. 当前节点显示为"经理审批"

---

### 场景5: 审批驳回操作

#### 测试目标
验证审批驳回后流程是否正确终止

#### 测试步骤
1. 创建新的加班申请（重复场景1）
2. 以"赵组长"身份审批
3. 在评论框输入: "加班时长过长，请调整后重新提交"
4. 点击"驳回"按钮

#### 预期结果
- ✅ 显示"已驳回"提示
- ✅ 任务从待办列表消失
- ✅ 流程状态变为 TERMINATED
- ✅ 发起人能在"我发起的"中看到被驳回的申请
- ✅ 状态显示为"已驳回"
- ✅ 可以看到驳回意见

---

### 场景6: 退回操作

#### 测试目标
验证退回到指定节点功能

#### 测试前提
有一个已经过组长审批，当前在经理审批节点的申请

#### 测试步骤
1. 以"陈经理"身份登录
2. 进入待审批任务
3. 点击"退回"按钮
4. 选择退回到"组长审批"节点
5. 输入退回原因: "需要补充加班原因说明"
6. 确认退回

#### 预期结果
- ✅ 退回成功提示
- ✅ 流程回到"组长审批"节点
- ✅ "赵组长"的待办中重新出现该任务
- ✅ 可以看到退回原因
- ✅ 审批历史中记录退回操作

---

### 场景7: 发起人撤回

#### 测试目标
验证发起人撤回功能

#### 测试步骤
1. 以"小明"身份登录
2. 进入"审批中心" → "我发起的"
3. 找到一个审批中的申请
4. 点击"撤回"按钮
5. 输入撤回原因: "填写错误，需要重新提交"
6. 确认撤回

#### 预期结果
- ✅ 撤回成功提示
- ✅ 流程状态变为 TERMINATED
- ✅ 状态显示为"已撤回"
- ✅ 审批人待办中该任务消失
- ✅ 记录撤回原因

---

### 场景8: 连续上级审批（managerChain）

#### 测试目标
验证连续上级审批功能

#### 测试步骤
1. 创建一个使用"逐级审批流程"的表单（如交工时记录）
2. 以"小明"身份提交
3. 依次以各级上级身份审批

#### 预期结果

**第一级 - 赵组长审批：**
- ✅ 赵组长待办中出现任务
- ✅ 审批通过后，进入下一级

**第二级 - 陈经理审批：**
- ✅ 陈经理待办中出现任务
- ✅ 审批通过后，进入下一级

**第三级 - 王总监审批（部门负责人）：**
- ✅ 王总监待办中出现任务
- ✅ 审批通过后，**流程结束**（默认到部门负责人为止）
- ✅ 不会继续到李总监

**特殊情况 - 同一审批人自动通过：**
如果赵组长兼任陈经理，则：
- ✅ 第一级正常审批
- ✅ 第二级自动通过（系统记录: "系统自动通过（审批人重复）"）

---

### 场景9: 条件分支（金额分级）

#### 测试目标
验证条件分支功能

#### 测试步骤

**测试9.1: 小额报销（≤1000元）**
1. 提交报销申请，金额: 800元
2. 查看审批流程

预期结果:
- ✅ 直接到"组长审批"节点
- ✅ 组长审批通过后，流程结束

**测试9.2: 大额报销（>1000元）**
1. 提交报销申请，金额: 5000元
2. 查看审批流程

预期结果:
- ✅ 直接到"经理审批"节点
- ✅ 跳过组长审批

---

### 场景10: 任务列表筛选与搜索

#### 测试目标
验证列表的筛选和搜索功能

#### 测试步骤
1. 进入"审批中心"
2. 在"待我审批"列表中
3. 使用搜索框输入关键词（如"加班"）
4. 切换状态筛选（如只看"审批中"）

#### 预期结果
- ✅ 搜索框实时过滤列表
- ✅ 状态筛选正常工作
- ✅ 分页功能正常
- ✅ 排序功能正常（按提交时间）

---

### 场景11: 审批历史查看

#### 测试目标
验证能否查看完整的审批历史

#### 测试步骤
1. 打开一个已经多人审批的申请
2. 查看底部的审批历史记录

#### 预期结果
- ✅ 显示完整的审批路径
- ✅ 每个节点显示:
  - 节点名称
  - 审批人
  - 审批时间
  - 审批动作（通过/驳回/退回）
  - 审批意见
- ✅ 时间线样式清晰
- ✅ 当前节点高亮显示

---

### 场景12: 多标签切换

#### 测试目标
验证各个标签页功能

#### 测试步骤
依次点击以下标签：
1. "发起新申请"
2. "待我审批"
3. "我发起的"
4. "我已处理"
5. "抄送我的"（如果启用）

#### 预期结果
- ✅ 每个标签数据加载正确
- ✅ 数字角标显示正确数量
- ✅ 切换标签时选中状态正确
- ✅ 列表数据刷新正常

---

## 🐛 常见问题排查

### 问题1: 点击任务后显示"暂无表单数据"

**可能原因:**
- formKey 为空或错误
- businessId 无法查询到表单实例
- 表单实例的 data 字段为空

**排查步骤:**
1. 打开浏览器控制台（F12）
2. 查看日志输出:
```javascript
[ApprovalCenter] 1️⃣ 选中的审批项: { formKey: ? }
[ApprovalCenter] 3️⃣ 查询表单定义，formKey = ?
[ApprovalCenter] 7️⃣ 通过 businessId 获取表单实例数据
```

**解决方案:**
- 确认表单定义的 `key` 字段正确
- 确认审批流程启动时传递了正确的 `formKey`
- 确认表单实例已正确保存

### 问题2: 审批按钮不可点击

**可能原因:**
- 不是当前审批人
- 任务已被其他人处理
- 流程已结束

**排查步骤:**
1. 检查 `canApprove` 和 `canReject` 状态
2. 查看任务状态是否为 PENDING
3. 确认当前用户ID与 assignee 匹配

### 问题3: formKey 为 "FORM_INSTANCE"

**原因:**
前端错误地使用了 `businessType` 作为 formKey

**解决方案:**
已在最新版本修复，`formKey` 从 `variables.formKey` 中提取

---

## ✅ 测试检查清单

### 基础功能
- [ ] 能访问审批中心页面
- [ ] 能看到正确的标签页
- [ ] 能看到待办数量角标
- [ ] 列表加载正常

### 表单提交
- [ ] 能选择表单
- [ ] 能填写表单
- [ ] 提交后启动审批流程
- [ ] 状态同步正常

### 审批操作
- [ ] 通过操作正常
- [ ] 驳回操作正常
- [ ] 退回操作正常
- [ ] 撤回操作正常
- [ ] 评论功能正常

### 审批流程
- [ ] 串行审批正常
- [ ] 连续上级审批正常
- [ ] 条件分支正常
- [ ] 同一审批人自动通过
- [ ] 审批链正确解析

### 查询显示
- [ ] 待办列表正确
- [ ] 我发起的列表正确
- [ ] 我已处理列表正确
- [ ] 表单详情显示正确
- [ ] 表单数据加载正确
- [ ] 审批历史显示正确

### 交互体验
- [ ] 按钮点击响应快速
- [ ] 加载状态显示清晰
- [ ] 错误提示友好
- [ ] 成功提示及时
- [ ] 页面跳转流畅

---

## 📊 性能测试

### 响应时间要求
| 操作 | 要求 | 说明 |
|------|------|------|
| 列表加载 | < 500ms | 首屏数据加载 |
| 详情加载 | < 300ms | 点击任务后加载详情 |
| 审批操作 | < 200ms | 通过/驳回/退回操作 |
| 搜索过滤 | < 100ms | 实时搜索响应 |

### 并发测试
- 同一任务被多人同时操作
- 预期: 后到请求返回冲突错误

---

## 📝 测试报告模板

```markdown
# 审批中心测试报告

## 测试环境
- 测试时间: YYYY-MM-DD
- 测试人员: XXX
- 浏览器: Chrome 120
- 后端版本: vX.X.X
- 前端版本: vX.X.X

## 测试结果汇总
| 场景 | 通过 | 失败 | 阻塞 |
|------|:----:|:----:|:----:|
| 场景1: 表单提交 | ✅ | | |
| 场景2: 查看待办 | ✅ | | |
| 场景3: 查看详情 | ❌ | 1 | |
| ... | | | |
| **合计** | 10 | 2 | 0 |

## 失败案例
### 场景3: 查看详情
- **问题描述**: 点击任务后显示"暂无表单数据"
- **复现步骤**: ...
- **预期结果**: ...
- **实际结果**: ...
- **错误截图**: [附上截图]
- **控制台日志**: [附上日志]

## 改进建议
1. 优化表单数据加载速度
2. 增加加载状态提示
3. ...
```

---

**创建日期**: 2025-12-23  
**适用版本**: v1.0.0  
**维护人员**: 开发团队


---

# 审批中心测试数据准备指南

> 详细的测试数据创建步骤 - 见本文件对应章节

---

## 📋 准备工作

### 前提条件
1. ✅ 系统已部署并可访问
2. ✅ 拥有管理员账号（Administrator 角色）
3. ✅ 数据库已运行 seed 脚本（角色已初始化）

### 登录管理员账号
使用管理员账号登录系统（通常是初始化时创建的 admin 账号）

---

## 🏢 第一步：确认区域

### 1.1 检查现有区域
访问：`组织管理` → `区域管理`

**或使用 API 查询**：
```bash
GET /api/organization/regions
Authorization: Bearer <your-token>
```

**查看返回结果**，找到中国区（CN）的ID：
```json
{
  "data": [
    { "id": "uuid-cn", "code": "CN", "name": "中国" },
    { "id": "uuid-us", "code": "US", "name": "美国" },
    { "id": "uuid-me", "code": "ME", "name": "中东" }
  ]
}
```

**⚠️ 重要**：记录中国区的 `id`，后续步骤需要使用。

如果没有中国区，通过以下步骤创建：

### 1.2 创建区域（API 方式）

**请求**：
```bash
POST /api/organization/regions
Content-Type: application/json
Authorization: Bearer <your-token>

{
  "code": "CN",
  "name": "中国",
  "isDefault": true
}
```

**预期响应**：
```json
{
  "success": true,
  "data": {
    "id": "uuid-cn-region",
    "code": "CN",
    "name": "中国"
  }
}
```

---

## 🏗️ 第二步：创建组织架构

### 2.1 创建顶层组织（技术中心）

**访问路径**：`组织管理` → `部门管理` → `创建组织`

**填写信息**：
```yaml
名称: 技术中心
代码: TECH_CENTER
归属区域: 中国 (CN)
运营区域: [中国]
描述: 技术部门总部
```

**或使用 API**：
```bash
POST /api/organization/departments
Content-Type: application/json
Authorization: Bearer <your-token>

{
  "name": "技术中心",
  "code": "TECH_CENTER",
  "primaryRegionId": "uuid-cn-region",
  "operatingRegionIds": ["uuid-cn-region"],
  "description": "技术部门总部"
}
```

**记录返回的 departmentId**：`{TECH_CENTER_ID}`

---

### 2.2 创建开发部（子部门）

**访问路径**：`组织管理` → `部门管理` → 在"技术中心"下点击`添加子部门`

**填写信息**：
```yaml
名称: 开发部
代码: DEV_DEPT
父部门: 技术中心
描述: 软件开发部门
```

**或使用 API**：
```bash
POST /api/organization/departments
Content-Type: application/json

{
  "name": "开发部",
  "code": "DEV_DEPT",
  "parentId": "{TECH_CENTER_ID}",
  "description": "软件开发部门"
}
```

**记录返回的 departmentId**：`{DEV_DEPT_ID}`

---

## 👥 第三步：创建用户

### 3.1 创建用户 - CEO 张总

**访问路径**：`组织管理` → `用户管理` → `添加成员`

**填写信息**：
```yaml
基本信息:
  姓名: 张总
  英文名: Zhang CEO
  邮箱: zhang.ceo@example.com
  用户名: zhang_ceo
  密码: Test123456  # 测试用密码
  
组织信息:
  主部门: （不设置或选择公司顶层）
  岗位: CEO
  
角色分配:
  - Administrator (管理员)
```

**或使用 API**：
```bash
POST /api/users
Content-Type: application/json

{
  "username": "zhang_ceo",
  "email": "zhang.ceo@example.com",
  "displayName": "张总",
  "englishName": "Zhang CEO",
  "password": "Test123456",
  "status": "ACTIVE"
}
```

**记录返回的 userId**：`{ZHANG_CEO_ID}`

---

### 3.2 创建用户 - CTO 李总监

**填写信息**：
```yaml
基本信息:
  姓名: 李总监
  英文名: Li CTO
  邮箱: li.cto@example.com
  用户名: li_cto
  密码: Test123456
  
组织信息:
  主部门: 技术中心
  岗位: CTO / 总监
  汇报对象: 张总
  
角色分配:
  - Department Manager (部门经理)
```

**API 创建**：
```bash
POST /api/users

{
  "username": "li_cto",
  "email": "li.cto@example.com",
  "displayName": "李总监",
  "englishName": "Li CTO",
  "password": "Test123456",
  "status": "ACTIVE"
}
```

**记录 userId**：`{LI_CTO_ID}`

**添加部门归属**：
```bash
POST /api/users/{LI_CTO_ID}/departments

{
  "departmentId": "{TECH_CENTER_ID}",
  "isPrimary": true,
  "managerId": "{ZHANG_CEO_ID}",
  "positionName": "CTO"
}
```

**设置为技术中心负责人**：
```bash
PUT /api/organization/departments/{TECH_CENTER_ID}/head

{
  "headId": "{LI_CTO_ID}"
}
```

---

### 3.3 创建用户 - 技术总监 王总监

**填写信息**：
```yaml
基本信息:
  姓名: 王总监
  英文名: Wang Director
  邮箱: wang.director@example.com
  用户名: wang_director
  密码: Test123456
  
组织信息:
  主部门: 开发部
  岗位: 技术总监
  汇报对象: 李总监
  
角色分配:
  - Department Manager (部门经理)
```

**创建用户并设置归属**：
```bash
# 1. 创建用户
POST /api/users
{
  "username": "wang_director",
  "email": "wang.director@example.com",
  "displayName": "王总监",
  "password": "Test123456",
  "status": "ACTIVE"
}

# 2. 添加部门归属
POST /api/users/{WANG_DIRECTOR_ID}/departments
{
  "departmentId": "{DEV_DEPT_ID}",
  "isPrimary": true,
  "managerId": "{LI_CTO_ID}",
  "positionName": "技术总监"
}

# 3. 设置为开发部负责人
PUT /api/organization/departments/{DEV_DEPT_ID}/head
{
  "headId": "{WANG_DIRECTOR_ID}"
}
```

**记录 userId**：`{WANG_DIRECTOR_ID}`

---

### 3.4 创建用户 - 开发经理 陈经理

**填写信息**：
```yaml
基本信息:
  姓名: 陈经理
  英文名: Chen Manager
  邮箱: chen.manager@example.com
  用户名: chen_manager
  密码: Test123456
  
组织信息:
  主部门: 开发部
  岗位: 开发经理
  汇报对象: 王总监
  
角色分配:
  - Employee (普通员工)
  - Department Manager (部门经理)  # 需要有审批权限
```

**创建步骤**：
```bash
# 1. 创建用户
POST /api/users
{
  "username": "chen_manager",
  "email": "chen.manager@example.com",
  "displayName": "陈经理",
  "password": "Test123456",
  "status": "ACTIVE"
}

# 2. 添加部门归属
POST /api/users/{CHEN_MANAGER_ID}/departments
{
  "departmentId": "{DEV_DEPT_ID}",
  "isPrimary": true,
  "managerId": "{WANG_DIRECTOR_ID}",
  "positionName": "开发经理"
}

# 3. 分配角色
POST /api/roles/{DEPARTMENT_MANAGER_ROLE_ID}/users
{
  "userId": "{CHEN_MANAGER_ID}"
}
```

**记录 userId**：`{CHEN_MANAGER_ID}`

---

### 3.5 创建用户 - 开发组长 赵组长

**填写信息**：
```yaml
基本信息:
  姓名: 赵组长
  英文名: Zhao Leader
  邮箱: zhao.leader@example.com
  用户名: zhao_leader
  密码: Test123456
  
组织信息:
  主部门: 开发部
  岗位: 开发组长
  汇报对象: 陈经理
  
角色分配:
  - Employee (普通员工)
  - Department Manager (部门经理)  # 需要有审批权限
```

**创建步骤**：
```bash
# 1. 创建用户
POST /api/users
{
  "username": "zhao_leader",
  "email": "zhao.leader@example.com",
  "displayName": "赵组长",
  "password": "Test123456",
  "status": "ACTIVE"
}

# 2. 添加部门归属
POST /api/users/{ZHAO_LEADER_ID}/departments
{
  "departmentId": "{DEV_DEPT_ID}",
  "isPrimary": true,
  "managerId": "{CHEN_MANAGER_ID}",
  "positionName": "开发组长"
}

# 3. 分配角色（审批权限）
POST /api/roles/{DEPARTMENT_MANAGER_ROLE_ID}/users
{
  "userId": "{ZHAO_LEADER_ID}"
}
```

**记录 userId**：`{ZHAO_LEADER_ID}`

---

### 3.6 创建用户 - 开发工程师 小明（测试用户）

**填写信息**：
```yaml
基本信息:
  姓名: 小明
  英文名: Xiao Ming
  邮箱: xiaoming@example.com
  用户名: xiaoming
  密码: Test123456
  
组织信息:
  主部门: 开发部
  岗位: 开发工程师
  汇报对象: 赵组长
  
角色分配:
  - Employee (普通员工)
```

**创建步骤**：
```bash
# 1. 创建用户
POST /api/users
{
  "username": "xiaoming",
  "email": "xiaoming@example.com",
  "displayName": "小明",
  "password": "Test123456",
  "status": "ACTIVE"
}

# 2. 添加部门归属
POST /api/users/{XIAOMING_ID}/departments
{
  "departmentId": "{DEV_DEPT_ID}",
  "isPrimary": true,
  "managerId": "{ZHAO_LEADER_ID}",
  "positionName": "开发工程师"
}

# 3. 分配 Employee 角色（通常自动分配）
POST /api/roles/{EMPLOYEE_ROLE_ID}/users
{
  "userId": "{XIAOMING_ID}"
}
```

**记录 userId**：`{XIAOMING_ID}`

---

## 📋 第四步：验证组织架构

### 4.1 检查组织树

访问：`组织管理` → `部门管理`

**预期显示**：
```
技术中心 (李总监)
└── 开发部 (王总监)
    ├── 陈经理
    ├── 赵组长
    └── 小明
```

### 4.2 检查汇报关系

点击每个用户，查看详情，确认：

| 用户 | 汇报对象 | 部门 | 岗位 |
|------|----------|------|------|
| 张总 | - | - | CEO |
| 李总监 | 张总 | 技术中心 | CTO |
| 王总监 | 李总监 | 开发部 | 技术总监 |
| 陈经理 | 王总监 | 开发部 | 开发经理 |
| 赵组长 | 陈经理 | 开发部 | 开发组长 |
| 小明 | 赵组长 | 开发部 | 开发工程师 |

---

## 📝 第五步：创建测试表单

### 5.1 创建表单定义 - 加班申请

**访问路径**：`表单管理` → `创建表单`

**基本信息**：
```yaml
表单名称: 加班申请
表单标识: overtime_request
表单分类: HR
描述: 员工加班申请表单
归属组织: （留空，平台级表单）
```

**表单字段设计**：
1. 加班日期 (date)
   - 字段名: overtimeDate
   - 标签: 加班日期
   - 必填: 是

2. 加班时长 (number)
   - 字段名: hours
   - 标签: 加班时长（小时）
   - 必填: 是
   - 最小值: 0.5

3. 加班原因 (textarea)
   - 字段名: reason
   - 标签: 加班原因
   - 必填: 是

4. 加班类型 (select)
   - 字段名: overtimeType
   - 标签: 加班类型
   - 选项:
     - 工作日加班
     - 周末加班
     - 节假日加班
   - 必填: 是

**审批流程配置**：

切换到"流程设计"标签：

```yaml
节点设计:
  - 开始节点 (自动)
  
  - 审批节点 1:
      节点名称: 组长审批
      节点ID: team_leader_approval
      审批人类型: 发起人上级
      审批人配置: initiator:manager
      
  - 审批节点 2:
      节点名称: 经理审批
      节点ID: manager_approval
      审批人类型: 发起人上级
      审批人配置: initiator:manager[2]  # 第二级上级
      
  - 结束节点 (自动)
```

**保存并提交审核**：
1. 点击"保存草稿"
2. 点击"提交审核"

**审核发布**（管理员操作）：
1. 切换到管理员账号
2. 访问：`表单管理` → `待审核`
3. 找到"加班申请"表单
4. 点击"审核通过"
5. 点击"发布"

---

### 5.2 创建表单定义 - 工时记录（连续上级审批）

**基本信息**：
```yaml
表单名称: 工时记录
表单标识: timesheet
表单分类: HR
归属组织: （留空）
```

**表单字段设计**：
1. 项目名称 (text)
   - 字段名: projectName
   - 必填: 是

2. 工时 (number)
   - 字段名: hours
   - 必填: 是

3. 工作内容 (textarea)
   - 字段名: description
   - 必填: 是

4. 日期 (date)
   - 字段名: workDate
   - 必填: 是

**审批流程配置**：
```yaml
节点设计:
  - 开始节点
  
  - 审批节点:
      节点名称: 逐级审批
      节点ID: manager_chain_approval
      审批人类型: 连续上级审批
      审批人配置: initiator:managerChain
      高级配置:
        自动通过模式: both  # 同一人或发起人自动通过
        最大层级: 10
        终止条件: 部门负责人
      
  - 结束节点
```

**保存、审核、发布**

---

### 5.3 创建表单定义 - 报销申请（条件分支）

**基本信息**：
```yaml
表单名称: 报销申请
表单标识: expense_request
表单分类: Finance
归属组织: （留空）
```

**表单字段设计**：
1. 报销金额 (number)
   - 字段名: amount
   - 必填: 是
   - 最小值: 0

2. 报销类型 (select)
   - 字段名: expenseType
   - 选项: 交通费、餐饮费、住宿费、办公用品

3. 发票附件 (file)
   - 字段名: invoice
   - 必填: 否

4. 报销说明 (textarea)
   - 字段名: description
   - 必填: 是

**审批流程配置**：
```yaml
节点设计:
  - 开始节点
  
  - 条件网关:
      节点ID: amount_gateway
      节点名称: 金额判断
      
  - 审批节点 1 (小额):
      节点名称: 组长审批
      节点ID: small_amount_approval
      审批人: initiator:manager
      触发条件: ${amount <= 1000}
      
  - 审批节点 2 (大额):
      节点名称: 经理审批
      节点ID: large_amount_approval
      审批人: initiator:manager[2]
      触发条件: ${amount > 1000}
      
  - 结束节点
```

**保存、审核、发布**

---

## ✅ 第六步：验证准备工作

### 6.1 登录测试

依次使用以下账号登录测试：
- [ ] 小明 (xiaoming / Test123456)
- [ ] 赵组长 (zhao_leader / Test123456)
- [ ] 陈经理 (chen_manager / Test123456)
- [ ] 王总监 (wang_director / Test123456)

### 6.2 权限检查

**小明登录后**：
- [ ] 能访问"审批中心"
- [ ] 能看到"发起新申请"按钮
- [ ] 能看到已发布的表单列表
- [ ] 不能访问"表单管理"（设计功能）

**赵组长登录后**：
- [ ] 能访问"审批中心"
- [ ] 能看到"待我审批"标签
- [ ] 有审批权限

### 6.3 组织关系检查

通过系统确认：
```bash
GET /api/users/{XIAOMING_ID}

# 预期返回包含：
{
  "manager": {
    "id": "{ZHAO_LEADER_ID}",
    "displayName": "赵组长"
  },
  "department": {
    "id": "{DEV_DEPT_ID}",
    "name": "开发部",
    "head": {
      "id": "{WANG_DIRECTOR_ID}",
      "displayName": "王总监"
    }
  }
}
```

---

## 🔧 故障排除

### 问题1：用户无法看到表单

**可能原因**：
- 表单未发布（状态不是 PUBLISHED）
- 表单归属组织设置错误
- 用户区域与表单不匹配

**解决方案**：
1. 检查表单状态
2. 确认表单 organizationId 为 null（平台级）
3. 检查用户的区域设置

### 问题2：审批人解析失败

**可能原因**：
- 汇报关系未正确设置
- 部门负责人未设置

**解决方案**：
1. 检查每个用户的 managerId
2. 检查部门的 headId
3. 确认组织架构完整

### 问题3：审批权限不足

**可能原因**：
- 用户未分配 Department Manager 角色
- 缺少 `approval:approve` 权限

**解决方案**：
1. 为审批人分配 Department Manager 角色
2. 检查角色权限配置

---

## 📊 数据汇总表

### 用户清单

| 序号 | 用户名 | 姓名 | 邮箱 | 密码 | 部门 | 岗位 | 汇报对象 | 角色 |
|------|--------|------|------|------|------|------|----------|------|
| 1 | zhang_ceo | 张总 | zhang.ceo@example.com | Test123456 | - | CEO | - | Administrator |
| 2 | li_cto | 李总监 | li.cto@example.com | Test123456 | 技术中心 | CTO | 张总 | Department Manager |
| 3 | wang_director | 王总监 | wang.director@example.com | Test123456 | 开发部 | 技术总监 | 李总监 | Department Manager |
| 4 | chen_manager | 陈经理 | chen.manager@example.com | Test123456 | 开发部 | 开发经理 | 王总监 | Department Manager, Employee |
| 5 | zhao_leader | 赵组长 | zhao.leader@example.com | Test123456 | 开发部 | 开发组长 | 陈经理 | Department Manager, Employee |
| 6 | xiaoming | 小明 | xiaoming@example.com | Test123456 | 开发部 | 开发工程师 | 赵组长 | Employee |

### 表单清单

| 序号 | 表单名称 | 表单标识 | 审批流程类型 | 用途 |
|------|----------|----------|-------------|------|
| 1 | 加班申请 | overtime_request | 固定两级审批 | 测试基本审批流程 |
| 2 | 工时记录 | timesheet | 连续上级审批 | 测试 managerChain |
| 3 | 报销申请 | expense_request | 条件分支 | 测试金额分级审批 |

---

## 🚀 下一步

准备工作完成后，请按照本文件的测试场景开始执行测试。

---

**创建日期**: 2025-12-24  
**适用版本**: v1.0.0  
**维护人员**: 开发团队
