Files
vd_test_fixture/docs/plans/2026-05-31-wave-test-frontend.md
wangfq a69d7ab1d0 feat: 波动测试模式前端适配 — tb_state_tst扩展+0xB4存库+页面更新
- edc_server/models.py: tb_state_tst DDL增加test_mode/data_source + B4字段
  + ALTER TABLE自动迁移 + insert_test_result扩展 + insert_wave_data
- edc_server/handlers.py: 0xB2处理传test_mode、0xB4处理调用insert_wave_data存库
- edc-web/models.py: 新增get_latest_wave_data/get_wave_records + test_mode筛选
- edc-web/routes: test_op返回wave数据、test_data支持test_mode筛选
- 前端: test_op页面增加波动数据显示区+测试模式列
  test_data页面增加test_mode下拉筛选+B4字段列+CSV导出适配
2026-06-03 14:14:52 +08:00

249 lines
7.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 波动测试模式前端适配 实施计划
> **For Hermes:** 直接执行各 Task。
**Goal:** 将波动测试模式0xB2 的 test_mode + 0xB4 上报数据)接入测试操作页面、查询导出页面,扩展 `tb_state_tst` 表字段。
**Architecture:** 单表方案 — `tb_state_tst` 增加 `test_mode``data_source` 和 B4 专属字段B2 和 B4 记录共存同表,通过 `data_source` 区分。后端 edc_server 存储、edc-web 查询/导出均扩展。
**Tech Stack:** Python/aiomysql (edc_server) + Flask/pymysql (edc-web) + vanilla JS 前端
---
### 涉及文件
| 层 | 文件 | 变更 |
|---|---|---|
| 数据库 | `edc_server/src/models.py` | DDL + ALTER 迁移 + `insert_test_result` 扩展 + 新增 `insert_wave_data` |
| 解析 | `edc_server/src/handlers.py` | 0xB2 传 test_mode、0xB4 调 insert_wave_data |
| 查询 | `edc-web/app/models.py` | 新增查询函数、导出扩展 |
| API | `edc-web/app/routes/test_op.py` | progress 端点返回波动数据 |
| API | `edc-web/app/routes/test_data.py` | 查询/导出增加新字段 |
| 前端 | `edc-web/app/templates/test_op.html` | 增加波动数据显示区 |
| 前端 | `edc-web/app/static/js/test_op.js` | renderLatest/renderRecords 扩展 + B4 轮询 |
| 前端 | `edc-web/app/templates/test_data.html` | 表头增加列 + test_mode 筛选 |
| 前端 | `edc-web/app/static/js/test_data.js` | renderTable 扩展 |
---
### Task 1: 扩展 tb_state_tst DDL + 迁移 (edc_server)
**文件:** `edc_server/src/models.py`
**Step 1:** 修改 CREATE TABLE 增加 9 列
在现有 `tb_state_tst` DDL 中增加:
```sql
`test_mode` TINYINT DEFAULT 0 COMMENT '0 灵敏度测试, 1 波动测试',
`data_source` CHAR(2) DEFAULT 'B2' COMMENT '数据来源 B2/B4',
`remain_count` INT DEFAULT 0 COMMENT '剩余波动次数 (B4)',
`work_freq` FLOAT DEFAULT 0 COMMENT '工作频率 Hz (B4)',
`curr_dist` INT DEFAULT 0 COMMENT '当前距离 mm (B4)',
`speed` INT DEFAULT 0 COMMENT '当前速度 dm/s (B4)',
`near_dist` INT DEFAULT 0 COMMENT '波动最近距离 mm (B4)',
`far_dist` INT DEFAULT 0 COMMENT '波动最远距离 mm (B4)',
`b4_enter_dist` INT DEFAULT 0 COMMENT 'B4 进入高度 mm',
`b4_leave_dist` INT DEFAULT 0 COMMENT 'B4 离开高度 mm'
```
**Step 2:**`_create_tables` 末尾增加 ALTER TABLE 迁移逻辑(参照已有的 `tb_fixture_param` 迁移模式)
```python
# V2.0.4 迁移tb_state_tst 增加波动测试字段
for col, col_def in [
("test_mode", "TINYINT DEFAULT 0 COMMENT '0 灵敏度, 1 波动测试'"),
("data_source", "CHAR(2) DEFAULT 'B2' COMMENT 'B2/B4'"),
("remain_count", "INT DEFAULT 0 COMMENT '剩余波动次数'"),
("work_freq", "FLOAT DEFAULT 0 COMMENT '工作频率 Hz'"),
("curr_dist", "INT DEFAULT 0 COMMENT '当前距离 mm'"),
("speed", "INT DEFAULT 0 COMMENT '当前速度 dm/s'"),
("near_dist", "INT DEFAULT 0 COMMENT '波动最近距离 mm'"),
("far_dist", "INT DEFAULT 0 COMMENT '波动最远距离 mm'"),
("b4_enter_dist", "INT DEFAULT 0 COMMENT 'B4 进入高度 mm'"),
("b4_leave_dist", "INT DEFAULT 0 COMMENT 'B4 离开高度 mm'"),
]:
try:
await cur.execute(f"ALTER TABLE `tb_state_tst` ADD COLUMN `{col}` {col_def}")
except Exception:
pass
```
**Step 3:** 修改 `insert_test_result` 函数签名,增加 `test_mode``data_source` 参数
```python
async def insert_test_result(dnt_id, dpg430_addr, pcnum, serialnum,
sub_type, str_type, iffinish, fault_info,
relay_out, ppvalue, idle_freq, enter_freq,
exit_freq, enter_dist, exit_dist,
enter_speed, exit_speed,
test_mode=0, data_source='B2'):
```
INSERT 语句增加 `test_mode`, `data_source` 列。
**Step 4:** 新增 `insert_wave_data` 函数
```python
async def insert_wave_data(dnt_id, dpg430_addr, remain_count, relay_out,
work_freq, curr_dist, speed, near_dist, far_dist,
enter_dist, leave_dist):
"""插入 0xB4 波动测试上报数据到 tb_state_tst"""
```
---
### Task 2: handlers.py 适配
**文件:** `edc_server/src/handlers.py`
**Step 1:** 0xB2 处理 — `insert_test_result` 调用增加 `test_mode=status.test_mode`
```python
await insert_test_result(
...
test_mode=status.test_mode,
)
```
**Step 2:** 0xB4 处理 — 调用 `insert_wave_data` 存库
```python
from src.models import insert_wave_data # 增加导入
# 在 0xB4 分支末尾
await insert_wave_data(
dnt_id=dnt_id,
dpg430_addr=wave.addr,
remain_count=wave.remain_count,
relay_out=wave.relay_out,
work_freq=wave.work_freq,
curr_dist=wave.curr_dist,
speed=wave.speed,
near_dist=wave.near_dist,
far_dist=wave.far_dist,
enter_dist=wave.enter_dist,
leave_dist=wave.leave_dist,
)
```
---
### Task 3: edc-web models.py 查询扩展
**文件:** `edc-web/app/models.py`
**Step 1:** 新增 `get_latest_wave_data(dnt_id)` — 获取最新一条 B4 数据
**Step 2:** 新增 `get_wave_records(dnt_id, since)` — 获取本轮 B4 明细
查询条件: `data_source='B4' AND create_time >= since`
**Step 3:** 修改 `get_automation_averages` — 不涉及波动字段,保持不变
---
### Task 4: edc-web test_op.py 路由扩展
**文件:** `edc-web/app/routes/test_op.py`
`api_automation_progress` 中增加返回 B4 数据:
```python
latest_wave = get_latest_wave_data(dnt_id)
wave_records = get_wave_records(dnt_id, since) if since else []
return jsonify({
...
"latest_wave": latest_wave,
"wave_records": wave_records,
})
```
导入新增的 `get_latest_wave_data`, `get_wave_records`
---
### Task 5: edc-web test_data.py 路由扩展
**文件:** `edc-web/app/routes/test_data.py`
**Step 1:** `api_test_data` — 增加 `test_mode` 筛选参数
```python
test_mode = request.args.get("test_mode", "", type=str) # '' = 全部, '0' = 灵敏度, '1' = 波动
```
传给 `get_test_data`,在 SQL WHERE 中增加 `AND t.test_mode = %s` 条件。
**Step 2:** 修改 `get_test_data` 函数签名和 SQL在 models.py 中)
**Step 3:** CSV 导出同样支持 `test_mode` 筛选
---
### Task 6: 前端 test_op.html + test_op.js
**文件:** `edc-web/app/templates/test_op.html` + `static/js/test_op.js`
**Step 1:** HTML — 在 `latest-result` 区域增加波动数据显示 div
```html
<h3>波动测试数据</h3>
<div id="latest-wave">
<p class="placeholder">暂无波动数据...</p>
</div>
```
**Step 2:** JS — `renderLatest` 增加 test_mode 显示
在现有显示中增加:
```js
<p>测试模式<strong>${data.test_mode === 1 ? '波动测试' : '灵敏度测试'}</strong></p>
```
**Step 3:** JS — 新增 `renderLatestWave(data)` 函数
显示 B4 上报数据:剩余次数、当前距离、速度、最近/最远距离、进入/离开高度。
**Step 4:** JS — `pollProgress` 中调用 `renderLatestWave(data.latest_wave)`
**Step 5:** JS — 明细表 `renderRecords` 增加测试模式列
---
### Task 7: 前端 test_data.html + test_data.js
**文件:** `edc-web/app/templates/test_data.html` + `static/js/test_data.js`
**Step 1:** HTML — 搜索栏增加测试模式下拉筛选
```html
<label>
测试模式:
<select id="search-test-mode">
<option value="">全部</option>
<option value="0">灵敏度测试</option>
<option value="1">波动测试</option>
</select>
</label>
```
**Step 2:** HTML — 表头增加列:测试模式、数据来源、剩余次数、工作频率、当前距离、速度、最近距离、最远距离
**Step 3:** JS — `searchData``test_mode` 参数
**Step 4:** JS — `renderTable` 增加新列渲染
**Step 5:** JS — `exportCSV``test_mode` 参数
---
### Task 8: 提交推送
```bash
cd /home/wfq/projects/vd_test_fixture
git add -A
git commit -m "feat: 波动测试模式前端适配 — tb_state_tst扩展+0xB4存库+页面更新"
git push origin main
```