1. 项目背景与核心价值
最近在畜牧行业信息化升级的大趋势下,我帮一家中型养猪场开发了一套基于Python+微信小程序的养殖管理系统。这个项目最让我兴奋的是,它完美结合了现代移动互联网技术和传统养殖业的实际需求。传统养殖场还在用纸质记录本登记猪只信息,不仅效率低下,数据还容易丢失。我们这套系统上线后,养殖员用手机就能完成所有日常操作,老板在办公室也能实时掌握全场情况。
微信小程序作为前端入口特别适合这个场景——养殖员普遍手机配置不高,但微信是必装应用,无需额外安装APP。后端采用Python+Django框架,数据处理和业务逻辑都在云端完成。这种架构既保证了系统性能,又降低了用户使用门槛。
2. 系统架构设计
2.1 技术栈选型
前端部分:
- 微信小程序原生开发(未用uniapp等跨平台方案)
- 采用TDesign组件库保证UI一致性
- 自定义地图组件展示猪舍分布
选择原生开发主要考虑两点:一是微信官方API支持最全面,二是后期对接支付、扫码等硬件功能更稳定。实测下来,在低端安卓机上原生小程序的流畅度确实优于H5方案。
后端部分:
- Django 3.2 + Django REST framework
- PostgreSQL数据库(比MySQL更适合养殖场的时空数据)
- Redis缓存登录状态和常用查询
- Celery异步处理报表生成
基础设施:
- 腾讯云CVM(2核4G基础配置)
- 对象存储COS存放疫苗注射记录等图片
- 微信云开发用于即时通讯
2.2 数据库关键表设计
python复制# 猪只信息表(核心表)
class Pig(models.Model):
ear_tag = models.CharField(max_length=20, unique=True) # 耳标号
breed = models.CharField(max_length=50) # 品种
birth_date = models.DateField()
father_tag = models.CharField(max_length=20, blank=True)
mother_tag = models.CharField(max_length=20, blank=True)
current_weight = models.DecimalField(max_digits=6, decimal_places=2)
status_choices = [
('nursery', '保育期'),
('fattening', '育肥期'),
('pregnant', '妊娠期'),
('sold', '已出栏'),
('dead', '死亡')
]
status = models.CharField(max_length=20, choices=status_choices)
pen = models.ForeignKey('Pen', on_delete=models.PROTECT) # 所在栏位
# 自动计算日龄的property
@property
def days_old(self):
return (date.today() - self.birth_date).days
3. 核心功能实现细节
3.1 移动端数据采集
养殖员最常用的功能是日常登记,我们做了这些优化:
- 离线模式:猪舍经常没信号,数据先存本地,有网络时自动同步
- 语音输入:双手不干净时可以直接说"3号栏喂食完成"
- 批量操作:勾选多个耳标号后统一记录体重
javascript复制// 微信小程序端的部分实现代码
Page({
data: {
selectedPigs: [],
offlineData: []
},
// 离线存储实现
saveOffline: function(event) {
const newRecord = {
timestamp: new Date().getTime(),
type: event.type,
pigs: this.data.selectedPigs,
value: event.detail.value
}
wx.setStorageSync('offline_records',
[...this.data.offlineData, newRecord])
},
// 网络恢复时自动同步
onNetworkReconnect: function() {
const records = wx.getStorageSync('offline_records') || []
records.forEach(record => {
wx.request({
url: 'https://api.example.com/sync',
method: 'POST',
data: record,
success: () => {
// 同步成功后移除本地记录
this.setData({
offlineData: this.data.offlineData.filter(
r => r.timestamp !== record.timestamp)
})
}
})
})
}
})
3.2 智能预警系统
通过分析历史数据建立的预警模型:
- 采食量下降超过15% → 黄色预警
- 连续2天体温异常 → 红色预警
- 同栏位3天内出现2例相似症状 → 群体疫情预警
python复制# 预警引擎核心逻辑
def generate_alerts():
# 获取最近24小时数据
recent_data = PigDailyRecord.objects.filter(
record_time__gte=timezone.now()-timedelta(hours=24))
for pig in Pig.objects.all():
# 计算采食量变化率
feed_ratio = calculate_feed_change(pig, recent_data)
if feed_ratio < 0.85:
Alert.objects.create(
pig=pig,
level='warning',
message=f'采食量下降{(1-feed_ratio)*100:.0f}%'
)
# 体温检测(如果有IoT设备数据)
if hasattr(pig, 'temperature_data'):
if pig.temperature_data.avg() > 39.5:
Alert.objects.create(...)
# 使用Celery定时任务
@shared_task
def check_alerts_every_hour():
generate_alerts()
4. 踩坑经验与优化方案
4.1 性能优化实战
问题现象:
当猪只数量超过5000头时,小程序加载列表变得极慢,特别是安卓低端机经常崩溃。
解决方案:
-
后端:
- 添加数据库索引:
db_index=True所有常用查询字段 - 使用
select_related和prefetch_related减少查询次数 - 对重量等频繁更新字段采用单独的表
- 添加数据库索引:
-
前端:
- 实现分页加载 + 虚拟滚动
- 对耳标号等固定内容启用本地缓存
- 采用差异更新策略(只传变化的字段)
python复制# 优化后的查询示例
def get_pig_list(pen_id=None):
queryset = Pig.objects.select_related('pen').only(
'ear_tag', 'breed', 'status', 'pen__name')
if pen_id:
queryset = queryset.filter(pen_id=pen_id)
return list(queryset.order_by('ear_tag').values())
4.2 微信支付对接陷阱
养殖场需要在线采购饲料和兽药,支付环节遇到两个大坑:
-
企业账户问题:
- 个体工商户无法开通微信商户号
- 最终用养殖场法人个人账户+特约商户模式解决
-
iOS虚拟支付限制:
- 苹果不允许虚拟商品直接支付
- 改为"服务费"名义并通过消息推送发货
小程序支付必须注意:requestPayment的success回调不代表支付成功,要以微信服务器通知为准。我们吃过亏:有用户支付后关闭页面太快,导致订单状态没更新。
5. 扩展功能开发
5.1 区块链溯源
最近新增的猪肉溯源功能:
- 每头猪的关键事件(疫苗、转栏、检疫)上链
- 消费者扫码可查看完整养殖记录
- 采用Hyperledger Fabric私有链方案
python复制# 区块链服务层示例
class BlockchainService:
def __init__(self):
self.contract = Contract('0x123...') # 智能合约地址
@retry(tries=3, delay=1)
def write_to_chain(self, pig_id, event_type, data):
tx_hash = self.contract.functions.recordEvent(
pig_id,
int(time.time()),
event_type,
json.dumps(data)
).transact()
return tx_hash
5.2 AI体重预估
通过摄像头拍照自动估算体重:
- 用OpenCV检测猪只轮廓
- 基于ResNet34训练回归模型
- 误差控制在±3kg以内(满足商用需求)
python复制# 体重预测模型调用示例
def predict_weight(image_file):
img = load_image(image_file)
preprocessed = preprocess_input(img)
model = load_model('weights/resnet34.h5')
prediction = model.predict(preprocessed)
return float(prediction[0][0])
这套系统上线半年后,养殖场的数据准确率从68%提升到99%,管理人员减少2名,饲料浪费下降15%。最让我有成就感的是,有养殖员说现在下班前不用再抄写各种表格了,手机点几下就能完成所有记录。
