Initial commit: 宁夏智慧养殖监管平台
This commit is contained in:
453
backend/controllers/deviceController.js
Normal file
453
backend/controllers/deviceController.js
Normal file
@@ -0,0 +1,453 @@
|
||||
/**
|
||||
* 设备控制器
|
||||
* @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: '服务器错误'
|
||||
});
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user