修改管理后台
This commit is contained in:
@@ -1,310 +1,351 @@
|
||||
/**
|
||||
* 养殖场控制器
|
||||
* @file farmController.js
|
||||
* @description 处理养殖场相关的请求
|
||||
*/
|
||||
|
||||
const { Farm, Animal, Device } = require('../models');
|
||||
|
||||
/**
|
||||
* 获取所有养殖场
|
||||
* @param {Object} req - 请求对象
|
||||
* @param {Object} res - 响应对象
|
||||
*/
|
||||
exports.getAllFarms = async (req, res) => {
|
||||
try {
|
||||
const farms = await Farm.findAll({
|
||||
include: [
|
||||
{
|
||||
model: Animal,
|
||||
as: 'animals',
|
||||
attributes: ['id', 'type', 'count', 'health_status']
|
||||
},
|
||||
{
|
||||
model: Device,
|
||||
as: 'devices',
|
||||
attributes: ['id', 'name', 'type', 'status']
|
||||
}
|
||||
]
|
||||
});
|
||||
res.status(200).json({
|
||||
success: true,
|
||||
data: farms
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('获取养殖场列表失败:', error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: '获取养殖场列表失败',
|
||||
error: error.message
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* 获取单个养殖场
|
||||
* @param {Object} req - 请求对象
|
||||
* @param {Object} res - 响应对象
|
||||
*/
|
||||
exports.getFarmById = async (req, res) => {
|
||||
try {
|
||||
const { id } = req.params;
|
||||
const farm = await Farm.findByPk(id);
|
||||
|
||||
if (!farm) {
|
||||
return res.status(404).json({
|
||||
success: false,
|
||||
message: '养殖场不存在'
|
||||
});
|
||||
}
|
||||
|
||||
res.status(200).json({
|
||||
success: true,
|
||||
data: farm
|
||||
});
|
||||
} 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.createFarm = async (req, res) => {
|
||||
try {
|
||||
const { name, type, owner, longitude, latitude, address, phone, area, capacity, status, description } = req.body;
|
||||
|
||||
// 验证必填字段
|
||||
if (!name || !type) {
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
message: '名称、类型和位置为必填项'
|
||||
});
|
||||
}
|
||||
|
||||
// 构建location对象
|
||||
const location = {};
|
||||
|
||||
// 处理经度
|
||||
if (longitude !== undefined && longitude !== null && longitude !== '') {
|
||||
const lng = parseFloat(longitude);
|
||||
if (!isNaN(lng)) {
|
||||
location.lng = lng;
|
||||
}
|
||||
}
|
||||
|
||||
// 处理纬度
|
||||
if (latitude !== undefined && latitude !== null && latitude !== '') {
|
||||
const lat = parseFloat(latitude);
|
||||
if (!isNaN(lat)) {
|
||||
location.lat = lat;
|
||||
}
|
||||
}
|
||||
|
||||
// 验证location对象不能为空(至少需要经纬度之一)
|
||||
if (Object.keys(location).length === 0) {
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
message: '名称、类型和位置为必填项'
|
||||
});
|
||||
}
|
||||
|
||||
const farm = await Farm.create({
|
||||
name,
|
||||
type,
|
||||
location,
|
||||
address,
|
||||
contact: owner,
|
||||
phone,
|
||||
status: status || 'active'
|
||||
});
|
||||
|
||||
res.status(201).json({
|
||||
success: true,
|
||||
message: '养殖场创建成功',
|
||||
data: farm
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('创建养殖场失败:', error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: '创建养殖场失败',
|
||||
error: error.message
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* 更新养殖场
|
||||
* @param {Object} req - 请求对象
|
||||
* @param {Object} res - 响应对象
|
||||
*/
|
||||
exports.updateFarm = async (req, res) => {
|
||||
try {
|
||||
const { id } = req.params;
|
||||
const { name, owner, longitude, latitude, address, phone, area, capacity, status, description } = req.body;
|
||||
|
||||
const farm = await Farm.findByPk(id);
|
||||
|
||||
if (!farm) {
|
||||
return res.status(404).json({
|
||||
success: false,
|
||||
message: '养殖场不存在'
|
||||
});
|
||||
}
|
||||
|
||||
// 构建location对象 - 创建新对象以确保Sequelize检测到变化
|
||||
const location = { ...(farm.location || {}) };
|
||||
|
||||
// 处理经度
|
||||
if (longitude !== undefined) {
|
||||
if (longitude !== null && longitude !== '') {
|
||||
location.lng = parseFloat(longitude);
|
||||
} else {
|
||||
delete location.lng; // 清空经度
|
||||
}
|
||||
}
|
||||
|
||||
// 处理纬度
|
||||
if (latitude !== undefined) {
|
||||
if (latitude !== null && latitude !== '') {
|
||||
location.lat = parseFloat(latitude);
|
||||
} else {
|
||||
delete location.lat; // 清空纬度
|
||||
}
|
||||
}
|
||||
|
||||
await farm.update({
|
||||
name,
|
||||
type: farm.type || 'farm',
|
||||
location,
|
||||
address,
|
||||
contact: owner,
|
||||
phone,
|
||||
status: status || 'active'
|
||||
});
|
||||
|
||||
res.status(200).json({
|
||||
success: true,
|
||||
message: '养殖场更新成功',
|
||||
data: farm
|
||||
});
|
||||
} 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.deleteFarm = async (req, res) => {
|
||||
try {
|
||||
const { id } = req.params;
|
||||
const farm = await Farm.findByPk(id);
|
||||
|
||||
if (!farm) {
|
||||
return res.status(404).json({
|
||||
success: false,
|
||||
message: '养殖场不存在'
|
||||
});
|
||||
}
|
||||
|
||||
await farm.destroy();
|
||||
|
||||
res.status(200).json({
|
||||
success: true,
|
||||
message: '养殖场删除成功'
|
||||
});
|
||||
} 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.getFarmAnimals = async (req, res) => {
|
||||
try {
|
||||
const { id } = req.params;
|
||||
const farm = await Farm.findByPk(id);
|
||||
|
||||
if (!farm) {
|
||||
return res.status(404).json({
|
||||
success: false,
|
||||
message: '养殖场不存在'
|
||||
});
|
||||
}
|
||||
|
||||
const animals = await Animal.findAll({
|
||||
where: { farm_id: id }
|
||||
});
|
||||
|
||||
res.status(200).json({
|
||||
success: true,
|
||||
data: animals
|
||||
});
|
||||
} 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.getFarmDevices = async (req, res) => {
|
||||
try {
|
||||
const { id } = req.params;
|
||||
const farm = await Farm.findByPk(id);
|
||||
|
||||
if (!farm) {
|
||||
return res.status(404).json({
|
||||
success: false,
|
||||
message: '养殖场不存在'
|
||||
});
|
||||
}
|
||||
|
||||
const devices = await Device.findAll({
|
||||
where: { farm_id: id }
|
||||
});
|
||||
|
||||
res.status(200).json({
|
||||
success: true,
|
||||
data: devices
|
||||
});
|
||||
} catch (error) {
|
||||
console.error(`获取养殖场(ID: ${req.params.id})的设备数据失败:`, error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: '获取养殖场设备数据失败',
|
||||
error: error.message
|
||||
});
|
||||
}
|
||||
};
|
||||
/**
|
||||
* 简化的养殖场控制器
|
||||
* @file farmController-simple.js
|
||||
* @description 处理养殖场相关的请求,不包含关联查询
|
||||
*/
|
||||
|
||||
const { Farm } = require('../models');
|
||||
|
||||
/**
|
||||
* 获取所有养殖场
|
||||
* @param {Object} req - 请求对象
|
||||
* @param {Object} res - 响应对象
|
||||
*/
|
||||
exports.getAllFarms = async (req, res) => {
|
||||
try {
|
||||
console.log('🔄 开始获取养殖场列表...');
|
||||
|
||||
const farms = await Farm.findAll({
|
||||
order: [['created_at', 'DESC']]
|
||||
});
|
||||
|
||||
console.log(`✅ 成功获取 ${farms.length} 个养殖场`);
|
||||
|
||||
res.status(200).json({
|
||||
success: true,
|
||||
data: farms
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('❌ 获取养殖场列表失败:', error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: '获取养殖场列表失败',
|
||||
error: error.message
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* 根据养殖场名称搜索养殖场
|
||||
* @param {Object} req - 请求对象
|
||||
* @param {Object} res - 响应对象
|
||||
*/
|
||||
exports.searchFarmsByName = async (req, res) => {
|
||||
const searchStartTime = Date.now();
|
||||
const requestId = Math.random().toString(36).substr(2, 9);
|
||||
|
||||
try {
|
||||
const { name } = req.query;
|
||||
const userAgent = req.get('User-Agent') || 'Unknown';
|
||||
const clientIP = req.ip || req.connection.remoteAddress || 'Unknown';
|
||||
|
||||
console.log(`🔍 [后端搜索监听] 搜索请求开始:`, {
|
||||
requestId: requestId,
|
||||
keyword: name,
|
||||
timestamp: new Date().toISOString(),
|
||||
clientIP: clientIP,
|
||||
userAgent: userAgent,
|
||||
queryParams: req.query,
|
||||
headers: {
|
||||
'content-type': req.get('Content-Type'),
|
||||
'accept': req.get('Accept'),
|
||||
'referer': req.get('Referer')
|
||||
}
|
||||
});
|
||||
|
||||
if (!name || name.trim() === '') {
|
||||
console.log(`❌ [后端搜索监听] 搜索关键词为空:`, {
|
||||
requestId: requestId,
|
||||
keyword: name
|
||||
});
|
||||
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
message: '请提供搜索关键词'
|
||||
});
|
||||
}
|
||||
|
||||
console.log(`🔄 [后端搜索监听] 开始数据库查询:`, {
|
||||
requestId: requestId,
|
||||
searchKeyword: name,
|
||||
searchPattern: `%${name}%`
|
||||
});
|
||||
|
||||
const queryStartTime = Date.now();
|
||||
|
||||
const farms = await Farm.findAll({
|
||||
where: {
|
||||
name: {
|
||||
[require('sequelize').Op.like]: `%${name}%`
|
||||
}
|
||||
},
|
||||
order: [['created_at', 'DESC']]
|
||||
});
|
||||
|
||||
const queryTime = Date.now() - queryStartTime;
|
||||
const totalTime = Date.now() - searchStartTime;
|
||||
|
||||
console.log(`📊 [后端搜索监听] 数据库查询完成:`, {
|
||||
requestId: requestId,
|
||||
queryTime: queryTime + 'ms',
|
||||
totalTime: totalTime + 'ms',
|
||||
resultCount: farms.length,
|
||||
searchKeyword: name
|
||||
});
|
||||
|
||||
// 记录搜索结果详情
|
||||
if (farms.length > 0) {
|
||||
console.log(`📋 [后端搜索监听] 搜索结果详情:`, {
|
||||
requestId: requestId,
|
||||
results: farms.map(farm => ({
|
||||
id: farm.id,
|
||||
name: farm.name,
|
||||
type: farm.type,
|
||||
status: farm.status,
|
||||
address: farm.address
|
||||
}))
|
||||
});
|
||||
}
|
||||
|
||||
console.log(`✅ [后端搜索监听] 搜索成功:`, {
|
||||
requestId: requestId,
|
||||
keyword: name,
|
||||
resultCount: farms.length,
|
||||
responseTime: totalTime + 'ms'
|
||||
});
|
||||
|
||||
res.status(200).json({
|
||||
success: true,
|
||||
data: farms,
|
||||
meta: {
|
||||
requestId: requestId,
|
||||
searchKeyword: name,
|
||||
resultCount: farms.length,
|
||||
queryTime: queryTime,
|
||||
totalTime: totalTime,
|
||||
timestamp: new Date().toISOString()
|
||||
}
|
||||
});
|
||||
} catch (error) {
|
||||
const errorTime = Date.now() - searchStartTime;
|
||||
|
||||
console.error(`❌ [后端搜索监听] 搜索失败:`, {
|
||||
requestId: requestId,
|
||||
error: error.message,
|
||||
stack: error.stack,
|
||||
errorTime: errorTime + 'ms',
|
||||
keyword: req.query.name
|
||||
});
|
||||
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: '搜索养殖场失败',
|
||||
error: error.message,
|
||||
meta: {
|
||||
requestId: requestId,
|
||||
errorTime: errorTime,
|
||||
timestamp: new Date().toISOString()
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* 根据ID获取养殖场详情
|
||||
* @param {Object} req - 请求对象
|
||||
* @param {Object} res - 响应对象
|
||||
*/
|
||||
exports.getFarmById = async (req, res) => {
|
||||
try {
|
||||
const { id } = req.params;
|
||||
|
||||
if (!id || isNaN(parseInt(id))) {
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
message: '请提供有效的养殖场ID'
|
||||
});
|
||||
}
|
||||
|
||||
console.log(`🔄 开始获取养殖场详情: ID=${id}`);
|
||||
|
||||
const farm = await Farm.findByPk(id);
|
||||
|
||||
if (!farm) {
|
||||
return res.status(404).json({
|
||||
success: false,
|
||||
message: '养殖场不存在'
|
||||
});
|
||||
}
|
||||
|
||||
console.log(`✅ 成功获取养殖场详情: ${farm.name}`);
|
||||
|
||||
res.status(200).json({
|
||||
success: true,
|
||||
data: farm
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('❌ 获取养殖场详情失败:', error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: '获取养殖场详情失败',
|
||||
error: error.message
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* 创建新养殖场
|
||||
* @param {Object} req - 请求对象
|
||||
* @param {Object} res - 响应对象
|
||||
*/
|
||||
exports.createFarm = async (req, res) => {
|
||||
try {
|
||||
const { name, type, location, address, contact, phone, status } = req.body;
|
||||
|
||||
// 验证必填字段
|
||||
if (!name || !type) {
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
message: '养殖场名称和类型为必填项'
|
||||
});
|
||||
}
|
||||
|
||||
console.log(`🔄 开始创建养殖场: ${name}`);
|
||||
|
||||
const farm = await Farm.create({
|
||||
name,
|
||||
type,
|
||||
location: location || {},
|
||||
address,
|
||||
contact,
|
||||
phone,
|
||||
status: status || 'active'
|
||||
});
|
||||
|
||||
console.log(`✅ 成功创建养殖场: ID=${farm.id}, 名称=${farm.name}`);
|
||||
|
||||
res.status(201).json({
|
||||
success: true,
|
||||
data: farm,
|
||||
message: '养殖场创建成功'
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('❌ 创建养殖场失败:', error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: '创建养殖场失败',
|
||||
error: error.message
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* 更新养殖场信息
|
||||
* @param {Object} req - 请求对象
|
||||
* @param {Object} res - 响应对象
|
||||
*/
|
||||
exports.updateFarm = async (req, res) => {
|
||||
try {
|
||||
const { id } = req.params;
|
||||
const { name, type, location, address, contact, phone, status } = req.body;
|
||||
|
||||
if (!id || isNaN(parseInt(id))) {
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
message: '请提供有效的养殖场ID'
|
||||
});
|
||||
}
|
||||
|
||||
console.log(`🔄 开始更新养殖场: ID=${id}`);
|
||||
|
||||
const farm = await Farm.findByPk(id);
|
||||
|
||||
if (!farm) {
|
||||
return res.status(404).json({
|
||||
success: false,
|
||||
message: '养殖场不存在'
|
||||
});
|
||||
}
|
||||
|
||||
// 更新字段
|
||||
if (name) farm.name = name;
|
||||
if (type) farm.type = type;
|
||||
if (location) farm.location = location;
|
||||
if (address !== undefined) farm.address = address;
|
||||
if (contact !== undefined) farm.contact = contact;
|
||||
if (phone !== undefined) farm.phone = phone;
|
||||
if (status) farm.status = status;
|
||||
|
||||
await farm.save();
|
||||
|
||||
console.log(`✅ 成功更新养殖场: ID=${farm.id}, 名称=${farm.name}`);
|
||||
|
||||
res.status(200).json({
|
||||
success: true,
|
||||
data: farm,
|
||||
message: '养殖场更新成功'
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('❌ 更新养殖场失败:', error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: '更新养殖场失败',
|
||||
error: error.message
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* 删除养殖场
|
||||
* @param {Object} req - 请求对象
|
||||
* @param {Object} res - 响应对象
|
||||
*/
|
||||
exports.deleteFarm = async (req, res) => {
|
||||
try {
|
||||
const { id } = req.params;
|
||||
|
||||
if (!id || isNaN(parseInt(id))) {
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
message: '请提供有效的养殖场ID'
|
||||
});
|
||||
}
|
||||
|
||||
console.log(`🔄 开始删除养殖场: ID=${id}`);
|
||||
|
||||
const farm = await Farm.findByPk(id);
|
||||
|
||||
if (!farm) {
|
||||
return res.status(404).json({
|
||||
success: false,
|
||||
message: '养殖场不存在'
|
||||
});
|
||||
}
|
||||
|
||||
await farm.destroy();
|
||||
|
||||
console.log(`✅ 成功删除养殖场: ID=${id}, 名称=${farm.name}`);
|
||||
|
||||
res.status(200).json({
|
||||
success: true,
|
||||
message: '养殖场删除成功'
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('❌ 删除养殖场失败:', error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: '删除养殖场失败',
|
||||
error: error.message
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user