010-53388338

美团买菜系统组合套餐销售功能设计与实现

分类:IT频道 时间:2026-02-21 19:40 浏览:16
概述
    一、功能概述    组合套餐销售是美团买菜系统中重要的营销功能,允许商家将多个商品打包销售,通常以优惠价格吸引顾客购买,提高客单价和商品周转率。    二、系统架构设计    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)}
  

  
  

  
   {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. 套餐对比:允许用户比较不同套餐内容
  
  通过以上设计和实现,美团买菜系统可以有效地支持组合套餐销售功能,提升用户体验和平台销售额。
评论
  • 下一篇

  • Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 8192 bytes) in /www/wwwroot/www.sjwxsc.com/config/function.php on line 274