一、功能概述
组合套餐销售是美团买菜系统中重要的营销功能,允许商家将多个商品打包销售,提供优惠价格以吸引用户购买。该功能需要实现套餐创建、展示、购买和订单处理等全流程。
二、系统架构设计
1. 前端实现
- 套餐展示页面:
- 套餐卡片组件,展示套餐图片、名称、原价、套餐价、节省金额
- 套餐包含商品列表,可点击查看详情
- "加入购物车"和"立即购买"按钮
- 套餐详情页:
- 套餐详细信息展示
- 商品组合可视化展示
- 用户评价模块
- 推荐相似套餐
2. 后端服务
- 套餐管理服务:
- 套餐CRUD接口
- 套餐状态管理(上架/下架)
- 套餐库存同步
- 订单处理服务:
- 套餐订单创建
- 库存预扣
- 订单拆单处理(将套餐拆分为单个商品)
- 促销计算服务:
- 套餐价格计算
- 优惠规则应用
- 节省金额计算
三、核心功能实现
1. 套餐数据模型设计
```java
// 套餐主表
public class ComboPackage {
private Long id;
private String name;
private String description;
private BigDecimal originalPrice; // 原价总和
private BigDecimal comboPrice; // 套餐价
private Integer status; // 0-下架 1-上架
private Date createTime;
private Date updateTime;
// 其他字段...
}
// 套餐商品关联表
public class ComboItem {
private Long id;
private Long comboId;
private Long productId;
private Integer quantity;
private BigDecimal itemPrice; // 套餐中该商品的单价
// 其他字段...
}
```
2. 套餐创建流程
1. 商家后台选择商品组成套餐
2. 设置套餐价格(需小于商品原价总和)
3. 设置套餐库存(基于包含商品的最小库存)
4. 设置套餐有效期
5. 提交审核后上架
3. 购买流程实现
```java
// 伪代码示例
public Order createComboOrder(Long userId, Long comboId, Integer quantity) {
// 1. 验证套餐状态和库存
ComboPackage combo = comboService.getValidCombo(comboId);
if (combo == null || combo.getStock() < quantity) {
throw new BusinessException("套餐不可用或库存不足");
}
// 2. 锁定套餐库存
boolean lockSuccess = comboService.lockStock(comboId, quantity);
if (!lockSuccess) {
throw new BusinessException("库存锁定失败");
}
try {
// 3. 获取套餐包含的商品列表
List items = comboItemService.getItemsByComboId(comboId);
// 4. 创建订单(拆单为单个商品)
Order order = new Order();
order.setUserId(userId);
order.setTotalAmount(combo.getComboPrice().multiply(BigDecimal.valueOf(quantity)));
order.setActualAmount(order.getTotalAmount()); // 假设无其他优惠
order.setStatus(OrderStatus.UNPAID);
orderService.save(order);
// 5. 创建订单项(基于套餐商品)
for (ComboItem item : items) {
OrderItem orderItem = new OrderItem();
orderItem.setOrderId(order.getId());
orderItem.setProductId(item.getProductId());
orderItem.setQuantity(item.getQuantity() * quantity);
orderItem.setPrice(item.getItemPrice());
orderItemService.save(orderItem);
}
return order;
} catch (Exception e) {
// 回滚库存
comboService.unlockStock(comboId, quantity);
throw e;
}
}
```
4. 价格计算逻辑
```java
public BigDecimal calculateComboPrice(Long comboId, Integer quantity) {
ComboPackage combo = comboRepository.findById(comboId)
.orElseThrow(() -> new BusinessException("套餐不存在"));
// 计算套餐总价 = 套餐单价 * 数量
return combo.getComboPrice().multiply(BigDecimal.valueOf(quantity));
}
public BigDecimal calculateOriginalPrice(Long comboId) {
ComboPackage combo = comboRepository.findById(comboId)
.orElseThrow(() -> new BusinessException("套餐不存在"));
// 获取套餐中所有商品的原价总和
List items = comboItemRepository.findByComboId(comboId);
BigDecimal total = BigDecimal.ZERO;
for (ComboItem item : items) {
Product product = productRepository.findById(item.getProductId())
.orElseThrow(() -> new BusinessException("商品不存在"));
total = total.add(product.getPrice().multiply(BigDecimal.valueOf(item.getQuantity())));
}
return total;
}
```
四、关键技术挑战与解决方案
1. 库存同步问题
- 挑战:套餐库存需要与包含商品的库存保持一致
- 解决方案:
- 使用分布式锁确保库存操作的原子性
- 实现库存预扣机制,下单时锁定库存,支付成功后扣除
- 设置定时任务同步套餐库存与商品库存
2. 套餐价格计算
- 挑战:需要实时计算套餐优惠金额
- 解决方案:
- 缓存套餐原价和现价
- 使用计算服务隔离价格计算逻辑
- 实现价格快照机制,防止价格变动影响已创建订单
3. 订单拆单处理
- 挑战:需要将套餐订单拆分为单个商品订单以便履约
- 解决方案:
- 在订单创建时生成主订单和子订单
- 使用订单项关联套餐信息
- 实现订单状态同步机制
五、测试要点
1. 功能测试:
- 套餐创建、编辑、上下架流程
- 不同用户角色访问权限
- 套餐购买全流程
2. 性能测试:
- 高并发下套餐库存锁定
- 套餐价格计算响应时间
- 订单拆单处理效率
3. 异常测试:
- 库存不足时的处理
- 套餐下架后的购买尝试
- 支付失败后的库存回滚
六、部署与监控
1. 部署方案:
- 套餐服务独立部署,与商品服务解耦
- 使用容器化技术实现弹性伸缩
2. 监控指标:
- 套餐创建成功率
- 库存同步延迟
- 套餐购买转化率
- 价格计算服务响应时间
七、扩展功能建议
1. 智能推荐:根据用户购买历史推荐相关套餐
2. 限时抢购:实现套餐的限时特价功能
3. 多人拼团:支持多人拼团购买套餐
4. 套餐评价:用户对套餐的单独评价系统
通过以上方案,美团买菜系统可以实现稳定、高效的组合套餐销售功能,提升用户购买体验和平台营销能力。