一、功能概述
优惠券管理是电商平台的重要营销工具,叮咚买菜系统的优惠券管理功能应包括优惠券的创建、发放、使用、统计等全生命周期管理。
二、核心功能模块设计
1. 优惠券类型管理
- 满减券:满指定金额减固定金额
- 折扣券:按比例折扣
- 无门槛券:可直接使用的固定金额券
- 运费券:减免配送费
- 品类券:指定品类可用
- 新人券:仅新用户可用
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 scope; // 使用范围(全平台/指定品类)
private String userScope; // 用户范围(新用户/所有用户)
// getters & setters
}
```
3. 优惠券发放方式
- 系统自动发放:新用户注册、特定活动触发
- 用户主动领取:在优惠券中心领取
- 分享发放:用户分享后获得
- 订单完成后发放:如评价后返券
4. 优惠券使用流程
1. 用户选择商品加入购物车
2. 进入结算页时显示可用优惠券
3. 用户选择使用或放弃使用
4. 系统验证优惠券有效性
5. 计算最终支付金额
三、数据库设计
优惠券表(coupon)
```sql
CREATE TABLE coupon (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
type VARCHAR(20) NOT NULL COMMENT 满减/折扣/无门槛等,
discount_type VARCHAR(20) COMMENT 金额/比例,
discount_value DECIMAL(10,2) NOT NULL,
min_order_amount DECIMAL(10,2) DEFAULT 0,
total_count INT NOT NULL,
remaining_count INT NOT NULL,
start_time DATETIME NOT NULL,
end_time DATETIME NOT NULL,
status TINYINT DEFAULT 1 COMMENT 1-有效 0-无效,
create_time DATETIME NOT NULL,
update_time DATETIME NOT NULL
);
```
用户优惠券表(user_coupon)
```sql
CREATE TABLE user_coupon (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id BIGINT NOT NULL,
coupon_id BIGINT NOT NULL,
status TINYINT NOT NULL COMMENT 0-未使用 1-已使用 2-已过期,
get_time DATETIME NOT NULL,
use_time DATETIME,
expire_time DATETIME NOT NULL,
order_id BIGINT COMMENT 使用订单ID,
FOREIGN KEY (coupon_id) REFERENCES coupon(id)
);
```
四、核心业务逻辑实现
1. 优惠券发放服务
```java
public class CouponService {
// 发放优惠券给用户
public boolean grantCoupon(Long userId, Long couponId) {
Coupon coupon = couponRepository.findById(couponId)
.orElseThrow(() -> new RuntimeException("优惠券不存在"));
if (coupon.getRemaining() <= 0) {
throw new RuntimeException("优惠券已发放完毕");
}
UserCoupon userCoupon = new UserCoupon();
userCoupon.setUserId(userId);
userCoupon.setCouponId(couponId);
userCoupon.setStatus(0); // 未使用
userCoupon.setExpireTime(coupon.getEndTime());
userCouponRepository.save(userCoupon);
// 更新优惠券剩余数量
coupon.setRemaining(coupon.getRemaining() - 1);
couponRepository.save(coupon);
return true;
}
}
```
2. 优惠券使用验证
```java
public class CouponValidator {
public boolean validateCoupon(Long userId, Long couponId, BigDecimal orderAmount) {
UserCoupon userCoupon = userCouponRepository.findByUserIdAndCouponIdAndStatus(
userId, couponId, 0); // 状态为未使用
if (userCoupon == null) {
return false;
}
Coupon coupon = couponRepository.findById(couponId)
.orElseThrow(() -> new RuntimeException("优惠券不存在"));
// 检查是否过期
if (LocalDateTime.now().isAfter(coupon.getEndTime().toInstant()
.atZone(ZoneId.systemDefault()).toLocalDateTime())) {
return false;
}
// 检查使用条件
if (coupon.getMinOrderAmount() > 0 &&
coupon.getMinOrderAmount() > orderAmount) {
return false;
}
return true;
}
}
```
三、前端交互设计
1. 优惠券列表页面
- 展示用户拥有的所有优惠券
- 按状态分类(可用/已使用/已过期)
- 支持按类型、有效期筛选
2. 优惠券使用弹窗
- 在购物车/结算页触发
- 自动匹配适用的优惠券
- 显示优惠后金额
- 一键使用功能
3. 后台管理界面
- 优惠券创建/编辑表单
- 发放记录查询
- 使用统计图表
- 批量发放功能
四、关键技术实现
1. 优惠券核销机制
```java
public class CouponRedemptionService {
@Transactional
public boolean redeemCoupon(Long userId, Long couponId, Long orderId) {
// 1. 验证优惠券有效性
UserCoupon userCoupon = validateCoupon(userId, couponId);
// 2. 更新优惠券状态
userCoupon.setStatus(1); // 已使用
userCoupon.setUsedTime(LocalDateTime.now());
userCouponRepository.save(userCoupon);
// 3. 记录使用日志
CouponUsageLog log = new CouponUsageLog();
log.setUserId(userId);
log.setCouponId(couponId);
log.setOrderId(orderId);
log.setUsageTime(LocalDateTime.now());
couponUsageLogRepository.save(log);
return true;
}
}
```
2. 定时任务检查过期优惠券
```java
@Scheduled(cron = "0 0 0 * * ?") // 每天午夜执行
public void checkExpiredCoupons() {
List expiredCoupons = userCouponRepository.findByStatusAndExpireTimeBefore(
0, // 未使用
LocalDateTime.now()
);
for (UserCoupon coupon : expiredCoupons) {
coupon.setStatus(2); // 标记为已过期
userCouponRepository.save(coupon);
}
}
```
五、安全与性能考虑
1. 并发控制:
- 使用乐观锁或悲观锁防止优惠券超发
- 分布式环境下使用Redis分布式锁
2. 防刷机制:
- 限制单个用户领取数量
- 验证码验证
- IP限制
3. 性能优化:
- 优惠券数据缓存
- 异步处理优惠券发放
- 批量操作优化
六、测试用例
1. 正常流程测试:
- 创建优惠券 → 发放给用户 → 用户使用 → 验证订单金额
2. 异常流程测试:
- 尝试使用过期优惠券
- 使用不满足条件的优惠券
- 重复使用同一张优惠券
3. 边界条件测试:
- 刚好满足满减条件的订单
- 优惠券刚好在边界时间使用
- 最大数量优惠券发放
七、部署与监控
1. 日志记录:
- 优惠券发放记录
- 优惠券使用记录
- 错误日志
2. 监控指标:
- 优惠券发放成功率
- 优惠券使用率
- 优惠券过期率
3. 报警机制:
- 发放失败报警
- 使用异常报警
- 系统性能报警
通过以上设计实现,叮咚买菜系统可以构建一个完整、健壮的优惠券管理体系,支持各种营销活动,同时保证系统稳定性和性能。