/** * 设备控制器 * @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.searchDevicesByName = async (req, res) => { try { const { name } = req.query; if (!name) { return res.status(400).json({ success: false, message: '请提供设备名称参数' }); } console.log(`开始搜索设备名称包含: ${name}`); // 使用模糊查询搜索设备名称 const devices = await Device.findAll({ where: { name: { [require('sequelize').Op.like]: `%${name}%` } }, include: [{ model: Farm, as: 'farm', attributes: ['id', 'name', 'location'] }], order: [['created_at', 'DESC']] }); console.log(`找到 ${devices.length} 个匹配的设备`); res.status(200).json({ success: true, data: devices, message: `找到 ${devices.length} 个匹配的设备` }); } 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: '服务器错误' }); } };