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 };