一、需求分析
组合套餐销售是美团买菜系统中提升客单价和用户购买体验的重要功能,主要需求包括:
1. 套餐创建与管理:支持商家灵活创建不同类型套餐
2. 智能推荐:根据用户购买习惯推荐合适套餐
3. 价格计算:自动计算套餐优惠价与单品总价对比
4. 库存管理:套餐与单品库存联动
5. 订单处理:支持套餐拆单与物流跟踪
二、系统架构设计
1. 核心模块
```
套餐管理系统
├── 套餐配置模块
├── 价格计算引擎
├── 库存同步服务
├── 推荐算法服务
└── 订单处理模块
```
2. 数据库设计
套餐主表(combo_package)
```
id | name | description | original_price | discount_price | start_time | end_time | status
```
套餐商品关联表(combo_items)
```
id | combo_id | item_id | quantity | is_required
```
套餐规则表(combo_rules)
```
id | combo_id | rule_type | condition | discount_value
```
三、关键功能实现
1. 套餐创建与管理
```java
// 套餐创建DTO
public class ComboCreateDTO {
private String name;
private String description;
private BigDecimal originalPrice;
private BigDecimal discountPrice;
private List
items;
private LocalDateTime startTime;
private LocalDateTime endTime;
}
// 套餐服务实现
@Service
public class ComboServiceImpl implements ComboService {
@Transactional
public Long createCombo(ComboCreateDTO dto) {
// 1. 创建套餐主记录
ComboPackage combo = convertToEntity(dto);
comboRepository.save(combo);
// 2. 创建套餐商品关联
List items = dto.getItems().stream()
.map(item -> new ComboItem(combo.getId(), item.getItemId(), item.getQuantity()))
.collect(Collectors.toList());
comboItemRepository.saveAll(items);
return combo.getId();
}
}
```
2. 价格计算引擎
```java
public class PriceCalculator {
public PriceCalculationResult calculate(Long comboId, Set selectedItems) {
// 获取套餐信息
ComboPackage combo = comboRepository.findById(comboId)
.orElseThrow(() -> new RuntimeException("套餐不存在"));
// 计算原价
BigDecimal originalPrice = BigDecimal.ZERO;
for (ComboItem item : combo.getItems()) {
Product product = productRepository.findById(item.getItemId())
.orElseThrow(() -> new RuntimeException("商品不存在"));
originalPrice = originalPrice.add(product.getPrice().multiply(
BigDecimal.valueOf(item.getQuantity())));
}
// 计算优惠价
BigDecimal discountPrice = combo.getDiscountPrice();
return new PriceCalculationResult(originalPrice, discountPrice,
originalPrice.subtract(discountPrice));
}
}
```
3. 库存同步机制
```java
@Service
public class InventorySyncService {
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void reserveInventoryForCombo(Long comboId, int quantity) {
ComboPackage combo = comboRepository.findById(comboId)
.orElseThrow(() -> new RuntimeException("套餐不存在"));
// 锁定套餐内所有商品的库存
for (ComboItem item : combo.getItems()) {
productInventoryRepository.lockInventory(
item.getItemId(),
item.getQuantity() * quantity
);
}
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void releaseInventoryForCombo(Long comboId, int quantity) {
// 释放库存的逆向操作
// ...
}
}
```
4. 推荐算法实现
```python
class ComboRecommender:
def recommend(self, user_id, cart_items):
1. 获取用户历史购买数据
user_history = self.user_service.get_purchase_history(user_id)
2. 分析购物车内容
cart_categories = self._analyze_cart_categories(cart_items)
3. 匹配适合的套餐
candidates = self.combo_repository.find_active_combos()
4. 计算匹配分数
scored_combos = []
for combo in candidates:
score = self._calculate_match_score(combo, cart_categories, user_history)
scored_combos.append((combo, score))
5. 返回top N推荐
return sorted(scored_combos, key=lambda x: x[1], reverse=True)[:5]
def _calculate_match_score(self, combo, cart_categories, user_history):
实现基于商品类别、用户偏好和互补性的评分逻辑
...
```
三、前端展示方案
1. 套餐展示组件
```jsx
function ComboCard({ combo }) {
const [showDetails, setShowDetails] = useState(false);
return (
{combo.name}
¥{combo.originalPrice.toFixed(2)}
¥{combo.discountPrice.toFixed(2)}
{showDetails && (
包含商品:
{combo.items.map(item => (
{item.name} × {item.quantity}
))}
)}
);
}
```
四、技术挑战与解决方案
1. 库存超卖问题
- 解决方案:采用分布式锁+数据库事务确保库存操作的原子性
2. 套餐价格实时计算
- 解决方案:使用Redis缓存商品价格,监听价格变更事件实时更新套餐价
3. 推荐算法性能
- 解决方案:离线计算用户画像,实时推荐时只需简单匹配
4. 套餐变更处理
- 解决方案:维护套餐版本历史,订单创建时锁定套餐快照
五、测试策略
1. 单元测试:覆盖价格计算、库存同步等核心逻辑
2. 集成测试:验证套餐创建-展示-下单全流程
3. 性能测试:模拟高并发场景下的套餐推荐和库存锁定
4. A/B测试:比较不同套餐展示方式对转化率的影响
六、部署与监控
1. 灰度发布:先在小范围用户群测试新功能
2. 监控指标:
- 套餐购买转化率
- 库存同步延迟
- 推荐点击率
3. 告警机制:库存不足、价格计算异常等关键指标告警
七、优化方向
1. 动态套餐:根据季节/库存自动生成推荐套餐
2. 社交分享:用户可自定义套餐并分享
3. 智能补货:基于套餐销售数据预测库存需求
4. 跨店套餐:支持不同仓库商品组合销售
通过以上实现方案,美团买菜系统可以有效支持组合套餐销售功能,提升用户购买体验和平台销售业绩。