一、需求分析
组合套餐销售是美团买菜提升客单价、促进商品销售的重要功能,主要需求包括:
1. 灵活组合:支持将不同品类商品组合成套餐
2. 价格优惠:套餐总价低于单独购买价格
3. 库存管理:套餐库存与组件商品库存联动
4. 营销展示:在APP/小程序突出展示套餐
5. 订单处理:正确拆分套餐组件进行配送
二、系统架构设计
1. 核心模块
```
组合套餐管理系统
├── 套餐配置模块
├── 价格计算模块
├── 库存管理模块
├── 订单处理模块
├── 营销展示模块
└── 数据分析模块
```
2. 数据库设计
套餐主表(combo_package)
```
id (主键)
name (套餐名称)
description (描述)
original_price (原价)
discount_price (折扣价)
start_time (开始时间)
end_time (结束时间)
status (状态:上架/下架)
image_url (图片)
```
套餐商品关联表(combo_items)
```
id (主键)
combo_id (套餐ID)
product_id (商品ID)
quantity (数量)
```
套餐库存表(combo_stock)
```
id (主键)
combo_id (套餐ID)
total_stock (总库存)
sold_count (已售数量)
```
三、核心功能实现
1. 套餐配置管理
```java
// 套餐创建示例
public ComboPackage createCombo(ComboCreateRequest request) {
// 验证商品是否存在
List
products = productService.batchGet(request.getProductIds());
if (products.size() != request.getProductIds().size()) {
throw new BusinessException("部分商品不存在");
}
// 计算原价
BigDecimal originalPrice = products.stream()
.map(p -> p.getPrice().multiply(BigDecimal.valueOf(request.getQuantities().get(p.getId()))))
.reduce(BigDecimal.ZERO, BigDecimal::add);
// 创建套餐
ComboPackage combo = new ComboPackage();
combo.setName(request.getName());
combo.setOriginalPrice(originalPrice);
combo.setDiscountPrice(request.getDiscountPrice());
// 其他字段设置...
// 保存套餐
comboRepository.save(combo);
// 保存套餐商品关系
for (Map.Entry entry : request.getQuantities().entrySet()) {
ComboItem item = new ComboItem();
item.setComboId(combo.getId());
item.setProductId(entry.getKey());
item.setQuantity(entry.getValue());
comboItemRepository.save(item);
}
return combo;
}
```
2. 价格计算策略
```java
public interface PriceCalculator {
BigDecimal calculate(ComboPackage combo, Map productQuantities);
}
// 固定折扣计算器
public class FixedDiscountCalculator implements PriceCalculator {
@Override
public BigDecimal calculate(ComboPackage combo, Map productQuantities) {
return combo.getDiscountPrice();
}
}
// 动态计算器(根据组件价格)
public class DynamicPriceCalculator implements PriceCalculator {
@Override
public BigDecimal calculate(ComboPackage combo, Map productQuantities) {
// 实现动态计算逻辑
// ...
}
}
```
3. 库存管理实现
```java
public class ComboStockService {
@Transactional
public boolean reserveStock(Long comboId, int quantity) {
ComboStock stock = comboStockRepository.findByComboId(comboId)
.orElseThrow(() -> new BusinessException("套餐不存在"));
if (stock.getAvailableStock() < quantity) {
return false;
}
// 扣减套餐库存
stock.setSoldCount(stock.getSoldCount() + quantity);
comboStockRepository.save(stock);
// 扣减组件商品库存
List items = comboItemRepository.findByComboId(comboId);
for (ComboItem item : items) {
productService.reduceStock(item.getProductId(), item.getQuantity() * quantity);
}
return true;
}
public void releaseStock(Long comboId, int quantity) {
// 回滚库存逻辑...
}
}
```
4. 订单处理流程
```
1. 用户选择套餐加入购物车
2. 系统验证套餐库存和组件库存
3. 创建订单时:
- 生成订单主表记录
- 为每个套餐组件生成订单明细
- 扣减实际商品库存
4. 配送时按组件商品进行分拣和打包
```
四、前端展示方案
1. 套餐卡片设计
```
[套餐图片]
套餐名称
原价: ¥XX 套餐价: ¥XX
包含商品:
- 商品1 x数量
- 商品2 x数量
- ...
[立即购买按钮]
```
2. 交互流程
1. 首页/分类页展示套餐专区
2. 点击套餐进入详情页,展示详细组件和优惠信息
3. 选择数量后加入购物车
4. 购物车页显示套餐优惠信息
五、技术挑战与解决方案
1. 库存同步问题
- 解决方案:使用分布式锁保证套餐和组件库存操作的原子性
2. 价格计算复杂性
- 解决方案:采用策略模式实现多种价格计算策略
3. 套餐变更影响
- 解决方案:套餐下架时检查是否有未完成订单,禁止直接删除
4. 性能优化
- 解决方案:套餐查询使用缓存,库存预加载
六、测试方案
1. 单元测试
- 套餐创建逻辑
- 价格计算策略
- 库存扣减逻辑
2. 集成测试
- 套餐从创建到下单的全流程
- 库存不足时的处理
3. 压力测试
- 高并发下套餐库存扣减
- 套餐页面加载性能
七、上线后监控
1. 套餐销售数据看板
2. 库存预警系统
3. 用户购买行为分析
通过以上方案,美团买菜系统可以实现灵活、高效的组合套餐销售功能,提升用户体验和平台销售额。