diff --git a/api/middleware/schedule/scheduledJobs.js b/api/middleware/schedule/scheduledJobs.js index 3ab2088..07cbaa3 100644 --- a/api/middleware/schedule/scheduledJobs.js +++ b/api/middleware/schedule/scheduledJobs.js @@ -306,9 +306,32 @@ class ScheduledJobs { return; } - // 为每个设备发送任务状态摘要 + // 离线阈值:3分钟 + const offlineThreshold = 3 * 60 * 1000; // 3分钟 + const now = Date.now(); + + // 为每个在线设备发送任务状态摘要 for (const account of accounts) { const sn_code = account.sn_code; + + // 检查设备是否在线 + const device = deviceManager.devices.get(sn_code); + + if (!device) { + // 设备从未发送过心跳,视为离线,跳过 + continue; + } + + // 检查最后心跳时间 + const lastHeartbeat = device.lastHeartbeat || 0; + const isOnline = device.isOnline && (now - lastHeartbeat < offlineThreshold); + + if (!isOnline) { + // 设备离线,跳过 + continue; + } + + // 设备在线,发送任务状态摘要 try { await this.taskQueue.sendTaskStatusSummary(sn_code); } catch (error) { @@ -540,7 +563,8 @@ class ScheduledJobs { // 如果存在上次投递记录,检查是否已经过了间隔时间 if (lastDeliverTask && lastDeliverTask.endTime) { const lastDeliverTime = new Date(lastDeliverTask.endTime); - const elapsedTime = now.getTime() - lastDeliverTime.getTime(); + + const elapsedTime = new Date().getTime() - lastDeliverTime.getTime(); if (elapsedTime < interval_ms) { const remainingMinutes = Math.ceil((interval_ms - elapsedTime) / (60 * 1000));