mirror of
				https://github.com/YunaiV/ruoyi-vue-pro.git
				synced 2025-10-31 10:37:41 +08:00 
			
		
		
		
	【功能】完成下单确认页价格计算功能(只做了满减,还没做满送)
This commit is contained in:
		| @ -46,6 +46,7 @@ public interface ErrorCodeConstants { | |||||||
|     ErrorCode REWARD_ACTIVITY_DELETE_FAIL_STATUS_NOT_CLOSED = new ErrorCode(1_013_006_003, "满减送活动未关闭,不能删除"); |     ErrorCode REWARD_ACTIVITY_DELETE_FAIL_STATUS_NOT_CLOSED = new ErrorCode(1_013_006_003, "满减送活动未关闭,不能删除"); | ||||||
|     ErrorCode REWARD_ACTIVITY_CLOSE_FAIL_STATUS_CLOSED = new ErrorCode(1_013_006_004, "满减送活动已关闭,不能重复关闭"); |     ErrorCode REWARD_ACTIVITY_CLOSE_FAIL_STATUS_CLOSED = new ErrorCode(1_013_006_004, "满减送活动已关闭,不能重复关闭"); | ||||||
|     ErrorCode REWARD_ACTIVITY_SCOPE_EXISTS = new ErrorCode(1_013_006_005, "与该时间段已存在的满减送活动商品范围冲突"); |     ErrorCode REWARD_ACTIVITY_SCOPE_EXISTS = new ErrorCode(1_013_006_005, "与该时间段已存在的满减送活动商品范围冲突"); | ||||||
|  |     ErrorCode REWARD_ACTIVITY_TYPE_NOT_EXISTS = new ErrorCode(1_013_006_006, "满减送活动类型不存在"); | ||||||
|  |  | ||||||
|     // ========== TODO 空着 1-013-007-000 ============ |     // ========== TODO 空着 1-013-007-000 ============ | ||||||
|  |  | ||||||
|  | |||||||
| @ -1,6 +1,7 @@ | |||||||
| package cn.iocoder.yudao.module.promotion.dal.mysql.discount; | package cn.iocoder.yudao.module.promotion.dal.mysql.discount; | ||||||
|  |  | ||||||
| import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; | ||||||
|  | import cn.iocoder.yudao.module.promotion.api.discount.dto.DiscountProductRespDTO; | ||||||
| import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountProductDO; | import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountProductDO; | ||||||
| import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | ||||||
| import org.apache.ibatis.annotations.Mapper; | import org.apache.ibatis.annotations.Mapper; | ||||||
| @ -31,7 +32,7 @@ public interface DiscountProductMapper extends BaseMapperX<DiscountProductDO> { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     // TODO @zhangshuai:逻辑里,尽量避免写 join 语句哈,你可以看看这个查询,有什么办法优化?目前的一个思路,是分 2 次查询,性能也是 ok 的 |     // TODO @zhangshuai:逻辑里,尽量避免写 join 语句哈,你可以看看这个查询,有什么办法优化?目前的一个思路,是分 2 次查询,性能也是 ok 的 | ||||||
|     List<DiscountProductDO> getMatchDiscountProductList(@Param("skuIds") Collection<Long> skuIds); |     List<DiscountProductRespDTO> getMatchDiscountProductList(@Param("skuIds") Collection<Long> skuIds); | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 查询出指定 spuId 的 spu 参加的活动最接近现在的一条记录。多个的话,一个 spuId 对应一个最近的活动编号 |      * 查询出指定 spuId 的 spu 参加的活动最接近现在的一条记录。多个的话,一个 spuId 对应一个最近的活动编号 | ||||||
|  | |||||||
| @ -1,6 +1,7 @@ | |||||||
| package cn.iocoder.yudao.module.promotion.service.discount; | package cn.iocoder.yudao.module.promotion.service.discount; | ||||||
|  |  | ||||||
| import cn.iocoder.yudao.framework.common.pojo.PageResult; | import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||||||
|  | import cn.iocoder.yudao.module.promotion.api.discount.dto.DiscountProductRespDTO; | ||||||
| import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityCreateReqVO; | import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityCreateReqVO; | ||||||
| import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityPageReqVO; | import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityPageReqVO; | ||||||
| import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityUpdateReqVO; | import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityUpdateReqVO; | ||||||
| @ -27,7 +28,7 @@ public interface DiscountActivityService { | |||||||
|      * @param skuIds SKU 编号数组 |      * @param skuIds SKU 编号数组 | ||||||
|      * @return 匹配的限时折扣商品 |      * @return 匹配的限时折扣商品 | ||||||
|      */ |      */ | ||||||
|     List<DiscountProductDO> getMatchDiscountProductList(Collection<Long> skuIds); |     List<DiscountProductRespDTO> getMatchDiscountProductList(Collection<Long> skuIds); | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 创建限时折扣活动 |      * 创建限时折扣活动 | ||||||
|  | |||||||
| @ -6,6 +6,7 @@ import cn.hutool.core.map.MapUtil; | |||||||
| import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | ||||||
| import cn.iocoder.yudao.framework.common.pojo.PageResult; | import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||||||
| import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | ||||||
|  | import cn.iocoder.yudao.module.promotion.api.discount.dto.DiscountProductRespDTO; | ||||||
| import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityBaseVO; | import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityBaseVO; | ||||||
| import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityCreateReqVO; | import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityCreateReqVO; | ||||||
| import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityPageReqVO; | import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityPageReqVO; | ||||||
| @ -49,7 +50,7 @@ public class DiscountActivityServiceImpl implements DiscountActivityService { | |||||||
|     private DiscountProductMapper discountProductMapper; |     private DiscountProductMapper discountProductMapper; | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public List<DiscountProductDO> getMatchDiscountProductList(Collection<Long> skuIds) { |     public List<DiscountProductRespDTO> getMatchDiscountProductList(Collection<Long> skuIds) { | ||||||
|         return discountProductMapper.getMatchDiscountProductList(skuIds); |         return discountProductMapper.getMatchDiscountProductList(skuIds); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @ -130,7 +131,7 @@ public class DiscountActivityServiceImpl implements DiscountActivityService { | |||||||
|         List<DiscountProductDO> list = discountProductMapper.selectListByActivityId(id); |         List<DiscountProductDO> list = discountProductMapper.selectListByActivityId(id); | ||||||
|         // TODO @zhangshuai:一般简单的 stream 方法,建议是使用 CollectionUtils,例如说这里是 convertList 对把。 |         // TODO @zhangshuai:一般简单的 stream 方法,建议是使用 CollectionUtils,例如说这里是 convertList 对把。 | ||||||
|         List<Long> skuIds = list.stream().map(item -> item.getSkuId()).collect(Collectors.toList()); |         List<Long> skuIds = list.stream().map(item -> item.getSkuId()).collect(Collectors.toList()); | ||||||
|         List<DiscountProductDO> matchDiscountProductList = getMatchDiscountProductList(skuIds); |         List<DiscountProductRespDTO> matchDiscountProductList = getMatchDiscountProductList(skuIds); | ||||||
|         if (id != null) { // 排除自己这个活动 |         if (id != null) { // 排除自己这个活动 | ||||||
|             matchDiscountProductList.removeIf(product -> id.equals(product.getActivityId())); |             matchDiscountProductList.removeIf(product -> id.equals(product.getActivityId())); | ||||||
|         } |         } | ||||||
|  | |||||||
| @ -3,8 +3,8 @@ | |||||||
| <mapper namespace="cn.iocoder.yudao.module.promotion.dal.mysql.discount.DiscountProductMapper"> | <mapper namespace="cn.iocoder.yudao.module.promotion.dal.mysql.discount.DiscountProductMapper"> | ||||||
|  |  | ||||||
|  |  | ||||||
|     <select id="getMatchDiscountProductList"   resultType="cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountProductDO"> |     <select id="getMatchDiscountProductList"   resultType="cn.iocoder.yudao.module.promotion.api.discount.dto.DiscountProductRespDTO"> | ||||||
|         SELECT pdp.* |         SELECT pdp.*,pda.name as activity_name | ||||||
|         FROM promotion_discount_product pdp |         FROM promotion_discount_product pdp | ||||||
|         LEFT JOIN promotion_discount_activity pda |         LEFT JOIN promotion_discount_activity pda | ||||||
|         ON pdp.activity_id = pda.id |         ON pdp.activity_id = pda.id | ||||||
| @ -17,8 +17,10 @@ | |||||||
|             </if> |             </if> | ||||||
|             AND pda.start_time <= CURRENT_TIME AND pda.end_time >= CURRENT_TIME |             AND pda.start_time <= CURRENT_TIME AND pda.end_time >= CURRENT_TIME | ||||||
|             AND pda.`status` = 0 |             AND pda.`status` = 0 | ||||||
|             AND pda.deleted != 1 |             AND pda.deleted =0 | ||||||
|  |             AND pdp.deleted = 0 | ||||||
|         </where> |         </where> | ||||||
|  |         ORDER BY pdp.id DESC | ||||||
|     </select> |     </select> | ||||||
|  |  | ||||||
| </mapper> | </mapper> | ||||||
|  | |||||||
| @ -1,6 +1,7 @@ | |||||||
| package cn.iocoder.yudao.module.trade.controller.app.order.vo; | package cn.iocoder.yudao.module.trade.controller.app.order.vo; | ||||||
|  |  | ||||||
| import cn.iocoder.yudao.module.trade.controller.app.base.property.AppProductPropertyValueDetailRespVO; | import cn.iocoder.yudao.module.trade.controller.app.base.property.AppProductPropertyValueDetailRespVO; | ||||||
|  | import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO; | ||||||
| import io.swagger.v3.oas.annotations.media.Schema; | import io.swagger.v3.oas.annotations.media.Schema; | ||||||
| import jakarta.validation.constraints.NotNull; | import jakarta.validation.constraints.NotNull; | ||||||
| import lombok.AllArgsConstructor; | import lombok.AllArgsConstructor; | ||||||
| @ -31,6 +32,13 @@ public class AppTradeOrderSettlementRespVO { | |||||||
|     @Schema(description = "总积分", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") |     @Schema(description = "总积分", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") | ||||||
|     private Integer totalPoint; |     private Integer totalPoint; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 营销活动数组 | ||||||
|  |      * | ||||||
|  |      * 只对应 {@link TradePriceCalculateRespBO.Price#items} 商品匹配的活动 | ||||||
|  |      */ | ||||||
|  |     private List<TradePriceCalculateRespBO.Promotion> promotions; | ||||||
|  |  | ||||||
|     @Schema(description = "购物项") |     @Schema(description = "购物项") | ||||||
|     @Data |     @Data | ||||||
|     public static class Item { |     public static class Item { | ||||||
|  | |||||||
| @ -3,6 +3,10 @@ package cn.iocoder.yudao.module.trade.service.price.calculator; | |||||||
| import cn.hutool.core.collection.CollUtil; | import cn.hutool.core.collection.CollUtil; | ||||||
| import cn.hutool.core.util.ObjectUtil; | import cn.hutool.core.util.ObjectUtil; | ||||||
| import cn.hutool.core.util.StrUtil; | import cn.hutool.core.util.StrUtil; | ||||||
|  | import cn.iocoder.yudao.module.member.api.level.MemberLevelApi; | ||||||
|  | import cn.iocoder.yudao.module.member.api.level.dto.MemberLevelRespDTO; | ||||||
|  | import cn.iocoder.yudao.module.member.api.user.MemberUserApi; | ||||||
|  | import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; | ||||||
| import cn.iocoder.yudao.module.promotion.api.discount.DiscountActivityApi; | import cn.iocoder.yudao.module.promotion.api.discount.DiscountActivityApi; | ||||||
| import cn.iocoder.yudao.module.promotion.api.discount.dto.DiscountProductRespDTO; | import cn.iocoder.yudao.module.promotion.api.discount.dto.DiscountProductRespDTO; | ||||||
| import cn.iocoder.yudao.module.promotion.enums.common.PromotionDiscountTypeEnum; | import cn.iocoder.yudao.module.promotion.enums.common.PromotionDiscountTypeEnum; | ||||||
| @ -32,6 +36,10 @@ public class TradeDiscountActivityPriceCalculator implements TradePriceCalculato | |||||||
|  |  | ||||||
|     @Resource |     @Resource | ||||||
|     private DiscountActivityApi discountActivityApi; |     private DiscountActivityApi discountActivityApi; | ||||||
|  |     @Resource | ||||||
|  |     private MemberLevelApi memberLevelApi; | ||||||
|  |     @Resource | ||||||
|  |     private MemberUserApi memberUserApi; | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public void calculate(TradePriceCalculateReqBO param, TradePriceCalculateRespBO result) { |     public void calculate(TradePriceCalculateReqBO param, TradePriceCalculateRespBO result) { | ||||||
| @ -39,6 +47,7 @@ public class TradeDiscountActivityPriceCalculator implements TradePriceCalculato | |||||||
|         if (ObjectUtil.notEqual(result.getType(), TradeOrderTypeEnum.NORMAL.getType())) { |         if (ObjectUtil.notEqual(result.getType(), TradeOrderTypeEnum.NORMAL.getType())) { | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|  |         //----------------------------------限时折扣计算----------------------------------------- | ||||||
|         // 获得 SKU 对应的限时折扣活动 |         // 获得 SKU 对应的限时折扣活动 | ||||||
|         List<DiscountProductRespDTO> discountProducts = discountActivityApi.getMatchDiscountProductList( |         List<DiscountProductRespDTO> discountProducts = discountActivityApi.getMatchDiscountProductList( | ||||||
|                 convertSet(result.getItems(), TradePriceCalculateRespBO.OrderItem::getSkuId)); |                 convertSet(result.getItems(), TradePriceCalculateRespBO.OrderItem::getSkuId)); | ||||||
| @ -47,27 +56,64 @@ public class TradeDiscountActivityPriceCalculator implements TradePriceCalculato | |||||||
|         } |         } | ||||||
|         Map<Long, DiscountProductRespDTO> discountProductMap = convertMap(discountProducts, DiscountProductRespDTO::getSkuId); |         Map<Long, DiscountProductRespDTO> discountProductMap = convertMap(discountProducts, DiscountProductRespDTO::getSkuId); | ||||||
|  |  | ||||||
|         // 处理每个 SKU 的限时折扣 |  | ||||||
|  |  | ||||||
|  |         //----------------------------------会员计算----------------------------------------- | ||||||
|  |  | ||||||
|  |         // 获得用户的会员等级 | ||||||
|  |         MemberUserRespDTO user = memberUserApi.getUser(param.getUserId()); | ||||||
|  |         if (user.getLevelId() == null || user.getLevelId() <= 0) { | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         MemberLevelRespDTO level = memberLevelApi.getMemberLevel(user.getLevelId()); | ||||||
|  |         if (level == null || level.getDiscountPercent() == null) { | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // 2. 计算每个 SKU 的优惠金额 | ||||||
|         result.getItems().forEach(orderItem -> { |         result.getItems().forEach(orderItem -> { | ||||||
|             // 1. 获取该 SKU 的优惠信息 |  | ||||||
|  |             //----------------------------------限时折扣计算----------------------------------------- | ||||||
|  |  | ||||||
|  |             // 2.1  计算限时折扣优惠信息 | ||||||
|             DiscountProductRespDTO discountProduct = discountProductMap.get(orderItem.getSkuId()); |             DiscountProductRespDTO discountProduct = discountProductMap.get(orderItem.getSkuId()); | ||||||
|             if (discountProduct == null) { |             if (discountProduct == null) { | ||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
|             // 2. 计算优惠金额 |             // 2.2 计算优惠金额 | ||||||
|             Integer newPayPrice = calculatePayPrice(discountProduct, orderItem); |             Integer newPayPrice = calculatePayPrice(discountProduct, orderItem); | ||||||
|             Integer newDiscountPrice = orderItem.getPayPrice() - newPayPrice; |             Integer newDiscountPrice = orderItem.getPayPrice() - newPayPrice; | ||||||
|  |  | ||||||
|             // 3.1 记录优惠明细 |  | ||||||
|  |             //----------------------------------会员计算----------------------------------------- | ||||||
|  |  | ||||||
|  |             // 2.3 计算会员优惠金额 | ||||||
|  |             Integer vipPrice = calculateVipPrice(orderItem.getPayPrice(), level.getDiscountPercent()); | ||||||
|  |             if (vipPrice <= 0) { | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             // 2.4 记录优惠明细 | ||||||
|             if (orderItem.getSelected()) { |             if (orderItem.getSelected()) { | ||||||
|  |                 if(newDiscountPrice > vipPrice){ | ||||||
|                     // 注意,只有在选中的情况下,才会记录到优惠明细。否则仅仅是更新 SKU 优惠金额,用于展示 |                     // 注意,只有在选中的情况下,才会记录到优惠明细。否则仅仅是更新 SKU 优惠金额,用于展示 | ||||||
|                     TradePriceCalculatorHelper.addPromotion(result, orderItem, |                     TradePriceCalculatorHelper.addPromotion(result, orderItem, | ||||||
|                             discountProduct.getActivityId(), discountProduct.getActivityName(), PromotionTypeEnum.DISCOUNT_ACTIVITY.getType(), |                             discountProduct.getActivityId(), discountProduct.getActivityName(), PromotionTypeEnum.DISCOUNT_ACTIVITY.getType(), | ||||||
|                             StrUtil.format("限时折扣:省 {} 元", formatPrice(newDiscountPrice)), |                             StrUtil.format("限时折扣:省 {} 元", formatPrice(newDiscountPrice)), | ||||||
|                             newDiscountPrice); |                             newDiscountPrice); | ||||||
|             } |                     // 2.5 更新 SKU 优惠金额 | ||||||
|             // 3.2 更新 SKU 优惠金额 |  | ||||||
|                     orderItem.setDiscountPrice(orderItem.getDiscountPrice() + newDiscountPrice); |                     orderItem.setDiscountPrice(orderItem.getDiscountPrice() + newDiscountPrice); | ||||||
|  |                 }else{ | ||||||
|  |                     // 注意,只有在选中的情况下,才会记录到优惠明细。否则仅仅是更新 SKU 优惠金额,用于展示 | ||||||
|  |                     TradePriceCalculatorHelper.addPromotion(result, orderItem, | ||||||
|  |                             level.getId(), level.getName(), PromotionTypeEnum.MEMBER_LEVEL.getType(), | ||||||
|  |                             String.format("会员等级折扣:省 %s 元", formatPrice(vipPrice)), | ||||||
|  |                             vipPrice); | ||||||
|  |                     // 2.5 更新 SKU 的优惠金额 | ||||||
|  |                     orderItem.setVipPrice(vipPrice); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |  | ||||||
|             TradePriceCalculatorHelper.recountPayPrice(orderItem); |             TradePriceCalculatorHelper.recountPayPrice(orderItem); | ||||||
|         }); |         }); | ||||||
|         TradePriceCalculatorHelper.recountAllPrice(result); |         TradePriceCalculatorHelper.recountAllPrice(result); | ||||||
| @ -77,7 +123,7 @@ public class TradeDiscountActivityPriceCalculator implements TradePriceCalculato | |||||||
|                                       TradePriceCalculateRespBO.OrderItem orderItem) { |                                       TradePriceCalculateRespBO.OrderItem orderItem) { | ||||||
|         Integer price = orderItem.getPayPrice(); |         Integer price = orderItem.getPayPrice(); | ||||||
|         if (PromotionDiscountTypeEnum.PRICE.getType().equals(discountProduct.getDiscountType())) { // 减价 |         if (PromotionDiscountTypeEnum.PRICE.getType().equals(discountProduct.getDiscountType())) { // 减价 | ||||||
|             price -= discountProduct.getDiscountPrice() * orderItem.getCount(); |             price -= discountProduct.getDiscountPrice() * 100 * orderItem.getCount(); | ||||||
|         } else if (PromotionDiscountTypeEnum.PERCENT.getType().equals(discountProduct.getDiscountType())) { // 打折 |         } else if (PromotionDiscountTypeEnum.PERCENT.getType().equals(discountProduct.getDiscountType())) { // 打折 | ||||||
|             price = price * discountProduct.getDiscountPercent() / 100; |             price = price * discountProduct.getDiscountPercent() / 100; | ||||||
|         } else { |         } else { | ||||||
| @ -86,4 +132,19 @@ public class TradeDiscountActivityPriceCalculator implements TradePriceCalculato | |||||||
|         return price; |         return price; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 计算会员 VIP 优惠价格 | ||||||
|  |      * | ||||||
|  |      * @param price 原价 | ||||||
|  |      * @param discountPercent 折扣 | ||||||
|  |      * @return 优惠价格 | ||||||
|  |      */ | ||||||
|  |     public Integer calculateVipPrice(Integer price, Integer discountPercent) { | ||||||
|  |         if (discountPercent == null) { | ||||||
|  |             return 0; | ||||||
|  |         } | ||||||
|  |         Integer newPrice = price * discountPercent / 100; | ||||||
|  |         return price - newPrice; | ||||||
|  |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -30,44 +30,49 @@ public class TradeMemberLevelPriceCalculator implements TradePriceCalculator { | |||||||
|     @Resource |     @Resource | ||||||
|     private MemberUserApi memberUserApi; |     private MemberUserApi memberUserApi; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 会员计算迁移到限时优惠计算里 | ||||||
|  |      * @param param | ||||||
|  |      * @param result | ||||||
|  |      */ | ||||||
|     @Override |     @Override | ||||||
|     public void calculate(TradePriceCalculateReqBO param, TradePriceCalculateRespBO result) { |     public void calculate(TradePriceCalculateReqBO param, TradePriceCalculateRespBO result) { | ||||||
|         // 0. 只有【普通】订单,才计算该优惠 | //        // 0. 只有【普通】订单,才计算该优惠 | ||||||
|         if (ObjectUtil.notEqual(result.getType(), TradeOrderTypeEnum.NORMAL.getType())) { | //        if (ObjectUtil.notEqual(result.getType(), TradeOrderTypeEnum.NORMAL.getType())) { | ||||||
|             return; | //            return; | ||||||
|         } | //        } | ||||||
|         // 1. 获得用户的会员等级 | //        // 1. 获得用户的会员等级 | ||||||
|         MemberUserRespDTO user = memberUserApi.getUser(param.getUserId()); | //        MemberUserRespDTO user = memberUserApi.getUser(param.getUserId()); | ||||||
|         if (user.getLevelId() == null || user.getLevelId() <= 0) { | //        if (user.getLevelId() == null || user.getLevelId() <= 0) { | ||||||
|             return; | //            return; | ||||||
|         } | //        } | ||||||
|         MemberLevelRespDTO level = memberLevelApi.getMemberLevel(user.getLevelId()); | //        MemberLevelRespDTO level = memberLevelApi.getMemberLevel(user.getLevelId()); | ||||||
|         if (level == null || level.getDiscountPercent() == null) { | //        if (level == null || level.getDiscountPercent() == null) { | ||||||
|             return; | //            return; | ||||||
|         } | //        } | ||||||
|  | // | ||||||
|         // 2. 计算每个 SKU 的优惠金额 | //        // 2. 计算每个 SKU 的优惠金额 | ||||||
|         result.getItems().forEach(orderItem -> { | //        result.getItems().forEach(orderItem -> { | ||||||
|             // 2.1 计算优惠金额 | //            // 2.1 计算优惠金额 | ||||||
|             Integer vipPrice = calculateVipPrice(orderItem.getPayPrice(), level.getDiscountPercent()); | //            Integer vipPrice = calculateVipPrice(orderItem.getPayPrice(), level.getDiscountPercent()); | ||||||
|             if (vipPrice <= 0) { | //            if (vipPrice <= 0) { | ||||||
|                 return; | //                return; | ||||||
|             } | //            } | ||||||
|  | // | ||||||
|             // 2.2 记录优惠明细 | //            // 2.2 记录优惠明细 | ||||||
|             if (orderItem.getSelected()) { | //            if (orderItem.getSelected()) { | ||||||
|                 // 注意,只有在选中的情况下,才会记录到优惠明细。否则仅仅是更新 SKU 优惠金额,用于展示 | //                // 注意,只有在选中的情况下,才会记录到优惠明细。否则仅仅是更新 SKU 优惠金额,用于展示 | ||||||
|                 TradePriceCalculatorHelper.addPromotion(result, orderItem, | //                TradePriceCalculatorHelper.addPromotion(result, orderItem, | ||||||
|                         level.getId(), level.getName(), PromotionTypeEnum.MEMBER_LEVEL.getType(), | //                        level.getId(), level.getName(), PromotionTypeEnum.MEMBER_LEVEL.getType(), | ||||||
|                         String.format("会员等级折扣:省 %s 元", formatPrice(vipPrice)), | //                        String.format("会员等级折扣:省 %s 元", formatPrice(vipPrice)), | ||||||
|                         vipPrice); | //                        vipPrice); | ||||||
|             } | //            } | ||||||
|  | // | ||||||
|             // 2.3 更新 SKU 的优惠金额 | //            // 2.3 更新 SKU 的优惠金额 | ||||||
|             orderItem.setVipPrice(vipPrice); | //            orderItem.setVipPrice(vipPrice); | ||||||
|             TradePriceCalculatorHelper.recountPayPrice(orderItem); | //            TradePriceCalculatorHelper.recountPayPrice(orderItem); | ||||||
|         }); | //        }); | ||||||
|         TradePriceCalculatorHelper.recountAllPrice(result); | //        TradePriceCalculatorHelper.recountAllPrice(result); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|  | |||||||
| @ -23,8 +23,10 @@ import java.util.Comparator; | |||||||
| import java.util.List; | import java.util.List; | ||||||
| import java.util.Map; | import java.util.Map; | ||||||
|  |  | ||||||
|  | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | ||||||
| import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; | ||||||
| import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.filterList; | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.filterList; | ||||||
|  | import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.REWARD_ACTIVITY_TYPE_NOT_EXISTS; | ||||||
| import static cn.iocoder.yudao.module.trade.service.price.calculator.TradePriceCalculatorHelper.formatPrice; | import static cn.iocoder.yudao.module.trade.service.price.calculator.TradePriceCalculatorHelper.formatPrice; | ||||||
|  |  | ||||||
| // TODO @puhui999:相关的单测,建议改一改 | // TODO @puhui999:相关的单测,建议改一改 | ||||||
| @ -53,9 +55,10 @@ public class TradeRewardActivityPriceCalculator implements TradePriceCalculator | |||||||
|         if (CollUtil.isEmpty(rewardActivities)) { |         if (CollUtil.isEmpty(rewardActivities)) { | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|  |         // 处理最新的满减送活动 | ||||||
|         // 处理每个满减送活动 |         if(!rewardActivities.isEmpty()){ | ||||||
|         rewardActivities.forEach(rewardActivity -> calculate(param, result, rewardActivity)); |             calculate(param, result, rewardActivities.get(0)); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private void calculate(TradePriceCalculateReqBO param, TradePriceCalculateRespBO result, |     private void calculate(TradePriceCalculateReqBO param, TradePriceCalculateRespBO result, | ||||||
| @ -126,21 +129,18 @@ public class TradeRewardActivityPriceCalculator implements TradePriceCalculator | |||||||
|      */ |      */ | ||||||
|     private List<TradePriceCalculateRespBO.OrderItem> filterMatchActivityOrderItems(TradePriceCalculateRespBO result, |     private List<TradePriceCalculateRespBO.OrderItem> filterMatchActivityOrderItems(TradePriceCalculateRespBO result, | ||||||
|                                                                                     RewardActivityMatchRespDTO rewardActivity) { |                                                                                     RewardActivityMatchRespDTO rewardActivity) { | ||||||
|         // 情况一:全部商品都可以参与 |         Integer productScope = rewardActivity.getProductScope(); | ||||||
|         if (PromotionProductScopeEnum.isAll(rewardActivity.getProductScope())) { |         if(PromotionProductScopeEnum.isAll(productScope)){ | ||||||
|             return result.getItems(); |             return result.getItems(); | ||||||
|         } |         }else if (PromotionProductScopeEnum.isSpu(productScope)) { | ||||||
|         // 情况二:指定商品参与 |  | ||||||
|         if (PromotionProductScopeEnum.isSpu(rewardActivity.getProductScope())) { |  | ||||||
|             return filterList(result.getItems(), |             return filterList(result.getItems(), | ||||||
|                     orderItem -> CollUtil.contains(rewardActivity.getProductScopeValues(), orderItem.getSpuId())); |                     orderItem -> CollUtil.contains(rewardActivity.getProductScopeValues(), orderItem.getSpuId())); | ||||||
|         } |         }else if (PromotionProductScopeEnum.isCategory(productScope)) { | ||||||
|         // 情况三:指定商品类型参与 |  | ||||||
|         if (PromotionProductScopeEnum.isCategory(rewardActivity.getProductScope())) { |  | ||||||
|             return filterList(result.getItems(), |             return filterList(result.getItems(), | ||||||
|                     orderItem -> CollUtil.contains(rewardActivity.getProductScopeValues(), orderItem.getCategoryId())); |                     orderItem -> CollUtil.contains(rewardActivity.getProductScopeValues(), orderItem.getCategoryId())); | ||||||
|  |         }else{ | ||||||
|  |             throw exception(REWARD_ACTIVITY_TYPE_NOT_EXISTS); | ||||||
|         } |         } | ||||||
|         return List.of(); |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 痴货
					痴货