# 执行计划：修复批量监控页任务状态进入即显示「已完成」

> 生成时间：2026-08-21
> 关联文档：`_问题处理_批量监控页任务状态残留completed.md`
> 状态：✅ 已完成并部署

---

## 问题概述

点击「执行全部」跳转到 `BatchMonitor.vue`，任务列表**一进来就显示「已完成」**（带 TPS/响应时间数据），但顶部进度条显示「执行中」。

**根因**：`create_batch_and_start()` 创建 batch 记录后、后台任务启动前，**没有将本次任务的状态重置为 pending**。前端在后台任务开始执行前的窗口期查询 `get_batch_details()`，读到的是上一次执行残留的 `completed` 状态。

**附带发现**：`_run_batch_background()` 漏传 `batch_id`，导致后台创建第二个 batch 记录。

---

## 执行步骤

### Step 1: 后端 — 前置重置任务状态

**文件**：`backend/app/services/performance_service.py` → `create_batch_and_start()`

**改动**：在 batch 记录提交后、后台任务启动前，重置任务状态为 pending：

```python
self.db.add(batch_record)

# 将批次内所有任务状态重置为 pending（避免读到上一次执行的残留 completed/failed 状态）
for task_id in task_ids:
    task = await self.db.get(PerformanceTask, task_id)
    if task and task.status in ("completed", "failed", "cancelled", "pending"):
        task.status = "pending"

await self.db.commit()
```

**注意**：跳过 `running` 状态的任务，避免干扰其他正在执行的批量。

**验收标准**：
- 点击「执行全部」后立即查询 batch-details，所有任务状态为 `pending`
- 正在 `running` 的任务不会被重置

### Step 2: 后端 — 修复漏传 batch_id

**文件**：`backend/app/services/performance_service.py` → `_run_batch_background()`

**改动**：

```python
await service.batch_run_tasks(
    task_ids=task_ids,
    project_id=project_id,
    batch_id=batch_id,   # 修复前：漏传，导致创建第二个 batch 记录
)
```

**验收标准**：每次批量执行只创建 1 条 batch 记录

### Step 3: 构建前端

```bash
cd frontend && npm run build
```

**验收标准**：构建成功，无 TypeScript 错误（本次前端无代码改动，仅重新构建部署）

### Step 4: 部署到 5.60

```bash
scp backend/app/services/performance_service.py ubains@192.168.5.60:.../backend/app/services/
scp -r frontend/dist ubains@192.168.5.60:.../frontend/
ssh ubains@192.168.5.60 "cd /data/third_party/plat-auto-test/deploy && docker compose restart app"
```

**验收标准**：容器重启成功，`grep -n 'task.status = .pending'` 确认修复代码已部署

### Step 5: 补充文档

- `Docs/PRD/性能测试/问题处理/_问题处理_批量监控页任务状态残留completed.md`（NEW）
- `Docs/PRD/性能测试/问题处理/_执行计划_修复批量监控页任务状态残留completed.md`（NEW）

---

## 改动清单

| 文件 | 类型 | 说明 |
|------|------|------|
| `backend/app/services/performance_service.py` | **MODIFY** | `create_batch_and_start()` 前置重置任务状态为 pending（+4 行） |
| `backend/app/services/performance_service.py` | **MODIFY** | `_run_batch_background()` 补传 `batch_id`（1 行） |
| `Docs/.../_问题处理_批量监控页任务状态残留completed.md` | **NEW** | 问题处理文档 |
| `Docs/.../_执行计划_修复批量监控页任务状态残留completed.md` | **NEW** | 本次执行计划 |

**无需改动**：
- 前端代码（`BatchMonitor.vue` 逻辑本身正确，只是读到的数据有问题）
- 数据库结构 / schema

---

## 验证计划

1. 浏览器 **Ctrl+F5** 强刷
2. 进入项目管理 → 点击「执行全部」
3. 确认页面跳转到批量监控页后：
   - 任务列表显示「等待中」（pending）而非「已完成」
   - 进度条显示「执行中」，进度 0/N
4. 观察任务逐个流转：等待中 → 运行中 → 已完成
5. 确认全部完成后进度条 100%、显示「查看合并报告」

---

*本文档由 Claude Code 生成*