Commit d7236068b98d9f471fb90a0f296d50fe33167927
1 parent
f01c6004
【功能完善】商城: APP 完善积分商城活动订单价格计算
Showing
3 changed files
with
23 additions
and
7 deletions
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/TradePriceServiceImpl.java
| @@ -69,7 +69,7 @@ public class TradePriceServiceImpl implements TradePriceService { | @@ -69,7 +69,7 @@ public class TradePriceServiceImpl implements TradePriceService { | ||
| 69 | .buildCalculateResp(calculateReqBO, spuList, skuList); | 69 | .buildCalculateResp(calculateReqBO, spuList, skuList); |
| 70 | priceCalculators.forEach(calculator -> calculator.calculate(calculateReqBO, calculateRespBO)); | 70 | priceCalculators.forEach(calculator -> calculator.calculate(calculateReqBO, calculateRespBO)); |
| 71 | // 2.2 如果最终支付金额小于等于 0,则抛出业务异常 | 71 | // 2.2 如果最终支付金额小于等于 0,则抛出业务异常 |
| 72 | - if (calculateRespBO.getPrice().getPayPrice() <= 0) { | 72 | + if (calculateReqBO.getPointActivityId() == null && calculateRespBO.getPrice().getPayPrice() <= 0) { |
| 73 | log.error("[calculatePrice][价格计算不正确,请求 calculateReqDTO({}),结果 priceCalculate({})]", | 73 | log.error("[calculatePrice][价格计算不正确,请求 calculateReqDTO({}),结果 priceCalculate({})]", |
| 74 | calculateReqBO, calculateRespBO); | 74 | calculateReqBO, calculateRespBO); |
| 75 | throw exception(PRICE_CALCULATE_PAY_PRICE_ILLEGAL); | 75 | throw exception(PRICE_CALCULATE_PAY_PRICE_ILLEGAL); |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradePointActivityPriceCalculator.java
| @@ -3,6 +3,8 @@ package cn.iocoder.yudao.module.trade.service.price.calculator; | @@ -3,6 +3,8 @@ package cn.iocoder.yudao.module.trade.service.price.calculator; | ||
| 3 | import cn.hutool.core.lang.Assert; | 3 | import cn.hutool.core.lang.Assert; |
| 4 | import cn.hutool.core.util.ObjectUtil; | 4 | import cn.hutool.core.util.ObjectUtil; |
| 5 | import cn.hutool.core.util.StrUtil; | 5 | import cn.hutool.core.util.StrUtil; |
| 6 | +import cn.iocoder.yudao.module.member.api.user.MemberUserApi; | ||
| 7 | +import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; | ||
| 6 | import cn.iocoder.yudao.module.promotion.api.point.PointActivityApi; | 8 | import cn.iocoder.yudao.module.promotion.api.point.PointActivityApi; |
| 7 | import cn.iocoder.yudao.module.promotion.api.point.dto.PointValidateJoinRespDTO; | 9 | import cn.iocoder.yudao.module.promotion.api.point.dto.PointValidateJoinRespDTO; |
| 8 | import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum; | 10 | import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum; |
| @@ -30,16 +32,26 @@ public class TradePointActivityPriceCalculator implements TradePriceCalculator { | @@ -30,16 +32,26 @@ public class TradePointActivityPriceCalculator implements TradePriceCalculator { | ||
| 30 | 32 | ||
| 31 | @Resource | 33 | @Resource |
| 32 | private PointActivityApi pointActivityApi; | 34 | private PointActivityApi pointActivityApi; |
| 35 | + @Resource | ||
| 36 | + private MemberUserApi memberUserApi; | ||
| 33 | 37 | ||
| 34 | @Resource | 38 | @Resource |
| 35 | private TradeOrderQueryService tradeOrderQueryService; | 39 | private TradeOrderQueryService tradeOrderQueryService; |
| 36 | 40 | ||
| 37 | @Override | 41 | @Override |
| 38 | public void calculate(TradePriceCalculateReqBO param, TradePriceCalculateRespBO result) { | 42 | public void calculate(TradePriceCalculateReqBO param, TradePriceCalculateRespBO result) { |
| 39 | - // 1. 判断订单类型是否为积分商城活动 | 43 | + // 1.1 判断订单类型是否为积分商城活动 |
| 40 | if (ObjectUtil.notEqual(result.getType(), TradeOrderTypeEnum.POINT.getType())) { | 44 | if (ObjectUtil.notEqual(result.getType(), TradeOrderTypeEnum.POINT.getType())) { |
| 41 | return; | 45 | return; |
| 42 | } | 46 | } |
| 47 | + // 1.2 初始化积分 | ||
| 48 | + MemberUserRespDTO user = memberUserApi.getUser(param.getUserId()); | ||
| 49 | + result.setTotalPoint(user.getPoint()).setUsePoint(0); | ||
| 50 | + | ||
| 51 | + // 1.3 校验用户积分余额 | ||
| 52 | + if (user.getPoint() == null || user.getPoint() <= 0) { | ||
| 53 | + return; | ||
| 54 | + } | ||
| 43 | 55 | ||
| 44 | Assert.isTrue(param.getItems().size() == 1, "积分商城兑换商品时,只允许选择一个商品"); | 56 | Assert.isTrue(param.getItems().size() == 1, "积分商城兑换商品时,只允许选择一个商品"); |
| 45 | // 2. 校验是否可以参与积分商城活动 | 57 | // 2. 校验是否可以参与积分商城活动 |
| @@ -49,12 +61,10 @@ public class TradePointActivityPriceCalculator implements TradePriceCalculator { | @@ -49,12 +61,10 @@ public class TradePointActivityPriceCalculator implements TradePriceCalculator { | ||
| 49 | orderItem.getSkuId(), orderItem.getCount()); | 61 | orderItem.getSkuId(), orderItem.getCount()); |
| 50 | 62 | ||
| 51 | // 3.1 记录优惠明细 | 63 | // 3.1 记录优惠明细 |
| 52 | - int discountPrice = 0; | 64 | + int discountPrice = orderItem.getPayPrice(); // 情况一:单使用积分兑换 |
| 53 | Assert.isTrue(activity.getPoint() >= 1, "积分商城商品兑换积分必须大于 1"); | 65 | Assert.isTrue(activity.getPoint() >= 1, "积分商城商品兑换积分必须大于 1"); |
| 54 | - // 情况一:单使用积分兑换 | ||
| 55 | - if (activity.getPrice() == null || activity.getPrice() == 0) { | ||
| 56 | - discountPrice = orderItem.getPayPrice(); | ||
| 57 | - } else { // 情况二:积分 + 金额 | 66 | + result.setUsePoint(activity.getPoint()); |
| 67 | + if (activity.getPrice() != null && activity.getPrice() > 0) { // 情况二:积分 + 金额 | ||
| 58 | discountPrice = orderItem.getPayPrice() - activity.getPrice() * orderItem.getCount(); | 68 | discountPrice = orderItem.getPayPrice() - activity.getPrice() * orderItem.getCount(); |
| 59 | } | 69 | } |
| 60 | TradePriceCalculatorHelper.addPromotion(result, orderItem, | 70 | TradePriceCalculatorHelper.addPromotion(result, orderItem, |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradePointUsePriceCalculator.java
| 1 | package cn.iocoder.yudao.module.trade.service.price.calculator; | 1 | package cn.iocoder.yudao.module.trade.service.price.calculator; |
| 2 | 2 | ||
| 3 | import cn.hutool.core.util.BooleanUtil; | 3 | import cn.hutool.core.util.BooleanUtil; |
| 4 | +import cn.hutool.core.util.ObjectUtil; | ||
| 4 | import cn.hutool.core.util.StrUtil; | 5 | import cn.hutool.core.util.StrUtil; |
| 5 | import cn.iocoder.yudao.module.member.api.config.MemberConfigApi; | 6 | import cn.iocoder.yudao.module.member.api.config.MemberConfigApi; |
| 6 | import cn.iocoder.yudao.module.member.api.config.dto.MemberConfigRespDTO; | 7 | import cn.iocoder.yudao.module.member.api.config.dto.MemberConfigRespDTO; |
| 7 | import cn.iocoder.yudao.module.member.api.user.MemberUserApi; | 8 | import cn.iocoder.yudao.module.member.api.user.MemberUserApi; |
| 8 | import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; | 9 | import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; |
| 9 | import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum; | 10 | import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum; |
| 11 | +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum; | ||
| 10 | import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO; | 12 | import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO; |
| 11 | import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO; | 13 | import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO; |
| 12 | import jakarta.annotation.Resource; | 14 | import jakarta.annotation.Resource; |
| @@ -37,6 +39,10 @@ public class TradePointUsePriceCalculator implements TradePriceCalculator { | @@ -37,6 +39,10 @@ public class TradePointUsePriceCalculator implements TradePriceCalculator { | ||
| 37 | 39 | ||
| 38 | @Override | 40 | @Override |
| 39 | public void calculate(TradePriceCalculateReqBO param, TradePriceCalculateRespBO result) { | 41 | public void calculate(TradePriceCalculateReqBO param, TradePriceCalculateRespBO result) { |
| 42 | + // 判断订单类型是否不为积分商城活动 | ||
| 43 | + if (ObjectUtil.equal(result.getType(), TradeOrderTypeEnum.POINT.getType())) { | ||
| 44 | + return; | ||
| 45 | + } | ||
| 40 | // 0. 初始化积分 | 46 | // 0. 初始化积分 |
| 41 | MemberUserRespDTO user = memberUserApi.getUser(param.getUserId()); | 47 | MemberUserRespDTO user = memberUserApi.getUser(param.getUserId()); |
| 42 | result.setTotalPoint(user.getPoint()).setUsePoint(0); | 48 | result.setTotalPoint(user.getPoint()).setUsePoint(0); |