一、功能概述
优惠券管理是电商系统中重要的营销工具,叮咚买菜系统的优惠券管理功能应包括优惠券的创建、发放、使用、统计等全生命周期管理,以支持各种促销活动。
二、核心功能模块设计
1. 优惠券类型管理
- 满减券:满X元减Y元
- 折扣券:按比例折扣(如8折)
- 无门槛券:直接抵扣指定金额
- 运费券:减免配送费用
- 品类券:限定商品类别使用
- 新人券:仅限新用户使用
2. 优惠券创建与配置
```java
// 优惠券实体类示例
public class Coupon {
private Long id;
private String name; // 优惠券名称
private String type; // 优惠券类型
private BigDecimal amount; // 优惠金额/折扣比例
private BigDecimal minOrder; // 最低消费金额
private Date startTime; // 生效时间
private Date endTime; // 失效时间
private Integer total; // 发放总量
private Integer remaining; // 剩余数量
private String适用范围; // 全场/指定品类/指定商品
private String userScope; // 全用户/新用户/指定用户
private String status; // 状态(未开始/进行中/已结束)
// getters & setters
}
```
3. 优惠券发放方式
- 主动领取:用户在APP/小程序中主动领取
- 系统发放:根据规则自动发放(如新用户注册)
- 分享发放:用户分享后获得优惠券
- 订单完成后发放:如评价后返券
4. 优惠券使用流程
1. 用户选择商品加入购物车
2. 结算时系统自动匹配适用的优惠券
3. 用户选择使用或放弃使用
4. 系统验证优惠券有效性
5. 计算最终订单金额
5. 优惠券状态管理
- 未开始
- 进行中(可领取/可使用)
- 已领完
- 已过期
- 已使用
三、技术实现方案
1. 数据库设计
```sql
CREATE TABLE coupon (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
type VARCHAR(20) NOT NULL COMMENT 满减/折扣/无门槛等,
amount DECIMAL(10,2) NOT NULL,
min_order DECIMAL(10,2) DEFAULT 0,
start_time DATETIME NOT NULL,
end_time DATETIME NOT NULL,
total INT DEFAULT 0,
remaining INT DEFAULT 0,
scope VARCHAR(50) COMMENT 全场/品类/商品,
scope_ids VARCHAR(500) COMMENT 适用范围ID集合,
user_scope VARCHAR(20) COMMENT 全用户/新用户/指定用户,
status VARCHAR(20) NOT NULL,
create_time DATETIME NOT NULL,
update_time DATETIME NOT NULL
);
CREATE TABLE user_coupon (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id BIGINT NOT NULL,
coupon_id BIGINT NOT NULL,
status VARCHAR(20) NOT NULL COMMENT 未使用/已使用/已过期,
order_id BIGINT DEFAULT NULL,
get_time DATETIME NOT NULL,
use_time DATETIME DEFAULT NULL,
expire_time DATETIME NOT NULL,
FOREIGN KEY (coupon_id) REFERENCES coupon(id)
);
```
2. 核心接口设计
```java
// 优惠券服务接口
public interface CouponService {
// 创建优惠券
Coupon createCoupon(CouponCreateDTO dto);
// 发放优惠券(批量)
void issueCoupons(Long couponId, List userIds);
// 用户领取优惠券
UserCoupon receiveCoupon(Long userId, Long couponId);
// 使用优惠券
Order useCoupon(Long userId, Long couponId, Long orderId);
// 查询用户可用优惠券
List getAvailableCoupons(Long userId, BigDecimal orderAmount);
// 统计优惠券使用情况
CouponStatistics getCouponStatistics(Long couponId);
}
```
3. 关键业务逻辑实现
```java
// 优惠券使用逻辑示例
public Order useCoupon(Long userId, Long couponId, Long orderId) {
// 1. 参数校验
UserCoupon userCoupon = userCouponRepository.findByIdAndUserId(couponId, userId)
.orElseThrow(() -> new BusinessException("优惠券不存在或不属于当前用户"));
// 2. 校验优惠券状态
if (!"UNUSED".equals(userCoupon.getStatus())) {
throw new BusinessException("优惠券不可用");
}
// 3. 校验有效期
if (userCoupon.getExpireTime().before(new Date())) {
throw new BusinessException("优惠券已过期");
}
// 4. 获取订单信息
Order order = orderRepository.findById(orderId)
.orElseThrow(() -> new BusinessException("订单不存在"));
// 5. 校验优惠券适用范围
Coupon coupon = couponRepository.findById(userCoupon.getCouponId())
.orElseThrow(() -> new BusinessException("优惠券不存在"));
// 6. 计算优惠金额(根据优惠券类型)
BigDecimal discountAmount = calculateDiscount(coupon, order.getTotalAmount());
// 7. 更新订单金额
order.setTotalAmount(order.getTotalAmount().subtract(discountAmount));
order.setCouponId(couponId);
order.setCouponDiscount(discountAmount);
// 8. 更新优惠券状态
userCoupon.setStatus("USED");
userCoupon.setUseTime(new Date());
userCouponRepository.save(userCoupon);
// 9. 保存订单
return orderRepository.save(order);
}
```
四、前端交互设计
1. 优惠券领取页面
- 展示可用优惠券列表
- 显示优惠券详情(面额、使用条件、有效期)
- "立即领取"按钮
2. 结算页优惠券选择
- 默认自动匹配最优优惠券
- 用户可手动选择/更换优惠券
- 显示使用优惠券后的实付金额
3. 我的优惠券页面
- 按状态分类展示(未使用/已使用/已过期)
- 显示优惠券详细信息和使用记录
五、安全与风控考虑
1. 防刷机制:
- 同一用户领取同类型优惠券的频率限制
- IP/设备ID限制
2. 数据校验:
- 优惠券金额、使用条件的合理性校验
- 防止金额篡改攻击
3. 并发控制:
- 优惠券库存的乐观锁/悲观锁机制
- 防止超发
4. 日志记录:
- 优惠券发放、使用操作的完整日志
- 便于审计和问题排查
六、扩展功能建议
1. 优惠券组合使用:支持多张优惠券叠加使用(需设置规则)
2. 社交分享裂变:用户分享优惠券可获得额外奖励
3. 优惠券过期提醒:通过Push/短信提醒用户即将过期的优惠券
4. 数据分析:优惠券领取率、使用率、ROI分析
5. A/B测试:不同优惠券策略的效果对比
七、部署与监控
1. 监控指标:
- 优惠券发放成功率
- 优惠券使用率
- 系统响应时间
2. 告警机制:
- 优惠券库存不足告警
- 系统异常告警
3. 性能优化:
- 优惠券查询缓存
- 异步处理优惠券发放日志
通过以上方案,叮咚买菜系统可以实现一个功能完善、安全可靠的优惠券管理系统,有效支持各种营销活动,提升用户转化率和复购率。