Compare commits
6 Commits
944870496a
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a2f31b3bfe | ||
|
|
ff9482780d | ||
|
|
6e13990386 | ||
|
|
3580f89552 | ||
|
|
25aafd57c8 | ||
|
|
cdddfac609 |
@@ -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,
|
||||
@@ -387,6 +387,7 @@ async def parse_loop():
|
||||
dpg430_addr=wave.addr,
|
||||
remain_count=wave.remain_count,
|
||||
relay_code=wave.relay_out,
|
||||
relay_out=relay_info,
|
||||
work_freq=wave.work_freq,
|
||||
curr_dist=wave.curr_dist,
|
||||
speed=wave.speed,
|
||||
|
||||
107
src/models.py
107
src/models.py
@@ -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 '流水号',
|
||||
@@ -152,7 +153,7 @@ async def _create_tables(pool: aiomysql.Pool):
|
||||
`id` INT AUTO_INCREMENT PRIMARY KEY,
|
||||
`username` VARCHAR(45) UNIQUE NOT NULL,
|
||||
`password_hash` VARCHAR(256) NOT NULL,
|
||||
`role` VARCHAR(20) DEFAULT 'operator' COMMENT 'admin/operator',
|
||||
`role` VARCHAR(20) DEFAULT 'operator' COMMENT 'admin/manager/operator/analyst',
|
||||
`is_active` TINYINT DEFAULT 1,
|
||||
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
|
||||
@@ -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` (
|
||||
@@ -344,6 +365,15 @@ async def _create_tables(pool: aiomysql.Pool):
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
# V2.3.0 迁移:tb_user 角色增加 manager
|
||||
try:
|
||||
await cur.execute(
|
||||
"ALTER TABLE tb_user MODIFY COLUMN `role` VARCHAR(20) DEFAULT 'operator' "
|
||||
"COMMENT 'admin/manager/operator/analyst'"
|
||||
)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
logger.info("数据库表初始化完成")
|
||||
|
||||
|
||||
@@ -489,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,
|
||||
@@ -499,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,
|
||||
@@ -522,27 +589,28 @@ async def insert_wave_data(dnt_id: int, dpg430_addr: int,
|
||||
remain_count: int, relay_code: int,
|
||||
work_freq: float, curr_dist: int, speed: int,
|
||||
near_dist: int, far_dist: int,
|
||||
enter_dist: int, leave_dist: int):
|
||||
enter_dist: int, leave_dist: int,
|
||||
relay_out: str = ""):
|
||||
"""插入 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_code,
|
||||
relay_out, relay_code,
|
||||
remain_count, work_freq, curr_dist, speed,
|
||||
near_dist, far_dist, enter_dist, leave_dist,
|
||||
coil_id, simulate_car_id),
|
||||
@@ -793,3 +861,20 @@ 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:
|
||||
return row["detector_serial"] or ""
|
||||
return ""
|
||||
|
||||
Reference in New Issue
Block a user