Compare commits

..

2 Commits

Author SHA1 Message Date
wangfq
ff9482780d feat: tb_state_tst 增加 detector_serial 字段 + tb_pending_detector 辅助表
- tb_state_tst DDL 增加 detector_serial VARCHAR(45) 列 + V2.4.0 迁移
- 新建 tb_pending_detector 表,用于 web 端暂存待插入的序列号
- insert_test_result / insert_wave_data 插入前从辅助表读取序列号(消费后清除)
- 新增 get_pending_detector_serial() 查询函数
2026-06-15 10:02:19 +08:00
wangfq
6e13990386 fix: 设备型号名称改为从 db tb_vechicle_base_test 动态查询,修复新增型号显示 Unknown 的问题
- handlers.py: B2 数据硬编码 dev_model_map {1:PD132,2:DLD110} → await get_dev_type_name()
- models.py: B4 波动数据硬编码 map → 同上
- models.py: 新增 get_dev_type_name() 带内存缓存,首次加载后缓存 type_num→dev_name
- models.py: 新增 refresh_dev_type_names() 供工装配置页新增型号后刷新缓存
2026-06-12 10:00:25 +08:00
2 changed files with 90 additions and 10 deletions

View File

@@ -33,6 +33,7 @@ from src.models import (
insert_device_log,
update_device_status,
get_all_device_serials,
get_dev_type_name,
)
from src.dg430 import (
parse_b2_status,
@@ -293,8 +294,7 @@ async def parse_loop():
fault_info = decode_fault_info(status.fault)
relay_info = decode_relay_info(status.relay_out)
dev_model_map = {1: "PD132", 2: "DLD110"}
str_type = dev_model_map.get(status.dev_model, f"Unknown({status.dev_model})")
str_type = await get_dev_type_name(status.dev_model)
await insert_test_result(
dnt_id=dnt_id,

View File

@@ -100,6 +100,7 @@ async def _create_tables(pool: aiomysql.Pool):
CREATE TABLE IF NOT EXISTS `tb_state_tst` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`dnt_id` INT NOT NULL COMMENT 'FK → dnt_info.id',
`detector_serial` VARCHAR(45) DEFAULT '' COMMENT '车检器序列号',
`dpg430_addr` TINYINT DEFAULT 0,
`pcnum` VARCHAR(10) DEFAULT '' COMMENT '批次号',
`serialnum` INT DEFAULT 0 COMMENT '流水号',
@@ -320,6 +321,26 @@ async def _create_tables(pool: aiomysql.Pool):
except Exception:
pass
# V2.4.0 迁移tb_state_tst 增加车检器序列号
for col, col_def in [
("detector_serial", "VARCHAR(45) DEFAULT '' COMMENT '车检器序列号'"),
]:
try:
await cur.execute(
f"ALTER TABLE `tb_state_tst` ADD COLUMN `{col}` {col_def}"
)
except Exception:
pass
# 13. 待插入的车检器序列号表 (V2.4.0)
await cur.execute("""
CREATE TABLE IF NOT EXISTS `tb_pending_detector` (
`dnt_id` INT PRIMARY KEY COMMENT 'FK → dnt_info.id',
`detector_serial` VARCHAR(45) DEFAULT '' COMMENT '待插入的车检器序列号',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
""")
# 11. 设备事件日志表
await cur.execute("""
CREATE TABLE IF NOT EXISTS `tb_device_log` (
@@ -498,6 +519,42 @@ async def get_fixture_dev_type(dnt_id: int) -> int:
return row[0] if row else 0
# ─── 设备型号名称缓存 ──────────────────────────────────────────────────
_dev_type_name_cache: dict[int, str] = {}
_cache_loaded = False
async def _load_dev_type_names():
"""从 tb_vechicle_base_test 加载 type_num → dev_name 映射"""
global _dev_type_name_cache, _cache_loaded
pool = await get_pool()
async with pool.acquire() as conn:
async with conn.cursor() as cur:
await cur.execute(
"SELECT type_num, dev_name FROM tb_vechicle_base_test"
)
rows = await cur.fetchall()
_dev_type_name_cache = {row[0]: row[1] for row in rows if row[1]}
_cache_loaded = True
logger.debug(f"设备型号名称缓存已加载: {_dev_type_name_cache}")
async def get_dev_type_name(dev_type: int) -> str:
"""根据设备型号编码获取名称(从 tb_vechicle_base_test 查询,带内存缓存)"""
global _cache_loaded
if not _cache_loaded:
await _load_dev_type_names()
return _dev_type_name_cache.get(dev_type, f"Unknown({dev_type})")
async def refresh_dev_type_names():
"""刷新型号名称缓存(工装配置页新增型号后调用)"""
global _cache_loaded
_cache_loaded = False
await _load_dev_type_names()
async def insert_test_result(dnt_id: int, dpg430_addr: int, pcnum: str,
serialnum: int, sub_type: int, str_type: str,
iffinish: str, fault_info: str, relay_out: str,
@@ -508,18 +565,19 @@ async def insert_test_result(dnt_id: int, dpg430_addr: int, pcnum: str,
relay_code: int = 0):
"""插入测试结果到 tb_state_tst"""
coil_id, simulate_car_id = await get_fixture_coil_car_ids(dnt_id)
detector_serial = await get_pending_detector_serial(dnt_id)
pool = await get_pool()
async with pool.acquire() as conn:
async with conn.cursor() as cur:
await cur.execute(
"""INSERT INTO tb_state_tst
(dnt_id, dpg430_addr, pcnum, serialnum, sub_type, str_type,
(dnt_id, detector_serial, dpg430_addr, pcnum, serialnum, sub_type, str_type,
test_mode, data_source,
iffinish, fault_info, relay_out, ppvalue, idle_freq,
enter_freq, exit_freq, enter_dist, exit_dist, enter_speed, exit_speed,
relay_code, coil_id, simulate_car_id)
VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)""",
(dnt_id, dpg430_addr, pcnum, serialnum, sub_type, str_type,
VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)""",
(dnt_id, detector_serial, dpg430_addr, pcnum, serialnum, sub_type, str_type,
test_mode, data_source,
iffinish, fault_info, relay_out, ppvalue, idle_freq,
enter_freq, exit_freq, enter_dist, exit_dist, enter_speed, exit_speed,
@@ -536,21 +594,21 @@ async def insert_wave_data(dnt_id: int, dpg430_addr: int,
"""插入 0xB4 波动测试上报数据到 tb_state_tst"""
coil_id, simulate_car_id = await get_fixture_coil_car_ids(dnt_id)
dev_type = await get_fixture_dev_type(dnt_id)
dev_model_map = {1: "PD132", 2: "DLD110"}
str_type = dev_model_map.get(dev_type, f"Unknown({dev_type})") if dev_type else ""
str_type = await get_dev_type_name(dev_type) if dev_type else ""
detector_serial = await get_pending_detector_serial(dnt_id)
pool = await get_pool()
async with pool.acquire() as conn:
async with conn.cursor() as cur:
await cur.execute(
"""INSERT INTO tb_state_tst
(dnt_id, dpg430_addr, sub_type, str_type,
(dnt_id, detector_serial, dpg430_addr, sub_type, str_type,
test_mode, data_source,
relay_out, relay_code,
remain_count, work_freq, curr_dist, speed,
near_dist, far_dist, b4_enter_dist, b4_leave_dist,
coil_id, simulate_car_id)
VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)""",
(dnt_id, dpg430_addr, dev_type, str_type,
VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)""",
(dnt_id, detector_serial, dpg430_addr, dev_type, str_type,
1, "B4",
relay_out, relay_code,
remain_count, work_freq, curr_dist, speed,
@@ -803,3 +861,25 @@ async def get_vehicle_base_test_by_type(type_num: int) -> dict | None:
(type_num,),
)
return await cur.fetchone()
# ─── tb_pending_detector ───────────────────────────────────────────
async def get_pending_detector_serial(dnt_id: int) -> str:
"""获取并清除待插入的车检器序列号(一次性消费)"""
pool = await get_pool()
async with pool.acquire() as conn:
async with conn.cursor(aiomysql.DictCursor) as cur:
await cur.execute(
"SELECT detector_serial FROM tb_pending_detector WHERE dnt_id=%s",
(dnt_id,),
)
row = await cur.fetchone()
if row:
# 清除已消费的记录
await cur.execute(
"DELETE FROM tb_pending_detector WHERE dnt_id=%s",
(dnt_id,),
)
return row["detector_serial"] or ""
return ""