diff --git a/src/App.vue b/src/App.vue index e613056..71c6cc2 100644 --- a/src/App.vue +++ b/src/App.vue @@ -2,17 +2,67 @@ +
+ + diff --git a/src/utils/alarmReminder.js b/src/utils/alarmReminder.js index 1dac36e..b34f693 100644 --- a/src/utils/alarmReminder.js +++ b/src/utils/alarmReminder.js @@ -1 +1,119 @@ const websocketUrl = 'ws://119.45.202.115:7181/ws'; +const deviceDataTime = {}; +const overtime = 1000 * 60 * 10; +// const overtime = 1000; +let alarmReminderSocket = null; +let overtimeTimer = null; +let overtimeCallback = null; + +const resolveMessagePayload = (data) => { + if (typeof data !== 'string') { + return data; + } + + try { + return JSON.parse(data, (key, value) => { + if (key === 'objid' && value !== null && value !== undefined) { + return String(value); + } + + return value; + }); + } catch { + return data; + } +}; + +const updateDeviceDataTime = (payload) => { + const monitorId = payload?.deviceParam?.monitorId; + const objid = payload?.deviceParam?.objid; + + if (!monitorId || objid === undefined || objid === null) { + return; + } + + deviceDataTime[monitorId] = { + objid: String(objid), + time: Date.now() + }; +}; + +const startOvertimeTimer = () => { + if (overtimeTimer) { + return; + } + + overtimeTimer = setInterval(() => { + if (typeof overtimeCallback !== 'function') { + return; + } + + const now = Date.now(); + + Object.keys(deviceDataTime).forEach((monitorId) => { + const item = deviceDataTime[monitorId]; + + if (!item || now - item.time <= overtime) { + return; + } + + overtimeCallback({ + monitorId, + ...item + }); + delete deviceDataTime[monitorId]; + }); + }, 1000); +}; + +export const connectAlarmReminder = (onMessage, url = websocketUrl) => { + if (typeof onMessage !== 'function') { + throw new Error('connectAlarmReminder 需要传入消息回调函数'); + } + + if (alarmReminderSocket) { + alarmReminderSocket.close(); + } + + alarmReminderSocket = new WebSocket(url); + + alarmReminderSocket.onmessage = (event) => { + const payload = resolveMessagePayload(event.data); + updateDeviceDataTime(payload); + onMessage(payload, event); + }; + + return alarmReminderSocket; +}; + +export const onAlarmReminderOvertime = (callback) => { + if (typeof callback !== 'function') { + throw new Error('onAlarmReminderOvertime 需要传入超时回调函数'); + } + + overtimeCallback = callback; + startOvertimeTimer(); +}; + +export const closeAlarmReminder = () => { + if (!alarmReminderSocket) { + if (overtimeTimer) { + clearInterval(overtimeTimer); + overtimeTimer = null; + } + overtimeCallback = null; + return; + } + + alarmReminderSocket.close(); + alarmReminderSocket = null; + + if (overtimeTimer) { + clearInterval(overtimeTimer); + overtimeTimer = null; + } + + overtimeCallback = null; +}; + +export { websocketUrl, deviceDataTime, overtime };