Commit d7236068b98d9f471fb90a0f296d50fe33167927

Authored by puhui999
1 parent f01c6004

【功能完善】商城: APP 完善积分商城活动订单价格计算

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);