# 执行计划：修复批量详情 API 500 错误（actual_concurrency 字段缺失）

> 生成时间：2026-08-21
> 关联文档：`_问题处理_批量详情API500_actual_concurrency字段缺失.md`
> 状态：✅ 已完成并验证

---

## 问题概述

批量执行启动后，前端 `BatchMonitor.vue` 调用 `GET /api/performance/batch-details/{batch_id}` 返回 **500**，页面无法展示任务列表和实时监控。

**根因**：`get_batch_details()` 访问 ORM 对象不存在的属性 `task.actual_concurrency`，抛出 `AttributeError`。`PerformanceTask` 模型只有 `concurrency`（配置并发数），没有 `actual_concurrency` 字段。

---

## 执行步骤

### Step 1: 本地定位并修复

**文件**：`backend/app/services/performance_service.py`

**改动**：`get_batch_details()` 中（约第 1648 行）

```python
# 修复前（报错）
"actual_concurrency": task.actual_concurrency,

# 修复后
"actual_concurrency": task.concurrency,
```

**验收标准**：
- 本地运行 `python -c "from app.services.performance_service import PerformanceService; ..."` 无 AttributeError
- schema 与前端类型无需改动（`BatchTaskItem.actual_concurrency` 仅是响应字段名，本身正确）

### Step 2: 上传修复文件到 5.60 服务器

```bash
scp app/services/performance_service.py ubains@192.168.5.60:/data/third_party/plat-auto-test/backend/app/services/performance_service.py
```

**验收标准**：上传成功，无报错

### Step 3: 重启后端容器

```bash
ssh ubains@192.168.5.60 "cd /data/third_party/plat-auto-test/deploy && docker compose restart app"
```

**验收标准**：`Container plat-auto-test-app Started`，无启动异常

### Step 4: 验证 API

```bash
# 用数据库中的真实 batch_id 验证
curl http://localhost/api/performance/batch-details/batch_xxx

# 不存在的 batch_id 验证 404 语义
curl http://localhost/api/performance/batch-details/nonexistent-id-123
```

**验收标准**：
- 真实批次返回 200，`tasks[]` 内包含 `actualConcurrency` 字段
- 不存在批次返回 `{"detail":"批量执行记录不存在"}`

### Step 5: 补充文档

**文件**：
- `Docs/PRD/性能测试/问题处理/_问题处理_批量详情API500_actual_concurrency字段缺失.md`（NEW）
- `Docs/PRD/性能测试/问题处理/_执行计划_修复批量详情API500_actual_concurrency字段缺失.md`（NEW）

**验收标准**：问题处理 + 执行计划文档配对齐全

---

## 改动清单

| 文件 | 类型 | 说明 |
|------|------|------|
| `backend/app/services/performance_service.py` | **MODIFY** | `get_batch_details()` 中 `task.actual_concurrency` → `task.concurrency`（1 行） |
| `Docs/.../_问题处理_批量详情API500_actual_concurrency字段缺失.md` | **NEW** | 问题处理文档（根因分析 + 修复 + 验证） |
| `Docs/.../_执行计划_修复批量详情API500_actual_concurrency字段缺失.md` | **NEW** | 本次执行计划 |

**无需改动**：
- `schemas/performance.py`（`BatchTaskItem.actual_concurrency` 是正确响应字段名）
- `types/performance.ts`（`actualConcurrency` 前端类型正确）
- 前端代码（无前端问题）

---

## 验证结果

| 验证项 | 结果 | 说明 |
|--------|------|------|
| 容器重启 | ✅ | `docker compose restart app` 成功 |
| 真实批次详情 | ✅ 200 | 返回 projectName/status/tasks，任务含 actualConcurrency=10 |
| 不存在批次 | ✅ 404 语义 | `{"detail":"批量执行记录不存在"}` |
| 前端页面 | 待用户复验 | 强刷后进入批量监控页确认任务列表正常展示 |

---

## 教训

1. service 层访问 ORM 属性前，先核对 `models/*.py` 字段定义，不要凭 schema 或前端类型猜测字段来源。
2. 500 定位最快路径：容器日志搜 `AttributeError`，直接给出行号和属性名。
3. 修复闭环：改代码 → 上传 → 重启 → 真实数据调接口确认 200，缺一不可。

---

*本文档由 Claude Code 生成*