规模化生猪养殖场管理系统是传统畜牧业向数字化转型升级的典型应用。随着养殖场规模扩大,人工记录饲料投喂、免疫接种、存栏统计等数据的方式已无法满足现代化管理需求。我在实际调研中发现,一个存栏5000头的猪场,仅每日饲料消耗记录就需要2名专职人员处理4小时,且错误率高达15%。这正是我们选择SpringBoot技术栈开发该系统的现实背景。
系统核心解决三个痛点:
提示:选择SpringBoot而非传统SSM框架,主要考虑养殖场通常位于网络条件较差的郊区,需要轻量级部署和快速响应能力
后端采用SpringBoot 2.7 + MyBatis Plus组合,实测在4核8G服务器上可支持200+终端并发访问。这里特别说明几个关键选型:
sql复制CREATE TABLE vaccination (
id BIGINT PRIMARY KEY,
pig_id VARCHAR(20),
vaccine_info JSON, -- 存储厂商特有参数
operator VARCHAR(50)
);
java复制@Cacheable(value = "stockCache", key = "#houseId", unless = "#result == null")
public Integer getCurrentStock(String houseId) {
// 数据库查询逻辑
}
系统采用六层架构设计,其中核心是业务逻辑层的五个模块:
| 模块 | 核心功能 | 技术实现要点 |
|---|---|---|
| 种猪管理 | 谱系追踪、繁殖性能分析 | 树形结构存储 + 遗传算法评估 |
| 育肥管理 | 日增重曲线、料肉比计算 | 时序数据库 + 线性回归预测 |
| 疫病防控 | 免疫提醒、异常体温预警 | 规则引擎 + 消息队列通知 |
| 饲料库存 | 采购预警、效期管理 | 分布式锁防止超卖 |
| 环境监控 | 氨气/温湿度数据采集 | Modbus TCP协议解析 |
养殖场最核心的"全进全出"批次管理,我们实现了智能分组算法。以1000头仔猪入栏为例:
核心代码片段:
java复制public List<PigGroup> autoGrouping(List<Pig> pigs) {
// 1. 体重标准化
double[] weights = pigs.stream().mapToDouble(Pig::getWeight).toArray();
// 2. K-means聚类
KMeansModel model = new KMeans(3).fit(weights);
// 3. 构建分组
return model.predict(weights).stream()
.collect(Collectors.groupingBy(i -> i))
.entrySet().stream()
.map(e -> new PigGroup(e.getKey(), e.getValue()))
.collect(Collectors.toList());
}
针对不同厂商的传感器设备,我们设计了适配器模式:
mermaid复制classDiagram
class SensorAdapter {
<<interface>>
+readData() SensorData
}
class TemperatureAdapter {
+readData() SensorData
}
class AmmoniaAdapter {
+readData() SensorData
}
SensorAdapter <|-- TemperatureAdapter
SensorAdapter <|-- AmmoniaAdapter
实际编码时发现,某品牌氨气传感器存在数据漂移问题,通过以下方式解决:
java复制public SensorData readData() {
double rawValue = device.readRaw();
// 温度补偿算法
double compensated = rawValue * (1 + 0.02*(envTemp-25));
return new SensorData(compensated);
}
现象:移动端APP显示某批次猪只数量突然增加20头
排查过程:
sql复制UPDATE pig_info SET batch_no='B2023-05'
WHERE house_id='H7' AND status='ACTIVE'
解决方案:
java复制@Transactional
public void transferBatch(String originBatch, String targetBatch, LocalDate date) {
// 添加日期条件
lambdaUpdate()
.eq(Pig::getBatchNo, originBatch)
.ge(Pig::getEntryDate, date)
.set(Pig::getBatchNo, targetBatch)
.update();
}
初始实现的月度报表生成需要45秒(数据量约50万条),通过以下优化降至3秒内:
优化前后对比:
| 优化措施 | 执行时间 | 内存占用 |
|---|---|---|
| 原始方案 | 45s | 1.2GB |
| SQL优化后 | 18s | 800MB |
| 并行处理 | 8s | 1.5GB |
| 内存分页 | 2.8s | 600MB |
考虑到养殖场常位于网络不稳定区域,我们设计双模式运行:
properties复制# application-offline.properties
spring.datasource.url=jdbc:sqlite:/local/pig.db
spring.cache.type=simple
切换逻辑:
java复制@Scheduled(fixedRate = 300000)
public void checkConnection() {
if(!networkService.isAvailable()) {
SpringApplication.exit(context,
() -> ConfigurableApplicationContext.OFFLINE);
}
}
针对不同角色设计细粒度权限:
java复制@PreAuthorize("hasRole('FEED_MANAGER') or "
+ "(hasRole('HOUSE_MANAGER') and #houseId.startsWith('H3'))")
public void updateFeedPlan(String houseId, FeedPlan plan) {
// 业务逻辑
}
在实际交付后,我们收到几个有价值的改进建议:
其中AI估重模块的测试效果:
python复制# 使用YOLOv5+ResNet18的混合模型
model = torch.hub.load('ultralytics/yolov5', 'custom',
path='weights/pig_weight.pt')
results = model(img)
weight = 2.34*results.xywhn[0][:, 5] + 18.6 # 回归公式