一、套餐组合销售功能概述
在叮咚买菜系统中实现套餐组合销售功能,可以提升用户购买体验、增加客单价并优化库存管理。该功能需要支持以下核心能力:
1. 套餐创建与管理
2. 套餐展示与推荐
3. 套餐购买流程
4. 库存与价格联动
5. 数据分析与优化
二、系统架构设计
1. 前端实现
页面组件:
- 套餐专区首页(轮播图、分类导航)
- 套餐详情页(商品组合展示、原价/套餐价对比)
- 套餐选择器(可选商品替换、数量调整)
- 购物车套餐展示(与单品区分)
交互设计:
- 套餐商品可视化组合展示
- 动态价格计算(根据选择变化)
- 库存状态实时显示
- 套餐与单品切换入口
2. 后端服务
核心服务模块:
- 套餐管理服务(创建、编辑、上下架)
- 组合计算服务(价格、优惠、库存)
- 订单处理服务(套餐拆单、库存预占)
- 推荐服务(个性化套餐推荐)
数据库设计:
```
套餐表(package)
- id: 主键
- name: 套餐名称
- description: 描述
- original_price: 原价总和
- package_price: 套餐价
- discount_type: 折扣类型
- status: 状态
- create_time: 创建时间
套餐商品关系表(package_items)
- id: 主键
- package_id: 套餐ID
- product_id: 商品ID
- quantity: 数量
- is_optional: 是否可选
- default_selected: 默认是否选中
套餐规则表(package_rules)
- id: 主键
- package_id: 套餐ID
- rule_type: 规则类型(互斥/依赖等)
- target_product_id: 目标商品ID
- condition: 条件
```
三、核心功能实现
1. 套餐创建与管理
```python
套餐创建示例代码
class PackageService:
def create_package(self, name, description, items, price):
验证商品是否存在
for item in items:
if not ProductService.check_exists(item[product_id]):
raise Exception("商品不存在")
计算原价总和
original_price = sum(
ProductService.get_price(item[product_id]) * item[quantity]
for item in items
)
创建套餐记录
package = Package(
name=name,
description=description,
original_price=original_price,
package_price=price,
status=1 上架状态
)
package.save()
创建套餐商品关系
for item in items:
PackageItem(
package_id=package.id,
product_id=item[product_id],
quantity=item[quantity],
is_optional=item.get(is_optional, False),
default_selected=item.get(default_selected, True)
).save()
return package
```
2. 套餐价格计算
```javascript
// 前端套餐价格计算
function calculatePackagePrice(packageData, selectedItems) {
let total = 0;
let originalTotal = 0;
packageData.items.forEach(item => {
const product = findProductById(item.product_id);
const itemPrice = product.price * item.quantity;
originalTotal += itemPrice;
if (selectedItems.includes(item.product_id) || item.default_selected) {
total += itemPrice;
}
});
// 应用套餐折扣
const discountedPrice = total * (1 - packageData.discount_rate);
return {
originalPrice: originalTotal,
packagePrice: Math.max(discountedPrice, packageData.min_price),
saved: originalTotal - discountedPrice
};
}
```
3. 库存管理
```java
// 套餐库存检查
public boolean checkPackageStock(Long packageId, int quantity) {
Package package = packageRepository.findById(packageId);
for (PackageItem item : package.getItems()) {
Product product = productRepository.findById(item.getProductId());
int requiredStock = item.getQuantity() * quantity;
if (product.getStock() < requiredStock) {
return false;
}
}
return true;
}
// 下单时扣减库存
public void reservePackageStock(Long packageId, int quantity) {
Package package = packageRepository.findById(packageId);
for (PackageItem item : package.getItems()) {
Product product = productRepository.findById(item.getProductId());
int requiredStock = item.getQuantity() * quantity;
product.setStock(product.getStock() - requiredStock);
productRepository.save(product);
}
}
```
四、关键业务逻辑
1. 套餐有效性验证
- 检查所有必选商品是否都有库存
- 验证可选商品的选择是否符合规则
- 检查套餐是否在有效期内
2. 价格计算规则
- 固定折扣套餐:直接显示套餐价
- 满减套餐:满足条件后显示减免后价格
- 换购套餐:主商品+换购商品组合价
3. 购物车合并逻辑
- 套餐内商品单独购买时提示可加入套餐更优惠
- 已加入购物车的单品与套餐冲突时的处理
- 修改套餐内商品数量时的价格动态更新
五、用户体验优化
1. 智能推荐:
- 基于用户历史购买记录推荐相关套餐
- 季节性/节日性套餐推荐
- 清仓促销套餐推荐
2. 可视化展示:
- 套餐内商品图片矩阵展示
- 价格对比动画效果
- 节省金额突出显示
3. 灵活选择:
- 必选商品与可选商品区分
- 可选商品数量限制
- 商品替换建议功能
六、运营支持功能
1. 套餐分析看板:
- 套餐销售占比
- 各套餐转化率
- 库存周转率分析
2. A/B测试支持:
- 不同套餐组合的对比测试
- 价格敏感度测试
- 展示方式效果测试
3. 动态定价接口:
- 实时库存影响价格
- 竞品价格监控调整
- 促销活动自动调价
七、技术挑战与解决方案
1. 实时库存同步:
- 使用Redis缓存套餐库存
- 最终一致性保证
- 库存预占机制
2. 高性能计算:
- 套餐价格计算缓存
- 异步计算复杂套餐
- 分布式锁防止超卖
3. 复杂规则引擎:
- 使用Drools等规则引擎
- 规则可视化配置
- 规则版本控制
八、实施路线图
1. MVP版本:
- 基础套餐创建与展示
- 固定组合套餐购买
- 简单价格计算
2. 迭代优化:
- 增加可选商品功能
- 实现动态定价
- 添加推荐算法
3. 高级功能:
- 智能套餐生成
- 跨品类套餐组合
- 预测性库存管理
通过以上方案,叮咚买菜可以实现灵活高效的套餐组合销售功能,提升用户购买体验的同时优化运营效率。