From 4fc0984994047a0b9a38302e7ebfdbb1b1c9fa0e Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Fri, 23 Jan 2026 18:04:13 +0800 Subject: [PATCH] =?UTF-8?q?feat(coupon):=20=E4=BC=98=E5=8C=96=E4=BC=98?= =?UTF-8?q?=E6=83=A0=E5=88=B8=E9=A2=86=E5=8F=96=E7=BB=93=E6=9E=9C=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除控制器中只返回首个错误的限制,改为返回完整的领取结果列表 - 在 CouponClaimResult DTO 中新增 claimedRecords 字段用于返回已领取记录 - 添加 failureWithClaimedRecords 静态方法支持携带已领取记录的失败结果 - 当用户达到领取上限时查询并返回其已领取的券记录供前端展示 - 实现无论成功或失败都向客户端返回完整结果数据的功能 --- .../SceneCouponClaimController.java | 8 +------ .../basic/pricing/dto/CouponClaimResult.java | 23 +++++++++++++++++++ .../service/impl/CouponServiceImpl.java | 9 ++++++-- 3 files changed, 31 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/ycwl/basic/pricing/controller/SceneCouponClaimController.java b/src/main/java/com/ycwl/basic/pricing/controller/SceneCouponClaimController.java index 0cc2333c..04322506 100644 --- a/src/main/java/com/ycwl/basic/pricing/controller/SceneCouponClaimController.java +++ b/src/main/java/com/ycwl/basic/pricing/controller/SceneCouponClaimController.java @@ -60,13 +60,7 @@ public class SceneCouponClaimController { List results = sceneCouponService.claimCoupons(req, userId); - // 判断整体结果 - boolean hasSuccess = results.stream().anyMatch(CouponClaimResult::isSuccess); - if (!hasSuccess && !results.isEmpty()) { - // 全部失败,返回第一个错误信息 - return ApiResponse.fail(results.get(0).getErrorMessage()); - } - + // 无论成功或失败,都返回完整结果列表(包含已领取的券信息) return ApiResponse.success(results); } catch (Exception e) { log.error("场景优惠券|领取失败 req={}", req, e); diff --git a/src/main/java/com/ycwl/basic/pricing/dto/CouponClaimResult.java b/src/main/java/com/ycwl/basic/pricing/dto/CouponClaimResult.java index 2a8f66c1..b7cde9c4 100644 --- a/src/main/java/com/ycwl/basic/pricing/dto/CouponClaimResult.java +++ b/src/main/java/com/ycwl/basic/pricing/dto/CouponClaimResult.java @@ -5,6 +5,7 @@ import com.ycwl.basic.pricing.entity.PriceCouponConfig; import lombok.Data; import java.util.Date; +import java.util.List; /** * 优惠券领取结果DTO @@ -58,6 +59,11 @@ public class CouponClaimResult { private String scenicId; private PriceCouponConfig coupon; + /** + * 已领取的记录列表(领取失败时返回,帮助前端展示用户已有的券) + */ + private List claimedRecords; + /** * 创建成功结果 */ @@ -84,6 +90,23 @@ public class CouponClaimResult { result.errorMessage = errorMessage; return result; } + + /** + * 创建失败结果(带已领取的券列表) + */ + public static CouponClaimResult failureWithClaimedRecords(String errorCode, String errorMessage, + List claimedRecords, + PriceCouponConfig coupon) { + CouponClaimResult result = new CouponClaimResult(); + result.success = false; + result.errorCode = errorCode; + result.errorMessage = errorMessage; + result.claimedRecords = claimedRecords; + result.coupon = coupon; + result.couponId = coupon != null ? coupon.getId() : null; + result.couponName = coupon != null ? coupon.getCouponName() : null; + return result; + } /** * 创建失败结果(仅错误消息) diff --git a/src/main/java/com/ycwl/basic/pricing/service/impl/CouponServiceImpl.java b/src/main/java/com/ycwl/basic/pricing/service/impl/CouponServiceImpl.java index 2b24ce44..a5deda7f 100644 --- a/src/main/java/com/ycwl/basic/pricing/service/impl/CouponServiceImpl.java +++ b/src/main/java/com/ycwl/basic/pricing/service/impl/CouponServiceImpl.java @@ -371,9 +371,14 @@ public class CouponServiceImpl implements ICouponService { request.getUserId(), request.getCouponId()); // countUserCouponClaims 使用 FOR UPDATE + 复合索引,确保并发下的计数准确 if (userClaimCount >= coupon.getUserClaimLimit()) { - return CouponClaimResult.failure( + // 查询用户已领取的记录,返回给前端展示 + List claimedRecords = couponClaimRecordMapper.selectUserCouponRecords( + request.getUserId(), request.getCouponId()); + return CouponClaimResult.failureWithClaimedRecords( CouponClaimResult.ERROR_CLAIM_LIMIT_REACHED, - "您已达到该优惠券的领取上限(" + coupon.getUserClaimLimit() + "张)"); + "您已达到该优惠券的领取上限(" + coupon.getUserClaimLimit() + "张)", + claimedRecords, + coupon); } }