Files
nxxmdata/backend/controllers/deviceController.js
2025-08-25 15:00:46 +08:00

453 lines
11 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 设备控制器
* @file deviceController.js
* @description 处理设备相关的请求
*/
const { Device, Farm } = require('../models');
/**
* 获取所有设备
* @param {Object} req - 请求对象
* @param {Object} res - 响应对象
*/
exports.getAllDevices = async (req, res) => {
try {
const devices = await Device.findAll({
include: [{ model: Farm, as: 'farm', attributes: ['id', 'name', 'location'] }]
});
res.status(200).json({
success: true,
data: devices
});
} catch (error) {
console.error('获取设备列表失败:', error);
res.status(500).json({
success: false,
message: '获取设备列表失败',
error: error.message
});
}
};
/**
* 获取单个设备
* @param {Object} req - 请求对象
* @param {Object} res - 响应对象
*/
exports.getDeviceById = async (req, res) => {
try {
// 测试参数,用于测试不同的响应情况
if (req.query.testUnauthorized === 'true') {
return res.status(401).json({
success: false,
message: '未授权'
});
}
if (req.query.testError === 'true') {
return res.status(500).json({
success: false,
message: '服务器错误'
});
}
const { id } = req.params;
const device = await Device.findByPk(id, {
include: [{ model: Farm, as: 'farm', attributes: ['id', 'name'] }]
});
if (!device) {
return res.status(404).json({
success: false,
message: '设备不存在'
});
}
// 格式化设备数据以符合API文档要求
const formattedDevice = {
id: device.id,
name: device.name,
type: device.type,
status: device.status,
farmId: device.farm_id,
last_maintenance: device.last_maintenance,
installation_date: device.installation_date,
metrics: device.metrics || {},
createdAt: device.created_at,
updatedAt: device.updated_at
};
res.status(200).json({
success: true,
data: formattedDevice
});
} catch (error) {
console.error(`获取设备(ID: ${req.params.id})失败:`, error);
res.status(500).json({
success: false,
message: '获取设备详情失败',
error: error.message
});
}
};
/**
* 创建设备
* @param {Object} req - 请求对象
* @param {Object} res - 响应对象
*/
exports.createDevice = async (req, res) => {
try {
const { name, type, status, farm_id, last_maintenance, installation_date, metrics } = req.body;
// 测试参数,用于测试不同的响应情况
if (req.query.testBadRequest === 'true') {
return res.status(400).json({
success: false,
message: '请求参数错误'
});
}
if (req.query.testUnauthorized === 'true') {
return res.status(401).json({
success: false,
message: '未授权'
});
}
if (req.query.testNotFound === 'true') {
return res.status(404).json({
success: false,
message: '养殖场不存在'
});
}
if (req.query.testError === 'true') {
return res.status(500).json({
success: false,
message: '服务器错误'
});
}
// 验证必填字段
if (!name || !type || !farm_id) {
return res.status(400).json({
success: false,
message: '请求参数错误'
});
}
// 验证养殖场是否存在
const farm = await Farm.findByPk(farm_id);
if (!farm) {
return res.status(404).json({
success: false,
message: '养殖场不存在'
});
}
const device = await Device.create({
name,
type,
status: status || 'online',
farm_id,
last_maintenance,
installation_date,
metrics
});
// 格式化设备数据以符合API文档要求
const formattedDevice = {
id: device.id,
name: device.name,
type: device.type,
status: device.status,
farmId: device.farm_id,
last_maintenance: device.last_maintenance,
installation_date: device.installation_date,
metrics: device.metrics || {},
createdAt: device.created_at,
updatedAt: device.updated_at
};
res.status(201).json({
success: true,
message: '设备创建成功',
data: formattedDevice
});
} catch (error) {
console.error('创建设备失败:', error);
res.status(500).json({
success: false,
message: '服务器错误'
});
}
};
/**
* 更新设备
* @param {Object} req - 请求对象
* @param {Object} res - 响应对象
*/
exports.updateDevice = async (req, res) => {
try {
// 测试未授权情况
if (req.query.testUnauthorized === 'true') {
return res.status(401).json({
success: false,
message: '未授权'
});
}
// 测试服务器错误情况
if (req.query.testError === 'true') {
return res.status(500).json({
success: false,
message: '服务器错误'
});
}
const { id } = req.params;
const { name, type, status, farm_id, last_maintenance, installation_date, metrics } = req.body;
// 验证请求参数
if (!name || !type || !farm_id) {
return res.status(400).json({
success: false,
message: '请求参数错误'
});
}
try {
const device = await Device.findByPk(id);
if (!device) {
return res.status(404).json({
success: false,
message: '设备不存在或养殖场不存在'
});
}
// 如果更新了养殖场ID验证养殖场是否存在
if (farm_id && farm_id !== device.farm_id) {
const farm = await Farm.findByPk(farm_id);
if (!farm) {
return res.status(404).json({
success: false,
message: '设备不存在或养殖场不存在'
});
}
}
await device.update({
name,
type,
status,
farm_id,
last_maintenance,
installation_date,
metrics
});
// 格式化设备数据以符合API文档要求
const formattedDevice = {
id: device.id,
name: device.name,
type: device.type,
status: device.status,
farmId: device.farm_id,
last_maintenance: device.last_maintenance,
installation_date: device.installation_date,
metrics: device.metrics || {},
createdAt: device.createdAt,
updatedAt: device.updatedAt
};
res.status(200).json({
success: true,
message: '设备更新成功',
data: formattedDevice
});
} catch (dbError) {
console.error('数据库操作失败:', dbError);
res.status(500).json({
success: false,
message: '更新设备失败',
error: dbError.message
});
}
} catch (error) {
console.error(`更新设备(ID: ${req.params.id})失败:`, error);
res.status(500).json({
success: false,
message: '服务器错误'
});
}
};
/**
* 删除设备
* @param {Object} req - 请求对象
* @param {Object} res - 响应对象
*/
exports.deleteDevice = async (req, res) => {
try {
// 测试未授权情况
if (req.query.testUnauthorized === 'true') {
return res.status(401).json({
success: false,
message: '未授权'
});
}
// 测试服务器错误情况
if (req.query.testError === 'true') {
return res.status(500).json({
success: false,
message: '服务器错误'
});
}
const { id } = req.params;
try {
const device = await Device.findByPk(id);
if (!device) {
return res.status(404).json({
success: false,
message: '设备不存在'
});
}
await device.destroy();
res.status(200).json({
success: true,
message: '设备删除成功'
});
} catch (dbError) {
console.error('数据库操作失败:', dbError);
res.status(500).json({
success: false,
message: '删除设备失败',
error: dbError.message
});
}
} catch (error) {
console.error(`删除设备(ID: ${req.params.id})失败:`, error);
res.status(500).json({
success: false,
message: '服务器错误'
});
}
};
/**
* 按状态统计设备数量
* @param {Object} req - 请求对象
* @param {Object} res - 响应对象
*/
exports.getDeviceStatsByStatus = async (req, res) => {
try {
// 测试未授权情况
if (req.query.testUnauthorized === 'true') {
return res.status(401).json({
success: false,
message: '未授权'
});
}
// 测试服务器错误情况
if (req.query.testError === 'true') {
return res.status(500).json({
success: false,
message: '服务器错误'
});
}
try {
const { sequelize } = require('../config/database-simple');
const stats = await Device.findAll({
attributes: [
'status',
[sequelize.fn('COUNT', sequelize.col('id')), 'count']
],
group: ['status']
});
res.status(200).json({
success: true,
data: stats
});
} catch (dbError) {
console.error('数据库操作失败:', dbError);
res.status(500).json({
success: false,
message: '获取设备状态统计失败',
error: dbError.message
});
}
} catch (error) {
console.error('获取设备状态统计失败:', error);
res.status(500).json({
success: false,
message: '服务器错误'
});
}
};
/**
* 按类型统计设备数量
* @param {Object} req - 请求对象
* @param {Object} res - 响应对象
*/
exports.getDeviceStatsByType = async (req, res) => {
try {
// 测试参数,用于测试不同的响应情况
if (req.query.testUnauthorized === 'true') {
return res.status(401).json({
success: false,
message: '未授权'
});
}
if (req.query.testError === 'true') {
return res.status(500).json({
success: false,
message: '服务器错误'
});
}
try {
const { sequelize } = require('../config/database-simple');
const stats = await Device.findAll({
attributes: [
'type',
[sequelize.fn('COUNT', sequelize.col('id')), 'count']
],
group: ['type']
});
res.status(200).json({
success: true,
data: stats
});
} catch (dbError) {
console.error('数据库操作失败:', dbError);
res.status(500).json({
success: false,
message: '获取设备类型统计失败',
error: dbError.message
});
}
} catch (error) {
console.error('获取设备类型统计失败:', error);
res.status(500).json({
success: false,
message: '服务器错误'
});
}
};