一、需求分析
组合套餐销售是电商平台提升客单价和用户购买体验的重要功能,美团买菜系统需要实现以下核心需求:
1. 套餐创建与管理:支持商家灵活创建不同类型套餐
2. 智能推荐:根据用户购买习惯推荐合适套餐
3. 价格计算:自动计算套餐优惠价格
4. 库存联动:套餐销售与单品库存实时同步
5. 订单处理:支持套餐商品的拆单与合并处理
二、系统架构设计
1. 核心模块划分
```
组合套餐系统
├── 套餐管理模块
├── 价格计算模块
├── 库存管理模块
├── 推荐引擎模块
├── 订单处理模块
└── 用户界面模块
```
2. 数据库设计
套餐主表(combo_package)
```
id | name | description | image | status | create_time | update_time
```
套餐商品关联表(combo_items)
```
id | combo_id | item_id | quantity | item_type | sort_order
```
套餐价格规则表(combo_pricing)
```
id | combo_id | original_price | discount_price | start_time | end_time
```
三、关键功能实现
1. 套餐创建与管理
```java
// 套餐创建DTO
public class ComboCreateDTO {
private String name;
private String description;
private List
items;
private BigDecimal discountPrice;
// 其他字段...
}
// 套餐服务实现
@Service
public class ComboServiceImpl implements ComboService {
@Transactional
public Long createCombo(ComboCreateDTO dto) {
// 1. 创建套餐主信息
ComboPackage combo = convertToEntity(dto);
comboRepository.save(combo);
// 2. 保存套餐商品关系
List items = convertToItems(dto.getItems(), combo.getId());
comboItemRepository.saveAll(items);
// 3. 创建价格规则
ComboPricing pricing = new ComboPricing();
pricing.setComboId(combo.getId());
pricing.setOriginalPrice(calculateOriginalPrice(items));
pricing.setDiscountPrice(dto.getDiscountPrice());
pricingRepository.save(pricing);
return combo.getId();
}
private BigDecimal calculateOriginalPrice(List items) {
// 计算套餐内商品原价总和
return items.stream()
.map(item -> item.getQuantity().multiply(getItemPrice(item.getItemId())))
.reduce(BigDecimal.ZERO, BigDecimal::add);
}
}
```
2. 智能推荐算法
```python
基于用户历史的推荐算法
def recommend_combos(user_id):
1. 获取用户历史购买记录
history = get_user_purchase_history(user_id)
2. 分析用户偏好
preferences = analyze_preferences(history)
3. 匹配适合的套餐
all_combos = get_all_active_combos()
recommended = []
for combo in all_combos:
match_score = calculate_match_score(combo, preferences)
if match_score > THRESHOLD:
recommended.append((combo, match_score))
4. 按匹配度排序返回
return sorted(recommended, key=lambda x: x[1], reverse=True)[:5]
```
3. 价格计算与优惠展示
```javascript
// 前端价格展示组件
function ComboPriceDisplay({ combo }) {
const originalPrice = combo.items.reduce(
(sum, item) => sum + (item.price * item.quantity), 0
);
const savings = originalPrice.subtract(combo.discountPrice);
return (
¥{combo.discountPrice.toFixed(2)}
¥{originalPrice.toFixed(2)}
省¥{savings.toFixed(2)}
);
}
```
4. 库存同步机制
```java
// 库存同步服务
@Service
public class InventorySyncService {
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void reserveInventoryForCombo(Long comboId, int quantity) {
// 1. 获取套餐所有商品
List items = comboItemRepository.findByComboId(comboId);
// 2. 锁定各商品库存
for (ComboItem item : items) {
inventoryService.lockInventory(
item.getItemId(),
item.getQuantity() * quantity
);
}
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void releaseInventoryForCombo(Long comboId, int quantity) {
// 类似地实现库存释放逻辑
}
}
```
四、技术挑战与解决方案
1. 套餐与单品库存同步问题
解决方案:
- 采用分布式锁确保库存操作的原子性
- 实现库存预占机制,在用户加入购物车时即预占库存
- 设置库存超时释放机制(如15分钟未支付则释放库存)
2. 套餐价格计算性能优化
解决方案:
- 对常用套餐价格进行缓存(Redis)
- 实现价格计算的异步预计算,定期更新缓存
- 对复杂套餐价格计算采用消息队列异步处理
3. 套餐与单品订单拆分
解决方案:
- 在订单创建时即拆分为主订单(套餐)和子订单(单品)
- 实现订单状态的同步机制,确保主子订单状态一致
- 提供统一的订单查询接口,透明化拆单逻辑
五、测试与上线策略
1. 单元测试:覆盖所有核心业务逻辑
2. 集成测试:验证各模块间交互
3. 压力测试:模拟高峰期套餐销售场景
4. 灰度发布:先上线部分区域或部分用户
5. 监控体系:建立套餐销售关键指标监控
六、运营与优化
1. 数据分析:跟踪套餐转化率、客单价提升等指标
2. A/B测试:对比不同套餐展示方式的效果
3. 用户反馈:收集用户对套餐的满意度和改进建议
4. 动态调整:根据销售数据动态调整套餐内容和价格
通过以上方案,美团买菜系统可以实现高效、灵活的组合套餐销售功能,提升用户体验和平台收益。