一、套餐组合销售系统设计概述
叮咚买菜作为生鲜电商平台,实现套餐组合销售功能可以提升用户购买体验、增加客单价并优化库存管理。以下是系统开发的关键实现方案:
二、核心功能模块设计
1. 套餐管理模块
- 套餐创建:
- 支持自定义套餐名称、描述、图片
- 设定套餐价格(可设置折扣价或原价划线)
- 配置套餐有效期(限时特惠)
- 商品组合:
- 拖拽式商品选择界面
- 支持设置必选商品和可选商品
- 商品数量限制配置(如"3荤2素"套餐)
- 库存联动:
- 实时计算套餐内商品总库存
- 设置库存预警阈值
- 自动下架库存不足的套餐
2. 用户界面实现
- 套餐展示页:
- 专题卡片式展示(热销套餐、新品套餐等)
- 套餐内商品清单可视化展示
- 原价与套餐价对比显示
- 个性化推荐:
- 基于用户购买历史的套餐推荐
- 季节性/节日性套餐推荐
- 智能补货建议(如购买A商品推荐搭配B商品)
3. 订单处理系统
- 价格计算:
- 自动应用套餐折扣
- 支持满减、赠品等复合优惠
- 价格分摊逻辑(各商品显示分摊价格)
- 库存锁定:
- 套餐下单时同时锁定各组件商品库存
- 支付超时自动释放库存
- 部分商品缺货时的处理策略
三、技术实现要点
1. 数据库设计
```sql
-- 套餐主表
CREATE TABLE combo_packages (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
description TEXT,
original_price DECIMAL(10,2),
discount_price DECIMAL(10,2),
start_time DATETIME,
end_time DATETIME,
status TINYINT DEFAULT 1 COMMENT 1-上架 0-下架,
create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- 套餐商品关联表
CREATE TABLE combo_items (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
combo_id BIGINT NOT NULL,
product_id BIGINT NOT NULL,
quantity INT NOT NULL DEFAULT 1,
is_required TINYINT DEFAULT 1 COMMENT 1-必选 0-可选,
sort_order INT DEFAULT 0,
FOREIGN KEY (combo_id) REFERENCES combo_packages(id)
);
```
2. 核心业务逻辑
```java
// 套餐价格计算示例
public BigDecimal calculateComboPrice(Long comboId, Map selectedOptions) {
ComboPackage combo = comboRepository.findById(comboId);
BigDecimal total = BigDecimal.ZERO;
// 必选商品总价
List requiredItems = comboItemRepository.findRequiredItems(comboId);
for (ComboItem item : requiredItems) {
Product product = productRepository.findById(item.getProductId());
total = total.add(product.getPrice().multiply(BigDecimal.valueOf(item.getQuantity())));
}
// 可选商品总价(根据用户选择)
if (selectedOptions != null) {
for (Map.Entry entry : selectedOptions.entrySet()) {
ComboItem item = comboItemRepository.findByComboAndProduct(comboId, entry.getKey());
if (item != null) {
Product product = productRepository.findById(item.getProductId());
total = total.add(product.getPrice().multiply(BigDecimal.valueOf(entry.getValue())));
}
}
}
// 应用套餐折扣
return total.multiply(combo.getDiscountRate());
}
```
3. 库存同步机制
- 采用Redis分布式锁保证库存操作的原子性
- 套餐下单时:
```java
public boolean reserveComboStock(Long comboId, int quantity) {
ComboPackage combo = comboRepository.findById(comboId);
List items = comboItemRepository.findByComboId(comboId);
// 获取所有商品的分布式锁
Map locks = new HashMap<>();
for (ComboItem item : items) {
locks.put(item.getProductId(), redissonClient.getLock("product_stock_" + item.getProductId()));
}
try {
// 尝试获取所有锁
boolean allLocked = true;
for (RLock lock : locks.values()) {
allLocked = allLocked && lock.tryLock(5, 10, TimeUnit.SECONDS);
}
if (allLocked) {
// 检查各商品库存
for (ComboItem item : items) {
Product product = productRepository.findById(item.getProductId());
if (product.getStock() < item.getQuantity() * quantity) {
return false; // 库存不足
}
}
// 扣减库存(实际扣减在订单支付成功后)
// 这里可以记录预扣减信息
return true;
}
} finally {
// 释放所有锁
for (RLock lock : locks.values()) {
if (lock.isLocked() && lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
}
return false;
}
```
四、运营与营销功能
1. 套餐分析看板:
- 各套餐销售数据统计
- 套餐与单品销售对比
- 用户购买套餐的频次分析
2. 动态定价系统:
- 根据库存情况自动调整套餐价格
- 竞品价格监控与自动调价
- 促销活动期间的智能定价
3. AB测试功能:
- 不同套餐组合的转化率测试
- 价格敏感度测试
- 页面展示方式的优化测试
五、实施路线图
1. 第一阶段(1个月):
- 基础套餐管理功能开发
- 套餐展示页面实现
- 简单套餐(固定组合)支持
2. 第二阶段(1个月):
- 可选商品功能开发
- 库存联动系统实现
- 基础数据分析
3. 第三阶段(1个月):
- 智能推荐系统集成
- 动态定价功能
- 完整运营后台
六、风险与应对
1. 库存超卖风险:
- 实施严格的库存预扣机制
- 设置合理的超卖补偿方案
2. 用户体验风险:
- 套餐变更时的用户通知
- 缺货时的智能替换建议
3. 系统性能风险:
- 套餐计算服务独立部署
- 热点数据缓存优化
通过以上方案,叮咚买菜可以实现高效、灵活的套餐组合销售系统,既提升用户体验,又优化运营效率,最终实现平台GMV的增长。