1. 项目概述
作为一名从事Java开发十余年的技术老兵,今天想和大家分享一个基于SpringBoot的规模化生猪养殖场管理系统开发实战。这个项目最初是为某农业科技公司设计的,后来经过多次迭代优化,逐渐发展成为一个功能完善、架构稳定的生产级系统。
这个系统主要解决了传统养猪场管理中的几个痛点:
- 纸质记录效率低下,数据容易丢失
- 养殖过程难以标准化管理
- 缺乏实时数据监控和预警机制
- 多部门协作困难
系统采用SpringBoot+Vue前后端分离架构,整合了养殖管理、饲料管理、疫病防控、销售管理等核心模块,实现了从仔猪入栏到出栏销售的全生命周期数字化管理。
2. 系统架构设计
2.1 技术选型考量
在技术选型阶段,我们主要考虑了以下几个因素:
- 开发效率:农业信息化项目通常预算有限,需要快速交付
- 团队技能:团队成员主要熟悉Java技术栈
- 可维护性:系统需要长期维护和迭代
- 性能要求:需要支持100+并发用户操作
基于这些考虑,我们最终选择了以下技术栈:
后端:
- Spring Boot 2.7.x:简化配置,快速开发
- MyBatis-Plus 3.5.x:简化数据库操作
- Shiro 1.10.x:权限控制
- Redis 6.x:缓存和会话管理
前端:
- Vue 3.x:组件化开发
- Element Plus:UI组件库
- ECharts 5.x:数据可视化
数据库:
- MySQL 8.0:关系型数据库
- MongoDB 5.0:非结构化数据存储
2.2 系统架构设计
系统采用标准的B/S架构,整体分为五层:
- 表现层:基于Vue的前端界面
- API网关层:统一接口管理和鉴权
- 业务逻辑层:Spring Boot实现核心业务
- 数据访问层:MyBatis-Plus操作数据库
- 数据存储层:MySQL+MongoDB混合存储
这种分层架构的优势在于:
- 职责分离,便于维护
- 可以独立扩展各层资源
- 前后端分离,便于团队协作
3. 核心功能模块实现
3.1 养殖管理模块
养殖管理是系统的核心模块,主要包括以下功能:
- 猪只档案管理:
java复制// 猪只实体类设计
@Data
@TableName("pig_info")
public class PigInfo {
@TableId(type = IdType.ASSIGN_ID)
private Long id;
private String earTag; // 耳标号
private Integer pigType; // 猪只类型
private Date birthDate;
private Long fatherId;
private Long motherId;
private Integer status; // 状态
private Long barnId; // 所在猪舍
// 其他字段...
}
- 生长记录管理:
- 每日体重记录
- 采食量统计
- 生长曲线分析
关键技术点:
- 使用Redis缓存常用查询结果
- 采用定时任务计算生长指标
- 使用ECharts实现数据可视化
3.2 饲料管理模块
饲料成本占养殖成本的60-70%,因此饲料管理至关重要。主要功能包括:
- 饲料库存管理:
sql复制CREATE TABLE `feed_stock` (
`id` bigint NOT NULL AUTO_INCREMENT,
`feed_type` varchar(50) NOT NULL COMMENT '饲料类型',
`batch_no` varchar(50) NOT NULL COMMENT '批次号',
`quantity` decimal(10,2) NOT NULL COMMENT '数量(kg)',
`unit_price` decimal(10,2) NOT NULL COMMENT '单价(元/kg)',
`product_date` date NOT NULL COMMENT '生产日期',
`expire_date` date NOT NULL COMMENT '过期日期',
`supplier_id` bigint NOT NULL COMMENT '供应商ID',
`storage_location` varchar(100) NOT NULL COMMENT '存储位置',
`status` tinyint NOT NULL DEFAULT '1' COMMENT '状态',
PRIMARY KEY (`id`),
KEY `idx_feed_type` (`feed_type`),
KEY `idx_batch_no` (`batch_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='饲料库存表';
- 饲料配方管理:
- 不同生长阶段配方设置
- 成本计算与优化
- 自动生成采购计划
3.3 疫病防控模块
疫病防控是养殖场的关键环节,系统实现了:
- 免疫计划管理:
- 自动生成免疫时间表
- 疫苗库存预警
- 免疫记录追踪
- 疾病预警系统:
java复制// 疾病预警服务实现
@Service
public class DiseaseAlertService {
@Autowired
private PigHealthMapper healthMapper;
@Scheduled(cron = "0 0 8 * * ?") // 每天8点执行
public void checkHealthStatus() {
// 查询异常健康状态的猪只
List<PigHealth> abnormalPigs = healthMapper.selectAbnormalRecords();
abnormalPigs.forEach(pig -> {
// 根据症状匹配可能的疾病
List<Disease> possibleDiseases = matchDisease(pig.getSymptoms());
// 生成预警通知
generateAlert(pig, possibleDiseases);
});
}
// 其他方法...
}
4. 系统关键技术实现
4.1 权限控制系统
系统采用Shiro实现细粒度的权限控制,主要设计如下:
- 权限模型设计:
java复制@Data
public class SysPermission {
private Long id;
private String name; // 权限名称
private String code; // 权限代码
private String url; // 资源URL
private String method; // 请求方法
private Integer type; // 权限类型
}
@Data
public class SysRole {
private Long id;
private String name;
private String code;
private List<SysPermission> permissions;
}
@Data
public class SysUser {
private Long id;
private String username;
private String password;
private List<SysRole> roles;
}
- 动态权限控制:
java复制@Configuration
public class ShiroConfig {
@Bean
public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
factoryBean.setSecurityManager(securityManager);
// 动态获取权限规则
Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
List<Permission> permissions = permissionService.listAll();
permissions.forEach(p -> {
String url = p.getUrl();
String code = p.getCode();
filterChainDefinitionMap.put(url, "perms[" + code + "]");
});
factoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
return factoryBean;
}
}
4.2 数据统计分析
系统提供了丰富的数据分析功能:
- 养殖效率分析:
sql复制-- 计算各猪舍的料肉比
SELECT
b.barn_name,
SUM(f.amount) AS total_feed,
SUM(p.weight) AS total_weight,
SUM(f.amount)/SUM(p.weight) AS feed_ratio
FROM
feed_record f
JOIN
pig_info p ON f.pig_id = p.id
JOIN
barn_info b ON p.barn_id = b.id
WHERE
f.feed_date BETWEEN :startDate AND :endDate
GROUP BY
b.barn_name
ORDER BY
feed_ratio;
- 成本收益分析:
- 饲料成本占比分析
- 人工成本计算
- 销售收益预测
5. 系统部署与优化
5.1 生产环境部署方案
推荐部署架构:
- Nginx:反向代理和负载均衡
- 2台应用服务器:Spring Boot应用
- Redis集群:缓存和会话共享
- MySQL主从:读写分离
- MinIO:文件存储
部署脚本示例:
bash复制#!/bin/bash
# Spring Boot应用启动脚本
JAVA_OPTS="-Xms512m -Xmx1024m -XX:+UseG1GC"
APP_HOME=/opt/pig-farm
LOG_DIR=$APP_HOME/logs
mkdir -p $LOG_DIR
nohup java $JAVA_OPTS -jar $APP_HOME/pig-farm.jar \
--spring.profiles.active=prod \
> $LOG_DIR/console.log 2>&1 &
5.2 性能优化实践
- 数据库优化:
- 合理设计索引
- 使用连接池配置
yaml复制spring:
datasource:
hikari:
maximum-pool-size: 20
minimum-idle: 5
connection-timeout: 30000
idle-timeout: 600000
max-lifetime: 1800000
- 缓存策略:
java复制@Cacheable(value = "pigCache", key = "#pigId")
public PigInfo getPigDetail(Long pigId) {
return pigMapper.selectById(pigId);
}
@CacheEvict(value = "pigCache", key = "#pigId")
public void updatePigInfo(PigInfo pigInfo) {
pigMapper.updateById(pigInfo);
}
- 前端性能优化:
- 组件懒加载
- API请求合并
- 本地缓存常用数据
6. 开发经验与问题解决
6.1 典型问题及解决方案
- 大量数据导出内存溢出:
- 问题:导出上万条记录时OOM
- 解决方案:使用流式查询分页处理
java复制public void exportPigData(HttpServletResponse response) {
// 设置响应头
response.setContentType("application/vnd.ms-excel");
try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).build()) {
int pageSize = 1000;
int pageNum = 1;
while (true) {
Page<PigInfo> page = new Page<>(pageNum, pageSize);
IPage<PigInfo> pageResult = pigMapper.selectPage(page, null);
if (pageResult.getRecords().isEmpty()) {
break;
}
WriteSheet writeSheet = EasyExcel.writerSheet(pageNum, "第" + pageNum + "页").build();
excelWriter.write(pageResult.getRecords(), writeSheet);
pageNum++;
}
}
}
- 定时任务执行时间过长:
- 问题:统计任务影响正常业务
- 解决方案:使用xxl-job分布式任务调度
java复制@XxlJob("dailyStatJob")
public void dailyStatJob() {
// 分片参数
int shardIndex = XxlJobHelper.getShardIndex();
int shardTotal = XxlJobHelper.getShardTotal();
// 根据分片处理数据
List<Long> barnIds = getBarnIdsByShard(shardIndex, shardTotal);
barnIds.forEach(barnId -> {
calculateBarnDailyStat(barnId);
});
}
6.2 开发经验总结
- 领域模型设计:
- 深入理解养殖业务是关键
- 与养殖专家充分沟通
- 建立准确的业务术语表
- 异常处理原则:
- 用户操作异常要有友好提示
- 系统异常要记录完整上下文
- 关键业务操作要有补偿机制
- 测试策略:
- 单元测试覆盖核心算法
- 集成测试验证业务流程
- 定期进行全链路压测
- 文档规范:
- API文档使用Swagger
- 数据库变更记录在Flyway脚本
- 业务规则集中维护
7. 系统扩展与演进
7.1 物联网集成
当前系统已经预留了IoT设备接入接口,未来计划:
- 智能饲喂系统对接:
- 实时采集饲喂数据
- 自动调整饲喂计划
- 设备异常预警
- 环境监控集成:
java复制// 环境数据接收接口
@PostMapping("/api/env/data")
public R receiveEnvData(@RequestBody EnvDataDTO data) {
// 验证设备
Device device = deviceService.getByCode(data.getDeviceCode());
if (device == null) {
return R.error("设备未注册");
}
// 保存数据
envDataService.saveData(device.getBarnId(), data);
// 检查是否需要预警
envAlertService.checkAlert(device.getBarnId(), data);
return R.ok();
}
7.2 大数据分析
计划引入大数据技术实现:
- 生长预测模型:
- 基于历史数据训练
- 预测出栏时间
- 优化养殖计划
- 疫病预测系统:
- 结合环境数据
- 早期疫病识别
- 预防措施建议
8. 项目收获与建议
通过这个项目的开发,我深刻体会到农业信息化领域的几个特点:
- 业务复杂性高:养殖业务涉及多个专业领域,需要与不同专家协作
- 用户水平参差:系统设计要考虑从技术员到场长的不同用户群体
- 数据价值大:养殖数据积累后可以产生巨大商业价值
对于准备开发类似系统的开发者,我的建议是:
- 前期充分调研业务,不要急于编码
- 设计灵活的扩展架构,农业需求变化快
- 重视数据质量,建立完善的数据校验机制
- 考虑移动端需求,养殖场现场操作多
这个项目从最初的简单信息管理,逐步发展成现在的智能化养殖平台,过程中遇到了各种挑战,但也积累了宝贵的经验。最大的成就感是看到系统真正帮助养殖场提高了管理效率,降低了生产成本。