一、功能概述 组合套餐销售是美团买菜系统中重要的营销功能,允许商家将多个商品打包销售,通常以优惠价格吸引顾客购买,提高客单价和商品周转率。 二、系统架构设计 1.前端组件 -套餐展示组件:在商品列表和详情页展示套餐信息 -套餐选择器:允许用户选择套餐内商品规格/数量
一、功能概述
组合套餐销售是美团买菜系统中重要的营销功能,允许商家将多个商品打包销售,通常以优惠价格吸引顾客购买,提高客单价和商品周转率。
二、系统架构设计
1. 前端组件
- 套餐展示组件:在商品列表和详情页展示套餐信息
- 套餐选择器:允许用户选择套餐内商品规格/数量
- 价格计算器:实时显示套餐原价与优惠价对比
- 购物车集成:将套餐作为特殊商品类型处理
2. 后端服务
- 套餐管理服务:创建/编辑/删除套餐
- 价格计算服务:根据套餐规则计算最终价格
- 库存服务:检查套餐内所有商品的库存
- 订单服务:处理套餐订单的创建和拆分
3. 数据库设计
```sql
-- 套餐主表
CREATE TABLE combo_packages (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
description TEXT,
start_time DATETIME,
end_time DATETIME,
status TINYINT COMMENT 1-上架 0-下架,
created_at DATETIME,
updated_at DATETIME
);
-- 套餐商品关联表
CREATE TABLE combo_items (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
package_id BIGINT NOT NULL,
product_id BIGINT NOT NULL,
quantity INT NOT NULL DEFAULT 1,
original_price DECIMAL(10,2) NOT NULL,
discount_price DECIMAL(10,2) NOT NULL,
sort_order INT DEFAULT 0,
FOREIGN KEY (package_id) REFERENCES combo_packages(id)
);
-- 套餐规则表(可选)
CREATE TABLE combo_rules (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
package_id BIGINT NOT NULL,
rule_type TINYINT COMMENT 1-满减 2-折扣 3-固定价,
rule_value DECIMAL(10,2) NOT NULL,
min_items INT COMMENT 满足条件的最小商品数,
FOREIGN KEY (package_id) REFERENCES combo_packages(id)
);
```
三、核心功能实现
1. 套餐创建流程
```java
// 伪代码示例
public class ComboService {
public ComboPackage createCombo(ComboCreateRequest request) {
// 1. 验证商品是否存在且可售
validateProducts(request.getProductIds());
// 2. 计算套餐总价和优惠价
ComboPriceCalculator calculator = new ComboPriceCalculator();
ComboPriceResult priceResult = calculator.calculate(request);
// 3. 创建套餐记录
ComboPackage package = new ComboPackage();
package.setName(request.getName());
package.setDescription(request.getDescription());
// 设置其他字段...
// 4. 保存套餐商品关系
List
items = new ArrayList<>(); for (ComboItemRequest itemRequest : request.getItems()) { ComboItem item = new ComboItem(); item.setProductId(itemRequest.getProductId()); item.setQuantity(itemRequest.getQuantity()); item.setOriginalPrice(itemRequest.getOriginalPrice()); item.setDiscountPrice(itemRequest.getDiscountPrice()); items.add(item); } // 5. 保存到数据库 comboRepository.save(package); comboItemRepository.saveAll(items); return package; } } ``` 2. 价格计算逻辑 ```java public class ComboPriceCalculator { public ComboPriceResult calculate(ComboCreateRequest request) { double totalOriginalPrice = 0; double totalDiscountPrice = 0; for (ComboItemRequest item : request.getItems()) { totalOriginalPrice += item.getOriginalPrice() * item.getQuantity(); totalDiscountPrice += item.getDiscountPrice() * item.getQuantity(); } // 应用额外规则(如满减) if (request.getRuleType() == RuleType.FULL_REDUCTION) { if (totalDiscountPrice >= request.getRuleValue()) { totalDiscountPrice -= request.getExtraDiscount(); } } return new ComboPriceResult(totalOriginalPrice, totalDiscountPrice); } } ``` 3. 库存检查实现 ```java public class InventoryChecker { public boolean checkComboInventory(Long packageId, int quantity) { List items = comboItemRepository.findByPackageId(packageId); for (ComboItem item : items) { Product product = productRepository.findById(item.getProductId()) .orElseThrow(() -> new RuntimeException("Product not found")); int requiredStock = item.getQuantity() * quantity; if (product.getStock() < requiredStock) { return false; } } return true; } } ``` 4. 订单处理逻辑 ```java public class OrderService { public Order createOrderWithCombo(OrderCreateRequest request) { // 1. 检查套餐库存 if (!inventoryChecker.checkComboInventory(request.getPackageId(), request.getQuantity())) { throw new RuntimeException("库存不足"); } // 2. 创建订单主记录 Order order = new Order(); // 设置订单基本信息... // 3. 获取套餐商品信息 List items = comboItemRepository.findByPackageId(request.getPackageId()); // 4. 创建订单商品项 List orderItems = new ArrayList<>(); for (ComboItem item : items) { OrderItem orderItem = new OrderItem(); orderItem.setProductId(item.getProductId()); orderItem.setQuantity(item.getQuantity() * request.getQuantity()); orderItem.setPrice(item.getDiscountPrice()); // 设置其他字段... orderItems.add(orderItem); } // 5. 保存订单 order.setItems(orderItems); orderRepository.save(order); // 6. 扣减库存 deductInventory(orderItems); return order; } } ``` 四、前端实现要点 1. 套餐展示组件 ```jsx function ComboPackageCard({ packageData }) { const [selectedQuantity, setSelectedQuantity] = useState(1); const totalOriginalPrice = packageData.items.reduce( (sum, item) => sum + (item.originalPrice * item.quantity), 0 ); const totalDiscountPrice = packageData.items.reduce( (sum, item) => sum + (item.discountPrice * item.quantity), 0 ) * selectedQuantity; return ( {packageData.name} {packageData.description}
{packageData.items.map(item => (
{item.productName} × {item.quantity}
))}
¥{totalOriginalPrice.toFixed(2)} ¥{totalDiscountPrice.toFixed(2)}
setSelectedQuantity(Math.max(1, selectedQuantity - 1))}>- {selectedQuantity} setSelectedQuantity(selectedQuantity + 1)}>+
addToCart(packageData.id, selectedQuantity)}> 加入购物车 ); } ``` 2. 购物车集成 ```jsx function ShoppingCart() { const [cartItems, setCartItems] = useState([]); // 处理添加套餐到购物车 const handleAddComboToCart = (packageId, quantity) => { fetchComboDetails(packageId).then(packageData => { const comboItem = { id: `combo_${packageId}_${Date.now()}`, // 临时ID type: combo, packageId, name: packageData.name, image: packageData.image, quantity, originalPrice: packageData.items.reduce( (sum, item) => sum + (item.originalPrice * item.quantity), 0 ), discountPrice: packageData.items.reduce( (sum, item) => sum + (item.discountPrice * item.quantity), 0 ) * quantity, items: packageData.items.map(item => ({ productId: item.productId, quantity: item.quantity * quantity })) }; setCartItems(prev => [...prev, comboItem]); }); }; // 渲染购物车中的套餐项 const renderCartItems = () => { return cartItems.map(item => ( {item.type === combo ? (
<>
{item.name} {item.items.map((subItem, idx) => (
{subItem.productName} × {subItem.quantity}
))}
>
) : (
// 普通商品渲染...
)}
¥{item.discountPrice.toFixed(2)}
)); }; return ( {renderCartItems()}
总计: ¥{cartItems.reduce((sum, item) => sum + item.discountPrice, 0).toFixed(2)}
); } ``` 五、关键业务规则 1. 库存锁定规则: - 用户下单时锁定套餐内所有商品的库存 - 支付超时或取消订单时释放库存 - 订单完成后实际扣减库存 2. 价格计算规则: - 套餐价格可以低于单品价格总和 - 支持多种优惠方式:固定价、折扣价、满减等 - 价格计算需考虑商品规格和数量 3. 套餐有效性检查: - 检查套餐是否在有效期内 - 检查套餐内所有商品是否可售 - 检查用户是否已购买过限购套餐 4. 退换货规则: - 套餐整体退货或部分商品退货 - 退款金额按比例计算 - 退货后恢复相应商品库存 六、性能优化建议 1. 缓存策略: - 缓存热门套餐详情 - 缓存套餐价格计算结果 - 使用Redis存储套餐库存快照 2. 数据库优化: - 对套餐商品表建立复合索引 - 使用读写分离处理查询和写入 - 考虑使用NoSQL存储套餐规则 3. 异步处理: - 异步更新套餐访问统计 - 异步处理库存预警 - 异步生成套餐推荐 4. 批量操作: - 批量查询套餐商品信息 - 批量更新库存 - 批量生成订单项 七、扩展功能考虑 1. 动态套餐:根据用户购买历史推荐个性化套餐 2. 限时抢购套餐:结合秒杀功能实现限时优惠 3. 分享有礼:用户分享套餐链接获得额外优惠 4. 套餐评价:收集用户对套餐的反馈 5. 套餐对比:允许用户比较不同套餐内容 通过以上设计和实现,美团买菜系统可以有效地支持组合套餐销售功能,提升用户体验和平台销售额。