Commit 30a24601cd885b954fac322a559ba5bc8ca75f4f

Authored by puhui999
1 parent d3352308

【缺陷修复】商城:修复积分不够还能兑换商品的 bug

yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/ErrorCodeConstants.java
@@ -37,6 +37,7 @@ public interface ErrorCodeConstants { @@ -37,6 +37,7 @@ public interface ErrorCodeConstants {
37 ErrorCode ORDER_CREATE_FAIL_EXIST_UNPAID = new ErrorCode(1_011_000_032, "交易订单创建失败,原因:存在未付款订单"); 37 ErrorCode ORDER_CREATE_FAIL_EXIST_UNPAID = new ErrorCode(1_011_000_032, "交易订单创建失败,原因:存在未付款订单");
38 ErrorCode ORDER_CANCEL_PAID_FAIL = new ErrorCode(1_011_000_033, "交易订单取消支付失败,原因:订单不是【{}】状态"); 38 ErrorCode ORDER_CANCEL_PAID_FAIL = new ErrorCode(1_011_000_033, "交易订单取消支付失败,原因:订单不是【{}】状态");
39 ErrorCode ORDER_PICK_UP_FAIL_NOT_VERIFY_USER = new ErrorCode(1_011_000_034, "交易订单自提失败,原因:你没有核销该门店订单的权限"); 39 ErrorCode ORDER_PICK_UP_FAIL_NOT_VERIFY_USER = new ErrorCode(1_011_000_034, "交易订单自提失败,原因:你没有核销该门店订单的权限");
  40 + ErrorCode ORDER_CREATE_FAIL_INSUFFICIENT_USER_POINTS = new ErrorCode(1_011_000_035, "交易订单创建失败,原因:用户积分不足");
40 41
41 // ========== After Sale 模块 1-011-000-100 ========== 42 // ========== After Sale 模块 1-011-000-100 ==========
42 ErrorCode AFTER_SALE_NOT_FOUND = new ErrorCode(1_011_000_100, "售后单不存在"); 43 ErrorCode AFTER_SALE_NOT_FOUND = new ErrorCode(1_011_000_100, "售后单不存在");
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradePointOrderHandler.java
@@ -2,6 +2,8 @@ package cn.iocoder.yudao.module.trade.service.order.handler; @@ -2,6 +2,8 @@ package cn.iocoder.yudao.module.trade.service.order.handler;
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.iocoder.yudao.module.member.api.user.MemberUserApi;
  6 +import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
5 import cn.iocoder.yudao.module.promotion.api.point.PointActivityApi; 7 import cn.iocoder.yudao.module.promotion.api.point.PointActivityApi;
6 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; 8 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
7 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO; 9 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
@@ -13,6 +15,9 @@ import org.springframework.stereotype.Component; @@ -13,6 +15,9 @@ import org.springframework.stereotype.Component;
13 import java.util.List; 15 import java.util.List;
14 import java.util.Objects; 16 import java.util.Objects;
15 17
  18 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  19 +import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.ORDER_CREATE_FAIL_INSUFFICIENT_USER_POINTS;
  20 +
16 /** 21 /**
17 * 积分商城活动订单的 {@link TradeOrderHandler} 实现类 22 * 积分商城活动订单的 {@link TradeOrderHandler} 实现类
18 * 23 *
@@ -23,6 +28,8 @@ public class TradePointOrderHandler implements TradeOrderHandler { @@ -23,6 +28,8 @@ public class TradePointOrderHandler implements TradeOrderHandler {
23 28
24 @Resource 29 @Resource
25 private PointActivityApi pointActivityApi; 30 private PointActivityApi pointActivityApi;
  31 + @Resource
  32 + private MemberUserApi memberUserApi;
26 33
27 @Override 34 @Override
28 public void beforeOrderCreate(TradeOrderDO order, List<TradeOrderItemDO> orderItems) { 35 public void beforeOrderCreate(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
@@ -31,6 +38,11 @@ public class TradePointOrderHandler implements TradeOrderHandler { @@ -31,6 +38,11 @@ public class TradePointOrderHandler implements TradeOrderHandler {
31 } 38 }
32 // 明确校验一下 39 // 明确校验一下
33 Assert.isTrue(orderItems.size() == 1, "积分商城活动兑换商品兑换时,只允许选择一个商品"); 40 Assert.isTrue(orderItems.size() == 1, "积分商城活动兑换商品兑换时,只允许选择一个商品");
  41 + // 校验用户剩余积分是否足够兑换商品
  42 + MemberUserRespDTO user = memberUserApi.getUser(order.getUserId());
  43 + if (user.getPoint() < order.getUsePoint()) {
  44 + throw exception(ORDER_CREATE_FAIL_INSUFFICIENT_USER_POINTS);
  45 + }
34 46
35 // 扣减积分商城活动的库存 47 // 扣减积分商城活动的库存
36 pointActivityApi.updatePointStockDecr(order.getPointActivityId(), 48 pointActivityApi.updatePointStockDecr(order.getPointActivityId(),
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradePointActivityPriceCalculator.java
@@ -60,21 +60,21 @@ public class TradePointActivityPriceCalculator implements TradePriceCalculator { @@ -60,21 +60,21 @@ public class TradePointActivityPriceCalculator implements TradePriceCalculator {
60 param.getUserId(), param.getPointActivityId(), 60 param.getUserId(), param.getPointActivityId(),
61 orderItem.getSkuId(), orderItem.getCount()); 61 orderItem.getSkuId(), orderItem.getCount());
62 62
  63 + // 3.0 积分兑换前置校验
  64 + Assert.isTrue(activity.getPoint() >= 1, "积分商城商品兑换积分必须大于 1");
63 // 3.1 记录优惠明细 65 // 3.1 记录优惠明细
  66 + int usePoint = activity.getPoint() * orderItem.getCount();
  67 + result.setUsePoint(usePoint);
  68 + orderItem.setUsePoint(usePoint);
64 int discountPrice = orderItem.getPayPrice(); // 情况一:单使用积分兑换 69 int discountPrice = orderItem.getPayPrice(); // 情况一:单使用积分兑换
65 - Assert.isTrue(activity.getPoint() >= 1, "积分商城商品兑换积分必须大于 1");  
66 - result.setUsePoint(activity.getPoint() * orderItem.getCount());  
67 - orderItem.setUsePoint(activity.getPoint() * orderItem.getCount());  
68 if (activity.getPrice() != null && activity.getPrice() > 0) { // 情况二:积分 + 金额 70 if (activity.getPrice() != null && activity.getPrice() > 0) { // 情况二:积分 + 金额
69 discountPrice = orderItem.getPayPrice() - activity.getPrice() * orderItem.getCount(); 71 discountPrice = orderItem.getPayPrice() - activity.getPrice() * orderItem.getCount();
70 } 72 }
71 - // 3.2 记录优惠明细  
72 TradePriceCalculatorHelper.addPromotion(result, orderItem, 73 TradePriceCalculatorHelper.addPromotion(result, orderItem,
73 param.getPointActivityId(), "积分商城活动", PromotionTypeEnum.POINT.getType(), 74 param.getPointActivityId(), "积分商城活动", PromotionTypeEnum.POINT.getType(),
74 StrUtil.format("积分商城活动:省 {} 元", TradePriceCalculatorHelper.formatPrice(discountPrice)), 75 StrUtil.format("积分商城活动:省 {} 元", TradePriceCalculatorHelper.formatPrice(discountPrice)),
75 discountPrice); 76 discountPrice);
76 -  
77 - // 3.3 更新 SKU 优惠金额 77 + // 3.2 更新 SKU 优惠金额
78 orderItem.setDiscountPrice(orderItem.getDiscountPrice() + discountPrice); 78 orderItem.setDiscountPrice(orderItem.getDiscountPrice() + discountPrice);
79 TradePriceCalculatorHelper.recountPayPrice(orderItem); 79 TradePriceCalculatorHelper.recountPayPrice(orderItem);
80 TradePriceCalculatorHelper.recountAllPrice(result); 80 TradePriceCalculatorHelper.recountAllPrice(result);