Commit 9451342aae40c88c11a24b3238641a66535a1aac

Authored by YunaiV
1 parent bf40767f

trade:营销商品(拼团、砍价)不能使用优惠劵

yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/ErrorCodeConstants.java
@@ -12,12 +12,6 @@ import cn.iocoder.yudao.framework.common.exception.ErrorCode; @@ -12,12 +12,6 @@ import cn.iocoder.yudao.framework.common.exception.ErrorCode;
12 public interface ErrorCodeConstants { 12 public interface ErrorCodeConstants {
13 13
14 // ========== Order 模块 1011000000 ========== 14 // ========== Order 模块 1011000000 ==========
15 - ErrorCode ORDER_CREATE_SKU_NOT_FOUND = new ErrorCode(1011000001, "商品 SKU 不存在");  
16 - ErrorCode ORDER_CREATE_SPU_NOT_SALE = new ErrorCode(1011000002, "商品 SPU 不可售卖");  
17 - ErrorCode ORDER_CREATE_SKU_STOCK_NOT_ENOUGH = new ErrorCode(1011000004, "商品 SKU 库存不足");  
18 - ErrorCode ORDER_CREATE_SPU_NOT_FOUND = new ErrorCode(1011000005, "商品 SPU 不可售卖");  
19 - ErrorCode ORDER_CREATE_ADDRESS_NOT_FOUND = new ErrorCode(1011000006, "收货地址不存在");  
20 -  
21 ErrorCode ORDER_ITEM_NOT_FOUND = new ErrorCode(1011000010, "交易订单项不存在"); 15 ErrorCode ORDER_ITEM_NOT_FOUND = new ErrorCode(1011000010, "交易订单项不存在");
22 ErrorCode ORDER_NOT_FOUND = new ErrorCode(1011000011, "交易订单不存在"); 16 ErrorCode ORDER_NOT_FOUND = new ErrorCode(1011000011, "交易订单不存在");
23 ErrorCode ORDER_ITEM_UPDATE_AFTER_SALE_STATUS_FAIL = new ErrorCode(1011000012, "交易订单项更新售后状态失败,请重试"); 17 ErrorCode ORDER_ITEM_UPDATE_AFTER_SALE_STATUS_FAIL = new ErrorCode(1011000012, "交易订单项更新售后状态失败,请重试");
@@ -61,6 +55,7 @@ public interface ErrorCodeConstants { @@ -61,6 +55,7 @@ public interface ErrorCodeConstants {
61 ErrorCode PRICE_CALCULATE_DELIVERY_PRICE_USER_ADDRESS_IS_EMPTY = new ErrorCode(1011003001, "计算快递运费异常,收件人地址编号为空"); 55 ErrorCode PRICE_CALCULATE_DELIVERY_PRICE_USER_ADDRESS_IS_EMPTY = new ErrorCode(1011003001, "计算快递运费异常,收件人地址编号为空");
62 ErrorCode PRICE_CALCULATE_DELIVERY_PRICE_TEMPLATE_NOT_FOUND = new ErrorCode(1011003002, "计算快递运费异常,找不到对应的运费模板"); 56 ErrorCode PRICE_CALCULATE_DELIVERY_PRICE_TEMPLATE_NOT_FOUND = new ErrorCode(1011003002, "计算快递运费异常,找不到对应的运费模板");
63 ErrorCode PRICE_CALCULATE_DELIVERY_PRICE_PICK_UP_STORE_IS_EMPTY = new ErrorCode(1011003003, "计算快递运费异常,自提点为空"); 57 ErrorCode PRICE_CALCULATE_DELIVERY_PRICE_PICK_UP_STORE_IS_EMPTY = new ErrorCode(1011003003, "计算快递运费异常,自提点为空");
  58 + ErrorCode PRICE_CALCULATE_COUPON_NOT_MATCH_NORMAL_ORDER = new ErrorCode(1011003004, "参与秒杀、拼团、砍价的营销商品,无法使用优惠劵");
64 59
65 // ========== 物流 Express 模块 1011004000 ========== 60 // ========== 物流 Express 模块 1011004000 ==========
66 ErrorCode EXPRESS_NOT_EXISTS = new ErrorCode(1011004000, "快递公司不存在"); 61 ErrorCode EXPRESS_NOT_EXISTS = new ErrorCode(1011004000, "快递公司不存在");
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeCouponPriceCalculator.java
@@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.trade.service.price.calculator; @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.trade.service.price.calculator;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.lang.Assert; 4 import cn.hutool.core.lang.Assert;
  5 +import cn.hutool.core.util.ObjectUtil;
5 import cn.hutool.core.util.StrUtil; 6 import cn.hutool.core.util.StrUtil;
6 import cn.iocoder.yudao.module.promotion.api.coupon.CouponApi; 7 import cn.iocoder.yudao.module.promotion.api.coupon.CouponApi;
7 import cn.iocoder.yudao.module.promotion.api.coupon.dto.CouponRespDTO; 8 import cn.iocoder.yudao.module.promotion.api.coupon.dto.CouponRespDTO;
@@ -9,6 +10,7 @@ import cn.iocoder.yudao.module.promotion.api.coupon.dto.CouponValidReqDTO; @@ -9,6 +10,7 @@ import cn.iocoder.yudao.module.promotion.api.coupon.dto.CouponValidReqDTO;
9 import cn.iocoder.yudao.module.promotion.enums.common.PromotionDiscountTypeEnum; 10 import cn.iocoder.yudao.module.promotion.enums.common.PromotionDiscountTypeEnum;
10 import cn.iocoder.yudao.module.promotion.enums.common.PromotionProductScopeEnum; 11 import cn.iocoder.yudao.module.promotion.enums.common.PromotionProductScopeEnum;
11 import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum; 12 import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum;
  13 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
12 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO; 14 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;
13 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO; 15 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;
14 import org.springframework.core.annotation.Order; 16 import org.springframework.core.annotation.Order;
@@ -22,6 +24,7 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU @@ -22,6 +24,7 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU
22 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.filterList; 24 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.filterList;
23 import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.COUPON_NO_MATCH_MIN_PRICE; 25 import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.COUPON_NO_MATCH_MIN_PRICE;
24 import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.COUPON_NO_MATCH_SPU; 26 import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.COUPON_NO_MATCH_SPU;
  27 +import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.PRICE_CALCULATE_COUPON_NOT_MATCH_NORMAL_ORDER;
25 28
26 /** 29 /**
27 * 优惠劵的 {@link TradePriceCalculator} 实现类 30 * 优惠劵的 {@link TradePriceCalculator} 实现类
@@ -44,6 +47,10 @@ public class TradeCouponPriceCalculator implements TradePriceCalculator { @@ -44,6 +47,10 @@ public class TradeCouponPriceCalculator implements TradePriceCalculator {
44 CouponRespDTO coupon = couponApi.validateCoupon(new CouponValidReqDTO() 47 CouponRespDTO coupon = couponApi.validateCoupon(new CouponValidReqDTO()
45 .setId(param.getCouponId()).setUserId(param.getUserId())); 48 .setId(param.getCouponId()).setUserId(param.getUserId()));
46 Assert.notNull(coupon, "校验通过的优惠劵({}),不能为空", param.getCouponId()); 49 Assert.notNull(coupon, "校验通过的优惠劵({}),不能为空", param.getCouponId());
  50 + // 1.2 只有【普通】订单,才允许使用优惠劵
  51 + if (ObjectUtil.notEqual(result.getType(), TradeOrderTypeEnum.NORMAL.getType())) {
  52 + throw exception(PRICE_CALCULATE_COUPON_NOT_MATCH_NORMAL_ORDER);
  53 + }
47 54
48 // 2.1 获得匹配的商品 SKU 数组 55 // 2.1 获得匹配的商品 SKU 数组
49 List<TradePriceCalculateRespBO.OrderItem> orderItems = filterMatchCouponOrderItems(result, coupon); 56 List<TradePriceCalculateRespBO.OrderItem> orderItems = filterMatchCouponOrderItems(result, coupon);
yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeCouponPriceCalculatorTest.java
@@ -7,6 +7,7 @@ import cn.iocoder.yudao.module.promotion.api.coupon.dto.CouponValidReqDTO; @@ -7,6 +7,7 @@ import cn.iocoder.yudao.module.promotion.api.coupon.dto.CouponValidReqDTO;
7 import cn.iocoder.yudao.module.promotion.enums.common.PromotionDiscountTypeEnum; 7 import cn.iocoder.yudao.module.promotion.enums.common.PromotionDiscountTypeEnum;
8 import cn.iocoder.yudao.module.promotion.enums.common.PromotionProductScopeEnum; 8 import cn.iocoder.yudao.module.promotion.enums.common.PromotionProductScopeEnum;
9 import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum; 9 import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum;
  10 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
10 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO; 11 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;
11 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO; 12 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;
12 import org.junit.jupiter.api.Test; 13 import org.junit.jupiter.api.Test;
@@ -47,6 +48,7 @@ public class TradeCouponPriceCalculatorTest extends BaseMockitoUnitTest { @@ -47,6 +48,7 @@ public class TradeCouponPriceCalculatorTest extends BaseMockitoUnitTest {
47 new TradePriceCalculateReqBO.Item().setSkuId(40L).setCount(5).setSelected(false) // 匹配优惠劵,但是未选中 48 new TradePriceCalculateReqBO.Item().setSkuId(40L).setCount(5).setSelected(false) // 匹配优惠劵,但是未选中
48 )); 49 ));
49 TradePriceCalculateRespBO result = new TradePriceCalculateRespBO() 50 TradePriceCalculateRespBO result = new TradePriceCalculateRespBO()
  51 + .setType(TradeOrderTypeEnum.NORMAL.getType())
50 .setPrice(new TradePriceCalculateRespBO.Price()) 52 .setPrice(new TradePriceCalculateRespBO.Price())
51 .setPromotions(new ArrayList<>()) 53 .setPromotions(new ArrayList<>())
52 .setItems(asList( 54 .setItems(asList(