Files
nxxmdata/backend/controllers/cattlePenController.js
2025-09-12 20:08:42 +08:00

416 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.

const { CattlePen, Farm, IotCattle } = require('../models');
const { Op } = require('sequelize');
/**
* 栏舍设置控制器
*/
class CattlePenController {
/**
* 获取栏舍列表
*/
async getPens(req, res) {
try {
const { page = 1, pageSize = 10, search, status, type } = req.query;
const offset = (page - 1) * pageSize;
// 构建查询条件
const where = {};
if (search) {
where[Op.or] = [
{ name: { [Op.like]: `%${search}%` } },
{ code: { [Op.like]: `%${search}%` } }
];
}
if (status) {
where.status = status;
}
if (type) {
where.type = type;
}
const { count, rows } = await CattlePen.findAndCountAll({
where,
include: [
{
model: Farm,
as: 'farm',
attributes: ['id', 'name']
}
],
limit: parseInt(pageSize),
offset: parseInt(offset),
order: [['created_at', 'DESC']]
});
res.json({
success: true,
data: {
list: rows,
total: count,
page: parseInt(page),
pageSize: parseInt(pageSize)
},
message: '获取栏舍列表成功'
});
} catch (error) {
console.error('获取栏舍列表失败:', error);
res.status(500).json({
success: false,
message: '获取栏舍列表失败',
error: error.message
});
}
}
/**
* 获取单个栏舍详情
*/
async getPenById(req, res) {
try {
const { id } = req.params;
const pen = await CattlePen.findByPk(id, {
include: [
{
model: Farm,
as: 'farm',
attributes: ['id', 'name']
}
]
});
if (!pen) {
return res.status(404).json({
success: false,
message: '栏舍不存在'
});
}
res.json({
success: true,
data: pen,
message: '获取栏舍详情成功'
});
} catch (error) {
console.error('获取栏舍详情失败:', error);
res.status(500).json({
success: false,
message: '获取栏舍详情失败',
error: error.message
});
}
}
/**
* 创建栏舍
*/
async createPen(req, res) {
try {
console.log('🆕 [后端-栏舍设置] 开始创建操作');
console.log('📋 [后端-栏舍设置] 请求数据:', req.body);
const penData = req.body;
// 验证必填字段
if (!penData.name || !penData.code || !penData.type || !penData.capacity || !penData.area) {
console.log('❌ [后端-栏舍设置] 必填字段验证失败:', {
name: !!penData.name,
code: !!penData.code,
type: !!penData.type,
capacity: !!penData.capacity,
area: !!penData.area
});
return res.status(400).json({
success: false,
message: '请填写所有必填字段(栏舍名称、编号、类型、容量、面积)'
});
}
// 检查编号是否已存在
const existingPen = await CattlePen.findOne({
where: { code: penData.code }
});
if (existingPen) {
console.log('❌ [后端-栏舍设置] 栏舍编号已存在:', penData.code);
return res.status(400).json({
success: false,
message: '栏舍编号已存在'
});
}
// 准备创建数据
const createData = {
name: penData.name,
code: penData.code,
type: penData.type,
capacity: parseInt(penData.capacity),
currentCount: penData.currentCount ? parseInt(penData.currentCount) : 0,
area: parseFloat(penData.area),
location: penData.location || '',
status: penData.status || '启用',
remark: penData.remark || '',
farmId: penData.farmId || 1
};
console.log('📝 [后端-栏舍设置] 准备创建的数据:', createData);
const pen = await CattlePen.create(createData);
console.log('✅ [后端-栏舍设置] 栏舍创建成功:', pen.id);
res.status(201).json({
success: true,
data: pen,
message: '创建栏舍成功'
});
} catch (error) {
console.error('❌ [后端-栏舍设置] 创建失败:', error);
res.status(500).json({
success: false,
message: '创建栏舍失败',
error: error.message
});
}
}
/**
* 更新栏舍
*/
async updatePen(req, res) {
try {
const { id } = req.params;
const updateData = req.body;
const pen = await CattlePen.findByPk(id);
if (!pen) {
return res.status(404).json({
success: false,
message: '栏舍不存在'
});
}
// 如果更新编号,检查是否与其他栏舍冲突
if (updateData.code && updateData.code !== pen.code) {
const existingPen = await CattlePen.findOne({
where: {
code: updateData.code,
id: { [Op.ne]: id }
}
});
if (existingPen) {
return res.status(400).json({
success: false,
message: '栏舍编号已存在'
});
}
}
await pen.update(updateData);
res.json({
success: true,
data: pen,
message: '更新栏舍成功'
});
} catch (error) {
console.error('更新栏舍失败:', error);
res.status(500).json({
success: false,
message: '更新栏舍失败',
error: error.message
});
}
}
/**
* 删除栏舍
*/
async deletePen(req, res) {
try {
console.log('🗑️ [后端-栏舍设置] 开始删除操作');
console.log('📋 [后端-栏舍设置] 请求参数:', req.params);
const { id } = req.params;
const pen = await CattlePen.findByPk(id);
if (!pen) {
console.log('❌ [后端-栏舍设置] 栏舍不存在ID:', id);
return res.status(404).json({
success: false,
message: '栏舍不存在'
});
}
console.log('✅ [后端-栏舍设置] 找到栏舍:', {
id: pen.id,
name: pen.name,
code: pen.code
});
// 注意由于IotCattle表中没有penId字段暂时跳过牛只检查
// 在实际应用中,应该根据业务需求决定是否需要检查关联数据
await pen.destroy();
console.log('✅ [后端-栏舍设置] 栏舍删除成功');
res.json({
success: true,
message: '删除栏舍成功'
});
} catch (error) {
console.error('❌ [后端-栏舍设置] 删除失败:', error);
res.status(500).json({
success: false,
message: '删除栏舍失败',
error: error.message
});
}
}
/**
* 批量删除栏舍
*/
async batchDeletePens(req, res) {
try {
const { ids } = req.body;
if (!ids || !Array.isArray(ids) || ids.length === 0) {
return res.status(400).json({
success: false,
message: '请选择要删除的栏舍'
});
}
// 检查是否有栏舍包含牛只
const animalCount = await IotCattle.count({
where: { penId: { [Op.in]: ids } }
});
if (animalCount > 0) {
return res.status(400).json({
success: false,
message: '选中的栏舍中还有牛只,无法删除'
});
}
await CattlePen.destroy({
where: { id: { [Op.in]: ids } }
});
res.json({
success: true,
message: `成功删除 ${ids.length} 个栏舍`
});
} catch (error) {
console.error('批量删除栏舍失败:', error);
res.status(500).json({
success: false,
message: '批量删除栏舍失败',
error: error.message
});
}
}
/**
* 获取栏舍中的牛只
*/
async getPenIotCattles(req, res) {
try {
const { id } = req.params;
const { page = 1, pageSize = 10 } = req.query;
const offset = (page - 1) * pageSize;
const pen = await CattlePen.findByPk(id);
if (!pen) {
return res.status(404).json({
success: false,
message: '栏舍不存在'
});
}
const { count, rows } = await IotCattle.findAndCountAll({
where: { penId: id },
limit: parseInt(pageSize),
offset: parseInt(offset),
order: [['created_at', 'DESC']]
});
res.json({
success: true,
data: {
list: rows,
total: count,
page: parseInt(page),
pageSize: parseInt(pageSize)
},
message: '获取栏舍牛只成功'
});
} catch (error) {
console.error('获取栏舍牛只失败:', error);
res.status(500).json({
success: false,
message: '获取栏舍牛只失败',
error: error.message
});
}
}
/**
* 获取栏舍中的牛只
*/
async getPenAnimals(req, res) {
try {
const { id } = req.params;
const { page = 1, pageSize = 10 } = req.query;
const offset = (page - 1) * pageSize;
// 检查栏舍是否存在
const pen = await CattlePen.findByPk(id);
if (!pen) {
return res.status(404).json({
success: false,
message: '栏舍不存在'
});
}
// 获取栏舍中的牛只
const { count, rows } = await IotCattle.findAndCountAll({
where: { penId: id },
attributes: ['id', 'earNumber', 'sex', 'strain', 'orgId'],
include: [
{
model: Farm,
as: 'farm',
attributes: ['id', 'name']
}
],
limit: parseInt(pageSize),
offset: offset,
order: [['earNumber', 'ASC']]
});
res.json({
success: true,
data: {
list: rows,
total: count,
page: parseInt(page),
pageSize: parseInt(pageSize)
},
message: '获取栏舍牛只成功'
});
} catch (error) {
console.error('获取栏舍牛只失败:', error);
res.status(500).json({
success: false,
message: '获取栏舍牛只失败',
error: error.message
});
}
}
}
module.exports = new CattlePenController();