|
@@ -3,15 +3,18 @@ package cn.iocoder.yudao.module.promotion.service.price;
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
import cn.hutool.core.lang.Assert;
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
|
+import cn.iocoder.yudao.framework.common.exception.ServiceException;
|
|
|
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
|
|
|
import cn.iocoder.yudao.module.product.api.sku.ProductSkuApi;
|
|
|
import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuRespDTO;
|
|
|
+import cn.iocoder.yudao.module.promotion.api.price.dto.CouponMeetRespDTO;
|
|
|
import cn.iocoder.yudao.module.promotion.api.price.dto.PriceCalculateReqDTO;
|
|
|
import cn.iocoder.yudao.module.promotion.api.price.dto.PriceCalculateRespDTO;
|
|
|
import cn.iocoder.yudao.module.promotion.convert.price.PriceConvert;
|
|
|
import cn.iocoder.yudao.module.promotion.dal.dataobject.coupon.CouponDO;
|
|
|
import cn.iocoder.yudao.module.promotion.dal.dataobject.reward.RewardActivityDO;
|
|
|
import cn.iocoder.yudao.module.promotion.enums.common.*;
|
|
|
+import cn.iocoder.yudao.module.promotion.enums.coupon.CouponStatusEnum;
|
|
|
import cn.iocoder.yudao.module.promotion.service.coupon.CouponService;
|
|
|
import cn.iocoder.yudao.module.promotion.service.discount.DiscountActivityService;
|
|
|
import cn.iocoder.yudao.module.promotion.service.discount.bo.DiscountProductDetailBO;
|
|
@@ -22,10 +25,7 @@ import org.springframework.stereotype.Service;
|
|
|
import org.springframework.validation.annotation.Validated;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
-import java.util.ArrayList;
|
|
|
-import java.util.List;
|
|
|
-import java.util.Map;
|
|
|
-import java.util.Set;
|
|
|
+import java.util.*;
|
|
|
import java.util.function.Supplier;
|
|
|
|
|
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
|
@@ -87,6 +87,52 @@ public class PriceServiceImpl implements PriceService {
|
|
|
return priceCalculate;
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public List<CouponMeetRespDTO> getMeetCouponList(PriceCalculateReqDTO calculateReqDTO) {
|
|
|
+ // 先计算一轮价格
|
|
|
+ PriceCalculateRespDTO priceCalculate = calculatePrice(calculateReqDTO);
|
|
|
+
|
|
|
+ // 获得用户的待使用优惠劵
|
|
|
+ List<CouponDO> couponList = couponService.getCouponList(calculateReqDTO.getUserId(), CouponStatusEnum.UNUSED.getStatus());
|
|
|
+ if (CollUtil.isEmpty(couponList)) {
|
|
|
+ return Collections.emptyList();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获得优惠劵的匹配信息
|
|
|
+ return CollectionUtils.convertList(couponList, coupon -> {
|
|
|
+ CouponMeetRespDTO couponMeetRespDTO = PriceConvert.INSTANCE.convert(coupon);
|
|
|
+ try {
|
|
|
+ // 校验优惠劵
|
|
|
+ couponService.validCoupon(coupon);
|
|
|
+
|
|
|
+ // 获得匹配的商品 SKU 数组
|
|
|
+ List<PriceCalculateRespDTO.OrderItem> orderItems = getMatchCouponOrderItems(priceCalculate, coupon);
|
|
|
+ if (CollUtil.isEmpty(orderItems)) {
|
|
|
+ return couponMeetRespDTO.setMeet(false).setMeetTip("所结算商品没有符合条件的商品");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 计算是否满足优惠劵的使用金额
|
|
|
+ Integer originPrice = getSumValue(orderItems, PriceCalculateRespDTO.OrderItem::getOrderDividePrice, Integer::sum);
|
|
|
+ assert originPrice != null;
|
|
|
+ if (originPrice < coupon.getUsePrice()) {
|
|
|
+ return couponMeetRespDTO.setMeet(false)
|
|
|
+ .setMeetTip(String.format("差 %s 元可用优惠劵", formatPrice(coupon.getUsePrice() - originPrice)));
|
|
|
+ }
|
|
|
+ } catch (ServiceException serviceException) {
|
|
|
+ couponMeetRespDTO.setMeet(false);
|
|
|
+ if (serviceException.getCode().equals(COUPON_VALID_TIME_NOT_NOW.getCode())) {
|
|
|
+ couponMeetRespDTO.setMeetTip("优惠劵未到使用时间");
|
|
|
+ } else {
|
|
|
+ log.error("[getMeetCouponList][calculateReqDTO({}) 获得优惠劵匹配信息异常]", calculateReqDTO, serviceException);
|
|
|
+ couponMeetRespDTO.setMeetTip("优惠劵不满足使用条件");
|
|
|
+ }
|
|
|
+ return couponMeetRespDTO;
|
|
|
+ }
|
|
|
+ // 满足
|
|
|
+ return couponMeetRespDTO.setMeet(true);
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
private List<ProductSkuRespDTO> checkSkus(PriceCalculateReqDTO calculateReqDTO) {
|
|
|
// 获得商品 SKU 数组
|
|
|
Map<Long, Integer> skuIdCountMap = CollectionUtils.convertMap(calculateReqDTO.getItems(),
|