# PRD 需求文档 - 执行记录删除功能

> **文档类型**: PRD 需求文档
> **创建日期**: 2026-07-14
> **作者**: czj
> **优先级**: P1
> **状态**: 待开发

---

## 一、需求背景

### 1.1 问题描述

执行中心页面目前只能查看执行记录，**无法删除**。随着测试不断执行，历史记录会持续累积，导致：
- 列表冗长，难以查找有效记录
- 无效/失败的执行记录无法清理
- 数据库存储持续增长

需要增加**单个删除**和**批量删除**执行记录的功能。

### 1.2 ⚠️ 核心约束（务必遵守）

**删除执行记录 ≠ 删除测试用例**

| 概念 | 说明 | 删除影响 |
|------|------|----------|
| 执行记录 (Execution) | 某次测试执行的"快照"，记录状态、通过率、耗时等 | 删除后只丢失本次执行结果 |
| 用例结果 (CaseResult) | 执行记录下每个用例的执行结果详情 | 随执行记录级联删除 |
| 测试用例 (TestCase) | 用例定义本身（步骤、选择器等） | **绝不删除**，与执行记录无关 |

执行记录与测试用例是**两个独立的表**，删除执行记录**不会影响**用例定义。用例可以再次被执行，生成新的执行记录。

### 1.3 影响范围

- **前端**: `frontend/src/views/Execution.vue` 执行中心页面
- **前端**: `frontend/src/api/executions.ts` API 接口
- **后端**: `backend/app/routers/executions.py` 路由
- **后端**: `backend/app/services/execution_service.py` 服务层

---

## 二、功能需求

### 2.1 单个删除

- 在执行记录列表的**操作列**增加【删除】按钮
- 点击后弹出**二次确认**对话框
- 确认后删除该执行记录及其关联的用例结果
- **运行中（running）的执行记录禁止删除**，避免影响正在执行的任务

### 2.2 批量删除

- 表格增加**多选列**（type="selection"）
- 顶部操作栏增加【批量删除】按钮，显示选中数量
- 点击后弹出**二次确认**对话框（显示将要删除的数量）
- 确认后批量删除选中的执行记录
- **运行中的记录自动排除**（不可勾选，或勾选后提示跳过）

### 2.3 交互细节

| 交互项 | 说明 |
|--------|------|
| 删除前确认 | ElMessageBox.confirm，提示"删除后无法恢复" |
| 删除成功提示 | ElMessage.success |
| 删除失败提示 | ElMessage.error + 错误信息 |
| 删除后刷新 | 自动刷新执行记录列表 |
| 按钮禁用 | 批量删除按钮在未选中时禁用 |
| 运行中保护 | running 状态记录的删除按钮禁用 + 隐藏多选框 |

---

## 三、技术方案

### 3.1 后端 API 设计

#### 单个删除

```
DELETE /api/executions/{execution_id}
```

**响应**:
- `204 No Content`：删除成功
- `404`：执行记录不存在
- `400`：执行记录正在运行中，无法删除
- `500`：服务器内部错误

#### 批量删除

```
POST /api/executions/batch-delete
Content-Type: application/json

{
  "ids": ["exec_xxx", "exec_yyy"]
}
```

**响应**:
```json
{
  "success_count": 2,
  "failed_count": 0,
  "skipped_count": 0,
  "errors": []
}
```

### 3.2 服务层方法

**ExecutionService** 新增：

```python
async def delete_execution(self, execution_id: str) -> bool:
    """删除执行记录（级联删除用例结果，不影响测试用例）"""
    # 1. 检查是否存在
    # 2. 检查是否运行中（running 禁止删除）
    # 3. 删除（级联自动删除 CaseResult）

async def delete_executions(self, execution_ids: List[str]) -> Tuple[int, int, int, List[str]]:
    """批量删除执行记录，返回 (成功数, 失败数, 跳过数, 错误列表)"""
```

### 3.3 级联删除（已支持）

Execution 模型已配置 `cascade="all, delete-orphan"`：

```python
case_results: Mapped[list["CaseResult"]] = relationship(
    "CaseResult",
    back_populates="execution",
    cascade="all, delete-orphan"  # 删除 Execution 时自动删除关联 CaseResult
)
```

删除 Execution 时，SQLAlchemy ORM 会**自动级联删除**关联的 CaseResult，无需手动处理。

### 3.4 前端改动

#### API 接口 (`api/executions.ts`)

```typescript
async delete(id: string): Promise<void> {
  await request.delete(`/api/executions/${id}`)
}

async batchDelete(ids: string[]): Promise<{success_count: number; failed_count: number}> {
  const response = await request.post('/api/executions/batch-delete', { ids })
  return response.data
}
```

#### Execution.vue 改动

1. 表格增加多选列 + 选择处理
2. 操作列增加【删除】按钮
3. 操作栏增加【批量删除】按钮
4. 新增 deleteExecution / batchDeleteExecutions 方法

---

## 四、验收标准

| 测试项 | 预期结果 |
|--------|----------|
| 单个删除执行记录 | ✅ 记录消失，用例结果一并删除 |
| 批量删除执行记录 | ✅ 选中记录全部删除 |
| 删除后测试用例完好 | ✅ 用例列表不受影响，可再次执行 |
| 删除运行中记录 | ✅ 拒绝删除，提示"运行中无法删除" |
| 批量删除含运行中记录 | ✅ 跳过运行中，删除其余 |
| 删除前二次确认 | ✅ 弹出确认对话框 |
| 删除后列表刷新 | ✅ 自动刷新 |
| 未选中时批量按钮 | ✅ 禁用 |

---

## 五、相关文档

- `frontend/src/views/Execution.vue` - 执行中心页面
- `frontend/src/views/Cases.vue` - 用例管理（删除交互参考）
- `backend/app/models/execution.py` - 执行记录模型（含级联配置）
- `backend/app/routers/executions.py` - 执行路由

---

*本文档由 Claude Code 生成，遵循项目 PRD 文档规范。*
