010-53388338

美团买菜系统优惠券设计:全平台通用与业务场景灵活应用

分类:IT频道 时间:2025-09-16 18:30 浏览:81
概述
    一、功能概述    美团买菜系统的优惠券通用功能需要支持多种类型的优惠券(满减券、折扣券、无门槛券等)在全平台(APP、小程序、H5等)通用,并能在不同业务场景(商品购买、配送服务、会员服务等)下灵活使用。    二、系统架构设计    1.核心模块划分  -优惠券中心:管理优惠券模板、发放
内容
  
   一、功能概述
  
  美团买菜系统的优惠券通用功能需要支持多种类型的优惠券(满减券、折扣券、无门槛券等)在全平台(APP、小程序、H5等)通用,并能在不同业务场景(商品购买、配送服务、会员服务等)下灵活使用。
  
   二、系统架构设计
  
   1. 核心模块划分
  - 优惠券中心:管理优惠券模板、发放、查询等
  - 订单系统:处理订单计算时优惠券的应用逻辑
  - 用户系统:管理用户优惠券的领取、持有和使用
  - 风控系统:防止优惠券滥用和欺诈行为
  - 通知系统:优惠券发放、使用、过期等通知
  
   2. 数据库设计
  ```
   优惠券模板表
  coupon_template (
   id BIGINT PRIMARY KEY,
   name VARCHAR(100),
   type ENUM(满减,折扣,无门槛),
   discount_type ENUM(金额,比例),
   discount_value DECIMAL(10,2),
   min_order_amount DECIMAL(10,2),    满减门槛
   valid_days INT,    生效天数
   start_time DATETIME,    固定生效时间
   end_time DATETIME,
   total_count INT,    发放总量
   remaining_count INT,    剩余数量
   user_limit INT,    每人限领数量
   scope ENUM(全平台,特定品类,特定商品),
   status TINYINT,    状态
   create_time DATETIME,
   update_time DATETIME
  )
  
   用户优惠券表
  user_coupon (
   id BIGINT PRIMARY KEY,
   user_id BIGINT,
   template_id BIGINT,
   status ENUM(未使用,已使用,已过期),
   order_id BIGINT,    使用订单ID
   get_time DATETIME,
   use_time DATETIME,
   expire_time DATETIME,
   FOREIGN KEY (template_id) REFERENCES coupon_template(id)
  )
  
   优惠券使用范围表
  coupon_scope (
   id BIGINT PRIMARY KEY,
   template_id BIGINT,
   scope_type ENUM(品类,商品,店铺,全平台),
   scope_id VARCHAR(50),    品类ID/商品ID等
   FOREIGN KEY (template_id) REFERENCES coupon_template(id)
  )
  ```
  
   三、核心功能实现
  
   1. 优惠券发放
  ```java
  public class CouponService {
  
   // 发放优惠券给用户
   public boolean grantCoupon(Long userId, Long templateId) {
   CouponTemplate template = couponTemplateDao.findById(templateId);
   if (template == null || template.getRemainingCount() <= 0) {
   return false;
   }
  
   // 检查用户是否已达领取上限
   int userCount = userCouponDao.countByUserIdAndTemplateId(userId, templateId);
   if (userCount >= template.getUserLimit()) {
   return false;
   }
  
   // 创建用户优惠券
   UserCoupon userCoupon = new UserCoupon();
   userCoupon.setUserId(userId);
   userCoupon.setTemplateId(templateId);
   userCoupon.setStatus(CouponStatus.UNUSED);
   userCoupon.setExpireTime(calculateExpireTime(template));
  
   userCouponDao.save(userCoupon);
   couponTemplateDao.decreaseRemainingCount(templateId);
  
   // 发送领取通知
   notificationService.sendCouponGrantedNotification(userId, templateId);
  
   return true;
   }
  
   private Date calculateExpireTime(CouponTemplate template) {
   if (template.getValidDays() > 0) {
   return DateUtils.addDays(new Date(), template.getValidDays());
   }
   return template.getEndTime();
   }
  }
  ```
  
   2. 优惠券使用
  ```java
  public class OrderService {
  
   // 计算订单可用优惠券
   public List getAvailableCoupons(Long userId, BigDecimal orderAmount, List categoryIds) {
   return userCouponDao.findByConditions(
   userId,
   CouponStatus.UNUSED,
   orderAmount,
   categoryIds
   );
   }
  
   // 使用优惠券
   public boolean useCoupon(Long userId, Long couponId, Long orderId) {
   UserCoupon userCoupon = userCouponDao.findByIdAndUserId(couponId, userId);
   if (userCoupon == null || userCoupon.getStatus() != CouponStatus.UNUSED) {
   return false;
   }
  
   // 验证优惠券是否适用于当前订单
   if (!validateCouponApplicability(userCoupon, orderId)) {
   return false;
   }
  
   // 更新优惠券状态
   userCoupon.setStatus(CouponStatus.USED);
   userCoupon.setUseTime(new Date());
   userCoupon.setOrderId(orderId);
   userCouponDao.update(userCoupon);
  
   return true;
   }
  
   private boolean validateCouponApplicability(UserCoupon userCoupon, Long orderId) {
   // 实现优惠券适用范围验证逻辑
   // 包括:有效期、商品范围、订单金额门槛等
   // ...
   }
  }
  ```
  
   3. 订单价格计算
  ```java
  public class PriceCalculator {
  
   public OrderPrice calculateOrderPrice(Order order, UserCoupon usedCoupon) {
   OrderPrice price = new OrderPrice(order.getOriginalTotal());
  
   if (usedCoupon != null) {
   CouponTemplate template = couponTemplateDao.findById(usedCoupon.getTemplateId());
  
   switch (template.getType()) {
   case FIXED_DISCOUNT:
   // 满减券
   if (order.getOriginalTotal().compareTo(template.getMinOrderAmount()) >= 0) {
   price.setDiscountAmount(template.getDiscountValue());
   }
   break;
   case PERCENTAGE_DISCOUNT:
   // 折扣券
   BigDecimal discount = order.getOriginalTotal()
   .multiply(template.getDiscountValue())
   .divide(new BigDecimal(100), 2, RoundingMode.DOWN);
   price.setDiscountAmount(discount);
   break;
   case NO_THRESHOLD:
   // 无门槛券
   price.setDiscountAmount(template.getDiscountValue());
   break;
   }
  
   price.setFinalTotal(order.getOriginalTotal().subtract(price.getDiscountAmount()));
   }
  
   return price;
   }
  }
  ```
  
   四、关键业务规则实现
  
   1. 优惠券适用范围验证
  ```java
  public class CouponScopeValidator {
  
   public boolean isCouponApplicable(CouponTemplate template, Order order) {
   // 1. 检查有效期
   if (new Date().after(template.getEndTime())) {
   return false;
   }
  
   // 2. 检查商品范围
   if (template.getScope() != CouponScope.ALL) {
   List applicableCategoryIds = getApplicableCategoryIds(template);
   boolean hasApplicableItems = order.getItems().stream()
   .anyMatch(item -> applicableCategoryIds.contains(item.getCategoryId()));
   if (!hasApplicableItems) {
   return false;
   }
   }
  
   // 3. 检查订单金额门槛
   if (template.getMinOrderAmount().compareTo(order.getOriginalTotal()) > 0) {
   return false;
   }
  
   return true;
   }
  }
  ```
  
   2. 优惠券叠加使用限制
  ```java
  public class CouponCombinationValidator {
  
   public boolean canCombineWith(UserCoupon existingCoupon, UserCoupon newCoupon) {
   // 获取优惠券模板
   CouponTemplate existingTemplate = couponTemplateDao.findById(existingCoupon.getTemplateId());
   CouponTemplate newTemplate = couponTemplateDao.findById(newCoupon.getTemplateId());
  
   // 规则1:同类型优惠券不可叠加
   if (existingTemplate.getType().equals(newTemplate.getType())) {
   return false;
   }
  
   // 规则2:特定活动优惠券不可与其他优惠券叠加
   if (existingTemplate.isExclusive() || newTemplate.isExclusive()) {
   return false;
   }
  
   // 其他业务规则...
  
   return true;
   }
  }
  ```
  
   五、系统优化与扩展
  
   1. 性能优化
  - 使用Redis缓存热门优惠券模板和用户优惠券列表
  - 对优惠券查询接口实现分页和异步加载
  - 使用布隆过滤器快速判断用户是否有可用优惠券
  
   2. 扩展功能
  - 优惠券分享功能:用户可将优惠券分享给好友
  - 优惠券裂变:用户邀请好友可获得额外优惠券
  - 优惠券组合:支持将多张优惠券组合成券包
  - 地理位置限制:支持按配送区域限制优惠券使用
  
   3. 监控与报警
  - 监控优惠券发放和使用量
  - 报警机制:当优惠券库存不足或使用异常时触发
  - 数据分析:优惠券领取率、使用率、核销率等指标
  
   六、测试用例示例
  
   1. 优惠券使用场景测试
  ```
  场景:用户使用满100减20优惠券
  前提:
  - 用户拥有1张满100减20优惠券,有效期至2023-12-31
  - 用户购物车中有商品总价120元
  
  步骤:
  1. 用户进入结算页面
  2. 系统自动匹配适用优惠券
  3. 用户选择使用满100减20优惠券
  4. 系统计算最终价格应为100元
  5. 用户完成支付
  6. 验证优惠券状态变为"已使用"
  7. 验证订单记录中使用了正确的优惠券
  
  预期结果:
  - 优惠券正确应用,订单金额正确计算
  - 优惠券状态更新正确
  - 系统无错误日志
  ```
  
   2. 优惠券过期处理测试
  ```
  场景:优惠券过期自动失效
  前提:
  - 用户拥有1张有效期至2023-12-01的优惠券
  - 当前日期为2023-12-02
  
  步骤:
  1. 查询用户优惠券列表
  2. 检查过期优惠券状态
  
  预期结果:
  - 过期优惠券状态自动更新为"已过期"
  - 过期优惠券不再出现在可用优惠券列表中
  ```
  
   七、部署与运维
  
  1. 灰度发布:先在部分区域或用户群体上线新功能
  2. 回滚机制:准备快速回滚方案以防出现问题
  3. 数据迁移:如需修改数据库结构,准备数据迁移脚本
  4. 监控指标:
   - 优惠券发放成功率
   - 优惠券使用率
   - 系统响应时间
   - 错误率
  
  通过以上设计和实现,美团买菜系统可以构建一个灵活、高效、可靠的优惠券通用功能,支持各种营销活动需求,同时保证系统性能和用户体验。
评论
  • 上一篇