一、功能概述
优惠券管理是电商平台的重要营销工具,叮咚买菜系统的优惠券管理功能应包含优惠券的创建、发放、使用、统计等全生命周期管理,支持多种类型的优惠券活动。
二、核心功能模块
1. 优惠券类型设计
- 满减券:满X元减Y元
- 折扣券:按比例折扣(如8折)
- 无门槛券:直接抵扣指定金额
- 运费券:免运费或抵扣运费
- 品类券:仅限特定品类使用
- 新人券:首次注册用户专享
2. 优惠券创建与管理
```java
// 优惠券实体类示例
public class Coupon {
private Long id;
private String name;
private Integer type; // 1-满减 2-折扣 3-无门槛 4-运费 5-品类
private BigDecimal discountAmount; // 折扣金额或比例
private BigDecimal minOrderAmount; // 满减门槛
private Date startTime;
private Date endTime;
private Integer totalQuantity; // 总数量
private Integer remainingQuantity; // 剩余数量
private Set applicableCategoryIds; // 适用品类
private Integer userLimit; // 每人限领数量
// getters & setters
}
```
3. 优惠券发放方式
- 自动发放:
- 新用户注册赠送
- 特定节日/活动自动发放
- 用户行为触发(如首次下单后)
- 手动发放:
- 后台批量导入用户发放
- 用户主动领取(活动页领取)
- 分享链接领取
4. 优惠券使用流程
1. 用户选择商品加入购物车
2. 结算时显示可用优惠券
3. 用户选择使用优惠券
4. 系统验证优惠券有效性
5. 计算最终支付金额
5. 优惠券验证逻辑
```java
public boolean validateCoupon(Coupon coupon, User user, BigDecimal orderAmount) {
// 1. 检查优惠券是否有效
Date now = new Date();
if (now.before(coupon.getStartTime()) || now.after(coupon.getEndTime())) {
return false;
}
// 2. 检查用户领取数量限制
int userUsedCount = couponService.countUserUsed(user.getId(), coupon.getId());
if (userUsedCount >= coupon.getUserLimit()) {
return false;
}
// 3. 检查订单金额是否满足条件
if (coupon.getMinOrderAmount() != null &&
orderAmount.compareTo(coupon.getMinOrderAmount()) < 0) {
return false;
}
// 4. 检查商品是否适用(品类限制)
// 实现品类检查逻辑...
return true;
}
```
三、数据库设计
1. 优惠券表(coupon)
```
id bigint
name varchar(100)
type int
discount_amount decimal(10,2)
min_order_amount decimal(10,2)
start_time datetime
end_time datetime
total_quantity int
remaining_quantity int
applicable_category_ids text -- JSON格式存储适用品类ID
user_limit int
status tinyint -- 0未开始 1进行中 2已结束 3已下架
create_time datetime
update_time datetime
```
2. 用户优惠券表(user_coupon)
```
id bigint
user_id bigint
coupon_id bigint
status tinyint -- 0未使用 1已使用 2已过期
order_id bigint -- 使用时关联的订单ID
get_time datetime
use_time datetime
```
四、关键接口设计
1. 优惠券领取接口
```
POST /api/coupon/receive
参数:
- couponId: 优惠券ID
- userId: 用户ID
返回:
{
"code": 200,
"message": "领取成功",
"data": {
"couponId": 123,
"name": "新人满30减10",
"expireTime": "2023-12-31 23:59:59"
}
}
```
2. 可用优惠券列表接口
```
GET /api/coupon/available
参数:
- userId: 用户ID
- orderAmount: 订单金额(可选,用于筛选适用优惠券)
返回:
{
"code": 200,
"data": [
{
"id": 123,
"name": "满50减15",
"discountAmount": 15,
"minOrderAmount": 50,
"expireTime": "2023-12-31 23:59:59"
},
// 其他可用优惠券...
]
}
```
3. 使用优惠券接口
```
POST /api/coupon/use
参数:
- userId: 用户ID
- couponId: 优惠券ID
- orderId: 订单ID
返回:
{
"code": 200,
"message": "优惠券使用成功",
"data": {
"finalAmount": 45.00, // 最终支付金额
"discountAmount": 15.00 // 优惠金额
}
}
```
五、技术实现要点
1. 并发控制:
- 优惠券领取使用Redis原子操作或数据库乐观锁
- 高并发场景下考虑使用分布式锁
2. 过期处理:
- 定时任务扫描过期优惠券并标记状态
- 使用Redis的TTL机制管理短期优惠券
3. 性能优化:
- 优惠券规则使用Drools等规则引擎实现
- 常用查询结果缓存
4. 安全考虑:
- 防止优惠券刷取(IP限制、设备指纹等)
- 优惠券核销防重放攻击
六、扩展功能建议
1. 优惠券分享:用户可分享优惠券链接给好友
2. 优惠券组合:支持多张优惠券叠加使用(需设置规则)
3. 优惠券转赠:用户可将未使用的优惠券转赠给他人
4. 优惠券分析:统计优惠券领取、使用情况,分析营销效果
5. AB测试:不同用户群体发放不同优惠券,测试转化效果
七、实施路线图
1. 第一阶段:基础功能实现
- 完成优惠券创建、发放、使用核心流程
- 实现基本的数据验证和状态管理
2. 第二阶段:优化与扩展
- 添加并发控制和性能优化
- 实现定时任务处理过期优惠券
3. 第三阶段:高级功能与数据分析
- 添加优惠券分享、转赠等社交功能
- 开发优惠券效果分析报表
通过以上设计,叮咚买菜系统可以实现一个灵活、高效、安全的优惠券管理系统,有效提升用户活跃度和订单转化率。