From db56984cf38ec9126d94079b0ed9c2379de896ec Mon Sep 17 00:00:00 2001 From: Chopper Date: Fri, 13 Aug 2021 18:18:01 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=93=E7=AE=97=E9=A1=B5=E4=BC=98=E6=83=A0?= =?UTF-8?q?=E5=88=B8=E9=87=91=E9=A2=9D=E9=94=99=E8=AF=AF=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E5=A4=84=E7=90=86=E3=80=82=20=E8=B4=AD=E7=89=A9=E8=BD=A6?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E9=87=91=E9=A2=9D=E6=B8=B2=E6=9F=93=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cart/entity/enums/RenderStepEnums.java | 6 +- .../order/cart/render/CartRenderStep.java | 1 - .../cart/render/RenderStepStatement.java | 80 ++++++++++ .../order/cart/render/TradeBuilder.java | 148 ++++++------------ .../cart/render/impl/CartPriceRender.java | 2 - .../order/cart/render/impl/CartSnRender.java | 1 - .../cart/render/impl/CheckDataRender.java | 1 - .../cart/render/impl/CheckedFilterRender.java | 46 ++++++ .../cart/render/impl/CommissionRender.java | 118 ++++++++++++++ .../order/cart/render/impl/CouponRender.java | 1 - .../render/impl/DistributionPriceRender.java | 2 - .../cart/render/impl/FullDiscountRender.java | 1 - .../cart/render/impl/SkuFreightRender.java | 1 - .../cart/render/impl/SkuPromotionRender.java | 38 ++--- .../order/cart/service/CartServiceImpl.java | 2 +- .../order/entity/dto/PriceDetailDTO.java | 28 +++- 16 files changed, 341 insertions(+), 135 deletions(-) create mode 100644 framework/src/main/java/cn/lili/modules/order/cart/render/RenderStepStatement.java create mode 100644 framework/src/main/java/cn/lili/modules/order/cart/render/impl/CheckedFilterRender.java create mode 100644 framework/src/main/java/cn/lili/modules/order/cart/render/impl/CommissionRender.java diff --git a/framework/src/main/java/cn/lili/modules/order/cart/entity/enums/RenderStepEnums.java b/framework/src/main/java/cn/lili/modules/order/cart/entity/enums/RenderStepEnums.java index 04694bf2..81bfd664 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/entity/enums/RenderStepEnums.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/entity/enums/RenderStepEnums.java @@ -6,13 +6,15 @@ package cn.lili.modules.order.cart.entity.enums; public enum RenderStepEnums { CHECK_DATA("校验商品"), + CHECKED_FILTER("选择商品过滤"), CART_SN("交易编号创建"), COUPON("优惠券价格渲染"), SKU_FREIGHT("运费计算"), SKU_PROMOTION("商品促销计算"), + FULL_DISCOUNT("满减计算"), CART_PRICE("购物车金额计算"), - DISTRIBUTION("分销佣金计算"), - FULL_DISCOUNT("满减计算"); + DISTRIBUTION("分销人员佣金计算"), + PLATFORM_COMMISSION("平台佣金"); private String distribution; diff --git a/framework/src/main/java/cn/lili/modules/order/cart/render/CartRenderStep.java b/framework/src/main/java/cn/lili/modules/order/cart/render/CartRenderStep.java index ce535122..a8bd6d6e 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/render/CartRenderStep.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/render/CartRenderStep.java @@ -21,7 +21,6 @@ public interface CartRenderStep { /** * 渲染一笔交易 - * 0-》 校验商品 1-》 满优惠渲染 2-》渲染优惠 3-》优惠券渲染 4-》计算运费 5-》计算价格 6-》分销渲染 7-》其他渲染 * * @param tradeDTO 交易DTO */ diff --git a/framework/src/main/java/cn/lili/modules/order/cart/render/RenderStepStatement.java b/framework/src/main/java/cn/lili/modules/order/cart/render/RenderStepStatement.java new file mode 100644 index 00000000..1a301ba6 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/order/cart/render/RenderStepStatement.java @@ -0,0 +1,80 @@ +package cn.lili.modules.order.cart.render; + +import cn.lili.modules.order.cart.entity.enums.RenderStepEnums; + +/** + * 价格渲染 步骤声明 + * + * @author Chopper + * @version v1.0 + * 2021-08-13 16:15 + */ +public class RenderStepStatement { + + /** + * 购物车购物车渲染 + * 校验商品 》 满优惠渲染 》 渲染优惠 》计算价格 + */ + public static RenderStepEnums[] cartRender = { + RenderStepEnums.CHECK_DATA, + RenderStepEnums.FULL_DISCOUNT, + RenderStepEnums.SKU_PROMOTION, + RenderStepEnums.CART_PRICE}; + + /** + * 结算页渲染 + * 过滤选择的商品 》 校验商品 》 满优惠渲染 》 渲染优惠 》 + * 优惠券渲染 》 计算运费 》 计算价格 + */ + public static RenderStepEnums[] checkedRender = { + RenderStepEnums.CHECKED_FILTER, + RenderStepEnums.CHECK_DATA, + RenderStepEnums.FULL_DISCOUNT, + RenderStepEnums.SKU_PROMOTION, + RenderStepEnums.COUPON, + RenderStepEnums.SKU_FREIGHT, + RenderStepEnums.CART_PRICE, + }; + + + /** + * 单个商品优惠,不需要渲染满减优惠 + * 用于特殊场景:例如积分商品,拼团商品,虚拟商品等等 + */ + public static RenderStepEnums[] checkedSingleRender = { + RenderStepEnums.CHECK_DATA, + RenderStepEnums.SKU_PROMOTION, + RenderStepEnums.SKU_FREIGHT, + RenderStepEnums.CART_PRICE + }; + + /** + * 交易创建前渲染 + * 渲染购物车 生成SN 》分销人员佣金渲染 》平台佣金渲染 + */ + public static RenderStepEnums[] singleTradeRender = { + RenderStepEnums.CHECK_DATA, + RenderStepEnums.SKU_PROMOTION, + RenderStepEnums.SKU_FREIGHT, + RenderStepEnums.CART_PRICE, + RenderStepEnums.CART_SN, + RenderStepEnums.DISTRIBUTION, + RenderStepEnums.PLATFORM_COMMISSION + }; + /** + * 交易创建前渲染 + * 渲染购物车 生成SN 》分销人员佣金渲染 》平台佣金渲染 + */ + public static RenderStepEnums[] tradeRender = { + RenderStepEnums.CHECKED_FILTER, + RenderStepEnums.CHECK_DATA, + RenderStepEnums.FULL_DISCOUNT, + RenderStepEnums.SKU_PROMOTION, + RenderStepEnums.COUPON, + RenderStepEnums.SKU_FREIGHT, + RenderStepEnums.CART_PRICE, + RenderStepEnums.CART_SN, + RenderStepEnums.DISTRIBUTION, + RenderStepEnums.PLATFORM_COMMISSION + }; +} diff --git a/framework/src/main/java/cn/lili/modules/order/cart/render/TradeBuilder.java b/framework/src/main/java/cn/lili/modules/order/cart/render/TradeBuilder.java index 8a11b21e..84da6207 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/render/TradeBuilder.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/render/TradeBuilder.java @@ -3,8 +3,6 @@ package cn.lili.modules.order.cart.render; import cn.lili.modules.order.cart.entity.dto.TradeDTO; import cn.lili.modules.order.cart.entity.enums.CartTypeEnum; import cn.lili.modules.order.cart.entity.enums.RenderStepEnums; -import cn.lili.modules.order.cart.entity.vo.CartSkuVO; -import cn.lili.modules.order.cart.entity.vo.CartVO; import cn.lili.modules.order.cart.service.CartService; import cn.lili.modules.order.order.entity.dos.Trade; import cn.lili.modules.order.order.service.TradeService; @@ -12,9 +10,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; /** * 交易构造&&创建 @@ -43,44 +39,6 @@ public class TradeBuilder { private CartService cartService; - /** - * 渲染整比交易 - * 校验商品 》 满优惠渲染 》 渲染优惠 》 优惠券渲染 》 计算运费 》 计算价格 》 分销渲染 》 订单SN初始化 - */ - RenderStepEnums[] defaultRender = { - RenderStepEnums.CHECK_DATA, - RenderStepEnums.FULL_DISCOUNT, - RenderStepEnums.SKU_PROMOTION, - RenderStepEnums.COUPON, - RenderStepEnums.SKU_FREIGHT, - RenderStepEnums.CART_PRICE, - RenderStepEnums.DISTRIBUTION, - RenderStepEnums.CART_SN - }; - - /** - * 单个商品优惠,不需要渲染满减优惠 - * 用于特殊场景:例如积分商品,拼团商品,虚拟商品等等 - */ - RenderStepEnums[] singleRender = { - RenderStepEnums.CHECK_DATA, - RenderStepEnums.SKU_PROMOTION, - RenderStepEnums.SKU_FREIGHT, - RenderStepEnums.CART_PRICE, - RenderStepEnums.DISTRIBUTION, - RenderStepEnums.CART_SN}; - - /** - * 购物车购物车渲染 - * 校验商品 》 满优惠渲染 》 渲染优惠 》计算价格 - */ - RenderStepEnums[] cartRender = { - RenderStepEnums.CHECK_DATA, - RenderStepEnums.FULL_DISCOUNT, - RenderStepEnums.SKU_PROMOTION, - RenderStepEnums.CART_PRICE}; - - /** * 构造购物车 * 购物车与结算信息不一致的地方主要是优惠券计算和运费计算,其他规则都是一致都 @@ -99,73 +57,23 @@ public class TradeBuilder { } //按照计划进行渲染 - for (RenderStepEnums step : cartRender) { - for (CartRenderStep render : cartRenderSteps) { - try { - if (render.step().equals(step)) { - render.render(tradeDTO); - } - } catch (Exception e) { - log.error("购物车{}渲染异常:", render.getClass(), e); - } - } - } + renderCartBySteps(tradeDTO, RenderStepStatement.cartRender); return tradeDTO; } /** - * 构造一笔交易 - * 1.从缓存中读取交易数据 - * 2.从购物车列表中筛选出已选择的SKU列表存入交易中 - * 3.渲染整个交易(0-> 校验商品 1-》 满优惠渲染 2->渲染优惠 3->优惠券渲染 4->计算运费 5->计算价格 6->分销渲染 7->其他渲染) - * 4.将已选择的购物车列表存入交易中 - * - * @param checkedWay 购物车类型 - * @return 购物车展示信息 + * 构造结算页面 */ - public TradeDTO buildTrade(CartTypeEnum checkedWay) { + public TradeDTO buildChecked(CartTypeEnum checkedWay) { //读取对应购物车的商品信息 TradeDTO tradeDTO = cartService.readDTO(checkedWay); - //将购物车到sku未选择信息过滤 - List collect = tradeDTO.getSkuList().parallelStream().filter(i -> Boolean.TRUE.equals(i.getChecked())).collect(Collectors.toList()); - tradeDTO.setSkuList(collect); - if (checkedWay.equals(CartTypeEnum.CART) || checkedWay.equals(CartTypeEnum.BUY_NOW) || checkedWay.equals(CartTypeEnum.VIRTUAL)) { - //按照计划进行渲染 - for (RenderStepEnums step : defaultRender) { - for (CartRenderStep render : cartRenderSteps) { - try { - if (render.step().equals(step)) { - render.render(tradeDTO); - } - } catch (Exception e) { - log.error("购物车{}渲染异常:", render.getClass(), e); - } - } - } + //需要对购物车渲染 + if (isSingle(checkedWay)) { + renderCartBySteps(tradeDTO, RenderStepStatement.checkedRender); } else { - for (RenderStepEnums step : singleRender) { - for (CartRenderStep render : cartRenderSteps) { - try { - if (render.step().equals(step)) { - render.render(tradeDTO); - } - } catch (Exception e) { - log.error("购物车{}渲染异常:", render.getClass(), e); - } - } - } + renderCartBySteps(tradeDTO, RenderStepStatement.checkedSingleRender); } - - //购物车信息接受 - List cartVOList = new ArrayList<>(); - //循环购物车信息 - for (CartVO cartVO : tradeDTO.getCartList()) { - //如果商品选中,则加入到对应购物车 - cartVO.setSkuList(cartVO.getSkuList().stream().filter(j -> Boolean.TRUE.equals(j.getChecked())).collect(Collectors.toList())); - cartVOList.add(cartVO); - } - tradeDTO.setCartList(cartVOList); return tradeDTO; } @@ -178,7 +86,47 @@ public class TradeBuilder { * @return 交易信息 */ public Trade createTrade(CartTypeEnum checkedWay) { - TradeDTO tradeDTO = this.buildTrade(checkedWay); + //读取对应购物车的商品信息 + TradeDTO tradeDTO = cartService.readDTO(checkedWay); + + //需要对购物车渲染 + if (isSingle(checkedWay)) { + renderCartBySteps(tradeDTO, RenderStepStatement.singleTradeRender); + } else { + renderCartBySteps(tradeDTO, RenderStepStatement.tradeRender); + } + + return tradeService.createTrade(tradeDTO); } + + /** + * 是否为单品渲染 + * + * @param checkedWay 购物车类型 + * @return 返回是否单品 + */ + private boolean isSingle(CartTypeEnum checkedWay) { + return (checkedWay.equals(CartTypeEnum.CART) || checkedWay.equals(CartTypeEnum.BUY_NOW) || checkedWay.equals(CartTypeEnum.VIRTUAL)); + } + + /** + * 根据渲染步骤,渲染购物车信息 + * + * @param tradeDTO 交易DTO + * @param defaultRender 渲染枚举 + */ + private void renderCartBySteps(TradeDTO tradeDTO, RenderStepEnums[] defaultRender) { + for (RenderStepEnums step : defaultRender) { + for (CartRenderStep render : cartRenderSteps) { + try { + if (render.step().equals(step)) { + render.render(tradeDTO); + } + } catch (Exception e) { + log.error("购物车{}渲染异常:", render.getClass(), e); + } + } + } + } } diff --git a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CartPriceRender.java b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CartPriceRender.java index c6f9b43e..e4021b38 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CartPriceRender.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CartPriceRender.java @@ -15,7 +15,6 @@ import cn.lili.modules.promotion.entity.vos.PointsGoodsVO; import cn.lili.modules.promotion.service.KanjiaActivityGoodsService; import cn.lili.modules.promotion.service.PointsGoodsService; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.annotation.Order; import org.springframework.stereotype.Service; import java.util.ArrayList; @@ -29,7 +28,6 @@ import java.util.Map; * @author Chopper * @see CartVO */ -@Order(5) @Service public class CartPriceRender implements CartRenderStep { diff --git a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CartSnRender.java b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CartSnRender.java index b3fcda81..bfc0f962 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CartSnRender.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CartSnRender.java @@ -14,7 +14,6 @@ import org.springframework.stereotype.Service; * @author Chopper * @since 2020-07-02 14:47 */ -@Order(7) @Service public class CartSnRender implements CartRenderStep { diff --git a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CheckDataRender.java b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CheckDataRender.java index ab15de51..01b3debd 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CheckDataRender.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CheckDataRender.java @@ -40,7 +40,6 @@ import java.util.stream.Collectors; * @author Chopper * @since 2020-07-02 14:47 */ -@Order(0) @Service public class CheckDataRender implements CartRenderStep { diff --git a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CheckedFilterRender.java b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CheckedFilterRender.java new file mode 100644 index 00000000..06b4150e --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CheckedFilterRender.java @@ -0,0 +1,46 @@ +package cn.lili.modules.order.cart.render.impl; + +import cn.lili.modules.order.cart.entity.dto.TradeDTO; +import cn.lili.modules.order.cart.entity.enums.RenderStepEnums; +import cn.lili.modules.order.cart.entity.vo.CartSkuVO; +import cn.lili.modules.order.cart.entity.vo.CartVO; +import cn.lili.modules.order.cart.render.CartRenderStep; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 佣金计算 + * + * @author Chopper + * @see CartVO + */ +@Service +public class CheckedFilterRender implements CartRenderStep { + + @Override + public RenderStepEnums step() { + return RenderStepEnums.CHECKED_FILTER; + } + + @Override + public void render(TradeDTO tradeDTO) { + //将购物车到sku未选择信息过滤 + List collect = tradeDTO.getSkuList().parallelStream().filter(i -> Boolean.TRUE.equals(i.getChecked())).collect(Collectors.toList()); + tradeDTO.setSkuList(collect); + + //购物车信息过滤 + List cartVOList = new ArrayList<>(); + //循环购物车信息 + for (CartVO cartVO : tradeDTO.getCartList()) { + //如果商品选中,则加入到对应购物车 + cartVO.setSkuList(cartVO.getSkuList().stream().filter(j -> Boolean.TRUE.equals(j.getChecked())).collect(Collectors.toList())); + cartVOList.add(cartVO); + } + tradeDTO.setCartList(cartVOList); + } + + +} diff --git a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CommissionRender.java b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CommissionRender.java new file mode 100644 index 00000000..87ab685e --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CommissionRender.java @@ -0,0 +1,118 @@ +package cn.lili.modules.order.cart.render.impl; + +import cn.hutool.core.util.StrUtil; +import cn.lili.modules.goods.service.CategoryService; +import cn.lili.modules.order.cart.entity.dto.TradeDTO; +import cn.lili.modules.order.cart.entity.enums.CartTypeEnum; +import cn.lili.modules.order.cart.entity.enums.RenderStepEnums; +import cn.lili.modules.order.cart.entity.vo.CartSkuVO; +import cn.lili.modules.order.cart.entity.vo.CartVO; +import cn.lili.modules.order.cart.render.CartRenderStep; +import cn.lili.modules.order.order.entity.dto.PriceDetailDTO; +import cn.lili.modules.promotion.entity.dto.KanjiaActivityGoodsDTO; +import cn.lili.modules.promotion.entity.vos.PointsGoodsVO; +import cn.lili.modules.promotion.service.KanjiaActivityGoodsService; +import cn.lili.modules.promotion.service.PointsGoodsService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +/** + * 佣金计算 + * + * @author Chopper + * @see CartVO + */ +@Service +public class CommissionRender implements CartRenderStep { + + + /** + * 商品分类 + */ + @Autowired + private CategoryService categoryService; + /** + * 积分商品 + */ + @Autowired + private PointsGoodsService pointsGoodsService; + /** + * 砍价商品 + */ + @Autowired + private KanjiaActivityGoodsService kanjiaActivityGoodsService; + + @Override + public RenderStepEnums step() { + return RenderStepEnums.PLATFORM_COMMISSION; + } + + @Override + public void render(TradeDTO tradeDTO) { + buildCartPrice(tradeDTO); + buildTradePrice(tradeDTO); + } + + /** + * 购物车佣金计算 + * + * @param tradeDTO 购物车展示信息 + */ + void buildCartPrice(TradeDTO tradeDTO) { + //购物车列表 + List cartVOS = tradeDTO.getCartList(); + + //计算购物车价格 + for (CartVO cart : cartVOS) { + //累加价格 + List priceDetailDTOS = new ArrayList<>(); + for (CartSkuVO cartSkuVO : cart.getSkuList()) { + + PriceDetailDTO priceDetailDTO = cartSkuVO.getPriceDetailDTO(); + //平台佣金根据分类计算 + String categoryId = cartSkuVO.getGoodsSku().getCategoryPath() + .substring(cartSkuVO.getGoodsSku().getCategoryPath().lastIndexOf(",") + 1); + if (StrUtil.isNotEmpty(categoryId)) { + Double commissionRate = categoryService.getById(categoryId).getCommissionRate(); + priceDetailDTO.setCommission(commissionRate); + } + + //如果积分订单 积分订单,单独操作订单结算金额和商家结算字段 + if (tradeDTO.getCartTypeEnum().equals(CartTypeEnum.POINTS)) { + PointsGoodsVO pointsGoodsVO = pointsGoodsService.getPointsGoodsVOByMongo(cartSkuVO.getGoodsSku().getId()); + priceDetailDTO.setBillPrice(pointsGoodsVO.getSettlementPrice()); + priceDetailDTO.setSettlementPrice(pointsGoodsVO.getSettlementPrice()); + } + //如果砍价订单 计算金额,单独操作订单结算金额和商家结算字段 + else if (tradeDTO.getCartTypeEnum().equals(CartTypeEnum.KANJIA)) { + KanjiaActivityGoodsDTO kanjiaActivityGoodsDTO = kanjiaActivityGoodsService.getKanJiaGoodsBySku(cartSkuVO.getGoodsSku().getId()); + priceDetailDTO.setBillPrice(kanjiaActivityGoodsDTO.getSettlementPrice()); + priceDetailDTO.setSettlementPrice(kanjiaActivityGoodsDTO.getSettlementPrice()); + } + + priceDetailDTOS.add(priceDetailDTO); + } + cart.getPriceDetailDTO().accumulationPriceDTO(priceDetailDTOS); + } + } + + /** + * 再次总计金额 + * + * @param tradeDTO 购物车展示信息 + */ + void buildTradePrice(TradeDTO tradeDTO) { + //购物车列表 + List cartVOS = tradeDTO.getCartList(); + + List priceDetailDTOS = new ArrayList<>(); + for (CartVO cart : cartVOS) { + priceDetailDTOS.add(cart.getPriceDetailDTO()); + } + tradeDTO.getPriceDetailDTO().accumulationPriceDTO(priceDetailDTOS); + } + +} diff --git a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CouponRender.java b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CouponRender.java index fe105dc5..43ffd8cf 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CouponRender.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CouponRender.java @@ -18,7 +18,6 @@ import java.util.Map; * @author Chopper * @since 2020-07-02 14:47 */ -@Order(3) @Service public class CouponRender implements CartRenderStep { diff --git a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/DistributionPriceRender.java b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/DistributionPriceRender.java index 2832e232..d03d168d 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/DistributionPriceRender.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/DistributionPriceRender.java @@ -18,7 +18,6 @@ import org.springframework.stereotype.Service; * @since 2020-07-02 14:47 */ @Service -@Order(6) public class DistributionPriceRender implements CartRenderStep { /** * 缓存 @@ -53,7 +52,6 @@ public class DistributionPriceRender implements CartRenderStep { if(cartSkuVO.getDistributionGoods()!=null){ cartSkuVO.getPriceDetailDTO().setDistributionCommission(CurrencyUtil.mul(cartSkuVO.getNum(), cartSkuVO.getDistributionGoods().getCommission())); } - } } diff --git a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/FullDiscountRender.java b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/FullDiscountRender.java index ceba243f..155af725 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/FullDiscountRender.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/FullDiscountRender.java @@ -24,7 +24,6 @@ import java.util.stream.Collectors; * @since 2020-04-01 10:27 上午 */ @Service -@Order(1) public class FullDiscountRender implements CartRenderStep { @Autowired diff --git a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/SkuFreightRender.java b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/SkuFreightRender.java index 9c82f5df..21119b9a 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/SkuFreightRender.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/SkuFreightRender.java @@ -25,7 +25,6 @@ import java.util.List; * @author Chopper * @since 2020-07-02 14:47 */ -@Order(4) @Service public class SkuFreightRender implements CartRenderStep { diff --git a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/SkuPromotionRender.java b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/SkuPromotionRender.java index a0d5ec9e..6a43ed3e 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/SkuPromotionRender.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/SkuPromotionRender.java @@ -20,7 +20,6 @@ import cn.lili.modules.promotion.entity.dto.StorePromotionPriceDTO; import cn.lili.modules.promotion.service.PromotionGoodsService; import cn.lili.modules.promotion.service.PromotionPriceService; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.annotation.Order; import org.springframework.stereotype.Service; import java.util.ArrayList; @@ -36,11 +35,9 @@ import java.util.stream.Collectors; * @since 2020-07-02 14:47 */ @Service -@Order(2) public class SkuPromotionRender implements CartRenderStep { - /** * 促销计算 */ @@ -108,7 +105,7 @@ public class SkuPromotionRender implements CartRenderStep { //店铺优惠券集合 List memberCoupons = this.getMemberCoupons(tradeDTO); //调用价格计算模块,返回价格计算结果 - PromotionPriceDTO promotionPrice = promotionPriceService.calculationPromotionPrice(promotionPriceParamList, memberCoupons,tradeDTO.getCartTypeEnum()); + PromotionPriceDTO promotionPrice = promotionPriceService.calculationPromotionPrice(promotionPriceParamList, memberCoupons, tradeDTO.getCartTypeEnum()); // 分配计算后的促销 this.distributionPromotionPrice(tradeDTO, promotionPrice); } @@ -174,27 +171,32 @@ public class SkuPromotionRender implements CartRenderStep { */ private void distributionPromotionPrice(TradeDTO tradeDTO, PromotionPriceDTO promotionPrice) { + //根据店铺分配店铺价格计算结果 for (CartVO cartVO : tradeDTO.getCartList()) { - //根据店铺分配店铺价格计算结果 - Optional storePromotionPriceDTOOptional = promotionPrice.getStorePromotionPriceList().parallelStream().filter(i -> i.getStoreId().equals(cartVO.getStoreId())).findAny(); + + //根据店铺id分组 + Optional storePromotionPriceDTOOptional = + promotionPrice.getStorePromotionPriceList().parallelStream().filter(i -> i.getStoreId().equals(cartVO.getStoreId())).findAny(); + + //参数有效 则分发 if (storePromotionPriceDTOOptional.isPresent()) { StorePromotionPriceDTO storePromotionPriceDTO = storePromotionPriceDTOOptional.get(); //根据商品分配商品结果计算结果 this.distributionSkuPromotionPrice(cartVO.getSkuList(), storePromotionPriceDTO); - PriceDetailDTO sSpd = new PriceDetailDTO(); - PriceDetailVO sPd = new PriceDetailVO(); - sSpd.setGoodsPrice(storePromotionPriceDTO.getTotalOriginPrice()); - sSpd.setDiscountPrice(storePromotionPriceDTO.getTotalDiscountPrice()); - sSpd.setCouponPrice(storePromotionPriceDTO.getTotalCouponPrice()); - sSpd.setPayPoint(storePromotionPriceDTO.getTotalPoints().intValue()); + PriceDetailDTO priceDetailDTO = new PriceDetailDTO(); + PriceDetailVO priceDetailVO = new PriceDetailVO(); + priceDetailDTO.setGoodsPrice(storePromotionPriceDTO.getTotalOriginPrice()); + priceDetailDTO.setDiscountPrice(storePromotionPriceDTO.getTotalDiscountPrice()); + priceDetailDTO.setCouponPrice(storePromotionPriceDTO.getTotalCouponPrice()); + priceDetailDTO.setPayPoint(storePromotionPriceDTO.getTotalPoints().intValue()); - sPd.setOriginalPrice(storePromotionPriceDTO.getTotalOriginPrice()); - sPd.setFinalePrice(storePromotionPriceDTO.getTotalFinalePrice()); - sPd.setDiscountPrice(storePromotionPriceDTO.getTotalDiscountPrice()); - sPd.setPayPoint(storePromotionPriceDTO.getTotalPoints().intValue()); - cartVO.setPriceDetailDTO(sSpd); - cartVO.setPriceDetailVO(sPd); + priceDetailVO.setOriginalPrice(storePromotionPriceDTO.getTotalOriginPrice()); + priceDetailVO.setFinalePrice(storePromotionPriceDTO.getTotalFinalePrice()); + priceDetailVO.setDiscountPrice(storePromotionPriceDTO.getTotalDiscountPrice()); + priceDetailVO.setPayPoint(storePromotionPriceDTO.getTotalPoints().intValue()); + cartVO.setPriceDetailDTO(priceDetailDTO); + cartVO.setPriceDetailVO(priceDetailVO); cartVO.setWeight(storePromotionPriceDTO.getTotalWeight()); } } diff --git a/framework/src/main/java/cn/lili/modules/order/cart/service/CartServiceImpl.java b/framework/src/main/java/cn/lili/modules/order/cart/service/CartServiceImpl.java index 6cf421e5..15e75fa7 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/service/CartServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/service/CartServiceImpl.java @@ -324,7 +324,7 @@ public class CartServiceImpl implements CartService { @Override public TradeDTO getCheckedTradeDTO(CartTypeEnum way) { - return tradeBuilder.buildTrade(way); + return tradeBuilder.buildChecked(way); } /** diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/dto/PriceDetailDTO.java b/framework/src/main/java/cn/lili/modules/order/order/entity/dto/PriceDetailDTO.java index 562bbceb..a3eb3e10 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/dto/PriceDetailDTO.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/dto/PriceDetailDTO.java @@ -99,6 +99,9 @@ public class PriceDetailDTO implements Serializable { if (originalPrice == 0D) { return flowPrice; } + if (originalPrice < 0) { + return 0d; + } return originalPrice; } @@ -160,9 +163,14 @@ public class PriceDetailDTO implements Serializable { } public void countBill() { + + //如果结算信息包含结算金额,则最终结算金额直接等于该交易 平台与商户的结算金额 + if (settlementPrice > 0) { + billPrice = settlementPrice; + } + //如果是普通订单最终结算金额 = flowPrice - platFormCommission - distributionCommission billPrice = CurrencyUtil.sub(CurrencyUtil.sub(flowPrice, platFormCommission), distributionCommission); - } /** @@ -174,11 +182,13 @@ public class PriceDetailDTO implements Serializable { public void accumulationPriceDTO(List priceDetailDTOS) { + double originalPrice = 0d; double goodsPrice = 0d; double freightPrice = 0d; int payPoint = 0; double discountPrice = 0d; + double couponPrice = 0d; double distributionCommission = 0d; double platFormCommission = 0d; @@ -191,17 +201,21 @@ public class PriceDetailDTO implements Serializable { double flowPrice = 0d; double billPrice = 0d; + double settlementPrice = 0d; + for (PriceDetailDTO price : priceDetailDTOS) { + originalPrice = CurrencyUtil.add(originalPrice, price.getOriginalPrice()); goodsPrice = CurrencyUtil.add(goodsPrice, price.getGoodsPrice()); freightPrice = CurrencyUtil.add(freightPrice, price.getFreightPrice()); + payPoint = payPoint + price.getPayPoint(); discountPrice = CurrencyUtil.add(discountPrice, price.getDiscountPrice()); + couponPrice = CurrencyUtil.add(couponPrice, price.getCouponPrice()); updatePrice = CurrencyUtil.add(updatePrice, price.getUpdatePrice()); - distributionCommission = CurrencyUtil.add(distributionCommission, price.getDistributionCommission()); platFormCommission = CurrencyUtil.add(platFormCommission, price.getPlatFormCommission()); @@ -211,14 +225,19 @@ public class PriceDetailDTO implements Serializable { flowPrice = CurrencyUtil.add(flowPrice, price.getFlowPrice()); billPrice = CurrencyUtil.add(billPrice, price.getBillPrice()); - + settlementPrice = CurrencyUtil.add(settlementPrice, price.getSettlementPrice()); } + + this.setOriginalPrice(originalPrice); this.setGoodsPrice(goodsPrice); this.setFreightPrice(freightPrice); + this.setPayPoint(payPoint); - this.setUpdatePrice(updatePrice); + this.setCouponPrice(couponPrice); this.setDiscountPrice(discountPrice); + this.setUpdatePrice(updatePrice); + this.setDistributionCommission(distributionCommission); this.setPlatFormCommission(platFormCommission); @@ -228,6 +247,7 @@ public class PriceDetailDTO implements Serializable { this.setFlowPrice(flowPrice); this.setBillPrice(billPrice); + this.setSettlementPrice(settlementPrice); } /**