This commit is contained in:
张成
2025-11-24 13:38:40 +08:00
parent 702375beea
commit d90d991710
2 changed files with 154 additions and 7 deletions

View File

@@ -209,7 +209,7 @@ class TaskQueue {
}
/**
* 扫描所有设备的队列并尝试执行任务(过滤未启用的账号)
* 扫描所有设备的队列并尝试执行任务(过滤未启用的账号和不在线的设备
*/
async scanAndProcessQueues() {
try {
@@ -230,11 +230,28 @@ class TaskQueue {
const enabledSnCodes = new Set(enabledAccounts.map(acc => acc.sn_code));
// 检查设备在线状态需要同时满足isOnline = true 且心跳未超时)
const device_status = db.getModel('device_status');
const heartbeatTimeout = require('./config.js').monitoring.heartbeatTimeout;
const now = new Date();
const heartbeatThreshold = new Date(now.getTime() - heartbeatTimeout);
const onlineDevices = await device_status.findAll({
where: {
isOnline: true,
lastHeartbeatTime: {
[Sequelize.Op.gte]: heartbeatThreshold // 心跳时间在阈值内
}
},
attributes: ['sn_code']
});
const onlineSnCodes = new Set(onlineDevices.map(dev => dev.sn_code));
let processedCount = 0;
let queuedCount = 0;
let skippedCount = 0;
// 遍历所有设备的队列,只处理启用账号设备
// 遍历所有设备的队列,只处理启用账号且在线设备
for (const [sn_code, queue] of this.deviceQueues.entries()) {
// 跳过未启用的账号
if (!enabledSnCodes.has(sn_code)) {
@@ -242,6 +259,12 @@ class TaskQueue {
continue;
}
// 跳过不在线的设备
if (!onlineSnCodes.has(sn_code)) {
skippedCount++;
continue;
}
const queueSize = queue.size();
if (queueSize > 0) {
queuedCount += queueSize;
@@ -254,7 +277,7 @@ class TaskQueue {
}
if (queuedCount > 0) {
console.log(`[任务队列] 扫描完成: ${processedCount} 个设备有任务,共 ${queuedCount} 个待执行任务`);
console.log(`[任务队列] 扫描完成: ${processedCount} 个设备有任务,共 ${queuedCount} 个待执行任务,跳过 ${skippedCount} 个设备`);
}
} catch (error) {
console.error('[任务队列] 扫描队列失败:', error);
@@ -274,9 +297,9 @@ class TaskQueue {
* 查找设备是否已有相同类型的任务
* @param {string} sn_code - 设备SN码
* @param {string} taskType - 任务类型
* @returns {object|null} 现有任务或null
* @returns {Promise<object|null>} 现有任务或null
*/
findExistingTask(sn_code, taskType) {
async findExistingTask(sn_code, taskType) {
// 检查当前正在执行的任务
const deviceStatus = this.deviceStatus.get(sn_code);
if (deviceStatus && deviceStatus.currentTask && deviceStatus.currentTask.taskType === taskType) {
@@ -286,12 +309,36 @@ class TaskQueue {
// 检查队列中等待的任务
const queue = this.deviceQueues.get(sn_code);
if (queue) {
const existingTask = queue.find(task => task.taskType === taskType && task.status === 'pending');
const existingTask = queue.find(task => task.taskType === taskType && (task.status === 'pending' || !task.status));
if (existingTask) {
return existingTask;
}
}
// 检查数据库中的pending/running任务防止系统重启后重复添加
try {
const Sequelize = require('sequelize');
const taskStatusModel = db.getModel('task_status');
const existingDbTask = await taskStatusModel.findOne({
where: {
sn_code: sn_code,
taskType: taskType,
status: ['pending', 'running']
},
order: [['id', 'DESC']]
});
if (existingDbTask) {
return {
id: existingDbTask.id,
taskType: existingDbTask.taskType,
status: existingDbTask.status
};
}
} catch (error) {
console.error(`[任务队列] 检查数据库现有任务失败:`, error);
}
return null;
}
@@ -342,7 +389,7 @@ class TaskQueue {
}
// 检查是否已有相同类型的任务在队列中或正在执行
const existingTask = this.findExistingTask(sn_code, taskConfig.taskType);
const existingTask = await this.findExistingTask(sn_code, taskConfig.taskType);
if (existingTask) {
console.log(`[任务队列] 设备 ${sn_code} 已有 ${taskConfig.taskType} 任务在执行或等待中,跳过添加`);
return existingTask.id;