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