From 3d084891f40e73d69c1451dbdb180e98d952d820 Mon Sep 17 00:00:00 2001 From: Cui Hongwei Date: Sun, 19 Jul 2026 09:46:22 +0800 Subject: [PATCH] feat: connect device history to database --- src/views/qingAn.vue | 76 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/src/views/qingAn.vue b/src/views/qingAn.vue index 1d7576a..bcf0bba 100644 --- a/src/views/qingAn.vue +++ b/src/views/qingAn.vue @@ -315,6 +315,8 @@ export default { storageMatrixRequesting: false, alarmEventTimer: null, alarmEventRequesting: false, + deviceHistoryTimer: null, + deviceHistoryRequesting: false, clockTimer: null, resizeHandler: null, alarmPieChart: null, @@ -629,6 +631,7 @@ export default { this.loadLineMonitorData() this.loadStorageMatrixData() this.loadAlarmEventData() + this.loadDeviceHistoryData() this.clockTimer = setInterval(this.updateTime, 1000) this.lineMonitorTimer = setInterval(() => { this.loadLineMonitorData() @@ -639,6 +642,9 @@ export default { this.alarmEventTimer = setInterval(() => { this.loadAlarmEventData() }, 10000) + this.deviceHistoryTimer = setInterval(() => { + this.loadDeviceHistoryData() + }, 60000) this.resizeHandler = () => { this.setScale() if (this.alarmPieChart) { @@ -682,6 +688,10 @@ export default { clearInterval(this.alarmEventTimer) this.alarmEventTimer = null } + if (this.deviceHistoryTimer) { + clearInterval(this.deviceHistoryTimer) + this.deviceHistoryTimer = null + } if (this.alarmPieChart) { this.alarmPieChart.dispose() this.alarmPieChart = null @@ -851,6 +861,72 @@ export default { const text = String(value == null ? '' : value).trim() return text.length > 9 ? `${text.slice(0, 9)}...` : text }, + loadDeviceHistoryData() { + if (this.deviceHistoryRequesting) return + this.deviceHistoryRequesting = true + const data = this.CreateData('11', 'TV_设备运行履历_查询', []) + this.ExecDatabase(data) + .then((response) => { + const list = response && response.data ? response.data : null + if (!Array.isArray(list) || list.length === 0) return + if (list.length === 1 && list[0] && (list[0].result === '0' || list[0].result === 0)) return + this.applyDeviceHistoryData(list) + }) + .catch((error) => { + console.error('TV_设备运行履历_查询失败', error) + }) + .then(() => { + this.deviceHistoryRequesting = false + }) + }, + applyDeviceHistoryData(list) { + const rowMap = {} + list.forEach((item) => { + const deviceKey = this.formatDisplayValue(this.pickRecordValue(item, ['DeviceKey', 'deviceKey'])) + if (!deviceKey || deviceKey === '--') return + if (!rowMap[deviceKey]) { + rowMap[deviceKey] = { + key: deviceKey, + name: this.formatDisplayValue(this.pickRecordValue(item, ['DeviceName', 'deviceName'])), + sortNo: Number(this.pickRecordValue(item, ['SortNo', 'sortNo'])) || 999, + segments: [] + } + } + const segment = this.createDeviceHistorySegment(item) + if (segment.end > segment.start) { + rowMap[deviceKey].segments.push(segment) + } + }) + const rows = Object.keys(rowMap) + .map(key => rowMap[key]) + .filter(row => row.segments.length > 0) + .sort((a, b) => a.sortNo - b.sortNo || a.name.localeCompare(b.name, 'zh-CN')) + rows.forEach((row) => { + row.segments.sort((a, b) => a.start - b.start) + }) + if (rows.length) { + this.deviceHistoryList = rows + } + }, + createDeviceHistorySegment(item) { + const start = this.clampHistoryHour(this.pickRecordValue(item, ['StartHour', 'startHour'])) + const end = this.clampHistoryHour(this.pickRecordValue(item, ['EndHour', 'endHour'])) + return { + label: this.formatDisplayValue(this.pickRecordValue(item, ['StatusText', 'statusText'])), + type: this.normalizeHistoryStatusType(this.pickRecordValue(item, ['StatusType', 'statusType'])), + start, + end + } + }, + normalizeHistoryStatusType(value) { + const type = String(value || '').trim().toLowerCase() + return ['off', 'standby', 'run', 'alarm'].includes(type) ? type : 'off' + }, + clampHistoryHour(value) { + const hour = Number(value) + if (!Number.isFinite(hour)) return 0 + return Math.max(0, Math.min(24, hour)) + }, loadLineMonitorData() { if (this.lineMonitorRequesting) return this.lineMonitorRequesting = true