314 lines
7.6 KiB
JavaScript
314 lines
7.6 KiB
JavaScript
/**
|
||
* 动物控制器
|
||
* @file animalController.js
|
||
* @description 处理动物相关的请求
|
||
*/
|
||
|
||
const { Animal, Farm } = require('../models');
|
||
|
||
/**
|
||
* 获取所有动物
|
||
* @param {Object} req - 请求对象
|
||
* @param {Object} res - 响应对象
|
||
*/
|
||
exports.getAllAnimals = async (req, res) => {
|
||
try {
|
||
const animals = await Animal.findAll({
|
||
include: [{ model: Farm, as: 'farm', attributes: ['id', 'name', 'location'] }]
|
||
});
|
||
res.status(200).json({
|
||
success: true,
|
||
data: animals
|
||
});
|
||
} catch (error) {
|
||
console.error('获取动物列表失败:', error);
|
||
res.status(500).json({
|
||
success: false,
|
||
message: '获取动物列表失败',
|
||
error: error.message
|
||
});
|
||
}
|
||
};
|
||
|
||
/**
|
||
* 根据养殖场名称搜索动物
|
||
* @param {Object} req - 请求对象
|
||
* @param {Object} res - 响应对象
|
||
*/
|
||
exports.searchAnimalsByFarmName = async (req, res) => {
|
||
try {
|
||
const { farmName } = req.query;
|
||
|
||
if (!farmName) {
|
||
return res.status(400).json({
|
||
success: false,
|
||
message: '请提供养殖场名称参数'
|
||
});
|
||
}
|
||
|
||
console.log(`开始搜索养殖场名称包含 "${farmName}" 的动物...`);
|
||
|
||
// 首先找到匹配的养殖场
|
||
const farms = await Farm.findAll({
|
||
where: {
|
||
name: {
|
||
[require('sequelize').Op.like]: `%${farmName}%`
|
||
}
|
||
},
|
||
attributes: ['id', 'name']
|
||
});
|
||
|
||
if (farms.length === 0) {
|
||
return res.status(200).json({
|
||
success: true,
|
||
data: [],
|
||
message: '未找到匹配的养殖场'
|
||
});
|
||
}
|
||
|
||
const farmIds = farms.map(farm => farm.id);
|
||
|
||
// 根据养殖场ID查找动物
|
||
const animals = await Animal.findAll({
|
||
where: {
|
||
farm_id: {
|
||
[require('sequelize').Op.in]: farmIds
|
||
}
|
||
},
|
||
include: [{ model: Farm, as: 'farm', attributes: ['id', 'name', 'location'] }],
|
||
order: [['created_at', 'DESC']]
|
||
});
|
||
|
||
console.log(`找到 ${animals.length} 个匹配的动物`);
|
||
|
||
res.status(200).json({
|
||
success: true,
|
||
data: animals,
|
||
message: `找到 ${animals.length} 个养殖场名称包含 "${farmName}" 的动物`
|
||
});
|
||
} catch (error) {
|
||
console.error('根据养殖场名称搜索动物失败:', error);
|
||
res.status(500).json({
|
||
success: false,
|
||
message: '搜索动物失败',
|
||
error: error.message
|
||
});
|
||
}
|
||
};
|
||
|
||
/**
|
||
* 获取单个动物
|
||
* @param {Object} req - 请求对象
|
||
* @param {Object} res - 响应对象
|
||
*/
|
||
exports.getAnimalById = async (req, res) => {
|
||
try {
|
||
const { id } = req.params;
|
||
const animal = await Animal.findByPk(id, {
|
||
include: [{ model: Farm, as: 'farm', attributes: ['id', 'name'] }]
|
||
});
|
||
|
||
if (!animal) {
|
||
return res.status(404).json({
|
||
success: false,
|
||
message: '动物不存在'
|
||
});
|
||
}
|
||
|
||
res.status(200).json({
|
||
success: true,
|
||
data: animal
|
||
});
|
||
} 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.createAnimal = async (req, res) => {
|
||
try {
|
||
const { type, count, farm_id, health_status, last_inspection, notes } = req.body;
|
||
|
||
// 验证必填字段
|
||
if (!type || !count || !farm_id) {
|
||
return res.status(400).json({
|
||
success: false,
|
||
message: '类型、数量和养殖场ID为必填项'
|
||
});
|
||
}
|
||
|
||
// 验证养殖场是否存在
|
||
const farm = await Farm.findByPk(farm_id);
|
||
if (!farm) {
|
||
return res.status(404).json({
|
||
success: false,
|
||
message: '指定的养殖场不存在'
|
||
});
|
||
}
|
||
|
||
const animal = await Animal.create({
|
||
type,
|
||
count,
|
||
farm_id,
|
||
health_status: health_status || 'healthy',
|
||
last_inspection: last_inspection || new Date(),
|
||
notes
|
||
});
|
||
|
||
res.status(201).json({
|
||
success: true,
|
||
message: '动物创建成功',
|
||
data: animal
|
||
});
|
||
} catch (error) {
|
||
console.error('创建动物失败:', error);
|
||
res.status(500).json({
|
||
success: false,
|
||
message: '创建动物失败',
|
||
error: error.message
|
||
});
|
||
}
|
||
};
|
||
|
||
/**
|
||
* 更新动物
|
||
* @param {Object} req - 请求对象
|
||
* @param {Object} res - 响应对象
|
||
*/
|
||
exports.updateAnimal = async (req, res) => {
|
||
try {
|
||
const { id } = req.params;
|
||
const { type, count, farm_id, health_status, last_inspection, notes } = req.body;
|
||
|
||
console.log('=== 动物更新请求 ===');
|
||
console.log('动物ID:', id);
|
||
console.log('请求数据:', { type, count, health_status, farm_id, last_inspection, notes });
|
||
|
||
const animal = await Animal.findByPk(id);
|
||
|
||
if (!animal) {
|
||
console.log('动物不存在, ID:', id);
|
||
return res.status(404).json({
|
||
success: false,
|
||
message: '动物不存在'
|
||
});
|
||
}
|
||
|
||
console.log('更新前的动物数据:', animal.toJSON());
|
||
|
||
// 如果更新了养殖场ID,验证养殖场是否存在
|
||
if (farm_id && farm_id !== animal.farm_id) {
|
||
const farm = await Farm.findByPk(farm_id);
|
||
if (!farm) {
|
||
console.log('养殖场不存在, farm_id:', farm_id);
|
||
return res.status(404).json({
|
||
success: false,
|
||
message: '指定的养殖场不存在'
|
||
});
|
||
}
|
||
console.log('养殖场验证通过, farm_id:', farm_id);
|
||
}
|
||
|
||
console.log('准备更新动物数据...');
|
||
const updateResult = await animal.update({
|
||
type,
|
||
count,
|
||
farm_id,
|
||
health_status,
|
||
last_inspection,
|
||
notes
|
||
});
|
||
console.log('更新操作结果:', updateResult ? '成功' : '失败');
|
||
|
||
// 重新获取更新后的数据
|
||
await animal.reload();
|
||
console.log('更新后的动物数据:', animal.toJSON());
|
||
|
||
res.status(200).json({
|
||
success: true,
|
||
message: '动物更新成功',
|
||
data: animal
|
||
});
|
||
|
||
console.log('响应发送成功');
|
||
} 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.deleteAnimal = async (req, res) => {
|
||
try {
|
||
const { id } = req.params;
|
||
const animal = await Animal.findByPk(id);
|
||
|
||
if (!animal) {
|
||
return res.status(404).json({
|
||
success: false,
|
||
message: '动物不存在'
|
||
});
|
||
}
|
||
|
||
await animal.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.getAnimalStatsByType = async (req, res) => {
|
||
try {
|
||
const { sequelize } = require('../config/database-simple');
|
||
const stats = await Animal.findAll({
|
||
attributes: [
|
||
'type',
|
||
[sequelize.fn('SUM', sequelize.col('count')), 'total']
|
||
],
|
||
group: ['type']
|
||
});
|
||
|
||
res.status(200).json({
|
||
success: true,
|
||
data: stats
|
||
});
|
||
} catch (error) {
|
||
console.error('获取动物类型统计失败:', error);
|
||
res.status(500).json({
|
||
success: false,
|
||
message: '获取动物类型统计失败',
|
||
error: error.message
|
||
});
|
||
}
|
||
}; |