一、功能概述
组合套餐销售是美团买菜系统中提升客单价、促进商品销售的重要功能,允许商家将多个商品打包销售,提供价格优惠,吸引用户购买。
二、系统架构设计
1. 数据库设计
套餐表(combo)
```
id (主键)
name (套餐名称)
description (描述)
original_price (原价总和)
discount_price (套餐价)
start_time (开始时间)
end_time (结束时间)
status (状态:上架/下架)
image_url (套餐图片)
```
套餐商品关联表(combo_items)
```
id (主键)
combo_id (套餐ID)
product_id (商品ID)
quantity (数量)
sort_order (排序)
```
用户购买记录表(combo_orders)
```
id (主键)
user_id (用户ID)
combo_id (套餐ID)
order_id (关联订单ID)
purchase_time (购买时间)
```
2. 后端服务设计
套餐管理服务
- 创建/编辑套餐
- 上下架套餐
- 查询套餐列表
- 获取套餐详情
套餐推荐服务
- 基于用户行为推荐套餐
- 热销套餐排行
- 新品套餐推荐
订单处理服务
- 套餐购买处理
- 库存预扣
- 订单拆分(将套餐拆分为单个商品)
三、核心功能实现
1. 套餐创建流程
```java
public Combo createCombo(ComboDTO comboDTO) {
// 1. 验证商品是否存在且可售
List
products = productService.validateProducts(comboDTO.getProductIds());
// 2. 计算原价总和
BigDecimal originalPrice = calculateOriginalPrice(products, comboDTO.getQuantities());
// 3. 验证套餐价是否低于原价
if (comboDTO.getDiscountPrice().compareTo(originalPrice) >= 0) {
throw new BusinessException("套餐价必须低于原价总和");
}
// 4. 创建套餐记录
Combo combo = new Combo();
combo.setName(comboDTO.getName());
combo.setOriginalPrice(originalPrice);
combo.setDiscountPrice(comboDTO.getDiscountPrice());
// 设置其他字段...
// 5. 保存套餐商品关联
for (ComboItemDTO item : comboDTO.getItems()) {
ComboItem comboItem = new ComboItem();
comboItem.setComboId(combo.getId());
comboItem.setProductId(item.getProductId());
comboItem.setQuantity(item.getQuantity());
// 保存comboItem...
}
return combo;
}
```
2. 套餐购买处理
```java
public Order placeComboOrder(Long userId, Long comboId, Integer quantity) {
// 1. 获取套餐详情
Combo combo = comboRepository.findById(comboId)
.orElseThrow(() -> new BusinessException("套餐不存在"));
// 2. 检查套餐状态
if (!combo.getStatus().equals(ComboStatus.ON_SALE)) {
throw new BusinessException("套餐已下架");
}
// 3. 检查库存
List items = comboItemRepository.findByComboId(comboId);
for (ComboItem item : items) {
Product product = productService.getProduct(item.getProductId());
if (product.getStock() < item.getQuantity() * quantity) {
throw new BusinessException(product.getName() + "库存不足");
}
}
// 4. 创建订单(预扣库存)
Order order = new Order();
order.setUserId(userId);
order.setTotalAmount(combo.getDiscountPrice().multiply(BigDecimal.valueOf(quantity)));
// 设置其他订单字段...
// 5. 拆分订单项(将套餐拆分为单个商品)
for (ComboItem item : items) {
OrderItem orderItem = new OrderItem();
orderItem.setProductId(item.getProductId());
orderItem.setQuantity(item.getQuantity() * quantity);
orderItem.setPrice(productService.getProduct(item.getProductId()).getPrice());
// 添加到order...
}
// 6. 保存订单
orderRepository.save(order);
return order;
}
```
3. 前端展示逻辑
套餐列表页
- 展示所有可购买的套餐
- 支持按分类、销量、价格排序
- 显示套餐原价、折扣价和节省金额
套餐详情页
- 套餐大图展示
- 包含商品清单(带图片和单价)
- 显示套餐有效期
- 购买按钮和加入购物车功能
四、关键技术点
1. 库存管理
- 采用预扣库存机制,防止超卖
- 订单支付成功后才真正扣减库存
- 定时任务清理未支付订单释放库存
2. 价格计算
- 套餐价与原价对比显示节省金额
- 支持多种优惠叠加计算
- 精确到分的小数计算
3. 推荐算法
- 基于用户购买历史的个性化推荐
- 热销套餐排行
- 新品套餐推荐
4. 性能优化
- 套餐数据缓存
- 异步加载套餐商品详情
- 图片懒加载
五、测试要点
1. 功能测试
- 套餐创建、编辑、上下架
- 套餐购买流程
- 库存预扣和实际扣减
2. 边界测试
- 库存不足时的处理
- 套餐过期检查
- 价格计算准确性
3. 并发测试
- 多用户同时购买同一套餐
- 库存扣减的原子性
4. 兼容性测试
- 不同手机型号和屏幕尺寸的显示
- 不同网络环境下的加载速度
六、上线后监控
1. 套餐销售数据监控
2. 用户购买行为分析
3. 系统性能指标监控
4. 异常订单报警
通过以上实现方案,美团买菜系统可以有效地支持组合套餐销售功能,提升用户购买体验和平台销售额。