本模块提供优惠券的核销功能,包括核销前效验和核销订单两个接口,支持代金券和团购券的核销处理。
GET /couponManage/verifyOrder| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| orderCode | String | 是 | 劵code(券码) |
GET /couponManage/verifyOrder?orderCode=ABC123456789
{
"code": 200,
"success": true,
"data": "效验通过",
"msg": "效验通过"
}
{
"code": 500,
"success": false,
"data": null,
"msg": "该劵不在有效期内"
}
详见核销前效验规则章节。
GET /couponManage/verifyCoupon| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| storeId | String | 是 | 门店ID |
| quanCode | String | 是 | 券码 |
GET /couponManage/verifyCoupon?storeId=102&quanCode=ABC123456789
{
"code": 200,
"success": true,
"data": {
"code": "true",
"message": "核销成功"
}
}
{
"code": 200,
"success": true,
"data": {
"code": "false",
"message": "请勿重复核销"
}
}
{
"code": 200,
"success": true,
"data": {
"code": "false",
"message": "核销失败"
}
}
{
"code": 200,
"success": true,
"data": {
"code": "false",
"message": "订单不存在"
}
}
{
"code": 200,
"success": true,
"data": {
"code": "false",
"message": "门店不存在"
}
}
┌─────────────────────────────────────────────┐
│ 客户端调用核销接口 │
│ /couponManage/verifyCoupon │
└─────────────────┬───────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ 1. Redis分布式锁 │
│ 检查 coupon:use:{quanCode} 是否存在 │
│ 存在 → 返回"请勿重复核销" │
│ 不存在 → 设置锁并继续 │
└─────────────────┬───────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ 2. 查询订单券中间表 │
│ - 根据券码查询 │
│ - 状态必须为:待使用(1) 或 退款失败(8) │
└─────────────────┬───────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ 3. 更新订单券状态 │
│ - status → 已使用(2) │
│ - usedTime → 当前时间 │
└─────────────────┬───────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ 4. 查询用户订单信息 │
│ - 根据 orderId 查询 │
└─────────────────┬───────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ 5. 检查平台优惠券 │
│ - 查询 quanId │
│ - 如果 type=3,标记为平台券 │
└─────────────────┬───────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ 6-7. 查询订单下所有券 │
│ - 检查是否全部已核销 │
│ - 筛选未完成的券 │
└─────────────────┬───────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ 8. 订单完成判断 │
│ 如果所有券都已核销 或 无未完成券 │
│ → 更新订单状态为已完成(3) │
│ → 设置完成时间 │
└─────────────────┬───────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ 9. 查询门店信息 │
│ - 获取抽成比例 commissionRate │
└─────────────────┬───────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ 10. 计算抽成和收入 │
│ 抽成 = 券价 × 100 × 抽成比例 │
│ 收入 = 券价 × 100 - 抽成 │
│ (如有平台券,需加上平均优惠价格) │
└─────────────────┬───────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ 11. 插入收入明细记录 │
│ - storeId, userOrderId │
│ - incomeType, businessId │
│ - commission, money │
└─────────────────┬───────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ 12. 更新店铺账户余额 │
│ - store_user.money += 收入金额 │
└─────────────────┬───────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ 13. 返回核销成功 │
│ { code: "true", message: "核销成功" } │
└─────────────────┬───────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ 14. 释放分布式锁 (finally) │
│ 删除 coupon:use:{quanCode} │
└─────────────────────────────────────────────┘
核销前效验(verifyOrder)会根据券类型进行不同的验证:
有效期验证
不可用日期验证
使用时间段验证
单次核销数量验证
有效期验证
不可用日期验证
抽成比例(小数) = storeInfo.commissionRate ÷ 100
抽成金额(分) = 券价(元) × 100 × 抽成比例
示例:
券价 = 100元
抽成比例 = 4%
抽成金额 = 100 × 100 × 0.04 = 400分(4元)
实际收入(分) = 券价(元) × 100 - 抽成金额(分)
示例:
券价 = 100元
抽成 = 400分
实际收入 = 100 × 100 - 400 = 9600分(96元)
实际收入(分) = (券价(元) + 平均优惠券价格(元)) × 100 - 抽成金额(分)
示例:
券价 = 100元
平台优惠 = 10元
抽成 = 400分
实际收入 = (100 + 10) × 100 - 400 = 10600分(106元)
| 存储单位 | 显示单位 | 转换关系 |
|---|---|---|
| 分(数据库) | 元(前端) | 1元 = 100分 |
注意:
BigDecimal,精度为2位小数┌─────────────────────────────────────────────┐
│ 1. 检查锁 │
│ getString("coupon:use:{quanCode}") │
│ 如果返回值不为空 → 锁已存在 → 拒绝核销 │
└─────────────────┬───────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ 2. 设置锁 │
│ setListRight("coupon:use:{quanCode}", │
│ quanCode) │
└─────────────────┬───────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ 3. 执行核销业务逻辑 │
│ (数据库操作、金额计算等) │
└─────────────────┬───────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ 4. 释放锁 (finally块) │
│ delete("coupon:use:{quanCode}") │
│ 确保无论成功失败都会释放 │
└─────────────────────────────────────────────┘
查询操作:
SELECT * FROM order_coupon_middle
WHERE coupon_code = ?
AND status IN (1, 8) -- 待使用或退款失败
更新操作:
UPDATE order_coupon_middle
SET status = 2, -- 已使用
used_time = NOW()
WHERE id = ?
查询操作:
SELECT * FROM life_user_order
WHERE id = ?
更新操作(订单完成时):
UPDATE life_user_order
SET status = 3, -- 已完成
finish_time = NOW(),
created_time = NOW()
WHERE id = ?
查询操作(检查平台券):
SELECT * FROM life_discount_coupon
WHERE id = ?
AND type = 3 -- 平台券
查询操作:
SELECT * FROM store_info
WHERE id = ?
插入操作:
INSERT INTO store_income_details_record
(store_id, user_order_id, income_type, business_id, commission, money)
VALUES (?, ?, ?, ?, ?, ?)
更新操作:
UPDATE store_user
SET money = money + ?
WHERE store_id = ?
AND delete_flag = 0
| Status | 枚举常量 | 说明 |
|---|---|---|
| 1 | WAIT_USE | 待使用 |
| 2 | USED | 已使用(核销完成) |
| 3 | REFUND | 已退款 |
| 8 | REFUND_FAILED | 退款失败 |
| Status | 枚举常量 | 说明 |
|---|---|---|
| 1 | WAIT_PAY | 待支付 |
| 2 | WAIT_USE | 待使用 |
| 3 | COMPLETE | 已完成 |
| 4 | REFUND | 已退款 |
| 5 | CANCEL | 已取消 |
| 6 | EXPIRE | 已过期 |
| 字段名 | 类型 | 说明 | 示例 |
|---|---|---|---|
| storeId | Integer | 门店ID | 102 |
| userOrderId | Integer | 订单券ID | 12345 |
| incomeType | Integer | 收入类型(券类型) | 1-代金券, 2-团购 |
| businessId | Integer | 业务ID(券ID) | 67890 |
| commission | Integer | 抽成金额(分) | 400 |
| money | Integer | 实际收入(分) | 9600 |
核销订单接口使用 @Transactional 注解,确保以下操作的原子性:
@Transactional(rollbackFor = Exception.class)
public Map<String, String> verifyCoupon(String storeId, String quanCode) {
// 任何异常都会触发回滚
}
| 场景 | 返回code | 返回message | 处理方式 |
|---|---|---|---|
| 重复核销 | "false" | "请勿重复核销" | 检测到锁存在 |
| 券不存在 | "false" | "核销失败" | 查询结果为空 |
| 订单不存在 | "false" | "订单不存在" | 订单查询失败 |
| 门店不存在 | "false" | "门店不存在" | 门店查询失败 |
| 系统异常 | "false" | "核销失败:{异常信息}" | 捕获Exception |
/alienStore/coupon/newVerifyLifeCouponControllerLifeCouponService.newCouponVerify()/couponManage/verifyCouponCouponManageControllerCouponManageService.verifyCoupon()| 项目 | app端 | web端 | 说明 |
|---|---|---|---|
| 好友券发放 | ✅ 支持 | ⚠️ 暂不支持 | 需通过Feign调用实现 |
| 其他逻辑 | ✅ | ✅ | 完全一致 |
新增接口:
GET /couponManage/verifyOrder - 核销订单前效验GET /couponManage/verifyCoupon - 核销订单核心功能:
涉及文件:
CouponManageController.java - 更新CouponManageService.java - 更新CouponManageServiceImpl.java - 更新(新增200行)文档版本:v1.0
最后更新:2025-11-14
维护人员:ssk