From f32c7a7253ec19d4ee0cb4c60713571d2a9e2602 Mon Sep 17 00:00:00 2001 From: Chopper Date: Tue, 7 Jun 2022 18:30:21 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BF=90=E8=B4=B9=E8=AE=A1=E7=AE=97=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E8=B0=83=E6=95=B4=20=E5=90=8C=E4=B8=80=E8=BF=90?= =?UTF-8?q?=E8=B4=B9=E6=A8=A1=E7=89=88=E7=9A=84=E5=95=86=E5=93=81=EF=BC=8C?= =?UTF-8?q?=E9=87=87=E7=94=A8=E7=B4=AF=E5=8A=A0=E8=AE=A1=E7=AE=97=EF=BC=8C?= =?UTF-8?q?=E8=B5=B7=E9=80=81=E8=B4=B9/=E8=99=9A=E4=BB=B6=EF=BC=88?= =?UTF-8?q?=E9=87=8D=EF=BC=89=E8=B4=B9=E7=94=A8=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cart/render/impl/SkuFreightRender.java | 119 ++++++++++++++---- 1 file changed, 98 insertions(+), 21 deletions(-) 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 d0b0e672..e7e7cc31 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 @@ -11,11 +11,15 @@ import cn.lili.modules.store.entity.dto.FreightTemplateChildDTO; import cn.lili.modules.store.entity.enums.FreightTemplateEnum; import cn.lili.modules.store.entity.vos.FreightTemplateVO; import cn.lili.modules.store.service.FreightTemplateService; +import org.apache.xmlbeans.impl.store.Cur; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; /** * sku 运费计算 @@ -43,31 +47,35 @@ public class SkuFreightRender implements CartRenderStep { if (memberAddress == null) { return; } - //循环渲染购物车商品运费价格 - forSku: - for (CartSkuVO cartSkuVO : cartSkuVOS) { - //获取sku运费模版 - String freightTemplateId = cartSkuVO.getGoodsSku().getFreightTemplateId(); - //免运费则跳出运费计算 - if (Boolean.TRUE.equals(cartSkuVO.getIsFreeFreight()) || freightTemplateId == null) { - continue; - } + //运费分组信息 + Map> freightGroups = freightTemplateGrouping(cartSkuVOS); + + //循环运费模版 + for (String freightTemplateId : freightGroups.keySet()) { + + //商品id列表 + List skuIds = freightGroups.get(freightTemplateId); + + //当前购物车商品列表 + List currentCartSkus = cartSkuVOS.stream().filter(item -> skuIds.contains(item.getGoodsSku().getId())).collect(Collectors.toList()); + //寻找对应对商品运费计算模版 FreightTemplateVO freightTemplate = freightTemplateService.getFreightTemplate(freightTemplateId); if (freightTemplate != null && freightTemplate.getFreightTemplateChildList() != null && !freightTemplate.getFreightTemplateChildList().isEmpty()) { - //店铺支付运费则跳过 + //店铺模版免运费则跳过 if (freightTemplate.getPricingMethod().equals(FreightTemplateEnum.FREE.name())) { break; } + + //运费模版 FreightTemplateChild freightTemplateChild = null; - //获取市级别id + //获取市级别id匹配运费模版 String addressId = memberAddress.getConsigneeAddressIdPath().split(",")[1]; - //获取匹配的收货地址 for (FreightTemplateChild templateChild : freightTemplate.getFreightTemplateChildList()) { - //如果当前模版包含,则返回 + //模版匹配判定 if (templateChild.getAreaId().contains(addressId)) { freightTemplateChild = templateChild; break; @@ -78,28 +86,97 @@ public class SkuFreightRender implements CartRenderStep { if (tradeDTO.getNotSupportFreight() == null) { tradeDTO.setNotSupportFreight(new ArrayList<>()); } - tradeDTO.getNotSupportFreight().add(cartSkuVO); - continue forSku; + tradeDTO.getNotSupportFreight().addAll(currentCartSkus); + continue; } //物流规则模型创立 FreightTemplateChildDTO freightTemplateChildDTO = new FreightTemplateChildDTO(freightTemplateChild); - + //模型写入运费模版设置的计费方式 freightTemplateChildDTO.setPricingMethod(freightTemplate.getPricingMethod()); - //要计算的基数 数量/重量 - Double count = (freightTemplateChildDTO.getPricingMethod().equals(FreightTemplateEnum.NUM.name())) ? - cartSkuVO.getNum() : - cartSkuVO.getGoodsSku().getWeight() * cartSkuVO.getNum(); + //计算运费总数 + Double count = currentCartSkus.stream().mapToDouble(item -> + // 根据计费规则 累加计费基数 + freightTemplateChildDTO.getPricingMethod().equals(FreightTemplateEnum.NUM.name()) ? + item.getNum() : + CurrencyUtil.mul(item.getNum(), item.getGoodsSku().getWeight()) + ).sum(); //计算运费 Double countFreight = countFreight(count, freightTemplateChildDTO); + //写入SKU运费 - cartSkuVO.getPriceDetailDTO().setFreightPrice(countFreight); + resetFreightPrice(FreightTemplateEnum.valueOf(freightTemplateChildDTO.getPricingMethod()), count, countFreight, currentCartSkus); } } } + + /** + * sku运费写入 + * + * @param freightTemplateEnum 运费计算模式 + * @param count 计费基数总数 + * @param countFreight 总运费 + * @param cartSkuVOS 与运费相关的购物车商品 + */ + private void resetFreightPrice(FreightTemplateEnum freightTemplateEnum, Double count, Double countFreight, List cartSkuVOS) { + + //剩余运费 默认等于总运费 + Double surplusFreightPrice = countFreight; + + //当前下标 + int index = 1; + for (CartSkuVO cartSkuVO : cartSkuVOS) { + //如果是最后一个 则将剩余运费直接赋值 + //PS: 循环中避免百分比累加不等于100%,所以最后一个运费不以比例计算,直接将剩余运费赋值 + if (index == cartSkuVOS.size()) { + cartSkuVO.getPriceDetailDTO().setFreightPrice(surplusFreightPrice); + break; + } + + Double freightPrice = freightTemplateEnum == FreightTemplateEnum.NUM ? + CurrencyUtil.mul(countFreight, CurrencyUtil.div(cartSkuVO.getNum(), count)) : + CurrencyUtil.mul(countFreight, + CurrencyUtil.div(CurrencyUtil.mul(cartSkuVO.getNum(), cartSkuVO.getGoodsSku().getWeight()), count)); + + //剩余运费=总运费-当前循环的商品运费 + surplusFreightPrice = CurrencyUtil.sub(surplusFreightPrice, freightPrice); + + cartSkuVO.getPriceDetailDTO().setFreightPrice(freightPrice); + index++; + } + } + + /** + * 运费模版分组 + * + * @param cartSkuVOS 购物车商品 + * @return map<运费模版id , List < skuid>> + */ + private Map> freightTemplateGrouping(List cartSkuVOS) { + Map> map = new HashMap<>(); + //循环渲染购物车商品运费价格 + for (CartSkuVO cartSkuVO : cartSkuVOS) { + ////免运费判定 + String freightTemplateId = cartSkuVO.getGoodsSku().getFreightTemplateId(); + if (Boolean.TRUE.equals(cartSkuVO.getIsFreeFreight()) || freightTemplateId == null) { + continue; + } + //包含 则value值中写入sku标识,否则直接写入新的对象,key为模版id,value为new arraylist + if (map.containsKey(freightTemplateId)) { + map.get(freightTemplateId).add(cartSkuVO.getGoodsSku().getId()); + } else { + List skuIdsList = new ArrayList<>(); + skuIdsList.add(cartSkuVO.getGoodsSku().getId()); + map.put(freightTemplateId, skuIdsList); + } + } + return map; + } + + /** * 计算运费 *