根据 DPG430 串口协议: - 频率 f(Hz) = 10 * X, X 为 DB/设备原始值 - 峰峰值 V = ((X*3.3)/4095)*4, X 为正整数 前端 fixture.js 和 vehicle_base_test.js 增加转换层: - 显示: raw X → f(Hz) / V(V)(fillFormFromParam、renderTable、openModal) - 保存: f(Hz)/V(V) → raw X(getFormParams、saveRecord) DB 已存原始值无需迁移,后端 build_4b_packet 透传原始值无需改。
172 lines
7.1 KiB
JavaScript
172 lines
7.1 KiB
JavaScript
// 车检器测试基准参数管理
|
|
|
|
// ─── 频率/峰峰值转换常量 ─────────────────────
|
|
// 协议: 工作频率 f(Hz) = 10 * X, X 为 DB/设备中存储和传输的原始值
|
|
// 协议: 峰峰值 V = ((X * 3.3) / 4095) * 4, X 为 DB/设备中存储和传输的原始值(正整数)
|
|
const FREQ_SCALE = 10;
|
|
const PEAK_SCALE = 4095 / (4 * 3.3); // ≈ 310.227
|
|
|
|
function rawFreqToHz(x) { return x * FREQ_SCALE; }
|
|
function hzToRawFreq(hz) { return Math.round(hz / FREQ_SCALE); }
|
|
function rawPeakToV(x) { return parseFloat(((x * 3.3) / 4095 * 4).toFixed(2)); }
|
|
function vToRawPeak(v) { return Math.round(v * PEAK_SCALE); }
|
|
|
|
let editId = null; // null=新增, number=编辑
|
|
|
|
// ─── Toast ───────────────────────────────────
|
|
|
|
function toast(msg, isError = false) {
|
|
const el = document.getElementById("toast");
|
|
el.textContent = msg;
|
|
el.className = "msg-toast " + (isError ? "error" : "") + " show";
|
|
clearTimeout(el._timeout);
|
|
el._timeout = setTimeout(() => { el.className = "msg-toast"; }, 3000);
|
|
}
|
|
|
|
// ─── 列表加载 ────────────────────────────────
|
|
|
|
async function loadList() {
|
|
const search = document.getElementById("search-input").value;
|
|
try {
|
|
const resp = await fetch(`/api/vehicle-base-test?search=${encodeURIComponent(search)}`);
|
|
const data = await resp.json();
|
|
renderTable(data);
|
|
} catch (e) {
|
|
console.error("加载失败:", e);
|
|
}
|
|
}
|
|
|
|
function renderTable(data) {
|
|
const tbody = document.querySelector("#vbt-table tbody");
|
|
if (!data.length) {
|
|
tbody.innerHTML = '<tr><td colspan="7" style="color:#999;text-align:center;">暂无数据,点右上角「新增」添加</td></tr>';
|
|
return;
|
|
}
|
|
tbody.innerHTML = data.map(t => `
|
|
<tr>
|
|
<td>${t.type_num}</td>
|
|
<td>${esc(t.dev_name)}</td>
|
|
<td>${t.SensMin} ~ ${t.SensMax}</td>
|
|
<td>${rawFreqToHz(t.FreMin)} ~ ${rawFreqToHz(t.FreMax)}</td>
|
|
<td>${rawPeakToV(t.PeakMin)} ~ ${rawPeakToV(t.PeakMax)}</td>
|
|
<td>${esc(t.remark || '-')}</td>
|
|
<td>
|
|
<button class="btn-edit" onclick="openModal(${t.id})">编辑</button>
|
|
<button class="btn-del" onclick="deleteRecord(${t.id}, '${esc(t.dev_name)}')">删除</button>
|
|
</td>
|
|
</tr>
|
|
`).join("");
|
|
}
|
|
|
|
// ─── 弹窗 ────────────────────────────────────
|
|
|
|
function openModal(id = null) {
|
|
editId = id;
|
|
document.getElementById("modal-title").textContent = id ? "编辑车检器测试基准" : "新增车检器测试基准";
|
|
document.getElementById("edit-modal").style.display = "flex";
|
|
|
|
if (id) {
|
|
// 编辑:加载数据
|
|
fetch(`/api/vehicle-base-test/${id}`)
|
|
.then(r => r.json())
|
|
.then(data => {
|
|
document.getElementById("edit-type-num").value = data.type_num;
|
|
document.getElementById("edit-dev-name").value = data.dev_name;
|
|
document.getElementById("edit-sens-min").value = data.SensMin;
|
|
document.getElementById("edit-sens-max").value = data.SensMax;
|
|
document.getElementById("edit-fre-min").value = rawFreqToHz(data.FreMin);
|
|
document.getElementById("edit-fre-max").value = rawFreqToHz(data.FreMax);
|
|
document.getElementById("edit-peak-min").value = rawPeakToV(data.PeakMin);
|
|
document.getElementById("edit-peak-max").value = rawPeakToV(data.PeakMax);
|
|
document.getElementById("edit-remark").value = data.remark || "";
|
|
});
|
|
} else {
|
|
// 新增:清空
|
|
document.getElementById("edit-type-num").value = "";
|
|
document.getElementById("edit-dev-name").value = "";
|
|
document.getElementById("edit-sens-min").value = "0";
|
|
document.getElementById("edit-sens-max").value = "0";
|
|
document.getElementById("edit-fre-min").value = "0";
|
|
document.getElementById("edit-fre-max").value = "0";
|
|
document.getElementById("edit-peak-min").value = "0";
|
|
document.getElementById("edit-peak-max").value = "0";
|
|
document.getElementById("edit-remark").value = "";
|
|
}
|
|
}
|
|
|
|
function closeModal() {
|
|
document.getElementById("edit-modal").style.display = "none";
|
|
editId = null;
|
|
}
|
|
|
|
// ─── 保存 ────────────────────────────────────
|
|
|
|
async function saveRecord() {
|
|
const data = {
|
|
type_num: parseInt(document.getElementById("edit-type-num").value) || 0,
|
|
dev_name: document.getElementById("edit-dev-name").value.trim(),
|
|
SensMin: parseInt(document.getElementById("edit-sens-min").value) || 0,
|
|
SensMax: parseInt(document.getElementById("edit-sens-max").value) || 0,
|
|
FreMin: hzToRawFreq(parseFloat(document.getElementById("edit-fre-min").value) || 0),
|
|
FreMax: hzToRawFreq(parseFloat(document.getElementById("edit-fre-max").value) || 0),
|
|
PeakMin: vToRawPeak(parseFloat(document.getElementById("edit-peak-min").value) || 0),
|
|
PeakMax: vToRawPeak(parseFloat(document.getElementById("edit-peak-max").value) || 0),
|
|
remark: document.getElementById("edit-remark").value.trim(),
|
|
};
|
|
|
|
if (!data.dev_name) {
|
|
toast("请输入型号/名称", true);
|
|
return;
|
|
}
|
|
|
|
try {
|
|
let resp;
|
|
if (editId) {
|
|
resp = await fetch(`/api/vehicle-base-test/${editId}`, {
|
|
method: "PUT",
|
|
headers: { "Content-Type": "application/json" },
|
|
body: JSON.stringify(data),
|
|
});
|
|
} else {
|
|
resp = await fetch("/api/vehicle-base-test", {
|
|
method: "POST",
|
|
headers: { "Content-Type": "application/json" },
|
|
body: JSON.stringify(data),
|
|
});
|
|
}
|
|
const result = await resp.json();
|
|
if (result.ok || resp.ok) {
|
|
toast(editId ? "更新成功" : "新增成功");
|
|
closeModal();
|
|
loadList();
|
|
} else {
|
|
toast("保存失败: " + (result.error || "未知错误"), true);
|
|
}
|
|
} catch (e) {
|
|
toast("保存失败: " + e.message, true);
|
|
}
|
|
}
|
|
|
|
// ─── 删除 ────────────────────────────────────
|
|
|
|
async function deleteRecord(id, name) {
|
|
if (!confirm(`确定要删除「${name}」吗?`)) return;
|
|
|
|
try {
|
|
const resp = await fetch(`/api/vehicle-base-test/${id}`, { method: "DELETE" });
|
|
const result = await resp.json();
|
|
if (result.ok) {
|
|
toast("删除成功");
|
|
loadList();
|
|
} else {
|
|
toast("删除失败: " + (result.error || "未知错误"), true);
|
|
}
|
|
} catch (e) {
|
|
toast("删除失败: " + e.message, true);
|
|
}
|
|
}
|
|
|
|
function esc(s) { return (s || "").replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """); }
|
|
|
|
loadList();
|