diff --git a/app.py b/app.py index 50e55eb..9289b87 100644 --- a/app.py +++ b/app.py @@ -58,12 +58,14 @@ def analyze_signals(): if '0b' in all_signals or (len(all_signals) >= 2 and all_signals[-2:] == ['09', '0b']): lights['up'] = True + lights['common'] = True if all_signals[-1:] != ['0b']: lights['up'] = False if '0d' in all_signals or (len(all_signals) >= 2 and all_signals[-2:] == ['09', '0d']): lights['down'] = True + lights['common'] = True if all_signals[-1:] != ['0d']: lights['down'] = False diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..cd1c654 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +flask +pyserial +flask-socketio +werkzeug \ No newline at end of file diff --git a/static/config/model.json b/static/config/model.json new file mode 100644 index 0000000..8d9000c --- /dev/null +++ b/static/config/model.json @@ -0,0 +1,23 @@ +[ + {"Type": "A类-4孔","Model": "KM52064153H01","Note": "TWO HAND INSPECTION BOX with 4 holes"}, + {"Type": "A类-4孔","Model": "KM52064153V003","Note": "双手检修手柄,4孔,PVC 3.5M,英国"}, + {"Type": "A类-4孔","Model": "KM52064153V012","Note": "DOUBLE-HAND INSPECTION 4 HOLES, PVC 12M"}, + {"Type": "A类-4孔","Model": "KM52064153V016","Note": "DOUBLE-HAND INSPECTION 4 HOLES, PVC 16M"}, + {"Type": "A类-4孔","Model": "KM52064153V032","Note": "DOUBLE-HAND INSPECTION 4 HOLES, PVC 32M"}, + {"Type": "A类-4孔","Model": "KM52064153V050","Note": "DOUBLE-HAND INSPECTION,4 HOLES, PVC 50M"}, + {"Type": "A类-4孔","Model": "KM52064153V103","Note": "双手检修手柄,4孔,HF 3.5M,英国"}, + {"Type": "A类-4孔","Model": "KM52064153V112","Note": "DOUBLE-HAND INSPECTION 4 HOLES, HF12M"}, + {"Type": "A类-4孔","Model": "KM52064153V116","Note": "DOUBLE-HAND INSPECTION 4 HOLES, HF16M"}, + {"Type": "A类-4孔","Model": "KM52064153V132","Note": "DOUBLE-HAND INSPECTION 4 HOLES, HF32M"}, + {"Type": "A类-4孔","Model": "KM52064153V150","Note": "DOUBLE-HAND INSPECTION,4 HOLES,HF50M"}, + {"Type": "A类-4孔","Model": "KM52064155H01","Note": "TWO HAND INSPECTION BOX,PLC"}, + {"Type": "A类-4孔","Model": "KM52064155V108","Note": "DOUBLE-HAND INSPECTION 4 HOLES, HF8M,PLC"}, + {"Type": "A类-4孔","Model": "KM52064155V116","Note": "DOUBLE-HAND INSPECTION 4 HOLES, HF16M,PLC"}, + {"Type": "A类-4孔","Model": "KM52064155V132","Note": "DOUBLE-HAND INSPECTION 4 HOLES, HF32M ,PLC"}, + {"Type": "A类-4孔","Model": "KM52064155V150","Note": "DOUBLE-HAND INSPECTION,4 HOLES,HF50M,PLC"}, + {"Type": "B类-5孔","Model": "KM52064154H01","Note": "TWO HAND INSPECTION BOX with 5 holes"}, + {"Type": "B类-5孔","Model": "KM52064154V112","Note": "DOUBLE-HAND INSPECTION,5 HOLES,HF12M"}, + {"Type": "B类-5孔","Model": "KM52064154V116","Note": "DOUBLE-HAND INSPECTION,5 HOLES,HF16M"}, + {"Type": "B类-5孔","Model": "KM52064154V132","Note": "DOUBLE-HAND INSPECTION,5 HOLES,HF32M"}, + {"Type": "B类-5孔","Model": "KM52064154V150","Note": "DOUBLE-HAND INSPECTION,5 HOLES,HF50M"} +] \ No newline at end of file diff --git a/static/main.js b/static/main.js index c9eeb47..1b72286 100644 --- a/static/main.js +++ b/static/main.js @@ -13,16 +13,20 @@ let allTestsPassed = false; let currentDeviceType = '5'; // 默认为五孔设备 function updateLights() { + if (!currentDeviceType) return; // 如果没有选择设备类型,不更新灯光状态 + fetch('/get_lights_status') .then(response => response.json()) .then(data => { + console.log('获取到的灯光状态:', data); // 调试输出 for (let light in data) { let element5 = document.getElementById(light + '-5'); let element4 = document.getElementById(light + '-4'); - if (element5) { + + // 根据当前设备类型更新相应的灯光 + if (currentDeviceType === '5' && element5) { updateLightStatus(element5, data[light]); - } - if (element4) { + } else if (currentDeviceType === '4' && element4) { updateLightStatus(element4, data[light]); } @@ -33,6 +37,9 @@ function updateLights() { } } checkAllTestsPassed(); + }) + .catch(error => { + console.error('获取灯光状态失败:', error); }); } @@ -55,11 +62,54 @@ function updateCheckList(light) { } function checkAllTestsPassed() { + // 检查所有测试项是否都通过 allTestsPassed = Array.from(document.querySelectorAll(`#statusCheckList${currentDeviceType} .badge`)) .every(badge => badge.style.display === 'inline-block'); - // 更测试结果 - updateTestResult(); + console.log('所有测试是否通过:', allTestsPassed); // 调试输出 + + // 如果所有测试都通过,更新测试结果 + if (allTestsPassed) { + const rows = document.querySelectorAll('#resultTable tbody tr'); + const lastRow = rows[rows.length - 1]; + + if (lastRow) { + const checkbox = lastRow.querySelector('.form-check-input'); + const label = lastRow.querySelector('.form-check-label'); + const pendingSpan = label.querySelector('.pending'); + const passSpan = label.querySelector('.pass'); + const failSpan = label.querySelector('.fail'); + const passTimeSpan = lastRow.querySelector('.pass-time'); + + // 更新复选框状态 + checkbox.disabled = false; + checkbox.checked = true; + + // 更新显示状态 + pendingSpan.style.display = 'none'; + passSpan.style.display = 'inline'; + failSpan.style.display = 'none'; + + // 更新行样式 + lastRow.classList.remove('pending-row', 'fail-row'); + lastRow.classList.add('pass-row'); + + // 记录通过时间 + const now = new Date(); + const timeString = now.toLocaleString('zh-CN', { + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + hour12: false + }); + passTimeSpan.textContent = timeString; + + console.log('测试通过,更新完成'); // 调试输出 + } + } } function resetCheckList() { @@ -73,58 +123,81 @@ function resetCheckList() { allTestsPassed = false; const deviceType = document.getElementById('deviceType').value; - const checkList = document.getElementById(`statusCheckList${deviceType}`); + const checkList = document.getElementById(`statusCheckList${currentDeviceType}`); if (checkList) { const badges = checkList.querySelectorAll('.badge'); badges.forEach(badge => { badge.style.display = 'none'; }); } - updateTestResult(); + + // 强制更新最后一行的状态为待测试 + const rows = document.querySelectorAll('#resultTable tbody tr'); + const lastRow = rows[rows.length - 1]; + if (lastRow) { + const checkbox = lastRow.querySelector('.form-check-input'); + const label = lastRow.querySelector('.form-check-label'); + const pendingSpan = label.querySelector('.pending'); + const passSpan = label.querySelector('.pass'); + const failSpan = label.querySelector('.fail'); + + checkbox.disabled = true; + checkbox.checked = false; + pendingSpan.style.display = 'inline'; + passSpan.style.display = 'none'; + failSpan.style.display = 'none'; + lastRow.classList.add('pending-row'); + lastRow.classList.remove('pass-row', 'fail-row'); + } } function updateTestResult() { const rows = document.querySelectorAll('#resultTable tbody tr'); const lastRow = rows[rows.length - 1]; - // 只更新最后一行的状态 - updateRowTestResult(lastRow); -} - -function updateRowTestResult(row) { - const checkbox = row.querySelector('.form-check-input'); - const label = row.querySelector('.form-check-label'); + if (!lastRow) return; + + const checkbox = lastRow.querySelector('.form-check-input'); + const label = lastRow.querySelector('.form-check-label'); const pendingSpan = label.querySelector('.pending'); const passSpan = label.querySelector('.pass'); const failSpan = label.querySelector('.fail'); - const passTimeSpan = row.querySelector('.pass-time'); + const passTimeSpan = lastRow.querySelector('.pass-time'); if (allTestsPassed) { - if (!checkbox.checked) { // 只在首次通过测试时记录时间 - checkbox.disabled = false; - checkbox.checked = true; - pendingSpan.style.display = 'none'; - passSpan.style.display = 'inline'; - failSpan.style.display = 'none'; - row.classList.remove('pending-row'); - row.classList.add('pass-row'); - row.classList.remove('fail-row'); - - // 记录合格时间 + // 如果所有测试通过,设置为合格状态 + checkbox.disabled = false; + checkbox.checked = true; + pendingSpan.style.display = 'none'; + passSpan.style.display = 'inline'; + failSpan.style.display = 'none'; + lastRow.classList.remove('pending-row', 'fail-row'); + lastRow.classList.add('pass-row'); + + // 如果还没有记录时间,则记录当前时间 + if (!passTimeSpan.textContent) { const now = new Date(); - const timeString = now.toLocaleString('zh-CN', { hour12: false }); + const timeString = now.toLocaleString('zh-CN', { + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + hour12: false + }); passTimeSpan.textContent = timeString; } } else { + // 如果测试未完成,设置为待测试状态 checkbox.disabled = true; checkbox.checked = false; pendingSpan.style.display = 'inline'; passSpan.style.display = 'none'; failSpan.style.display = 'none'; - row.classList.add('pending-row'); - row.classList.remove('pass-row'); - row.classList.remove('fail-row'); - // 不清空合格时间,保留之前记录的时间(如果有的话) + lastRow.classList.add('pending-row'); + lastRow.classList.remove('pass-row', 'fail-row'); + passTimeSpan.textContent = ''; } } @@ -145,17 +218,29 @@ function addNewRow(button) { const newRow = table.insertRow(); const rowIndex = table.rows.length - 1; + // 重置所有状态(在创建新行之前) + allTestsPassed = false; + lightHistory = { + common: false, + alarm: false, + up: false, + down: false, + emergency_stop: false + }; + + // 创建新行的HTML const cell1 = newRow.insertCell(0); const cell2 = newRow.insertCell(1); const cell3 = newRow.insertCell(2); const cell4 = newRow.insertCell(3); + // 设置新行的初始状态 cell1.innerHTML = ''; cell2.innerHTML = `