1
This commit is contained in:
@@ -1054,6 +1054,113 @@ class TaskQueue {
|
||||
console.warn(`[任务队列] 通知客户端任务状态变更失败:`, error.message);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取任务状态摘要(用于同步到客户端)
|
||||
* @param {string} sn_code - 设备SN码
|
||||
* @returns {Promise<object>} 任务状态摘要
|
||||
*/
|
||||
async getTaskStatusSummary(sn_code) {
|
||||
try {
|
||||
const queue = this.deviceQueues.get(sn_code);
|
||||
const status = this.deviceStatus.get(sn_code) || {
|
||||
isRunning: false,
|
||||
currentTask: null,
|
||||
runningCount: 0
|
||||
};
|
||||
|
||||
// 获取当前执行的任务
|
||||
let currentTask = null;
|
||||
if (status.currentTask) {
|
||||
const taskData = status.currentTask;
|
||||
currentTask = {
|
||||
taskId: taskData.id,
|
||||
taskName: taskData.taskName || taskData.task_name || taskData.taskType || taskData.task_type || '未知任务',
|
||||
taskType: taskData.taskType || taskData.task_type,
|
||||
status: 'running',
|
||||
progress: taskData.progress || 0,
|
||||
currentStep: taskData.currentStep || taskData.current_step || '',
|
||||
startTime: taskData.startTime || taskData.start_time || taskData.created_time
|
||||
};
|
||||
}
|
||||
|
||||
// 获取待执行任务列表(最多10个)
|
||||
const pendingTasks = [];
|
||||
if (queue && queue.size() > 0) {
|
||||
const queueArray = queue.toArray();
|
||||
for (const task of queueArray.slice(0, 10)) {
|
||||
const taskData = task;
|
||||
pendingTasks.push({
|
||||
taskId: taskData.id,
|
||||
taskName: taskData.taskName || taskData.task_name || taskData.taskType || taskData.task_type || '未知任务',
|
||||
taskType: taskData.taskType || taskData.task_type,
|
||||
status: 'pending',
|
||||
scheduledTime: taskData.scheduledTime || taskData.scheduled_time || taskData.created_time,
|
||||
priority: taskData.priority || 0
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// 计算下次任务执行时间(队列中第一个任务的计划时间)
|
||||
let nextTaskTime = null;
|
||||
if (queue && queue.size() > 0) {
|
||||
const firstTask = queue.peek();
|
||||
if (firstTask && (firstTask.scheduledTime || firstTask.scheduled_time)) {
|
||||
nextTaskTime = firstTask.scheduledTime || firstTask.scheduled_time;
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
sn_code,
|
||||
currentTask,
|
||||
pendingTasks,
|
||||
nextTaskTime,
|
||||
pendingCount: queue ? queue.size() : 0,
|
||||
mqttTopic: `task_status_${sn_code}`,
|
||||
timestamp: new Date().toISOString()
|
||||
};
|
||||
} catch (error) {
|
||||
console.error(`[任务队列] 获取任务状态摘要失败:`, error, { sn_code });
|
||||
return {
|
||||
sn_code,
|
||||
currentTask: null,
|
||||
pendingTasks: [],
|
||||
nextTaskTime: null,
|
||||
pendingCount: 0,
|
||||
mqttTopic: `task_status_${sn_code}`,
|
||||
timestamp: new Date().toISOString()
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 向客户端发送任务状态摘要
|
||||
* @param {string} sn_code - 设备SN码
|
||||
*/
|
||||
async sendTaskStatusSummary(sn_code) {
|
||||
try {
|
||||
const mqttClient = await this.getMqttClient();
|
||||
if (!mqttClient) {
|
||||
return; // MQTT客户端不可用,静默失败
|
||||
}
|
||||
|
||||
const summary = await this.getTaskStatusSummary(sn_code);
|
||||
|
||||
// 通过MQTT发布任务状态摘要
|
||||
// 主题格式: task_status_{sn_code}
|
||||
const topic = `task_status_${sn_code}`;
|
||||
const message = JSON.stringify({
|
||||
action: 'task_status_summary',
|
||||
data: summary,
|
||||
timestamp: new Date().toISOString()
|
||||
});
|
||||
|
||||
await mqttClient.publish(topic, message);
|
||||
} catch (error) {
|
||||
// 通知失败不影响任务执行,只记录日志
|
||||
console.warn(`[任务队列] 发送任务状态摘要失败:`, error.message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 导出单例
|
||||
|
||||
Reference in New Issue
Block a user