This commit is contained in:
shenquanyi
2025-08-27 15:36:36 +08:00
parent ec72c6a8b5
commit 2bd1d8c032
100 changed files with 25780 additions and 20 deletions

View File

@@ -8,6 +8,231 @@ const { Farm, Animal, Device, Alert, SensorData } = require('../models');
const { sequelize } = require('../config/database-simple');
const { Op } = require('sequelize');
/**
* 获取动物总数统计(实时数据库查询)
* @param {Object} req - 请求对象
* @param {Object} res - 响应对象
*/
exports.getAnimalCount = async (req, res) => {
try {
// 测试数据库连接状态
await sequelize.authenticate();
// 执行精确的SQL查询统计动物总数
const animalCountResult = await sequelize.query(
'SELECT SUM(count) as total_animals FROM animals',
{
type: sequelize.QueryTypes.SELECT,
raw: true
}
);
// 获取按类型分组的动物数量
const animalsByTypeResult = await sequelize.query(
'SELECT type, SUM(count) as total_count FROM animals GROUP BY type',
{
type: sequelize.QueryTypes.SELECT,
raw: true
}
);
// 获取按健康状态分组的动物数量
const animalsByHealthResult = await sequelize.query(
'SELECT health_status, SUM(count) as total_count FROM animals GROUP BY health_status',
{
type: sequelize.QueryTypes.SELECT,
raw: true
}
);
// 获取按农场分组的动物数量
const animalsByFarmResult = await sequelize.query(
'SELECT farm_id, SUM(count) as total_count FROM animals GROUP BY farm_id',
{
type: sequelize.QueryTypes.SELECT,
raw: true
}
);
const totalAnimals = animalCountResult[0]?.total_animals || 0;
// 格式化类型统计数据
const typeStats = {};
animalsByTypeResult.forEach(item => {
typeStats[item.type] = parseInt(item.total_count);
});
// 格式化健康状态统计数据
const healthStats = {
healthy: 0,
sick: 0,
quarantine: 0,
treatment: 0
};
animalsByHealthResult.forEach(item => {
healthStats[item.health_status] = parseInt(item.total_count);
});
// 格式化农场统计数据
const farmStats = {};
animalsByFarmResult.forEach(item => {
farmStats[`farm_${item.farm_id}`] = parseInt(item.total_count);
});
const response = {
totalAnimals: parseInt(totalAnimals),
animalsByType: typeStats,
animalsByHealth: healthStats,
animalsByFarm: farmStats,
lastUpdated: new Date().toISOString(),
dataSource: 'mysql_realtime'
};
res.status(200).json({
success: true,
data: response
});
} catch (error) {
console.error('获取动物总数统计失败:', error);
// 数据库连接错误处理
if (error.name === 'SequelizeConnectionError' ||
error.name === 'SequelizeConnectionRefusedError' ||
error.name === 'SequelizeHostNotFoundError') {
return res.status(503).json({
success: false,
message: '数据库连接失败,无法获取实时数据',
error: 'DATABASE_CONNECTION_ERROR',
details: error.message
});
}
// 其他数据库错误
if (error.name && error.name.startsWith('Sequelize')) {
return res.status(500).json({
success: false,
message: '数据库查询错误',
error: 'DATABASE_QUERY_ERROR',
details: error.message
});
}
// 通用错误处理
res.status(500).json({
success: false,
message: '获取动物总数统计失败',
error: 'INTERNAL_SERVER_ERROR',
details: error.message
});
}
};
/**
* 获取农场总数统计(实时数据库查询)
* @param {Object} req - 请求对象
* @param {Object} res - 响应对象
*/
exports.getFarmCount = async (req, res) => {
try {
// 测试数据库连接状态
await sequelize.authenticate();
// 执行精确的SQL查询统计农场总数
const farmCountResult = await sequelize.query(
'SELECT COUNT(*) as total_farms FROM farms',
{
type: sequelize.QueryTypes.SELECT,
raw: true
}
);
// 获取按状态分组的农场数量
const farmsByStatusResult = await sequelize.query(
'SELECT status, COUNT(*) as count FROM farms GROUP BY status',
{
type: sequelize.QueryTypes.SELECT,
raw: true
}
);
// 获取按类型分组的农场数量
const farmsByTypeResult = await sequelize.query(
'SELECT type, COUNT(*) as count FROM farms GROUP BY type',
{
type: sequelize.QueryTypes.SELECT,
raw: true
}
);
const totalFarms = farmCountResult[0]?.total_farms || 0;
// 格式化状态统计数据
const statusStats = {
active: 0,
inactive: 0,
maintenance: 0
};
farmsByStatusResult.forEach(item => {
statusStats[item.status] = parseInt(item.count);
});
// 格式化类型统计数据
const typeStats = {};
farmsByTypeResult.forEach(item => {
typeStats[item.type] = parseInt(item.count);
});
const response = {
totalFarms: parseInt(totalFarms),
farmsByStatus: statusStats,
farmsByType: typeStats,
lastUpdated: new Date().toISOString(),
dataSource: 'mysql_realtime'
};
res.status(200).json({
success: true,
data: response
});
} catch (error) {
console.error('获取农场总数统计失败:', error);
// 数据库连接错误处理
if (error.name === 'SequelizeConnectionError' ||
error.name === 'SequelizeConnectionRefusedError' ||
error.name === 'SequelizeHostNotFoundError') {
return res.status(503).json({
success: false,
message: '数据库连接失败,无法获取实时数据',
error: 'DATABASE_CONNECTION_ERROR',
details: error.message
});
}
// 其他数据库错误
if (error.name && error.name.startsWith('Sequelize')) {
return res.status(500).json({
success: false,
message: '数据库查询错误',
error: 'DATABASE_QUERY_ERROR',
details: error.message
});
}
// 通用错误处理
res.status(500).json({
success: false,
message: '获取农场总数统计失败',
error: 'INTERNAL_SERVER_ERROR',
details: error.message
});
}
};
/**
* 获取仪表盘统计数据
* @param {Object} req - 请求对象