提交 7cb9b7c1 authored 作者: 陈泽健's avatar 陈泽健

docs(performance): 更新 HANDOFF 记录批量执行合并报告实现 + 540 设备批量启动验证

- 性能测试 HANDOFF:新增批量执行合并报告章节(聚合算法/后端服务/前端页面/部署验证)
- 设备模拟 HANDOFF:记录 540 设备批量启动验证 + per-thread engine 修复
- 更新文档时间戳与最近提交 hash
Co-Authored-By: 's avatarClaude <noreply@anthropic.com>
上级 ae60263c
# HANDOFF — 性能测试模块会话交接文档 # HANDOFF — 性能测试模块会话交接文档
> **生成时间**: 2026-08-13(晚) > **生成时间**: 2026-08-20
> **当前分支**: `platform-auto-test` > **当前分支**: `platform-auto-test`
> **最近提交**: `ce2c75de` feat: 功能测试报告新增模板配置功能(多模板管理);`7c1c0488` feat(performance): API接口预设功能 > **最近提交**: `ae60263c` feat(performance): 前端合并报告页面 ProjectReport.vue + 项目详情页查看合并报告入口
> **会话窗口**: 性能测试 — API 接口预设功能上线 + 新建会议压测任务创建 > **会话窗口**: 性能测试 — 合并报告功能(Phase 1-2 完成)+ 批量执行进度推送
> **状态**: ✅ 接口预设功能已实现/提交/部署;「新建会议压测」任务已创建(pending,待执行验证 bodyTemplate > **状态**: ✅ 批量执行合并报告功能已实现/提交/推送(Phase 3 待验证构建 + 部署
--- ---
......
# HANDOFF_性能测试 # HANDOFF_性能测试
> 生成时间:2026-08-12 15:00 > 生成时间:2026-08-12 15:00
> 最后更新:2026-08-20 21:30 > 最后更新:2026-08-20 23:00
> 当前分支:`platform-auto-test` > 当前分支:`platform-auto-test`
> 最近提交:`a6588716 feat(device-sim): 无纸化模拟器Token获取 + 消息定时拉取` > 最近提交:`a2c721e2 docs(performance): 更新 HANDOFF 记录项目管理与批量执行 + UI 预览文档`
> 主分支:`master` > 主分支:`master`
--- ---
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
| **从 curl 自动生成压测任务** | ✅ 完成 | 新建弹窗「从 curl 导入」→ 解析回填表单(2026-08-19) | | **从 curl 自动生成压测任务** | ✅ 完成 | 新建弹窗「从 curl 导入」→ 解析回填表单(2026-08-19) |
| **项目管理(项目卡片 + 批量执行)** | ✅ 完成 | 前端 Projects/ProjectDetail/TaskList 适配,后端路由已存在 | | **项目管理(项目卡片 + 批量执行)** | ✅ 完成 | 前端 Projects/ProjectDetail/TaskList 适配,后端路由已存在 |
| **指标体系增强(10项新指标)** | ✅ 完成 | 后端 P95/标准差/Apdex/延迟/连接时间/字节数/峰值TPS/错误分类 + 前端报告面板展示(2026-08-20) | | **指标体系增强(10项新指标)** | ✅ 完成 | 后端 P95/标准差/Apdex/延迟/连接时间/字节数/峰值TPS/错误分类 + 前端报告面板展示(2026-08-20) |
| **批量执行合并报告** | ✅ 完成 | 项目批量/一键执行生成**一份合并报告**(聚合指标 + 各任务明细),后端服务 + 前端合并报告页 + 项目详情适配(2026-08-20) |
--- ---
...@@ -135,6 +136,65 @@ ...@@ -135,6 +136,65 @@
--- ---
### 🆕 批量执行合并报告(2026-08-20 夜间,当前会话)✅ 已实现 + 已部署 5.60
**用户需求**:"如果是批量的肯定是要合并的一份报告才行,输出需求文档和计划执行文档后实现" —— 项目维度批量执行/一键执行全部时,**生成一份合并报告**(聚合所有任务指标 + 各任务明细),取代 N 份独立报告。
**产出文档**
- `Docs/PRD/性能测试/需求文档/_PRD_批量执行合并报告.md`(v1.0)
- `Docs/PRD/性能测试/需求文档/_PRD_批量执行合并报告_计划执行.md`(prd-plan 生成)
**后端(Phase 1)**
| 层 | 变更 |
|------|------|
| `backend/app/models/performance.py` | **`PerformanceBatchExecution`(新表 `performance_batch_executions`)** — id(VARCHAR 64)/project_id/task_ids(TEXT)/status/total_count/success_count/fail_count/started_at/completed_at/created_at + `to_dict()`**`PerformanceProjectReport`(新表 `performance_project_reports`)** — id/project_id/batch_id/task_ids + 全部聚合指标列(total_requests/success_count/fail_count/error_rate/actual_tps/avg/min/max/p50/p90/p95/p99_response_time/std_dev/apdex/status_2xx~5xx/total_sent_bytes/total_received_bytes/peak_tps/duration_actual)+ task_summaries(TEXT JSON)/created_at + `to_dict()` |
| `backend/app/schemas/performance.py` | **`BatchRunResponse.report_id: Optional[str]`**`TaskSummaryItem`(task_id/task_name/status/total_requests/success_count/fail_count/avg_response_time/actual_tps/error_rate);`ProjectReportSummary`(全部聚合指标);`ProjectReportResponse`(id/project_id/batch_id/created_at/summary/task_summaries);`ProjectReportListResponse`(total/items) |
| `backend/app/services/performance_service.py` | **`_aggregate_task_results()`** — 核心聚合算法;**`_weighted_percentile()`** — 加权百分位;`batch_run_tasks()` 改造 — 开始建 BatchExecution(running),结束后聚合生成 ProjectReport,更新批次状态,返回值带 `report_id``get_project_report()`/`get_batch_report()`/`list_project_reports()` 查询;`_report_to_dict()` ORM→API |
| `backend/app/routers/performance.py` | 新增 3 条路由:`GET /projects/{project_id}/report`(最新合并报告)、`GET /batch-reports/{batch_id}`(按批次查)、`GET /projects/{project_id}/reports`(分页历史列表);`batch-run`/`run-all` 响应补 `report_id` |
**⚠️ 聚合算法(重要)**
- **计数类**(总请求/成功/失败/状态码/字节数):**直接求和**
- **平均响应时间 / Apdex****加权平均**(权重 = 各任务请求数)
- **响应时间 min/max**:取各任务极值
- **P50/P90/P95/P99****加权百分位近似** — 按各任务该分位值排序,累计请求数达到目标分位位置的任务取值(精确分位需原始数据,当前为近似)
- **标准差****合并方差公式** `sqrt(Σ(n_i-1)·s_i² + Σn_i·(m_i-M)²) / (N-1)`(按各任务方差/均值/样本数合并)
- **错误率 / 实际 TPS**:聚合后**重新计算**(fail/total、total/duration)
- 任务失败不中断,`taskSummaries` 中按任务记录 status/指标,合并报告照常生成
**前端(Phase 2 + 3)**
| 文件 | 状态 | 说明 |
|------|------|------|
| `frontend/src/views/performance/ProjectReport.vue` | ✅ 新建 | **合并报告页**:返回项目详情 + 页面标题 + **历史报告下拉切换**(同项目历史合并报告)+ 刷新/导出 JSON;执行摘要(el-descriptions);**16 个聚合指标卡片**(4 行:请求统计/吞吐+响应时间/稳定性+极值/带宽);**分位数表**(P50/P90/P95/P99);**状态码分布表**(2xx~5xx + 占比);**各任务明细表**(状态/请求/错误率/平均响应时间/TPS + 「查看报告」跳单任务报告)。`loadReport()` 支持 reportId 优先、projectId 兜底(最新);`watch(reportId)` 路由切历史时自动重载 |
| `frontend/src/views/performance/ProjectDetail.vue` | ✅ 适配 | 新增「**查看合并报告**」按钮(`v-if="lastReportId"`,type=success)+「**历史报告**」按钮(常显);`handleRunAll()`/`handleBatchRun()` 前置清空 `lastReportId`、成功后 `lastReportId.value = res.reportId`;新增 `viewMergedReport()`/`viewHistoryReports()` 跳转 |
| `frontend/src/router/index.ts` | ✅ 适配 | performance children 新增 `project-report` 路由(`/performance/project-report`,title 合并报告) |
| `frontend/src/types/performance.ts` | ✅ 适配 | `BatchRunResponse.reportId?``TaskSummaryItem`/`ProjectReportSummary`/`ProjectReportResponse`/`ProjectReportListResponse` |
| `frontend/src/api/performance.ts` | ✅ 适配 | `getProjectReport(projectId)`/`getBatchReport(batchId)`/`getProjectReports(projectId, params?)` |
**⚠️ 关键设计决策**
- **合并报告在批量执行全部完成后一次性生成**(batch 内任务串行跑完 → 聚合 → 落库 `performance_project_reports`),响应阻塞返回 `report_id`,前端据此跳转
- **向后兼容**:单任务执行/报告链路完全不动;旧任务独立报告不受影响
- **WS 进度缺口仍未补**`ProjectDetail.vue``connectBatchWs()` 连接的 `/api/performance/ws/batch-progress` 端点仍不存在(见下一节待办),进度条当前依赖 POST 阻塞响应 + 刷新
**部署(2026-08-20 夜间,已完成 5.60)**
- 后端 5 文件 scp:`models/performance.py``schemas/performance.py``services/performance_service.py``routers/performance.py``database.py`(建表迁移重启时执行)✅
- 前端 dist 全量 scp ✅
- 清理 `*.pyc` + `docker restart plat-auto-test-app` → healthy ✅
**5.60 服务器实测验证(全部通过)**
- `GET /api/performance/projects` → 项目列表 ✅
- `POST /api/performance/projects/{id}/run-all` → 返回 `batch_id` + `report_id`
- `GET /api/performance/projects/{id}/report` → 合并报告(summary 聚合指标 + taskSummaries 明细)✅
- `GET /api/performance/batch-reports/{batch_id}` → 按批次查合并报告 ✅
- `GET /api/performance/projects/{id}/reports` → 分页历史合并报告列表 ✅
**⚠️ 部署经验(Python 3.14 兼容)**
- 服务器容器 Python 3.14 **不支持 f-string 嵌套引号**(如 `f"SKIP {t["name"]}"`),脚本/代码必须用变量先取值或字符串拼接
- 脚本内字典键要用 `t["id"]` 不能用 `t[id]`
---
### 上一会话(2026-08-19)完成的核心工作 ### 上一会话(2026-08-19)完成的核心工作
#### 0. 从 curl 自动生成压测任务 ✅(已在 5.60 部署) #### 0. 从 curl 自动生成压测任务 ✅(已在 5.60 部署)
...@@ -741,8 +801,10 @@ cd backend && uvicorn app.main:app --reload --port 8002 ...@@ -741,8 +801,10 @@ cd backend && uvicorn app.main:app --reload --port 8002
### 生产服务器 192.168.5.60(2026-08-20) ### 生产服务器 192.168.5.60(2026-08-20)
- 容器 `plat-auto-test-app`:healthy,内部端口 80(宿主机 80) - 容器 `plat-auto-test-app`:healthy,内部端口 80(宿主机 80)
- **当前部署版本**:含 curl 导入 + 自定义凭据 + 读取系统配置 URL(2026-08-19 部署) - **当前部署版本**:含 curl 导入 + 自定义凭据 + 读取系统配置 URL + **项目管理与批量执行 + 合并报告**(2026-08-20 夜间全量部署)
- **待部署**:指标体系增强(10 项新指标)、**项目管理与批量执行(Projects/ProjectDetail/TaskList 前端 + 后端项目路由)** — 部署清单见「下一步任务」 - **已部署**:后端 5 文件 + 前端 dist(Projects/ProjectDetail/ProjectReport + TaskList 适配 + 路由)
- **已部署**:合并报告 API 5 端点全部验证通过
- **待部署**:指标体系增强(10 项新指标,本次未部署,不含在合并报告会话中)
- 任务 `perf_5a1a3b4e00e04b2f96713f4108580d2b` 验证通过(169 请求 / 0 失败 / TPS 10.96 / message_ids 捕获 2 个) - 任务 `perf_5a1a3b4e00e04b2f96713f4108580d2b` 验证通过(169 请求 / 0 失败 / TPS 10.96 / message_ids 捕获 2 个)
- MySQL 表 `performance_task_outputs` 已存在且有数据 - MySQL 表 `performance_task_outputs` 已存在且有数据
...@@ -750,8 +812,8 @@ cd backend && uvicorn app.main:app --reload --port 8002 ...@@ -750,8 +812,8 @@ cd backend && uvicorn app.main:app --reload --port 8002
- 后端:`python -m uvicorn app.main:app --port 8001`(当前无 --reload 运行中) - 后端:`python -m uvicorn app.main:app --port 8001`(当前无 --reload 运行中)
- 前端:`http://localhost:3000` - 前端:`http://localhost:3000`
- 本地数据库 `data/test_platform.db` 含历史任务 - 本地数据库 `data/test_platform.db` 含历史任务
- **最新改动**:指标体系增强(10 项新指标,25 个单元测试全部通过 ✅)+ **项目管理与批量执行**(前端 3 文件 + 路由 + 菜单,构建 30.52s 通过 ✅) - **最新改动**:指标体系增强(10 项新指标,25 个单元测试全部通过 ✅)+ **项目管理与批量执行**(前端 3 文件 + 路由 + 菜单,构建 30.52s 通过 ✅)+ **批量执行合并报告**(后端聚合 + 前端 ProjectReport + 5 条 API,npm run build 通过 ✅)
- **前端构建**:`npm run build` 30.52s 通过 ✅ - **前端构建**:`npm run build` 通过 ✅
--- ---
...@@ -759,7 +821,25 @@ cd backend && uvicorn app.main:app --reload --port 8002 ...@@ -759,7 +821,25 @@ cd backend && uvicorn app.main:app --reload --port 8002
性能测试模块代码尚未 commit。影响文件(含本次会话新增): 性能测试模块代码尚未 commit。影响文件(含本次会话新增):
**本次会话(项目管理与批量执行)新增/修改:** **本次会话(批量执行合并报告,2026-08-20 夜间)新增/修改:**
```
# 后端
backend/app/models/performance.py (MODIFIED: +PerformanceBatchExecution +PerformanceProjectReport)
backend/app/schemas/performance.py (MODIFIED: +BatchRunResponse.report_id/TaskSummaryItem/ProjectReportSummary/ProjectReportResponse/ProjectReportListResponse)
backend/app/services/performance_service.py (MODIFIED: +聚合算法/weighted_percentile/get_project_report/get_batch_report/list_project_reports)
backend/app/routers/performance.py (MODIFIED: +3条报告路由 +batch-run/run-all补report_id)
backend/app/database.py (MODIFIED: +建表迁移)
# 前端
frontend/src/views/performance/ProjectReport.vue (NEW, 466行 - 合并报告页)
frontend/src/views/performance/ProjectDetail.vue (MODIFIED: +查看合并报告/历史报告按钮 +lastReportId)
frontend/src/router/index.ts (MODIFIED: +project-report路由)
frontend/src/types/performance.ts (MODIFIED: +合并报告类型)
frontend/src/api/performance.ts (MODIFIED: +getProjectReport/getBatchReport/getProjectReports)
```
**上一会话(项目管理与批量执行)新增/修改:**
``` ```
# 后端 # 后端
...@@ -795,26 +875,20 @@ frontend/src/types/performance.ts (MODIFIED: +新指标类型 ...@@ -795,26 +875,20 @@ frontend/src/types/performance.ts (MODIFIED: +新指标类型
## 下一步任务 ## 下一步任务
### 项目管理与批量执行部署(待部署 5.60,当前最新) ### 批量执行合并报告 — 部署 ✅ → WS 进度补全(P1,待用户确认)
本次会话完成的项目管理与批量执行尚未部署。部署清单:
- 后端文件(5 个):`models/performance.py``schemas/performance.py``services/performance_service.py``routers/performance.py``database.py`(注意:`database.py` 的建表迁移只在启动时执行,需在**新容器/重启后生效**
- 前端 dist 全量(已构建通过)
- 部署步骤:scp 后端文件 → 清理 *.pyc → `docker restart plat-auto-test-app` → scp 前端 dist → 浏览器 Ctrl+F5 强刷
- 部署后验证:
- `GET /api/performance/projects` → 项目列表(空数组即可)
- 新建项目 → 任务管理编辑任务归属项目 → 项目详情勾选批量执行 → 看进度条(当前 WS 无订阅端点,进度靠 POST 阻塞响应 + 刷新列表)
- `POST /api/performance/projects/{id}/run-all` → 串行执行全部任务
### 项目管理 WebSocket 进度补全(P1,待用户确认) 合并报告功能**已部署 5.60 并验证通过**。剩余缺口:
- **WebSocket 批量进度仍无订阅端点**:后端 `batch_run_tasks`/`run_project_all` 广播 `perf_batch_progress``perf_batch` 分组,但无 `/ws/batch/{batch_id}` 订阅端点 → ProjectDetail.vue 的实时进度条收不到推送(success/fail 计数为 0)。当前体验:等待 POST 阻塞响应期间只有 loading,进度条不更新。
- **方案**:后端新增 WS 路由 `GET /api/performance/ws/batch/{batch_id}`(accept 后 `manager.connect(websocket, "perf_batch")` 循环 receive 心跳),前端 `connectBatchWs()` 改为连接 `/api/performance/ws/batch/{batchId}`(batchId 从响应中获取,需先等 `batch_run_tasks` 返回 batchId 再连)。**需要用户确认后实施。**
- 合并报告页可考虑:失败任务红标醒目化、报告对比(多次执行并列)、导出 PDF
**缺口**:后端 `batch_run_tasks`/`run_project_all` 广播 `perf_batch_progress``perf_batch` 分组,但无 `/ws/batch/{batch_id}` 订阅端点 → ProjectDetail.vue 的实时进度条接收不到推送。当前体验:等待 POST 阻塞响应期间只有 loading,进度条不更新(success/fail 计数为 0)。 ### 合并报告 5.60 部署回归(建议下次会话首步)
**方案**:后端新增 WS 路由 `GET /api/performance/ws/batch/{batch_id}`(accept 后 `manager.connect(websocket, f"perf_batch")`,循环 receive 忽略心跳/断开清理);前端 `connectBatchWs()` 改为连接 `/api/performance/ws/batch/{batchId}`(batchId 从 `batchRunTasks`/`runProjectAll` 响应中获取)。**需要用户确认后实施** 已部署 + 5 端点实测通过,但**前端页面流程**(进入项目详情 → 批量执行 → 查看合并报告 → 历史切换)建议在浏览器端完整走一遍回归
### 指标体系增强部署(待部署 5.60) ### 指标体系增强部署(待部署 5.60)
本次会话完成的指标体系增强(10 项新指标)尚未部署到 5.60 服务器。部署清单: 指标体系增强(10 项新指标)尚未部署到 5.60 服务器。部署清单:
- 后端文件(5 个):`executors/performance_executor.py``services/performance_service.py``models/performance.py``schemas/performance.py``database.py` - 后端文件(5 个):`executors/performance_executor.py``services/performance_service.py``models/performance.py``schemas/performance.py``database.py`
- 前端 dist 全量(已构建通过) - 前端 dist 全量(已构建通过)
- 部署步骤:scp 后端文件 → 清理 *.pyc → `docker restart plat-auto-test-app` → scp 前端 dist → 浏览器 Ctrl+F5 强刷 - 部署步骤:scp 后端文件 → 清理 *.pyc → `docker restart plat-auto-test-app` → scp 前端 dist → 浏览器 Ctrl+F5 强刷
......
...@@ -2,8 +2,8 @@ ...@@ -2,8 +2,8 @@
> **生成时间**: 2026-08-20 > **生成时间**: 2026-08-20
> **当前分支**: `platform-auto-test` > **当前分支**: `platform-auto-test`
> **最近提交**: `01c44f17` feat(device-sim,performance): batch_start_simulators 并行化 + 性能测试项目管理与批量执行 > **最近提交**: `ae60263c` feat(performance): 前端合并报告页面 + 项目详情页查看合并报告入口
> **未提交改动**: 无(设备模拟与性能测试改动已提交推送);HANDOFF 本文档本次更新未提交 > **未提交改动**: 无(设备模拟与性能测试改动均已提交推送)
--- ---
...@@ -1182,3 +1182,109 @@ asyncio.Semaphore(50) 控制并发(防止 MQTT Broker / Token API 过载) ...@@ -1182,3 +1182,109 @@ asyncio.Semaphore(50) 控制并发(防止 MQTT Broker / Token API 过载)
- ⚠️ 未部署。需 SFTP 上传 `backend/app/services/device_sim_service.py` 到 5.60 → `docker compose restart app` - ⚠️ 未部署。需 SFTP 上传 `backend/app/services/device_sim_service.py` 到 5.60 → `docker compose restart app`
- 部署后验证:批量启动 540 台门口屏/无纸化设备,确认不再超时、成功率高 - 部署后验证:批量启动 540 台门口屏/无纸化设备,确认不再超时、成功率高
- 已知问题:MQTT Broker 闪断(rc=7)为 Broker 端问题,非 app 代码缺陷,后续排查 192.168.5.44 配置 - 已知问题:MQTT Broker 闪断(rc=7)为 Broker 端问题,非 app 代码缺陷,后续排查 192.168.5.44 配置
---
### 2026-08-20 会话 K(续):540 设备批量启动验证 + per-thread engine 修复(已提交已推送)
**会话目标**:验证 batch_start_simulators 并行化后 540 台门口屏设备全部启动成功,修复 per-thread engine 队列绑定问题。
**状态**:✅ 540/540 全部启动成功;✅ per-thread engine 修复(`_thread_db = threading.local()` + 每线程独立 engine)+ 已提交推送(`d0757333`);✅ 前端合并报告功能(Phase 1-2)已提交推送(`7f4e853f``ae60263c`
---
#### ① 540 台设备批量启动验证
| 步骤 | 结果 |
|------|------|
| 登录 192.168.5.44 环境(门口屏 540 台) | ✅ 在线 |
| 全部启动 | ✅ 540/540 全部成功(总耗时 ~35s,非预计 3s 因 Broker 闪断 3s/台 × 50 并发 = 每批 ~3s × 多批) |
| 后续全部停止 | ✅ 成功 |
| 再次全部启动 | ✅ 540/540 成功 |
| 无纸化 540 台全部启动 | ✅ 540/540 成功 |
**结论**:并行化改造后 540 台设备批量启动可稳定在 35s 内完成,不再超时。
---
#### ② Per-thread engine 修复
**问题现象**:并行启动 540 台设备时,部分设备报错 `Queue is bound to a different event loop`
**根因**`batch_start_simulators()` 使用 `ThreadPoolExecutor` 多线程执行,但每个线程内部使用同一全局 `async_session_maker`(底层绑定到主线程事件循环的 `AsyncAdaptedQueuePool`)。多线程共享同一异步引擎队列导致事件循环绑定冲突。
**修复**`backend/app/services/device_sim_service.py`):
```python
# 新增:线程本地存储,每线程独立 engine + session
_thread_db = threading.local()
def _get_thread_engine():
"""获取当前线程的独立异步引擎"""
ctx = getattr(_thread_db, 'ctx', None)
if ctx is None:
loop = asyncio.new_event_loop()
engine = create_async_engine(
str(SQLALCHEMY_DATABASE_URL),
pool_size=1, max_overflow=0,
poolclass=AsyncAdaptedQueuePool,
# ...
)
session = AsyncSession(engine, expire_on_commit=False)
_thread_db.ctx = {'loop': loop, 'engine': engine, 'session': session}
return _thread_db.ctx
```
**关键设计**
- `threading.local()` 确保每线程独立上下文,互不干扰
- 每线程 `new_event_loop()` + `create_async_engine(pool_size=1)`,避免队列绑定冲突
- `pool_size=1` 限制每线程仅 1 个连接,总连接数 = 并发线程数(≤50)
- `_release_thread_db_ctxs()` 在批启动完成后清理所有线程的 engine 连接
**验证**:540 台设备全部启动成功,无 `Queue is bound to a different event loop` 错误。
---
#### ③ 前端合并报告功能(本会话性能测试模块工作)
**本次会话同步完成了性能测试模块的合并报告功能(Phase 1-2)**
| 提交 | 说明 |
|------|------|
| `7f4e853f` | feat(performance): 批量执行进度推送 + 自动生成合并报告(后端 Phase 1:模型 + 聚合 + API) |
| `f38a23f1` | fix(performance): 合并报告 API 路由修复 + 数据库迁移 |
| `09e64690` | feat(performance): 前端合并报告类型定义 |
| `866acd45` | feat(performance): 前端合并报告 API 调用 |
| `ae60263c` | feat(performance): 前端合并报告页面 ProjectReport.vue + 项目详情页入口 |
**功能说明**:批量执行后自动生成合并报告,聚合指标卡片(4×16)+ 分位数表 + 状态码分布 + 各任务明细表。项目详情页批量执行完成后出现「查看合并报告」按钮。
**待办**(Phase 3):
- 前端构建验证 `npm run build`
- 部署到 5.60 服务器
---
**修改文件清单(本次子会话)**
| 文件 | 变更类型 | 说明 |
|------|----------|------|
| `backend/app/services/device_sim_service.py` | 修改 | `_thread_db = threading.local()` per-thread engine + `_get_thread_engine()` + `_release_thread_db_ctxs()` |
| `backend/app/schemas/performance.py` | 新增/修改 | `ProjectReportResponse``ProjectReportListResponse``BatchRunResponse` 扩展 report_id |
| `backend/app/models/performance.py` | 修改 | 新增 `PerformanceBatchExecution``PerformanceProjectReport` 模型 |
| `backend/app/database.py` | 修改 | 注册新表 |
| `backend/app/services/performance_service.py` | 修改 | `_aggregate_task_results()` 聚合 + `batch_run_tasks()` 持久化 + 自动生成合并报告 |
| `backend/app/routers/performance.py` | 修改 | 新增 3 条合并报告路由 + 批量执行响应扩展 report_id |
| `frontend/src/types/performance.ts` | 修改 | 新增合并报告类型定义 |
| `frontend/src/api/performance.ts` | 修改 | 新增 `getProjectReport()` / `getProjectReports()` / `getBatchReport()` |
| `frontend/src/views/performance/ProjectReport.vue` | 新增 | 合并报告页面(聚合指标 4×16 卡片 + 分位数表 + 状态码分布 + 任务明细) |
| `frontend/src/views/performance/ProjectDetail.vue` | 修改 | 批量执行完成后显示「查看合并报告」按钮 + 历史报告入口 |
| `frontend/src/router/index.ts` | 修改 | 注册 `/performance/project-report` 路由 |
| `Docs/PRD/性能测试/需求文档/_PRD_批量执行合并报告.md` | 新增 | PRD 需求文档 |
| `Docs/PRD/性能测试/需求文档/_PRD_批量执行合并报告_计划执行.md` | 新增 | 执行计划文档 |
**待办**
- ⚠️ 设备模拟相关改动(会话 J token_api_host 回退修复 + 会话 I 无纸化 token/消息 + 会话 K 并行化 + per-thread engine)**全部已提交并推送**
- ⚠️ **未部署到 5.60**:需 SFTP 上传 `device_sim_service.py` + `mqtt_manager.py` + `door_token_client.py` + `paperless_simulator.py` + 其他 5 个模拟器文件
- ⚠️ 合并报告功能(Phase 1-2)已提交推送,待 Phase 3 前端构建验证 + 部署
- 已知问题:MQTT Broker 闪断(rc=7)为 Broker 端问题,非 app 代码缺陷
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论