diff --git a/edc-web/app/models.py b/edc-web/app/models.py index 7ee80db..4ff7130 100644 --- a/edc-web/app/models.py +++ b/edc-web/app/models.py @@ -151,10 +151,12 @@ def get_latest_test_state(dnt_id: int) -> dict | None: def get_test_data(page: int = 1, per_page: int = 20, serial: str = "", date_from: str = "", - date_to: str = "", test_mode: str = "") -> tuple[list[dict], int]: + date_to: str = "", test_mode: str = "", + data_source: str = "") -> tuple[list[dict], int]: """分页查询测试数据(JOIN dnt_info),返回 (records, total) test_mode: ''=全部, '0'=灵敏度, '1'=波动 + data_source: ''=全部, 'B2', 'B4' """ conn = get_conn() try: @@ -173,6 +175,9 @@ def get_test_data(page: int = 1, per_page: int = 20, if test_mode: where.append("t.test_mode = %s") params.append(int(test_mode)) + if data_source: + where.append("t.data_source = %s") + params.append(data_source) where_clause = " AND ".join(where) if where else "1=1" @@ -201,10 +206,12 @@ def get_test_data(page: int = 1, per_page: int = 20, def get_all_test_data_for_export(serial: str = "", date_from: str = "", - date_to: str = "", test_mode: str = "") -> list[dict]: + date_to: str = "", test_mode: str = "", + data_source: str = "") -> list[dict]: """导出全部数据 test_mode: ''=全部, '0'=灵敏度, '1'=波动 + data_source: ''=全部, 'B2', 'B4' """ conn = get_conn() try: @@ -223,6 +230,9 @@ def get_all_test_data_for_export(serial: str = "", date_from: str = "", if test_mode: where.append("t.test_mode = %s") params.append(int(test_mode)) + if data_source: + where.append("t.data_source = %s") + params.append(data_source) where_clause = " AND ".join(where) if where else "1=1" cur.execute( diff --git a/edc-web/app/routes/test_data.py b/edc-web/app/routes/test_data.py index cdf1057..fbe2b27 100644 --- a/edc-web/app/routes/test_data.py +++ b/edc-web/app/routes/test_data.py @@ -24,8 +24,10 @@ def api_test_data(): date_from = request.args.get("date_from", "", type=str) date_to = request.args.get("date_to", "", type=str) test_mode = request.args.get("test_mode", "", type=str) + data_source = request.args.get("data_source", "", type=str) - records, total = get_test_data(page, per_page, serial, date_from, date_to, test_mode) + records, total = get_test_data(page, per_page, serial, date_from, date_to, + test_mode, data_source) return jsonify({ "records": records, "total": total, @@ -42,8 +44,10 @@ def api_export(): date_from = request.args.get("date_from", "", type=str) date_to = request.args.get("date_to", "", type=str) test_mode = request.args.get("test_mode", "", type=str) + data_source = request.args.get("data_source", "", type=str) - records = get_all_test_data_for_export(serial, date_from, date_to, test_mode) + records = get_all_test_data_for_export(serial, date_from, date_to, + test_mode, data_source) output = io.StringIO() writer = csv.writer(output) diff --git a/edc-web/app/static/js/test_data.js b/edc-web/app/static/js/test_data.js index 7ed758c..052368b 100644 --- a/edc-web/app/static/js/test_data.js +++ b/edc-web/app/static/js/test_data.js @@ -1,25 +1,112 @@ -// 测试信息页 +// 测试信息页 — 三视图 (全部 / B2 / B4) + +// ─── 视图定义 ─────────────────────────────────── + +const VIEWS = { + all: { + label: '全部数据', + data_source: '', // '' = 不过滤 + cols: [ + { key: 'id', title: 'ID' }, + { key: 'serial', title: '设备编码' }, + { key: 'dpg430_addr', title: '地址' }, + { key: 'model', title: '型号', render: r => r.sub_type === 1 ? 'PD132' : r.sub_type === 2 ? 'DLD110' : '-' }, + { key: 'str_type', title: '类型' }, + { key: 'data_source', title: '来源' }, + { key: 'test_mode', title: '测试模式', render: r => r.test_mode === 1 ? '波动' : '灵敏度' }, + { key: 'ppvalue', title: '峰峰值(V)', render: r => r.ppvalue?.toFixed(2) || '-' }, + { key: 'idle_freq', title: '开始频率' }, + { key: 'enter_dist', title: '进入距离' }, + { key: 'exit_dist', title: '离开距离' }, + { key: 'remain_count', title: '剩余次数' }, + { key: 'curr_dist', title: '当前距离' }, + { key: 'create_time', title: '时间' }, + ], + }, + b2: { + label: '灵敏度测试', + data_source: 'B2', + cols: [ + { key: 'id', title: 'ID' }, + { key: 'serial', title: '设备编码' }, + { key: 'dpg430_addr', title: '地址' }, + { key: 'model', title: '型号', render: r => r.sub_type === 1 ? 'PD132' : r.sub_type === 2 ? 'DLD110' : '-' }, + { key: 'str_type', title: '类型' }, + { key: 'test_mode', title: '测试模式', render: r => r.test_mode === 1 ? '波动' : '灵敏度' }, + { key: 'iffinish', title: '完成', render: r => r.iffinish === '1' ? '是' : '否' }, + { key: 'fault_info', title: '故障信息' }, + { key: 'relay_out', title: '继电器' }, + { key: 'ppvalue', title: '峰峰值(V)', render: r => r.ppvalue?.toFixed(2) || '-' }, + { key: 'idle_freq', title: '开始频率' }, + { key: 'enter_freq', title: '进入频率' }, + { key: 'exit_freq', title: '离开频率' }, + { key: 'enter_dist', title: '进入距离' }, + { key: 'exit_dist', title: '离开距离' }, + { key: 'enter_speed', title: '进入速度', render: r => toSpeed(r.enter_speed) }, + { key: 'exit_speed', title: '离开速度', render: r => toSpeed(r.exit_speed) }, + { key: 'create_time', title: '时间' }, + ], + }, + b4: { + label: '波动测试', + data_source: 'B4', + cols: [ + { key: 'id', title: 'ID' }, + { key: 'serial', title: '设备编码' }, + { key: 'dpg430_addr', title: '地址' }, + { key: 'remain_count', title: '剩余次数' }, + { key: 'work_freq', title: '工作频率(Hz)' }, + { key: 'curr_dist', title: '当前距离(mm)' }, + { key: 'speed', title: '速度(dm/s)' }, + { key: 'near_dist', title: '最近距离(mm)' }, + { key: 'far_dist', title: '最远距离(mm)' }, + { key: 'b4_enter_dist', title: '进入高度(mm)' }, + { key: 'b4_leave_dist', title: '离开高度(mm)' }, + { key: 'relay_out', title: '继电器' }, + { key: 'create_time', title: '时间' }, + ], + }, +}; + +// ─── 状态 ─────────────────────────────────────── + +let currentView = 'all'; +let currentPage = 1; +let totalPages = 1; function toSpeed(v) { if (v === null || v === undefined || v === '') return '-'; return (parseFloat(v) / 10).toFixed(1); } -let currentPage = 1; -let totalPages = 1; +// ─── 视图切换 ──────────────────────────────────── + +function switchView(view) { + currentView = view; + document.querySelectorAll('.tab-btn').forEach(b => b.classList.remove('active')); + document.getElementById('tab-' + view).classList.add('active'); + // 重置分页 + currentPage = 1; + searchData(1); +} + +// ─── 查询 ──────────────────────────────────────── async function searchData(page = 1) { currentPage = page; const serial = document.getElementById("search-serial").value; const dateFrom = document.getElementById("search-date-from").value; const dateTo = document.getElementById("search-date-to").value; - const testMode = document.getElementById("search-test-mode").value; + const v = VIEWS[currentView]; const params = new URLSearchParams({ page, per_page: 20 }); if (serial) params.set("serial", serial); if (dateFrom) params.set("date_from", dateFrom); if (dateTo) params.set("date_to", dateTo); - if (testMode) params.set("test_mode", testMode); + // 按 data_source 过滤(全部不过滤) + if (v.data_source) { + params.set("data_source", v.data_source); + } try { const resp = await fetch(`/api/test-data?${params}`); @@ -32,42 +119,39 @@ async function searchData(page = 1) { } } +// ─── 渲染表头 ──────────────────────────────────── + +function renderHead() { + const thead = document.querySelector("#test-data-table thead"); + const v = VIEWS[currentView]; + thead.innerHTML = '
| ID | -设备编码 | -DG430地址 | -设备型号 | -类型 | -测试模式 | -数据来源 | -是否完成 | -故障信息 | -继电器 | -峰峰值(V) | -开始频率(Hz) | -进入频率(Hz) | -离开频率(Hz) | -进入距离(mm) | -离开距离(mm) | -进入速度(m/s) | -离开速度(m/s) | -剩余次数 | -当前距离(mm) | -速度(dm/s) | -最近距离(mm) | -最远距离(mm) | -时间 | -
|---|