1. 项目背景与核心价值
鲜牛奶订购系统是连接牧场与消费者的数字化桥梁。我在实际开发中发现,传统乳制品行业存在三个典型痛点:配送时效性要求高(通常需要凌晨3-6点完成配送)、库存周转周期短(鲜奶保质期通常只有3-7天)、订单波动性大(节假日订单量可达平日3倍)。这个SpringBoot项目正是为解决这些行业特性问题而设计。
相比通用电商系统,鲜奶订购有这些特殊需求:
- 需要支持按周/月为周期的订阅制购买
- 必须实现配送时间段的精确控制
- 需动态计算最佳配送路径
- 要预留临时停送、容量调整等柔性功能
关键提示:鲜奶配送系统的数据库设计必须考虑"时间窗口"概念,所有配送相关表都需要记录配送时段(如AM6:00-8:00),这是与普通电商最显著的区别。
2. 系统架构设计
2.1 技术栈选型
基础框架采用SpringBoot 2.7 + MyBatis Plus组合,这个选择基于以下考量:
- 快速迭代:从需求确认到上线只有6周时间
- 事务控制:需要处理支付、库存扣减、配送分配等多个事务操作
- 轻量级:日订单量预估在3000单左右,不需要微服务拆分
数据库使用MySQL 8.0,关键配置项:
sql复制# 必须启用事务隔离级别设置
transaction-isolation = READ-COMMITTED
# 鲜奶库存需要精确到瓶(不能超卖)
innodb_autoinc_lock_mode = 1
2.2 核心模块划分
系统采用六层架构设计:
- 用户服务:包含C端用户和配送员双端登录
- 商品服务:特殊在需要管理"配送周期"属性
- 订单服务:核心是订阅订单的自动生成逻辑
- 配送服务:包含智能路线规划算法
- 支付服务:对接微信支付分账API
- 消息服务:强依赖短信提醒(配送前1小时提醒)
踩坑记录:初期使用Spring Scheduler实现定时任务,在生成次日订单时出现并发问题。后改用XXL-JOB分布式任务调度,通过分片广播机制解决。
3. 关键业务实现
3.1 订阅型订单处理
鲜奶订购的核心业务逻辑体现在订单生成策略上。我们设计了三级时间维度:
- 配送日:用户设置的每周几送奶(如周一、三、五)
- 配送时段:早晨6-8点或晚上17-19点
- 临时调整:支持用户临时暂停某次配送
代码示例(订单生成逻辑):
java复制public void generateDailyOrders() {
// 1. 获取所有有效订阅
List<Subscription> subs = subscriptionMapper.selectActiveSubs();
// 2. 过滤今日需配送的订阅
subs.stream()
.filter(sub -> needDeliveryToday(sub.getDeliveryDays()))
.forEach(sub -> {
// 3. 检查是否有临时暂停
if (!pauseService.isPaused(sub.getUserId(), LocalDate.now())) {
// 4. 创建订单记录
Order order = buildOrder(sub);
orderMapper.insert(order);
// 5. 扣减库存(乐观锁控制)
productService.reduceInventory(sub.getProductId(), 1);
}
});
}
3.2 智能配送规划
配送算法需要考虑三个核心参数:
- 地理围栏:每个配送员负责的片区(GIS多边形范围)
- 装载容量:电动三轮车最多装载80瓶鲜奶
- 时效要求:必须在用户指定时段内送达
我们采用改进的节约算法(Clarke-Wright)实现路径优化:
code复制1. 以配送站为中心建立初始路线
2. 计算所有订单点之间的合并节约值
3. 优先合并节约值最大的路线
4. 检查容量和时间窗约束
5. 生成最终配送清单
4. 特殊业务处理
4.1 鲜奶库存管理
与普通商品不同,鲜奶库存需要实现三重控制:
- 批次管理:不同生产日期的牛奶独立库存
- 动态锁定:当天的可售量=总库存-已预订量-安全库存
- 临期处理:提前48小时触发促销推送
库存表关键字段设计:
sql复制CREATE TABLE milk_inventory (
id BIGINT PRIMARY KEY,
product_id BIGINT NOT NULL,
batch_no VARCHAR(20) NOT NULL, -- 生产批次
produce_date DATE NOT NULL, -- 生产日期
total INT NOT NULL, -- 总数量
reserved INT DEFAULT 0, -- 已预订量
expired TINYINT DEFAULT 0 -- 是否临期(提前24小时标记)
);
4.2 异常情况处理
在实际运营中我们总结了这些常见问题及解决方案:
| 问题现象 | 根因分析 | 解决方案 |
|---|---|---|
| 用户投诉收到隔夜奶 | 配送员未按路线顺序送货 | 在APP端强制显示配送顺序 |
| 支付成功但订单未生成 | 库存扣减时发生并发冲突 | 改用Redis分布式锁 |
| 周末订单量突增 | 未考虑节假日模式 | 增加动态扩容开关 |
5. 性能优化实践
5.1 高并发场景应对
在春节前一周,我们通过以下措施支撑了日均8000单的压力:
- 订单表按用户ID分片(16个分片)
- 支付回调接口增加幂等控制
- 配送计算任务迁移到凌晨1-3点执行
- 使用Redis缓存用户常用地址
JVM参数调优配置:
properties复制# 年轻代大小设置为堆的1/3
-Xmn1g
# 使用G1垃圾回收器
-XX:+UseG1GC
# 针对大量短生命周期对象优化
-XX:G1NewSizePercent=40
5.2 监控体系建设
关键监控指标包括:
- 订单生成成功率(要求>99.9%)
- 库存超卖次数(要求=0)
- 配送准时率(要求>98%)
- 临期商品占比(要求<5%)
我们通过Grafana配置的监控看板包含:
- 实时订单流量图
- 配送员位置热力图
- 库存周转率趋势图
- 用户投诉分类统计
6. 项目演进方向
这个系统在实际运行半年后,我们又迭代了这些功能:
- 增加智能温控功能:通过IoT设备监控运输温度
- 开发团长代收模式:支持社区集中配送
- 引入动态定价算法:根据库存和天气调整价格
- 对接乳品检测报告:扫码查看当日质检结果
在技术架构方面,下一步计划:
- 将配送计算模块改造成Flink实时作业
- 用户服务迁移到Spring Cloud
- 试用TiDB处理订单分析报表
- 用Kubernetes实现自动扩缩容
经验之谈:鲜奶系统的开发要特别注意冷链环节,我们曾因未考虑运输车制冷功率问题,导致夏季配送时出现品质问题。后来在系统中增加了温度异常预警功能,当车厢温度>4℃时自动通知运维人员。