diff --git a/src/main/java/com/ycwl/basic/pricing/controller/PriceCalculationController.java b/src/main/java/com/ycwl/basic/pricing/controller/PriceCalculationController.java index d38a3b52..0db83998 100644 --- a/src/main/java/com/ycwl/basic/pricing/controller/PriceCalculationController.java +++ b/src/main/java/com/ycwl/basic/pricing/controller/PriceCalculationController.java @@ -1,7 +1,9 @@ package com.ycwl.basic.pricing.controller; +import com.ycwl.basic.constant.BaseContextHandler; import com.ycwl.basic.utils.ApiResponse; import com.ycwl.basic.pricing.dto.*; +import com.ycwl.basic.pricing.dto.resp.UserCouponResp; import com.ycwl.basic.pricing.service.ICouponService; import com.ycwl.basic.pricing.service.IPriceCalculationService; import lombok.RequiredArgsConstructor; @@ -53,16 +55,37 @@ public class PriceCalculationController { } /** - * 查询用户可用优惠券 + * 查询用户可用优惠券(包含领取记录信息) */ @GetMapping("/coupons/my-coupons") - public ApiResponse> getUserCoupons(@RequestParam Long userId) { + public ApiResponse> getUserCoupons() { + Long userId = getUserId(); + if (userId == null) { + return ApiResponse.fail("用户未登录"); + } + log.info("查询用户可用优惠券: userId={}", userId); - - List coupons = couponService.getUserAvailableCoupons(userId); - + + List coupons = couponService.getUserAvailableCoupons(userId); + log.info("用户可用优惠券数量: {}", coupons.size()); - + return ApiResponse.success(coupons); } + + /** + * 获取当前登录用户ID + */ + private Long getUserId() { + try { + String userIdStr = BaseContextHandler.getUserId(); + if (userIdStr == null || userIdStr.isEmpty()) { + return null; + } + return Long.valueOf(userIdStr); + } catch (NumberFormatException e) { + log.warn("无法解析用户ID: {}", BaseContextHandler.getUserId()); + return null; + } + } } \ No newline at end of file diff --git a/src/main/java/com/ycwl/basic/pricing/dto/resp/UserCouponResp.java b/src/main/java/com/ycwl/basic/pricing/dto/resp/UserCouponResp.java new file mode 100644 index 00000000..225400a7 --- /dev/null +++ b/src/main/java/com/ycwl/basic/pricing/dto/resp/UserCouponResp.java @@ -0,0 +1,89 @@ +package com.ycwl.basic.pricing.dto.resp; + +import com.ycwl.basic.pricing.enums.CouponStatus; +import com.ycwl.basic.pricing.enums.CouponType; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 用户优惠券响应DTO(包含领取记录+优惠券配置) + */ +@Data +public class UserCouponResp { + + // ==================== 领取记录信息 ==================== + + /** + * 领取记录ID + */ + private Long claimRecordId; + + /** + * 领取时间 + */ + private Date claimTime; + + /** + * 过期时间(根据领取时间+领取后有效期计算) + */ + private Date expireTime; + + /** + * 优惠券状态 + */ + private CouponStatus status; + + /** + * 领取时的景区ID + */ + private String claimScenicId; + + // ==================== 优惠券配置信息 ==================== + + /** + * 优惠券ID + */ + private Long couponId; + + /** + * 优惠券名称 + */ + private String couponName; + + /** + * 优惠类型 + */ + private CouponType couponType; + + /** + * 优惠值(百分比时为折扣比例,固定金额时为具体金额) + */ + private BigDecimal discountValue; + + /** + * 最小使用金额(门槛) + */ + private BigDecimal minAmount; + + /** + * 最大优惠金额 + */ + private BigDecimal maxDiscount; + + /** + * 适用景区ID(NULL表示不限景区) + */ + private String scenicId; + + /** + * 优惠券全局有效期开始时间 + */ + private Date validFrom; + + /** + * 优惠券全局有效期结束时间 + */ + private Date validUntil; +} diff --git a/src/main/java/com/ycwl/basic/pricing/service/ICouponService.java b/src/main/java/com/ycwl/basic/pricing/service/ICouponService.java index 21a84ff7..23683382 100644 --- a/src/main/java/com/ycwl/basic/pricing/service/ICouponService.java +++ b/src/main/java/com/ycwl/basic/pricing/service/ICouponService.java @@ -6,6 +6,7 @@ import com.ycwl.basic.pricing.dto.CouponUseResult; import com.ycwl.basic.pricing.dto.CouponClaimRequest; import com.ycwl.basic.pricing.dto.CouponClaimResult; import com.ycwl.basic.pricing.dto.ProductItem; +import com.ycwl.basic.pricing.dto.resp.UserCouponResp; import com.ycwl.basic.pricing.entity.PriceCouponConfig; import java.math.BigDecimal; @@ -55,12 +56,12 @@ public interface ICouponService { CouponUseResult useCoupon(CouponUseRequest request); /** - * 查询用户可用优惠券 - * + * 查询用户可用优惠券(包含领取记录信息) + * * @param userId 用户ID - * @return 可用优惠券列表 + * @return 用户优惠券列表(包含领取记录+优惠券配置) */ - List getUserAvailableCoupons(Long userId); + List getUserAvailableCoupons(Long userId); /** * 领取优惠券(内部调用方法) 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 cc08751a..2b24ce44 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 @@ -3,6 +3,7 @@ package com.ycwl.basic.pricing.service.impl; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.ycwl.basic.pricing.dto.*; +import com.ycwl.basic.pricing.dto.resp.UserCouponResp; import com.ycwl.basic.pricing.entity.PriceCouponClaimRecord; import com.ycwl.basic.pricing.entity.PriceCouponConfig; import com.ycwl.basic.pricing.enums.CouponStatus; @@ -274,19 +275,43 @@ public class CouponServiceImpl implements ICouponService { } @Override - public List getUserAvailableCoupons(Long userId) { + public List getUserAvailableCoupons(Long userId) { List records = couponClaimRecordMapper.selectUserAvailableCoupons(userId); - List coupons = new ArrayList<>(); - + List coupons = new ArrayList<>(); + for (PriceCouponClaimRecord record : records) { PriceCouponConfig config = couponConfigMapper.selectById(record.getCouponId()); if (config != null) { - coupons.add(buildCouponInfo(config, null)); + coupons.add(buildUserCouponResp(record, config)); } } - + return coupons; } + + private UserCouponResp buildUserCouponResp(PriceCouponClaimRecord record, PriceCouponConfig config) { + UserCouponResp resp = new UserCouponResp(); + + // 领取记录信息 + resp.setClaimRecordId(record.getId()); + resp.setClaimTime(record.getClaimTime()); + resp.setExpireTime(record.getExpireTime()); + resp.setStatus(record.getStatus()); + resp.setClaimScenicId(record.getScenicId()); + + // 优惠券配置信息 + resp.setCouponId(config.getId()); + resp.setCouponName(config.getCouponName()); + resp.setCouponType(config.getCouponType()); + resp.setDiscountValue(config.getDiscountValue()); + resp.setMinAmount(config.getMinAmount()); + resp.setMaxDiscount(config.getMaxDiscount()); + resp.setScenicId(config.getScenicId()); + resp.setValidFrom(config.getValidFrom()); + resp.setValidUntil(config.getValidUntil()); + + return resp; + } private CouponInfo buildCouponInfo(PriceCouponConfig coupon, BigDecimal actualDiscountAmount) { CouponInfo info = new CouponInfo();