1
This commit is contained in:
@@ -252,9 +252,12 @@ class PlaAccountService {
|
||||
order: [['id', 'DESC']]
|
||||
});
|
||||
|
||||
// 将 Sequelize 模型实例转换为普通对象
|
||||
const rows = result.rows.map(row => row.get({ plain: true }));
|
||||
|
||||
return {
|
||||
count: result.count,
|
||||
rows: result.rows
|
||||
rows: rows
|
||||
};
|
||||
}
|
||||
|
||||
@@ -266,7 +269,9 @@ class PlaAccountService {
|
||||
async getAccountCommands(params) {
|
||||
const pla_account = db.getModel('pla_account');
|
||||
const task_commands = db.getModel('task_commands');
|
||||
const task_status = db.getModel('task_status');
|
||||
const Sequelize = require('sequelize');
|
||||
const Op = Sequelize.Op;
|
||||
|
||||
const { id, limit, offset } = params;
|
||||
|
||||
@@ -280,51 +285,66 @@ class PlaAccountService {
|
||||
throw new Error('账号不存在');
|
||||
}
|
||||
|
||||
// 获取 sequelize 实例
|
||||
const sequelize = task_commands.sequelize;
|
||||
// 先查询所有匹配 sn_code 的任务 ID
|
||||
const tasks = await task_status.findAll({
|
||||
where: {
|
||||
sn_code: account.sn_code
|
||||
},
|
||||
attributes: ['id']
|
||||
});
|
||||
|
||||
// 使用原生 SQL JOIN 查询
|
||||
const countSql = `
|
||||
SELECT COUNT(DISTINCT tc.id) as count
|
||||
FROM task_commands tc
|
||||
INNER JOIN task_status ts ON tc.task_id = ts.id
|
||||
WHERE ts.sn_code = :sn_code
|
||||
`;
|
||||
const taskIds = tasks.map(task => task.id);
|
||||
|
||||
const dataSql = `
|
||||
SELECT tc.*
|
||||
FROM task_commands tc
|
||||
INNER JOIN task_status ts ON tc.task_id = ts.id
|
||||
WHERE ts.sn_code = :sn_code
|
||||
ORDER BY tc.id DESC
|
||||
LIMIT :limit OFFSET :offset
|
||||
`;
|
||||
// 如果没有任务,直接返回空结果
|
||||
if (taskIds.length === 0) {
|
||||
return {
|
||||
count: 0,
|
||||
rows: []
|
||||
};
|
||||
}
|
||||
|
||||
// 并行执行查询和计数
|
||||
const [countResult, dataResult] = await Promise.all([
|
||||
sequelize.query(countSql, {
|
||||
replacements: { sn_code: account.sn_code },
|
||||
type: Sequelize.QueryTypes.SELECT
|
||||
}),
|
||||
sequelize.query(dataSql, {
|
||||
replacements: {
|
||||
sn_code: account.sn_code,
|
||||
limit: limit,
|
||||
offset: offset
|
||||
},
|
||||
type: Sequelize.QueryTypes.SELECT
|
||||
})
|
||||
]);
|
||||
// 使用 Sequelize 模型查询指令列表
|
||||
const result = await task_commands.findAndCountAll({
|
||||
where: {
|
||||
task_id: {
|
||||
[Op.in]: taskIds
|
||||
}
|
||||
},
|
||||
limit,
|
||||
offset,
|
||||
order: [['id', 'DESC']]
|
||||
});
|
||||
|
||||
const count = countResult[0]?.count || 0;
|
||||
|
||||
// 将原始数据转换为 Sequelize 模型实例
|
||||
const rows = dataResult.map(row => {
|
||||
return task_commands.build(row, { isNewRecord: false });
|
||||
// 将 Sequelize 模型实例转换为普通对象
|
||||
const rows = result.rows.map(row => {
|
||||
const plainRow = row.get({ plain: true });
|
||||
|
||||
// 添加 create_time 字段(使用 start_time 或 createdAt)
|
||||
if (!plainRow.create_time) {
|
||||
plainRow.create_time = plainRow.start_time || plainRow.createdAt || null;
|
||||
}
|
||||
|
||||
// 解析 JSON 字段
|
||||
if (plainRow.command_params && typeof plainRow.command_params === 'string') {
|
||||
try {
|
||||
plainRow.command_params = JSON.parse(plainRow.command_params);
|
||||
} catch (e) {
|
||||
// 解析失败保持原样
|
||||
}
|
||||
}
|
||||
if (plainRow.result && typeof plainRow.result === 'string') {
|
||||
try {
|
||||
plainRow.result = JSON.parse(plainRow.result);
|
||||
} catch (e) {
|
||||
// 解析失败保持原样
|
||||
}
|
||||
}
|
||||
|
||||
return plainRow;
|
||||
});
|
||||
|
||||
return {
|
||||
count: parseInt(count),
|
||||
count: result.count,
|
||||
rows: rows
|
||||
};
|
||||
}
|
||||
@@ -451,6 +471,100 @@ class PlaAccountService {
|
||||
return commandDetail;
|
||||
}
|
||||
|
||||
/**
|
||||
* 重试指令
|
||||
* @param {Object} params - 重试参数
|
||||
* @param {number} params.commandId - 指令ID
|
||||
* @returns {Promise<Object>} 重试结果
|
||||
*/
|
||||
async retryCommand(params) {
|
||||
const task_commands = db.getModel('task_commands');
|
||||
const task_status = db.getModel('task_status');
|
||||
const scheduleManager = require('../middleware/schedule/index.js');
|
||||
|
||||
const { commandId } = params;
|
||||
|
||||
if (!commandId) {
|
||||
throw new Error('指令ID不能为空');
|
||||
}
|
||||
|
||||
// 查询指令信息
|
||||
const command = await task_commands.findByPk(commandId);
|
||||
if (!command) {
|
||||
throw new Error('指令不存在');
|
||||
}
|
||||
|
||||
// 检查指令状态
|
||||
if (command.status !== 'failed') {
|
||||
throw new Error('只能重试失败的指令');
|
||||
}
|
||||
|
||||
// 获取任务信息
|
||||
const task = await task_status.findByPk(command.task_id);
|
||||
if (!task) {
|
||||
throw new Error('任务不存在');
|
||||
}
|
||||
|
||||
// 获取账号信息
|
||||
const pla_account = db.getModel('pla_account');
|
||||
const account = await pla_account.findOne({ where: { sn_code: task.sn_code } });
|
||||
if (!account) {
|
||||
throw new Error('账号不存在');
|
||||
}
|
||||
|
||||
// 检查授权状态
|
||||
const authCheck = await authorizationService.checkAuthorization(account.id, 'id');
|
||||
if (!authCheck.is_authorized) {
|
||||
throw new Error(authCheck.message);
|
||||
}
|
||||
|
||||
// 检查 MQTT 客户端
|
||||
if (!scheduleManager.mqttClient) {
|
||||
throw new Error('MQTT客户端未初始化');
|
||||
}
|
||||
|
||||
// 重置指令状态
|
||||
await command.update({
|
||||
status: 'pending',
|
||||
error_message: null,
|
||||
error_stack: null,
|
||||
retry_count: (command.retry_count || 0) + 1,
|
||||
start_time: null,
|
||||
end_time: null,
|
||||
duration: null,
|
||||
result: null
|
||||
});
|
||||
|
||||
// 解析指令参数
|
||||
let commandParams = {};
|
||||
if (command.command_params) {
|
||||
try {
|
||||
commandParams = typeof command.command_params === 'string'
|
||||
? JSON.parse(command.command_params)
|
||||
: command.command_params;
|
||||
} catch (error) {
|
||||
console.warn('解析指令参数失败:', error);
|
||||
}
|
||||
}
|
||||
|
||||
// 构建指令对象
|
||||
const commandObj = {
|
||||
command_type: command.command_type,
|
||||
command_name: command.command_name,
|
||||
command_params: JSON.stringify(commandParams)
|
||||
};
|
||||
|
||||
// 执行指令
|
||||
const result = await scheduleManager.command.executeCommand(task.id, commandObj, scheduleManager.mqttClient);
|
||||
|
||||
return {
|
||||
success: true,
|
||||
message: '指令重试成功',
|
||||
commandId: command.id,
|
||||
result: result
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 执行账号任务(旧接口兼容)
|
||||
* @param {Object} params - 任务参数
|
||||
|
||||
Reference in New Issue
Block a user