一、功能概述
优惠券管理是电商系统中重要的营销工具,叮咚买菜系统的优惠券功能应包括优惠券的创建、发放、使用、统计等全生命周期管理,支持多种优惠券类型和发放方式。
二、核心功能模块设计
1. 优惠券类型管理
- 满减券:满指定金额可减免
- 折扣券:按比例折扣
- 无门槛券:直接减免固定金额
- 运费券:减免配送费用
- 品类券:指定品类可用
- 新人专享券:仅新用户可用
2. 优惠券创建与配置
```java
// 优惠券实体类示例
public class Coupon {
private Long id;
private String name; // 优惠券名称
private String type; // 优惠券类型
private BigDecimal discount; // 折扣金额/比例
private BigDecimal minOrder; // 最低消费金额
private Date startTime; // 生效时间
private Date endTime; // 失效时间
private Integer total; // 发放总量
private Integer remaining; // 剩余数量
private String applicableGoods; // 适用商品范围
private String userScope; // 适用用户范围
// getters & setters
}
```
3. 优惠券发放方式
- 主动领取:用户在APP/小程序领取
- 系统发放:根据规则自动发放(如新用户注册)
- 分享发放:用户分享后获得
- 订单完成后发放:满足条件后发放下一张
4. 优惠券使用流程
1. 用户选择商品加入购物车
2. 结算时显示可用优惠券
3. 用户选择使用或放弃使用
4. 系统验证优惠券有效性
5. 计算最终支付金额
三、数据库设计
核心表结构
```sql
-- 优惠券模板表
CREATE TABLE coupon_template (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
type VARCHAR(20) NOT NULL, -- 满减/折扣/无门槛等
discount DECIMAL(10,2) NOT NULL,
min_order DECIMAL(10,2) DEFAULT 0,
start_time DATETIME NOT NULL,
end_time DATETIME NOT NULL,
total_count INT NOT NULL,
remaining_count INT NOT NULL,
applicable_goods TEXT, -- JSON格式存储适用商品ID
user_scope VARCHAR(20), -- ALL/NEW/VIP等
status TINYINT DEFAULT 1 -- 1有效 0失效
);
-- 用户优惠券表
CREATE TABLE user_coupon (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id BIGINT NOT NULL,
coupon_id BIGINT NOT NULL,
status TINYINT DEFAULT 0, -- 0未使用 1已使用 2已过期
get_time DATETIME NOT NULL,
use_time DATETIME,
order_id BIGINT,
FOREIGN KEY (coupon_id) REFERENCES coupon_template(id)
);
```
四、关键业务逻辑实现
1. 优惠券领取
```java
public boolean receiveCoupon(Long userId, Long couponId) {
// 1. 查询优惠券模板
CouponTemplate coupon = couponTemplateMapper.selectById(couponId);
if (coupon == null || coupon.getRemainingCount() <= 0) {
return false;
}
// 2. 检查用户是否符合领取条件
if (!checkUserEligibility(userId, coupon)) {
return false;
}
// 3. 创建用户优惠券记录
UserCoupon userCoupon = new UserCoupon();
userCoupon.setUserId(userId);
userCoupon.setCouponId(couponId);
userCoupon.setGetTime(new Date());
userCoupon.setStatus(0);
// 4. 减少剩余数量
couponTemplateMapper.decreaseRemaining(couponId);
// 5. 保存记录
return userCouponMapper.insert(userCoupon) > 0;
}
```
2. 优惠券使用验证
```java
public boolean validateCoupon(Long userId, Long couponId, BigDecimal orderAmount) {
// 1. 查询用户优惠券
UserCoupon userCoupon = userCouponMapper.selectByUserIdAndCouponId(userId, couponId);
if (userCoupon == null || userCoupon.getStatus() != 0) {
return false;
}
// 2. 查询优惠券模板
CouponTemplate coupon = couponTemplateMapper.selectById(userCoupon.getCouponId());
// 3. 检查有效期
Date now = new Date();
if (now.before(coupon.getStartTime()) || now.after(coupon.getEndTime())) {
return false;
}
// 4. 检查最低消费
if (coupon.getMinOrder().compareTo(orderAmount) > 0) {
return false;
}
// 5. 检查适用商品范围
if (!checkApplicableGoods(coupon, cartItems)) {
return false;
}
return true;
}
```
3. 订单结算使用优惠券
```java
public Order calculateOrderWithCoupon(Order order, Long couponId) {
// 验证优惠券
if (!validateCoupon(order.getUserId(), couponId, order.getTotalAmount())) {
throw new RuntimeException("优惠券不可用");
}
// 获取优惠券详情
UserCoupon userCoupon = userCouponMapper.selectById(couponId);
CouponTemplate coupon = couponTemplateMapper.selectById(userCoupon.getCouponId());
// 计算折扣金额
BigDecimal discountAmount = calculateDiscount(coupon, order.getTotalAmount());
// 更新订单金额
order.setDiscountAmount(discountAmount);
order.setPayAmount(order.getTotalAmount().subtract(discountAmount));
// 标记优惠券为已使用
userCoupon.setStatus(1);
userCoupon.setUseTime(new Date());
userCoupon.setOrderId(order.getId());
userCouponMapper.updateById(userCoupon);
return order;
}
```
五、前端交互设计
1. 优惠券列表页
- 显示用户拥有的所有优惠券
- 按状态分类(可用/已使用/已过期)
- 支持按类型、有效期筛选
2. 优惠券领取页
- 展示可领取的优惠券列表
- 显示优惠券详情(面额、使用条件、有效期)
- 领取按钮及剩余数量提示
3. 订单结算页
- 自动匹配适用优惠券
- 显示优惠后金额
- 支持手动选择/取消使用优惠券
六、性能优化考虑
1. 缓存策略:
- 缓存热门优惠券模板
- 缓存用户优惠券列表
2. 数据库优化:
- 优惠券模板表按状态和时间建立索引
- 用户优惠券表按用户ID和状态建立索引
3. 异步处理:
- 优惠券发放采用消息队列异步处理
- 优惠券使用后更新库存异步处理
4. 限流措施:
- 高并发场景下对优惠券领取接口限流
- 防止黄牛刷券
七、安全考虑
1. 防止优惠券篡改(使用数字签名)
2. 防止重复使用(数据库唯一约束)
3. 防止超发(原子操作更新剩余数量)
4. 防止恶意刷券(IP限制、用户行为分析)
八、扩展功能
1. 优惠券组合使用:支持多张券叠加使用
2. 优惠券分享:用户可分享优惠券给好友
3. 优惠券过期提醒:临近过期提醒用户
4. 优惠券数据分析:统计使用率、ROI等指标
通过以上设计,叮咚买菜系统可以实现一个功能完善、性能优良的优惠券管理系统,有效提升用户活跃度和订单转化率。