一、功能概述
组合套餐销售是美团买菜系统中提升客单价、促进商品销售的重要功能,允许商家将多个商品打包销售,提供优惠价格吸引用户购买。
二、系统架构设计
1. 前端展示层
- 套餐展示页面:展示套餐图片、名称、原价、套餐价、节省金额
- 套餐详情页:展示包含商品列表、规格、数量及套餐规则
- 购物车集成:支持单独购买或选择套餐购买
2. 后端服务层
- 套餐管理服务:套餐CRUD、上下架、库存管理
- 价格计算服务:实时计算套餐价格及优惠
- 订单处理服务:处理套餐订单的拆单、库存预占等
3. 数据存储层
- MySQL:存储套餐基础信息、规则配置
- Redis:缓存热门套餐数据、库存信息
- MongoDB:存储套餐与商品的关联关系(可选)
三、核心功能实现
1. 套餐模型设计
```java
// 套餐实体类示例
public class ComboPackage {
private Long id;
private String name;
private String description;
private BigDecimal originalPrice; // 原价总和
private BigDecimal packagePrice; // 套餐价
private Integer status; // 0-下架 1-上架
private Date createTime;
private Date updateTime;
private List
items; // 套餐包含商品 private List rules; // 购买规则 } // 套餐商品项 public class ComboItem { private Long skuId; private Integer quantity; private BigDecimal unitPrice; } // 套餐规则 public class ComboRule { private Integer minPurchase; // 最小购买数量 private Integer maxPurchase; // 最大购买数量 private String timeRange; // 限购时间段 private String userLimit; // 用户限购规则 } ``` 2. 核心业务逻辑实现 套餐价格计算 ```java public BigDecimal calculatePackagePrice(ComboPackage package) { // 计算原价总和 BigDecimal originalTotal = package.getItems().stream() .map(item -> item.getUnitPrice().multiply(BigDecimal.valueOf(item.getQuantity()))) .reduce(BigDecimal.ZERO, BigDecimal::add); // 返回套餐价(已包含优惠) return package.getPackagePrice(); // 实际业务中可能需要更复杂的优惠计算逻辑 } ``` 库存检查与预占 ```java public boolean checkAndReserveInventory(ComboPackage package, int quantity) { for (ComboItem item : package.getItems()) { // 检查每个商品的库存 boolean hasStock = inventoryService.checkStock( item.getSkuId(), item.getQuantity() * quantity ); if (!hasStock) { return false; } } // 预占库存(使用事务) for (ComboItem item : package.getItems()) { inventoryService.reserve( item.getSkuId(), item.getQuantity() * quantity ); } return true; } ``` 3. 订单处理逻辑 ```java public Order createPackageOrder(User user, ComboPackage package, int quantity) { // 1. 检查库存并预占 if (!checkAndReserveInventory(package, quantity)) { throw new BusinessException("库存不足"); } // 2. 创建订单主表 Order order = new Order(); order.setUserId(user.getId()); order.setTotalAmount(package.getPackagePrice().multiply(BigDecimal.valueOf(quantity))); order.setActualAmount(order.getTotalAmount()); // 假设无其他优惠 order.setStatus(OrderStatus.UNPAID); orderDao.save(order); // 3. 创建订单商品明细(套餐作为整体) OrderItem mainItem = new OrderItem(); mainItem.setOrderId(order.getId()); mainItem.setSkuId(package.getId()); // 使用套餐ID作为SKU mainItem.setQuantity(quantity); mainItem.setPrice(package.getPackagePrice()); mainItem.setItemType(ItemType.PACKAGE); orderItemDao.save(mainItem); // 4. 创建套餐内商品明细(可选,用于库存扣减和财务核算) for (ComboItem item : package.getItems()) { OrderItem subItem = new OrderItem(); subItem.setOrderId(order.getId()); subItem.setSkuId(item.getSkuId()); subItem.setQuantity(item.getQuantity() * quantity); subItem.setPrice(item.getUnitPrice()); subItem.setItemType(ItemType.PACKAGE_SUB_ITEM); orderItemDao.save(subItem); } return order; } ``` 四、关键技术实现 1. 套餐与商品关系存储 - 方案1:关系型数据库存储(适合套餐结构稳定) ```sql CREATE TABLE combo_package ( id BIGINT PRIMARY KEY, name VARCHAR(100), price DECIMAL(10,2), status TINYINT ); CREATE TABLE combo_item ( id BIGINT PRIMARY KEY, package_id BIGINT, sku_id BIGINT, quantity INT, FOREIGN KEY (package_id) REFERENCES combo_package(id) ); ``` - 方案2:MongoDB文档存储(适合套餐频繁变更) ```json { "_id": ObjectId("..."), "name": "家庭蔬菜套餐", "price": 59.9, "items": [ {"skuId": "1001", "quantity": 2}, {"skuId": "1002", "quantity": 1} ] } ``` 2. 库存管理方案 - 方案A:套餐独立库存 - 每个套餐维护独立库存 - 优点:管理简单 - 缺点:无法灵活调整套餐内容 - 方案B:组件库存管理 - 套餐不维护库存,购买时检查各组件库存 - 优点:灵活调整套餐 - 缺点:高并发时库存检查压力大 - 推荐方案:混合模式 - 热门套餐预打包库存 - 其他套餐动态检查组件库存 3. 缓存策略 - 套餐基本信息:Redis缓存,TTL=5分钟 - 库存信息:Redis分布式锁+本地缓存 - 热门套餐:本地缓存+多级缓存 五、前端实现要点 1. 套餐展示组件 ```jsx function PackageCard({ package }) { return ( {package.name} ¥{package.originalPrice.toFixed(2)} ¥{package.packagePrice.toFixed(2)} 省¥{(package.originalPrice - package.packagePrice).toFixed(2)}
addToCart(package)}>加入购物车 ); } ``` 2. 购物车集成 ```jsx function CartItem({ item }) { if (item.type === package) { return ( {item.name} ¥{item.price.toFixed(2)} × {item.quantity}
包含商品: {item.items.map((subItem, index) => ( {subItem.name} × {subItem.quantity} ))} ); } // 普通商品渲染... } ``` 六、测试要点 1. 功能测试 - 套餐创建、编辑、删除 - 套餐上下架 - 套餐价格计算正确性 - 库存检查逻辑 2. 性能测试 - 高并发下套餐购买 - 库存检查接口响应时间 - 订单创建性能 3. 异常场景测试 - 套餐组件库存不足 - 套餐下架后购买尝试 - 价格变动场景 七、部署与监控 1. 部署方案 - 套餐服务独立部署,便于扩容 - 数据库分库分表(预期套餐数据量大时) 2. 监控指标 - 套餐购买成功率 - 库存检查接口QPS和响应时间 - 套餐服务错误率 3. 告警策略 - 套餐库存不足预警 - 套餐服务不可用告警 - 价格异常变动告警 八、扩展功能考虑 1. 动态套餐:根据用户购买历史推荐个性化套餐 2. 限时套餐:支持特定时间段的有效套餐 3. 加价购:主商品+低价附加商品组合 4. 满减套餐:满一定金额自动组成优惠套餐 通过以上方案,美团买菜系统可以实现高效、稳定的组合套餐销售功能,提升用户体验和平台销售额。