# PRD - 性能测试项目管理与批量执行

> **文档版本**: v1.0
> **创建日期**: 2026-08-20
> **模块类型**: 性能测试
> **优先级**: P1

---

## 一、背景与目标

### 1.1 背景

当前性能测试模块的任务管理采用**平铺列表**方式，所有任务混在一起，缺乏层级组织能力。随着性能测试任务数量增长，用户面临以下问题：

1. **任务归属不清晰**：无法区分「标准版」与「项目定制」场景的任务
2. **无法批量操作**：每次只能执行单个任务，需要反复操作
3. **缺乏项目级视角**：不能直观查看某个项目下所有接口的性能概况

UI 自动化模块已通过 `module_type: standard/custom` 实现了「标准模块」与「项目定制模块」的区分，并支持整模块执行和模块内多选执行。性能测试模块需要类似的层级管理能力。

### 1.2 目标

1. **项目化管理**：将性能测试任务组织到「项目」中，区分标准版/项目定制场景
2. **整项目执行**：一键执行项目下所有任务（顺序执行）
3. **批量勾选执行**：进入项目后，勾选多个任务批量执行
4. **兼容现有数据**：已有任务可归入项目，不破坏现有数据

---

## 二、功能范围

| 功能 | 描述 | 优先级 |
|------|------|--------|
| 性能项目管理（CRUD） | 创建/编辑/删除项目，区分标准版/项目定制 | P0 |
| 项目卡片网格视图 | 类似 Modules.vue 的卡片布局展示项目 | P0 |
| 任务归属项目 | 创建/编辑任务时选择归属项目 | P0 |
| 项目内任务列表 | 进入项目后查看该项目的所有任务 | P0 |
| 整项目执行 | 一键顺序执行项目下所有任务 | P0 |
| 多任务勾选批量执行 | 勾选多个任务后批量执行（顺序执行） | P0 |
| 批量执行进度展示 | 展示当前执行到第几个任务、整体进度 | P1 |
| 任务列表按项目筛选 | 全局任务列表支持按项目维度过滤 | P1 |
| 项目维度统计 | 项目卡片展示任务数、最近执行状态等 | P1 |

---

## 三、数据模型设计

### 3.1 PerformanceProject（新表）

```sql
CREATE TABLE performance_projects (
    id VARCHAR(64) PRIMARY KEY,          -- 唯一标识 (proj_xxx)
    name VARCHAR(200) NOT NULL,           -- 项目名称
    description TEXT DEFAULT '',           -- 项目描述
    project_type VARCHAR(20) DEFAULT 'standard',  -- 类型: standard(标准)/custom(项目定制)
    icon VARCHAR(50) DEFAULT 'folder',    -- 项目图标
    sort_order INT DEFAULT 0,             -- 排序序号
    created_at DATETIME,                  -- 创建时间
    updated_at DATETIME                   -- 更新时间
);
```

### 3.2 PerformanceTask（扩展字段）

在现有 `performance_tasks` 表的基础上新增**一个字段**：

```sql
ALTER TABLE performance_tasks ADD COLUMN project_id VARCHAR(64) DEFAULT NULL;
```

**说明**：
- `project_id` 为 nullable，不强制所有任务都归属项目
- 删除项目时，其下任务的 `project_id` 置为 NULL（不级联删除任务）
- 现有任务不受影响，迁移时用户可手动将任务归入项目

### 3.3 批量执行记录（可选，P1）

```sql
CREATE TABLE performance_batch_executions (
    id VARCHAR(64) PRIMARY KEY,           -- 批量执行ID
    project_id VARCHAR(64),                -- 关联项目ID
    task_ids TEXT,                         -- 执行的任务ID列表（JSON数组）
    status VARCHAR(20) DEFAULT 'running',  -- running/completed/partially_failed
    current_index INT DEFAULT 0,           -- 当前执行到第几个
    total_count INT DEFAULT 0,             -- 总任务数
    success_count INT DEFAULT 0,           -- 成功数
    fail_count INT DEFAULT 0,              -- 失败数
    started_at DATETIME,                   -- 开始时间
    completed_at DATETIME,                 -- 完成时间
    created_at DATETIME                    -- 创建时间
);
```

---

## 四、API 设计

### 4.1 项目管理

| 方法 | 路径 | 描述 |
|------|------|------|
| GET | `/api/performance/projects` | 获取项目列表（支持 project_type 筛选） |
| POST | `/api/performance/projects` | 创建项目 |
| GET | `/api/performance/projects/{id}` | 获取项目详情 |
| PUT | `/api/performance/projects/{id}` | 更新项目 |
| DELETE | `/api/performance/projects/{id}` | 删除项目（任务置空 project_id） |
| GET | `/api/performance/projects/{id}/stats` | 获取项目统计（任务数、各状态分布） |

### 4.2 任务列表扩展

| 参数 | 描述 |
|------|------|
| `project_id` | 按项目筛选任务（现有 `list_tasks` 新增参数） |
| `project_id=null` | 查询未归属项目的任务 |

### 4.3 批量执行

| 方法 | 路径 | 描述 |
|------|------|------|
| POST | `/api/performance/projects/{id}/run-all` | 执行项目下所有任务 |
| POST | `/api/performance/tasks/batch-run` | 批量执行指定任务列表 |

**批量执行流程**：
1. 接收请求，返回 `batch_id` 和 `task_ids` 列表
2. 后台按顺序逐个执行任务（串行，避免资源竞争）
3. 每个任务执行完毕后更新进度
4. 全部完成后推送批量执行完成通知
5. 可通过 WebSocket 订阅批量执行进度（`perf_batch_progress`）

### 4.4 WebSocket 消息扩展

```json
{
  "type": "perf_batch_progress",
  "batch_id": "batch_xxx",
  "project_id": "proj_xxx",
  "current_index": 2,
  "total_count": 5,
  "current_task_id": "perf_xxx",
  "current_task_name": "获取设备列表",
  "current_status": "completed",
  "success_count": 2,
  "fail_count": 0
}
```

---

## 五、前端页面设计

### 5.1 页面结构

```
/performance
├── /performance/projects          ← 项目列表页（卡片网格，新增）
├── /performance/projects/:id      ← 项目详情页（项目内任务列表，新增）
├── /performance/tasks             ← 全局任务列表（现有，新增 project_id 筛选）
├── /performance/monitor           ← 监控页（现有）
├── /performance/report            ← 报告页（现有）
└── /performance/presets           ← 预设配置（现有）
```

### 5.2 项目列表页（/performance/projects）

- **顶部 tab**：标准版 / 项目定制（类似 Modules.vue 的 `:type` 参数）
- **卡片网格**：每行 4 张卡片（el-col span=6）
  - 显示项目名称、描述、图标
  - 显示统计信息：任务数、最近执行状态
  - 操作：进入项目（点击卡片）、编辑、删除
- **工具栏**：新建项目按钮、刷新按钮

### 5.3 项目详情页（/performance/projects/:id）

- **顶部区域**：项目名称、描述、返回按钮
- **工具栏**：
  - 「执行全部」按钮（一键执行项目下所有任务）
  - 批量执行按钮（勾选后出现）
  - 新建任务按钮（自动设置 project_id）
  - 状态筛选、刷新
- **任务表格**：在现有 TaskList 表格基础上增加：
  - 多选框列（用于批量勾选）
  - 显示任务状态、TPS、错误率等
- **批量执行进度条**：执行中显示进度（当前第 N 个 / 共 M 个）

### 5.4 任务创建/编辑弹窗扩展

- 新增「归属项目」下拉选择器（可选，不强制）
- 在现有创建弹窗中增加一个字段

### 5.5 全局任务列表调整

- 任务列表页增加「项目」列，显示项目名称
- 增加按项目筛选的下拉选择器

---

## 六、UI 预览图

> 详见同目录下 `_PRD_性能测试项目管理与批量执行_UI预览.html`
> 可使用浏览器打开查看完整页面设计

---

## 七、非功能需求

### 7.1 兼容性

- 新增 `project_id` 字段为 nullable，现有任务不强制迁移
- 删除项目不级联删除任务，仅置空 `project_id`
- 所有现有 API 保持向后兼容

### 7.2 性能约束

- 批量执行采用**串行**方式（一个任务完成后才执行下一个），避免多个压测引擎同时运行导致资源竞争
- 批量执行进度通过 WebSocket 实时推送

### 7.3 安全性

- 正在运行的任务不可编辑/删除（现有约束）
- 批量执行中如果某个任务失败，继续执行下一个（不中断）

---

## 八、实施计划

| 阶段 | 内容 | 预估工时 |
|------|------|---------|
| Phase 1 | 数据模型 + 后端 CRUD API | 1 天 |
| Phase 2 | 项目列表页 + 项目详情页 UI | 1 天 |
| Phase 3 | 批量执行 + 进度推送 | 1 天 |
| Phase 4 | 现有任务列表适配 + 联调测试 | 0.5 天 |

---

*本文档完成后，将使用 prd-plan skill 生成计划执行文档，再使用 prd-code skill 实现代码。*