美团买菜系统优惠券设计:全平台通用与业务场景灵活应用
分类: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. 监控指标:
- 优惠券发放成功率
- 优惠券使用率
- 系统响应时间
- 错误率
通过以上设计和实现,美团买菜系统可以构建一个灵活、高效、可靠的优惠券通用功能,支持各种营销活动需求,同时保证系统性能和用户体验。
评论