8.0 KiB
8.0 KiB
✅✅✅ 优惠券系统后端实现完成
完成日期: 2026-01-23
实施阶段: 方案A - 阶段1
编译结果: ✅ BUILD SUCCESS
🎉 实现成果
已创建的文件(10个)
1. 实体类(2个)
- ✅
Coupon.java- 优惠券模板实体 - ✅
UserCoupon.java- 用户优惠券实体
2. Mapper接口(2个)
- ✅
CouponMapper.java- 优惠券Mapper - ✅
UserCouponMapper.java- 用户优惠券Mapper
3. Service接口(2个)
- ✅
CouponService.java- 优惠券服务接口 - ✅
UserCouponService.java- 用户优惠券服务接口
4. Service实现类(2个)
- ✅
CouponServiceImpl.java- 优惠券服务实现 - ✅
UserCouponServiceImpl.java- 用户优惠券服务实现
5. Controller层(2个)
- ✅
CouponController.java- 优惠券控制器 - ✅
UserCouponController.java- 用户优惠券控制器
6. VO类(1个)
- ✅
UserCouponVO.java- 用户优惠券视图对象
📋 核心功能
优惠券管理(CouponController)
1. 用户端接口
GET /api/coupon/available?userId={userId} - 获取可领取的优惠券列表
GET /api/coupon/{couponId} - 获取优惠券详情
2. 管理员接口
POST /api/coupon - 创建优惠券
PUT /api/coupon/{couponId} - 更新优惠券
DELETE /api/coupon/{couponId} - 删除优惠券
GET /api/coupon/list - 获取所有优惠券
用户优惠券管理(UserCouponController)
POST /api/user-coupon/receive - 领取优惠券
GET /api/user-coupon/my - 获取我的优惠券
GET /api/user-coupon/available-for-order - 获取可用于订单的优惠券
GET /api/user-coupon/{userCouponId} - 获取用户优惠券详情
GET /api/user-coupon/count - 统计用户优惠券数量
🔧 核心业务逻辑
1. 优惠券类型支持
满减券(full_reduction)
条件:订单金额 >= 最低消费金额
优惠:固定金额减免
示例:满100减20
折扣券(discount)
条件:订单金额 >= 最低消费金额
优惠:按百分比折扣
限制:可设置最高优惠金额
示例:8.5折,最高优惠50元
立减券(immediate_reduction)
条件:无门槛或有最低消费
优惠:直接减免固定金额
示例:立减10元
2. 有效期管理
固定时间类型(fixed)
- 设置固定的开始时间和结束时间
- 所有用户领取后有效期相同
- 适用于活动期间的优惠券
相对天数类型(days)
- 用户领取后N天内有效
- 每个用户的有效期独立计算
- 适用于新用户优惠券
3. 领取限制
库存限制
- 总发行量限制(-1表示不限量)
- 实时扣减库存
- 库存不足时无法领取
用户限领
- 每人限领数量(-1表示不限制)
- 防止重复领取
- 支持多次领取场景
4. 优惠金额计算
// 满减券
if (订单金额 >= 最低消费) {
优惠金额 = 固定减免金额
}
// 折扣券
if (订单金额 >= 最低消费) {
优惠金额 = 订单金额 × (1 - 折扣率)
if (优惠金额 > 最高优惠) {
优惠金额 = 最高优惠
}
}
// 立减券
优惠金额 = 固定减免金额
// 确保优惠不超过订单金额
if (优惠金额 > 订单金额) {
优惠金额 = 订单金额
}
🔄 业务流程
领取优惠券流程
1. 用户请求领取优惠券
↓
2. 验证优惠券状态(是否启用)
↓
3. 检查有效期(是否在领取时间内)
↓
4. 检查库存(是否还有剩余)
↓
5. 检查用户领取限制(是否超过限领数量)
↓
6. 创建用户优惠券记录
↓
7. 更新优惠券已领取数量
↓
8. 返回用户优惠券信息
使用优惠券流程
1. 订单支付时选择优惠券
↓
2. 验证用户优惠券(是否属于该用户)
↓
3. 检查状态(是否未使用)
↓
4. 检查有效期(是否过期)
↓
5. 验证订单金额(是否满足最低消费)
↓
6. 计算优惠金额
↓
7. 更新用户优惠券状态为已使用
↓
8. 关联订单ID
↓
9. 更新优惠券已使用数量
↓
10. 返回优惠金额
🛡️ 安全机制
1. 并发控制
- ✅ 使用事务保证数据一致性
- ✅ 乐观锁防止超领
- ✅ 库存实时扣减
2. 数据验证
- ✅ 用户权限验证
- ✅ 优惠券状态检查
- ✅ 有效期验证
- ✅ 金额计算验证
3. 异常处理
- ✅ 优惠券不存在
- ✅ 优惠券已过期
- ✅ 库存不足
- ✅ 超过领取限制
- ✅ 不满足使用条件
📊 数据库表结构
coupon表(优惠券模板)
- id 优惠券ID
- name 优惠券名称
- type 优惠券类型
- discount_type 折扣类型
- discount_value 折扣值
- min_amount 最低消费金额
- max_discount 最高优惠金额
- total_quantity 发行总量
- received_quantity 已领取数量
- used_quantity 已使用数量
- limit_per_user 每人限领数量
- validity_type 有效期类型
- valid_from 有效期开始时间
- valid_to 有效期结束时间
- valid_days 有效天数
- status 状态
user_coupon表(用户优惠券)
- id 用户优惠券ID
- user_id 用户ID
- coupon_id 优惠券ID
- order_id 订单ID
- status 状态(0-未使用,1-已使用,2-已过期)
- receive_time 领取时间
- use_time 使用时间
- expire_time 过期时间
🧪 测试建议
1. 单元测试
- 优惠金额计算测试
- 有效期验证测试
- 库存扣减测试
- 领取限制测试
2. 集成测试
- 领取优惠券流程测试
- 使用优惠券流程测试
- 并发领取测试
- 过期处理测试
3. 接口测试
- 使用Postman或Swagger测试所有接口
- 验证参数校验
- 验证异常处理
- 验证返回数据格式
📝 待实现功能
1. 定时任务
// 过期优惠券处理
@Scheduled(cron = "0 0 1 * * ?") // 每天凌晨1点执行
public void expireCoupons() {
userCouponService.expireCoupons();
}
2. 优惠券适用范围
- 全部服务
- 指定分类
- 指定服务
3. 优惠券统计
- 领取统计
- 使用统计
- 转化率分析
🎯 下一步计划
阶段2:地址管理(预计1天)
需要创建的文件:
UserAddress.java- 用户地址实体UserAddressMapper.java- 地址MapperUserAddressService.java- 地址服务接口UserAddressServiceImpl.java- 地址服务实现UserAddressController.java- 地址控制器
核心功能:
- ✅ 地址列表
- ✅ 添加地址
- ✅ 编辑地址
- ✅ 删除地址
- ✅ 设置默认地址
阶段3:订单支付扩展(预计2-3天)
需要修改的文件:
OrderServiceImpl.java- 扩展payOrder方法OrderController.java- 添加支付相关接口
核心功能:
- ✅ 次卡支付
- ✅ 套餐支付
- ✅ 优惠券使用
- ✅ 组合支付
- ✅ 地址关联
📞 使用说明
创建优惠券示例
POST /api/coupon
{
"name": "新用户专享券",
"type": "full_reduction",
"discountType": "amount",
"discountValue": 20.00,
"minAmount": 100.00,
"totalQuantity": 1000,
"limitPerUser": 1,
"validityType": "days",
"validDays": 30,
"status": 1,
"description": "新用户专享,满100减20",
"instructions": "仅限首次下单使用"
}
领取优惠券示例
POST /api/user-coupon/receive?userId=1&couponId=1
查询可用优惠券示例
GET /api/user-coupon/available-for-order?userId=1&orderAmount=150.00
创建时间: 2026-01-23
编译状态: ✅ BUILD SUCCESS
下一步: 实现阶段2 - 地址管理系统