1. 项目背景与需求分析
本庄村果园预售系统是一个典型的农产品电商平台,旨在帮助当地果农解决传统销售模式中的痛点。在传统销售模式下,果农面临着几个核心问题:销售渠道单一(主要依赖批发商收购)、价格被动、库存管理混乱、缺乏客户数据积累。这套系统通过"预售+管理"的双重模式,实现了以下几个核心价值:
- 预售模式创新:消费者可以在水果成熟前下单预订,果园根据订单量精准安排采摘和发货,减少库存损耗(据统计可降低约30%的损耗率)
- 全流程数字化:从果树生长记录、采摘计划、订单处理到物流跟踪的全生命周期管理
- 农户-消费者直连:去除中间环节,农户可增收20%-35%,消费者获得更新鲜实惠的产品
系统需要同时满足两类用户的需求:
- 农户端:果树管理、库存预警、订单处理、财务统计
- 消费者端:果园直播、预售下单、生长过程追踪、配送查询
2. 技术架构设计
2.1 整体技术栈选型
采用前后端分离架构,这是基于以下考虑:
- 迭代效率:农业销售有强季节性,需要快速响应需求变化
- 团队协作:农户端管理功能与消费者端功能可并行开发
- 性能考量:消费者端需要应对促销期间的高并发访问
code复制技术栈组成:
├── 前端
│ ├── Vue 2.x (稳定生态+农业操作人员学习成本低)
│ ├── Element-UI (表单密集型后台友好)
│ └── Axios + Vuex (状态管理方案)
├── 后端
│ ├── Spring Boot 2.7 (LTS版本)
│ ├── MyBatis-Plus (简化农户数据CRUD)
│ └── Redis (应对618/双11类促销活动)
└── 数据库
├── MySQL 8.0 (GIS功能支持配送路径规划)
└── 阿里云RDS (自动备份保障数据安全)
2.2 核心架构决策点
-
数据一致性方案:
- 采用柔性事务(本地消息表)处理订单-库存数据
- 典型场景:消费者支付成功后,通过RabbitMQ延时消息检查库存扣减
-
GIS集成设计:
- 使用MySQL的空间扩展函数计算配送半径
- 示例SQL:
sql复制SELECT orchard_id FROM orchards WHERE ST_Distance_Sphere( point(120.12, 30.16), point(longitude, latitude) ) <= 5000 -- 5公里配送范围
-
农产品溯源实现:
- 区块链存证简化方案:使用Merkle Tree记录生长日志
- 每个批次水果生成唯一溯源码,消费者扫码可查看:
- 施肥记录(时间/种类/操作人)
- 病虫害防治记录
- 采摘时的糖度检测数据
3. 关键业务模块实现
3.1 预售订单流程
采用状态机模式管理订单生命周期,这是农产品销售的特殊性决定的:
- 待支付(30分钟超时)
- 已支付待采摘(可取消但需扣10%违约金)
- 采摘中(关联果园工人APP任务)
- 配送中(集成电子面单打印)
- 已完成(自动触发农户结算)
状态转换代码示例:
java复制public class OrderStateMachine extends StateMachine<OrderStatus, OrderEvent> {
public OrderStateMachine() {
super(OrderStatus.class);
// 从待支付到已支付
addTransition(OrderStatus.UNPAID, OrderStatus.PAID,
OrderEvent.PAY_SUCCESS);
// 已支付状态下可触发采摘
addTransition(OrderStatus.PAID, OrderStatus.PICKING,
OrderEvent.START_PICKING)
.withGuard(order -> checkInventory(order)); // 库存检查
}
}
3.2 库存管理策略
针对农产品易腐特性设计三级库存体系:
- 预售库存:可售数量=预估产量×70%(预留30%缓冲)
- 采摘库存:实际采摘量(允许±5%误差)
- 现货库存:处理尾货和赠品
库存扣减的防超卖实现:
java复制@Transactional
public boolean reduceInventory(Long skuId, int num) {
// 使用CAS乐观锁
int updated = inventoryMapper.update(
"set available = available - #{num} " +
"where sku_id = #{skuId} and available >= #{num}",
Map.of("num", num, "skuId", skuId));
if (updated == 0) {
// 触发库存预警
alertService.sendStockAlert(skuId);
return false;
}
return true;
}
3.3 农户端特色功能
-
果树档案管理:
- 使用树形结构存储果园地块划分
- 每个果树有独立二维码标签
- 移动端支持扫码快速记录农事操作
-
智能预警系统:
- 基于历史数据预测病虫害风险
- 集成气象API提供霜冻/暴雨预警
- 示例预警规则配置:
yaml复制rules: - name: "炭疽病风险" condition: "temperature > 28 && humidity > 80%" action: "发送防治指南到农户APP"
4. 部署与性能优化
4.1 生产环境配置
针对农村网络条件做的特殊优化:
- CDN加速:静态资源使用阿里云OSS+CDN
- 图片处理:
- 采用WebP格式(比JPEG小25%)
- 根据网络状况动态调整质量
nginx复制# 根据网络类型返回不同质量图片 map $http_net_type $quality { "4g" 80; "wifi" 90; default 60; } location ~* \.(jpg|webp)$ { image_filter resize 800 -; image_filter_webp_quality $quality; }
4.2 安全防护措施
-
农户账号安全:
- 短信验证码+简单密码(考虑中老年用户习惯)
- 关键操作需人脸识别确认
-
防刷单机制:
- 基于地理位置验证(同一IP不同订单需≥500米距离)
- 预售期限制单人购买量(如草莓≤5斤/人)
-
数据加密:
- 使用国密SM4加密农户身份证信息
- 支付敏感字段内存中即时清除
5. 项目演进方向
当前已实现的核心指标:
- 农户端操作效率提升40%(相比纸质记录)
- 订单处理吞吐量200TPS(促销期间)
- 平均API响应时间<300ms
后续优化计划:
- AI产量预测:接入多光谱无人机数据
- 冷链物流优化:基于订单密度规划配送路线
- 区块链溯源升级:对接政府监管链
这套系统在落地过程中有个值得分享的经验:初期我们使用了复杂的微服务架构,但发现农户端的网络稳定性无法保障。后来调整为"前后端分离+单体服务"的混合架构,关键业务(如订单创建)仍保持强一致性,非关键业务(如果树日志)采用最终一致性,这个折中方案在实际运行中取得了很好的平衡。
