feat(edc-web): 线圈参数/模拟车辆参数管理 + 工装关联 + 测试环境显示
新增功能: - 线圈参数管理页 (/coil-info): 增删改查,日志记录 - 模拟车辆管理页 (/simulate-car): 增删改查,日志记录 - 工装配置页新增线圈/模拟车辆选择区,保存时关联到 tb_fixture_param - 测试信息查询页新增「测试环境」列,显示当前线圈和模拟车辆信息 - edc_server 写入测试数据时自动从 fixture 获取线圈/车辆关联 数据库: - 新增 tb_coil_info、tb_simulate_car 表 - tb_fixture_param 增加 coil_id/simulate_car_id 字段 - tb_state_tst 增加 coil_id/simulate_car_id 字段 后端: - models.py 新增线圈/模拟车辆 CRUD - get_fixture_param 改为 LEFT JOIN 返回线圈/车辆详情 - upsert_fixture_param 支持 coil_id/simulate_car_id - 测试数据查询 LEFT JOIN 线圈/车辆信息
This commit is contained in:
@@ -9,6 +9,8 @@ let pollTimers = {}; // record_id → timer (指令响应轮询)
|
||||
|
||||
async function init() {
|
||||
await loadBaseTests();
|
||||
await loadCoilList();
|
||||
await loadCarList();
|
||||
await loadFixtureParam();
|
||||
}
|
||||
|
||||
@@ -119,6 +121,66 @@ function onDevTypeChange() {
|
||||
else { selectedBaseTest = null; renderBaseTestTable(); }
|
||||
}
|
||||
|
||||
// ─── 线圈列表 ────────────────────────────────
|
||||
|
||||
let coilList = [];
|
||||
|
||||
async function loadCoilList() {
|
||||
try {
|
||||
const resp = await fetch("/api/coil-info");
|
||||
coilList = await resp.json();
|
||||
populateCoilSelect();
|
||||
} catch (e) { console.error("加载线圈列表失败:", e); }
|
||||
}
|
||||
|
||||
function populateCoilSelect() {
|
||||
const sel = document.getElementById("coil-select");
|
||||
sel.innerHTML = '<option value="">-- 选择线圈 --</option>' +
|
||||
coilList.map(c => `<option value="${c.id}">${esc(c.coil_num || c.name || `#${c.id}`)}</option>`).join("");
|
||||
}
|
||||
|
||||
function onCoilChange() {
|
||||
const id = parseInt(document.getElementById("coil-select").value);
|
||||
const coil = coilList.find(c => c.id === id);
|
||||
const detail = document.getElementById("coil-detail");
|
||||
if (coil) {
|
||||
const sizeText = coil.shape === '圆形' ? `半径${coil.radius}cm` : `${coil.length}×${coil.width}cm`;
|
||||
detail.innerHTML = `${coil.shape || '-'} / ${sizeText} / ${coil.turns || 0}圈 / ${coil.resistance || 0}Ω / ${coil.material || ''}`;
|
||||
} else {
|
||||
detail.innerHTML = '';
|
||||
}
|
||||
}
|
||||
|
||||
// ─── 模拟车辆列表 ────────────────────────────
|
||||
|
||||
let carList = [];
|
||||
|
||||
async function loadCarList() {
|
||||
try {
|
||||
const resp = await fetch("/api/simulate-car");
|
||||
carList = await resp.json();
|
||||
populateCarSelect();
|
||||
} catch (e) { console.error("加载模拟车辆列表失败:", e); }
|
||||
}
|
||||
|
||||
function populateCarSelect() {
|
||||
const sel = document.getElementById("car-select");
|
||||
sel.innerHTML = '<option value="">-- 选择模拟车辆 --</option>' +
|
||||
carList.map(c => `<option value="${c.id}">${esc(c.simulate_num || c.name || `#${c.id}`)}</option>`).join("");
|
||||
}
|
||||
|
||||
function onCarChange() {
|
||||
const id = parseInt(document.getElementById("car-select").value);
|
||||
const car = carList.find(c => c.id === id);
|
||||
const detail = document.getElementById("car-detail");
|
||||
if (car) {
|
||||
const sizeText = car.shape === '圆形' ? `半径${car.radius}cm` : `${car.length}×${car.width}cm`;
|
||||
detail.innerHTML = `${car.shape || '-'} / ${sizeText} / ${car.material || ''}`;
|
||||
} else {
|
||||
detail.innerHTML = '';
|
||||
}
|
||||
}
|
||||
|
||||
// ─── 从 DB 加载/刷新/保存 ────────────────────
|
||||
|
||||
async function loadFixtureParam() {
|
||||
@@ -152,6 +214,17 @@ function fillFormFromParam(param) {
|
||||
document.getElementById("param-far-stay").value = param.FarStay || 0;
|
||||
const matched = baseTests.find(t => t.type_num === param.DevType);
|
||||
if (matched) { selectedBaseTest = matched; renderBaseTestTable(); }
|
||||
// 设置线圈和模拟车辆选中
|
||||
if (param.coil_id) {
|
||||
document.getElementById("coil-select").value = param.coil_id;
|
||||
onCoilChange();
|
||||
}
|
||||
if (param.simulate_car_id) {
|
||||
document.getElementById("car-select").value = param.simulate_car_id;
|
||||
onCarChange();
|
||||
}
|
||||
// 更新当前关联标签
|
||||
updateCurrentLabels(param);
|
||||
}
|
||||
|
||||
async function refreshParams() {
|
||||
@@ -168,31 +241,55 @@ async function refreshParams() {
|
||||
|
||||
async function saveToDb() {
|
||||
const data = getFormParams();
|
||||
const coilId = parseInt(document.getElementById("coil-select").value) || null;
|
||||
const carId = parseInt(document.getElementById("car-select").value) || null;
|
||||
const body = {
|
||||
Addr: data.addr, DevType: data.dev_type, TestMode: data.test_mode,
|
||||
RestDis: data.reset_dis, MinusDis: data.minus_dis,
|
||||
SensMin: data.sens_min, SensMax: data.sens_max,
|
||||
FreMin: data.fre_min, FreMax: data.fre_max,
|
||||
PeakMin: data.peak_min, PeakMax: data.peak_max,
|
||||
FarTol: data.far_tol, NearTol: data.near_tol,
|
||||
StepTol: data.step_tol, BackForth: data.back_forth,
|
||||
NearStay: data.near_stay, FarStay: data.far_stay,
|
||||
};
|
||||
if (coilId) body.coil_id = coilId;
|
||||
if (carId) body.simulate_car_id = carId;
|
||||
try {
|
||||
const resp = await fetch(`/api/fixture/param/${DNT_ID}`, {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify({
|
||||
Addr: data.addr, DevType: data.dev_type, TestMode: data.test_mode,
|
||||
RestDis: data.reset_dis, MinusDis: data.minus_dis,
|
||||
SensMin: data.sens_min, SensMax: data.sens_max,
|
||||
FreMin: data.fre_min, FreMax: data.fre_max,
|
||||
PeakMin: data.peak_min, PeakMax: data.peak_max,
|
||||
FarTol: data.far_tol, NearTol: data.near_tol,
|
||||
StepTol: data.step_tol, BackForth: data.back_forth,
|
||||
NearStay: data.near_stay, FarStay: data.far_stay,
|
||||
}),
|
||||
body: JSON.stringify(body),
|
||||
});
|
||||
const result = await resp.json();
|
||||
if (result.ok) {
|
||||
commLog('info', null, '参数已保存到数据库');
|
||||
toast("已保存到数据库");
|
||||
updateCurrentLabels();
|
||||
} else {
|
||||
toast("保存失败: " + (result.error || ""), true);
|
||||
}
|
||||
} catch (e) { toast("保存失败: " + e.message, true); }
|
||||
}
|
||||
|
||||
/** 更新页面上的当前线圈/车辆标签 */
|
||||
function updateCurrentLabels(param) {
|
||||
const coilLabel = document.getElementById("current-coil-label");
|
||||
const carLabel = document.getElementById("current-car-label");
|
||||
if (param) {
|
||||
coilLabel.textContent = param.coil_name || param.coil_num || '未设置';
|
||||
carLabel.textContent = param.car_name || param.simulate_num || '未设置';
|
||||
} else {
|
||||
// 从 DOM 读取当前选择
|
||||
const coilId = parseInt(document.getElementById("coil-select").value);
|
||||
const carId = parseInt(document.getElementById("car-select").value);
|
||||
const coil = coilId ? coilList.find(c => c.id === coilId) : null;
|
||||
const car = carId ? carList.find(c => c.id === carId) : null;
|
||||
coilLabel.textContent = coil ? (coil.coil_num || coil.name) : '未设置';
|
||||
carLabel.textContent = car ? (car.simulate_num || car.name) : '未设置';
|
||||
}
|
||||
}
|
||||
|
||||
function getFormParams() {
|
||||
return {
|
||||
addr: parseInt(document.getElementById("param-addr").value) || 1,
|
||||
@@ -324,19 +421,24 @@ async function sendConfig() {
|
||||
startRespPolling(data.record_id, "4B");
|
||||
|
||||
// 同时保存到数据库
|
||||
const coilId = parseInt(document.getElementById("coil-select").value) || null;
|
||||
const carId = parseInt(document.getElementById("car-select").value) || null;
|
||||
const saveBody = {
|
||||
Addr: params.addr, DevType: params.dev_type, TestMode: params.test_mode,
|
||||
RestDis: params.reset_dis, MinusDis: params.minus_dis,
|
||||
SensMin: params.sens_min, SensMax: params.sens_max,
|
||||
FreMin: params.fre_min, FreMax: params.fre_max,
|
||||
PeakMin: params.peak_min, PeakMax: params.peak_max,
|
||||
FarTol: params.far_tol, NearTol: params.near_tol,
|
||||
StepTol: params.step_tol, BackForth: params.back_forth,
|
||||
NearStay: params.near_stay, FarStay: params.far_stay,
|
||||
};
|
||||
if (coilId) saveBody.coil_id = coilId;
|
||||
if (carId) saveBody.simulate_car_id = carId;
|
||||
await fetch(`/api/fixture/param/${DNT_ID}`, {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify({
|
||||
Addr: params.addr, DevType: params.dev_type, TestMode: params.test_mode,
|
||||
RestDis: params.reset_dis, MinusDis: params.minus_dis,
|
||||
SensMin: params.sens_min, SensMax: params.sens_max,
|
||||
FreMin: params.fre_min, FreMax: params.fre_max,
|
||||
PeakMin: params.peak_min, PeakMax: params.peak_max,
|
||||
FarTol: params.far_tol, NearTol: params.near_tol,
|
||||
StepTol: params.step_tol, BackForth: params.back_forth,
|
||||
NearStay: params.near_stay, FarStay: params.far_stay,
|
||||
}),
|
||||
body: JSON.stringify(saveBody),
|
||||
});
|
||||
} else {
|
||||
toast(`失败: ${data.error}`, true);
|
||||
|
||||
Reference in New Issue
Block a user