Commit 30a24601cd885b954fac322a559ba5bc8ca75f4f
1 parent
d3352308
【缺陷修复】商城:修复积分不够还能兑换商品的 bug
Showing
3 changed files
with
19 additions
and
6 deletions
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 | 37 | ErrorCode ORDER_CREATE_FAIL_EXIST_UNPAID = new ErrorCode(1_011_000_032, "交易订单创建失败,原因:存在未付款订单"); |
| 38 | 38 | ErrorCode ORDER_CANCEL_PAID_FAIL = new ErrorCode(1_011_000_033, "交易订单取消支付失败,原因:订单不是【{}】状态"); |
| 39 | 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 | 42 | // ========== After Sale 模块 1-011-000-100 ========== |
| 42 | 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 | 2 | |
| 3 | 3 | import cn.hutool.core.collection.CollUtil; |
| 4 | 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 | 7 | import cn.iocoder.yudao.module.promotion.api.point.PointActivityApi; |
| 6 | 8 | import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; |
| 7 | 9 | import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO; |
| ... | ... | @@ -13,6 +15,9 @@ import org.springframework.stereotype.Component; |
| 13 | 15 | import java.util.List; |
| 14 | 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 | 22 | * 积分商城活动订单的 {@link TradeOrderHandler} 实现类 |
| 18 | 23 | * |
| ... | ... | @@ -23,6 +28,8 @@ public class TradePointOrderHandler implements TradeOrderHandler { |
| 23 | 28 | |
| 24 | 29 | @Resource |
| 25 | 30 | private PointActivityApi pointActivityApi; |
| 31 | + @Resource | |
| 32 | + private MemberUserApi memberUserApi; | |
| 26 | 33 | |
| 27 | 34 | @Override |
| 28 | 35 | public void beforeOrderCreate(TradeOrderDO order, List<TradeOrderItemDO> orderItems) { |
| ... | ... | @@ -31,6 +38,11 @@ public class TradePointOrderHandler implements TradeOrderHandler { |
| 31 | 38 | } |
| 32 | 39 | // 明确校验一下 |
| 33 | 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 | 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 | 60 | param.getUserId(), param.getPointActivityId(), |
| 61 | 61 | orderItem.getSkuId(), orderItem.getCount()); |
| 62 | 62 | |
| 63 | + // 3.0 积分兑换前置校验 | |
| 64 | + Assert.isTrue(activity.getPoint() >= 1, "积分商城商品兑换积分必须大于 1"); | |
| 63 | 65 | // 3.1 记录优惠明细 |
| 66 | + int usePoint = activity.getPoint() * orderItem.getCount(); | |
| 67 | + result.setUsePoint(usePoint); | |
| 68 | + orderItem.setUsePoint(usePoint); | |
| 64 | 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 | 70 | if (activity.getPrice() != null && activity.getPrice() > 0) { // 情况二:积分 + 金额 |
| 69 | 71 | discountPrice = orderItem.getPayPrice() - activity.getPrice() * orderItem.getCount(); |
| 70 | 72 | } |
| 71 | - // 3.2 记录优惠明细 | |
| 72 | 73 | TradePriceCalculatorHelper.addPromotion(result, orderItem, |
| 73 | 74 | param.getPointActivityId(), "积分商城活动", PromotionTypeEnum.POINT.getType(), |
| 74 | 75 | StrUtil.format("积分商城活动:省 {} 元", TradePriceCalculatorHelper.formatPrice(discountPrice)), |
| 75 | 76 | discountPrice); |
| 76 | - | |
| 77 | - // 3.3 更新 SKU 优惠金额 | |
| 77 | + // 3.2 更新 SKU 优惠金额 | |
| 78 | 78 | orderItem.setDiscountPrice(orderItem.getDiscountPrice() + discountPrice); |
| 79 | 79 | TradePriceCalculatorHelper.recountPayPrice(orderItem); |
| 80 | 80 | TradePriceCalculatorHelper.recountAllPrice(result); | ... | ... |