huangzhiguo vor 1 Jahr
Ursprung
Commit
d8cc4c7db6

+ 59 - 61
src/main/java/com/caimei365/order/components/ProductService.java

@@ -185,18 +185,24 @@ public class ProductService {
      * 计算运费
      *
      * @param userId    用户ID
-     * @param townId    地区Id
+     * @param cityId    地区市Id
+     * @param num       购买数量
+     * @param amount    购买商品金额
      * @param skuIdList 商品Id列表
      */
-    public Map<String, Object> computePostage(Integer userId, Integer townId, List<String> skuIdList) {
+    public Map<String, Object> computePostage(Integer userId, Integer cityId, Integer num, Double amount, List<String> skuIdList) {
         // 用户组织Id
         Integer organizeId = baseMapper.getOrganizeId(userId);
         // 返回数据初始化
         Map<String, Object> postageMap = new HashMap<>(4);
-        // 运费标志:0包邮 2到付 1遵循运费规则
+        // 运费标志:0包邮 1到付 2使用运费模板
         int postageFlag = 0;
         // 运费
         Double postage = 0.00d;
+        // 含包邮
+        Boolean freePostTage = false;
+        // 含到付
+        Boolean freePostTagePayment = false;
         // 可用采美豆
         Integer userBeans = baseMapper.getUserBeans(userId);
         postageMap.put("userBeans", userBeans);
@@ -204,6 +210,8 @@ public class ProductService {
         Integer superVipUserId = baseMapper.getSvipUserIdByUserId(userId);
         if (null != superVipUserId) {
             // 超级VIP包邮
+            postageMap.put("freePostTage", freePostTage);
+            postageMap.put("freePostTagePayment", freePostTagePayment);
             postageMap.put("postageFlag", 0);
             postageMap.put("postage", 0.00d);
             return postageMap;
@@ -215,73 +223,63 @@ public class ProductService {
         } else {
             postageFlagList = baseMapper.getPostageFlagOrganizeList(skuIdList);
         }
-        // 是否包含需要冷链运输商品
-        List<Integer> collect = postageFlagList.stream().map(ProductPostageVo::getProductId).collect(Collectors.toList());
-        if (collect.stream().allMatch(c -> c == 7881)) {
-            postageMap.put("designatedFlag", 1);
-        } else if (!collect.contains(7881)) {
-            postageMap.put("designatedFlag", 2);
-        } else {
-            postageMap.put("designatedFlag", 3);
-        }
         if (null != postageFlagList && postageFlagList.size() > 0) {
             for (ProductPostageVo postageVo : postageFlagList) {
                 if (null != postageVo) {
                     // 是否是仪器 或 设置了运费到付
-                    boolean flag = (null == postageVo.getCommodityType() || 2 == postageVo.getCommodityType() || (null != postageVo.getPostageFlag() && 1 == postageVo.getPostageFlag()));
-                    if (flag) {
+                    if (null != postageVo.getPostageFlag() && 0 == postageVo.getPostageFlag()) {
+                        // 包邮
+                        freePostTage = true;
+                    } else if (null != postageVo.getPostageFlag() && 1 == postageVo.getPostageFlag()) {
                         // 到付
-                        postageMap.put("postageFlag", 2);
-                        postageMap.put("postage", 0.00d);
-                        return postageMap;
-                    } else if (null != postageVo.getPostageFlag() && 2 == postageVo.getPostageFlag()) {
-                        // 若有不包邮商品,则全部不包邮(商品数据库:2默认(遵循运费规则),这里返回前端(按照订单数据库):1遵循运费规则)
-                        postageFlag = 1;
+                        freePostTagePayment = true;
+                    } else {
+                        // 使用运费模板
+                        postageFlag = 2;
+                        if (null == postageVo.getFreightTemplateId()) {
+                            // 商品运费规则异常
+                            postageMap.put("postageFlag", 999);
+                            return postageMap;
+                        } else {
+                            Integer freightTemplate = baseMapper.getFreightTemplate(postageVo.getFreightTemplateId());
+                            if (null == freightTemplate) {
+                                // 商品运费规则异常
+                                postageMap.put("postageFlag", 999);
+                                return postageMap;
+                            }
+                            FreightRuleVo freightRule = baseMapper.getFreightRule(postageVo.getFreightTemplateId(), cityId);
+                            if (null != freightRule) {
+                                postage = freightRule.getFreightAmount();
+                                // 含有包邮的规则
+                                if (1 == freightRule.getFreeType()) {
+                                    if (0 == freightRule.getFreeCondition()) {
+                                        // 满足数量
+                                        if (num >= freightRule.getProductNum()) {
+                                            postage = 0.00d;
+                                            freePostTage = true;
+                                        }
+                                    } else {
+                                        // 满足金额
+                                        if (amount >= freightRule.getAllAmount()) {
+                                            postage = 0.00d;
+                                            freePostTage = true;
+                                        }
+                                    }
+                                }
+                            } else {
+                                // 未选择地区包邮
+                                freePostTage = true;
+                            }
+                        }
                     }
                 }
             }
         }
-        // 是否首单(统计订单数)
-        Integer count = null;
-        if (0 == organizeId) {
-            // 采美
-            count = baseMapper.countUserOrder(userId);
-        } else {
-            // 组织 -- 联合丽格无首单优惠
-            count = -1;
-        }
-        // 包邮条件:首单 或 包邮(上一步未被设置成不包邮)
-        boolean freeFlag = ((null != count && count == 0) || postageFlag == 0);
-        if (freeFlag) {
-            // 包邮
-            postageMap.put("postageFlag", 0);
-            postageMap.put("postage", 0.00d);
-            return postageMap;
-        } else {
-            /*
-             * 运费计算:广东省内运费15元,深圳市内运费10,其他地区到付
-             */
-            postageFlag = 1;
-            // 获取根据地区Id获取省市地址信息
-            AddressVo address = baseMapper.getProvinceIdAndCityId(townId);
-            if (null != address && 202 == address.getCityId()) {
-                // 深圳市内运费10
-                postage = 10.00d;
-            } else if (null != address && 19 == address.getProvinceId()) {
-                // 广东省内运费15元
-                postage = 15.00d;
-            } else {
-                // 到付
-                postageFlag = 2;
-            }
-            // 只有冷链费商品 运费为0
-            if (1 == (Integer) postageMap.get("designatedFlag")) {
-                postage = 0d;
-            }
-            postageMap.put("postageFlag", postageFlag);
-            postageMap.put("postage", postage);
-            return postageMap;
-        }
+        postageMap.put("freePostTage", freePostTage);
+        postageMap.put("freePostTagePayment", freePostTagePayment);
+        postageMap.put("postageFlag", postageFlag);
+        postageMap.put("postage", postage);
+        return postageMap;
     }
 
     /**

+ 13 - 0
src/main/java/com/caimei365/order/mapper/BaseMapper.java

@@ -180,6 +180,19 @@ public interface BaseMapper {
      */
     List<ProductPostageVo> getPostageFlagOrganizeList(@Param("skuIds") List<String> skuIds);
 
+    /**
+     * 获取模板信息
+     * @param freightId
+     * @return
+     */
+    Integer getFreightTemplate(@Param("freightId") Integer freightId);
+    /**
+     * 获取运费规则
+     * @param freightId
+     * @param cityId
+     * @return
+     */
+    FreightRuleVo getFreightRule(@Param("freightId") Integer freightId, @Param("cityId") Integer cityId);
     /**
      * 获取购物车商品数据
      *

+ 2 - 2
src/main/java/com/caimei365/order/model/dto/CartDto.java

@@ -30,10 +30,10 @@ public class CartDto implements Serializable {
     @ApiModelProperty("商品id")
     private Integer productId;
     /**
-     * 地址Id
+     * 地址Id
      */
     @ApiModelProperty("地址Id")
-    private Integer townId;
+    private Integer cityId;
     /**
      * 商品数量
      */

+ 6 - 2
src/main/java/com/caimei365/order/model/vo/CartShopVo.java

@@ -99,9 +99,13 @@ public class CartShopVo implements Serializable {
      */
     private Integer userBeans;
     /**
-     * 是否包含需要冷链运输商品
+     * 含包邮
      */
-    private Integer designatedFlag;
+    private Integer freePostTage;
+    /**
+     * 含到付
+     */
+    private Integer freePostTagePayment;
     /**
      * 是否勾选冷链费
      */

+ 43 - 0
src/main/java/com/caimei365/order/model/vo/FreightRuleVo.java

@@ -0,0 +1,43 @@
+package com.caimei365.order.model.vo;
+
+import lombok.Data;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2023/8/11
+ */
+@Data
+public class FreightRuleVo {
+
+    private Integer id;
+    /**
+     * 运费模板表Id
+     */
+    private Integer freightId;
+    /**
+     * 运费金额
+     */
+    private Double freightAmount;
+    /**
+     * 运费地区
+     */
+    private String areaTax;
+    /**
+     * 是否指定条件包邮 0无条件 1指定条件包邮
+     */
+    private Integer freeType;
+    /**
+     * 包邮条件 0 满足件数 1 满足金额
+     */
+    private Integer freeCondition;
+    /**
+     * 包邮商品件数
+     */
+    private Integer productNum;
+    /**
+     * 包邮商品金额
+     */
+    private Double allAmount;
+}

+ 5 - 1
src/main/java/com/caimei365/order/model/vo/ProductPostageVo.java

@@ -18,9 +18,13 @@ public class ProductPostageVo implements Serializable {
      */
     private Integer productId;
     /**
-     * 运费标志:0包邮 -1到付 1遵循运费规则
+     * 物流方式 0包邮、1到付、2使用运费模板
      */
     private Integer postageFlag;
+    /**
+     * 运费模板Id
+     */
+    private Integer freightTemplateId;
     /**
      * 邮费
      */

+ 27 - 22
src/main/java/com/caimei365/order/service/impl/CartClubServiceImpl.java

@@ -921,7 +921,7 @@ public class CartClubServiceImpl implements CartClubService {
      * @param source 来源 : 1 网站 ; 2 小程序
      */
     @Override
-    public ResponseJson<Map<String, Object>> settlementShoppingCart(Integer userId, Integer townId, String skuIds, Integer source) {
+    public ResponseJson<Map<String, Object>> settlementShoppingCart(Integer userId, Integer cityId, String skuIds, Integer source) {
         // 用户组织Id
         Integer organizeId = baseMapper.getOrganizeId(userId);
         log.info("¥¥¥¥¥¥¥¥¥¥ > 商品结算");
@@ -1035,14 +1035,7 @@ public class CartClubServiceImpl implements CartClubService {
                         }
                         List<Integer> collect = productList.stream().map(CartItemVo::getSkuId).collect(Collectors.toList());
                         List<String> skuIdsList = collect.stream().map(String::valueOf).collect(Collectors.toList());
-                        // 设置商品运费
-                        if (null != townId) {
-                            Map<String, Object> postageMap = productService.computePostage(userId, townId, skuIdsList);
-                            shop.setPostage((Double) postageMap.get("postage"));
-                            shop.setPostageFlag((Integer) postageMap.get("postageFlag"));
-                            shop.setUserBeans((Integer) postageMap.get("userBeans"));
-                            shop.setDesignatedFlag((Integer) postageMap.get("designatedFlag"));
-                        }
+
                         // 冷链费
                         Double coldChain = 0d;
                         // 迭代器设置商品信息
@@ -1152,6 +1145,15 @@ public class CartClubServiceImpl implements CartClubService {
                                     shopPromotionFee.set(MathUtil.add(shopPromotionFee, MathUtil.mul(cartItemVo.getNumber(), cartItemVo.getPrice())).doubleValue());
                                 }
                             }
+                            // 设置商品运费
+                            if (null != cityId) {
+                                Map<String, Object> postageMap = productService.computePostage(userId, cityId, cartItemVo.getNumber(), MathUtil.mul(cartItemVo.getNumber(), cartItemVo.getPrice()).doubleValue(), skuIdsList);
+                                shop.setPostage((Double) postageMap.get("postage"));
+                                shop.setPostageFlag((Integer) postageMap.get("postageFlag"));
+                                shop.setUserBeans((Integer) postageMap.get("userBeans"));
+                                shop.setFreePostTage((Integer) postageMap.get("freePostTage"));
+                                shop.setFreePostTagePayment((Integer) postageMap.get("freePostTagePayment"));
+                            }
                             // 该供应商下商品种类 +1
                             shopKindCount.incrementAndGet();
                             // 总数量 + 当前商品购买数量
@@ -1374,7 +1376,7 @@ public class CartClubServiceImpl implements CartClubService {
      * @return
      */
     @Override
-    public ResponseJson<Map<String, Object>> MultipleBuyNow(Integer userId, Integer townId, String productInfo, Integer source) {
+    public ResponseJson<Map<String, Object>> MultipleBuyNow(Integer userId, Integer cityId, String productInfo, Integer source) {
         log.info("¥¥¥¥¥¥¥¥¥¥ > 组合商品立即购买");
         // 商品种类
         AtomicInteger kindCount = new AtomicInteger(0);
@@ -1490,18 +1492,12 @@ public class CartClubServiceImpl implements CartClubService {
                         // 设置商品运费
                         List<Integer> collect = productList.stream().map(CartItemVo::getSkuId).collect(Collectors.toList());
                         List<String> skuIdsList = collect.stream().map(String::valueOf).collect(Collectors.toList());
-                        if (null != townId) {
-                            Map<String, Object> postageMap = productService.computePostage(userId, townId, skuIdsList);
-                            shop.setPostage((Double) postageMap.get("postage"));
-                            shop.setPostageFlag((Integer) postageMap.get("postageFlag"));
-                            shop.setUserBeans((Integer) postageMap.get("userBeans"));
-                            shop.setDesignatedFlag((Integer) postageMap.get("designatedFlag"));
-                        }
+
                         Double coldChain = 0d;
                         // 迭代器设置商品信息
                         for (CartItemVo cartItemVo : productList) {
                             // 设置商品运费
-                            if (null != townId) {
+                            if (null != cityId) {
                                 if (7881 == cartItemVo.getProductId()) {
                                     if (cartItemVo.getNumber() >= 100) {
                                         coldChain = 0d;
@@ -1599,6 +1595,14 @@ public class CartClubServiceImpl implements CartClubService {
                                 // 超级会员购买svip商品不享受店铺促销优惠
                                 shopPromotionFee.set(MathUtil.add(shopPromotionFee, MathUtil.mul(cartItemVo.getNumber(), cartItemVo.getPrice())).doubleValue());
                             }
+                            if (null != cityId) {
+                                Map<String, Object> postageMap = productService.computePostage(userId, cityId, cartItemVo.getNumber(), MathUtil.mul(cartItemVo.getNumber(), cartItemVo.getPrice()).doubleValue(), skuIdsList);
+                                shop.setPostage((Double) postageMap.get("postage"));
+                                shop.setPostageFlag((Integer) postageMap.get("postageFlag"));
+                                shop.setUserBeans((Integer) postageMap.get("userBeans"));
+                                shop.setFreePostTage((Integer) postageMap.get("freePostTage"));
+                                shop.setFreePostTagePayment((Integer) postageMap.get("freePostTagePayment"));
+                            }
                             // 该供应商下商品种类 +1
                             shopKindCount.incrementAndGet();
                             // 总数量 + 当前商品购买数量
@@ -1978,14 +1982,15 @@ public class CartClubServiceImpl implements CartClubService {
         }
         // 计算运费
         Double coldChain = 0d;
-        if (null != cartDto.getTownId()) {
+        if (null != cartDto.getCityId()) {
             List<String> skuIds = new ArrayList<>();
             skuIds.add(cartDto.getSkuId().toString());
-            Map<String, Object> postageMap = productService.computePostage(cartDto.getUserId(), cartDto.getTownId(), skuIds);
+            Map<String, Object> postageMap = productService.computePostage(cartDto.getUserId(), cartDto.getCityId(), cartItemVo.getNumber(), MathUtil.mul(cartItemVo.getNumber(), cartItemVo.getPrice()).doubleValue(), skuIds);
             shop.setPostage((Double) postageMap.get("postage"));
             shop.setPostageFlag((Integer) postageMap.get("postageFlag"));
             shop.setUserBeans((Integer) postageMap.get("userBeans"));
-            shop.setDesignatedFlag((Integer) postageMap.get("designatedFlag"));
+            shop.setFreePostTage((Integer) postageMap.get("freePostTage"));
+            shop.setFreePostTagePayment((Integer) postageMap.get("freePostTagePayment"));
             if (7881 == cartItemVo.getProductId()) {
                 if (cartItemVo.getNumber() >= 100) {
                     coldChain = 0d;
@@ -2190,7 +2195,7 @@ public class CartClubServiceImpl implements CartClubService {
             skuIdList.add(skuIds);
         }
         // 计算运费
-        Map<String, Object> resultMap = productService.computePostage(userId, townId, skuIdList);
+        Map<String, Object> resultMap = productService.computePostage(userId, townId, 0, 0d, skuIdList);
         return ResponseJson.success(resultMap);
     }
 

+ 11 - 9
src/main/java/com/caimei365/order/service/impl/CartSellerServiceImpl.java

@@ -517,7 +517,7 @@ public class CartSellerServiceImpl implements CartSellerService {
      * @param skuIds            skuIds
      */
     @Override
-    public ResponseJson<Map<String, Object>> settlementSellerCart(Integer serviceProviderId, Integer townId, Integer clubId, String skuIds) {
+    public ResponseJson<Map<String, Object>> settlementSellerCart(Integer serviceProviderId, Integer cityId, Integer clubId, String skuIds) {
         log.info("¥¥¥¥¥¥¥¥¥¥ > 商品结算(协销帮机构下单)");
         // 商品种类
         AtomicInteger kindCount = new AtomicInteger(0);
@@ -576,14 +576,7 @@ public class CartSellerServiceImpl implements CartSellerService {
                 List<CartItemVo> productList = cartSellerMapper.getCartProductsByProductIds(serviceProviderId, clubId, shop.getShopId(), finalIdList);
                 List<Integer> collect = productList.stream().map(CartItemVo::getSkuId).collect(Collectors.toList());
                 List<String> skuIdsList = collect.stream().map(String::valueOf).collect(Collectors.toList());
-                // 设置商品运费
-                if (null != townId) {
-                    Map<String, Object> postageMap = productService.computePostage(clubUserId, townId, skuIdsList);
-                    shop.setPostage((Double) postageMap.get("postage"));
-                    shop.setPostageFlag((Integer) postageMap.get("postageFlag"));
-                    shop.setUserBeans((Integer) postageMap.get("userBeans"));
-                    shop.setDesignatedFlag((Integer) postageMap.get("designatedFlag"));
-                }
+
                 // 冷链费
                 AtomicDouble coldChain = new AtomicDouble(0);
                 if (null != productList && productList.size() > 0) {
@@ -688,6 +681,15 @@ public class CartSellerServiceImpl implements CartSellerService {
                             // 超级会员购买svip商品不享受店铺促销优惠
                             shopPromotionFee.set(MathUtil.add(shopPromotionFee, MathUtil.mul(cartItemVo.getNumber(), cartItemVo.getPrice())).doubleValue());
                         }
+                        // 设置商品运费
+                        if (null != cityId) {
+                            Map<String, Object> postageMap = productService.computePostage(clubUserId, cityId, cartItemVo.getNumber(), MathUtil.mul(cartItemVo.getNumber(), cartItemVo.getPrice()).doubleValue(), skuIdsList);
+                            shop.setPostage((Double) postageMap.get("postage"));
+                            shop.setPostageFlag((Integer) postageMap.get("postageFlag"));
+                            shop.setUserBeans((Integer) postageMap.get("userBeans"));
+                            shop.setFreePostTage((Integer) postageMap.get("freePostTage"));
+                            shop.setFreePostTagePayment((Integer) postageMap.get("freePostTagePayment"));
+                        }
                         // 该供应商下商品种类 +1
                         shopKindCount.incrementAndGet();
                         // 总数量 + 当前商品购买数量

+ 15 - 0
src/main/resources/mapper/BaseMapper.xml

@@ -245,6 +245,7 @@
         SELECT
         p.productID AS productId,
         p.freePostFlag AS postageFlag,
+        p.freightTemplateId,
         p.commodityType,
         p.productType
         FROM product p
@@ -260,6 +261,7 @@
         SELECT
         p.productID AS productId,
         p.freePostFlag AS postageFlag,
+        p.freightTemplateId,
         p.commodityType,
         p.productType
         FROM product p
@@ -270,6 +272,19 @@
             #{skuId}
         </foreach>
     </select>
+
+    <select id="getFreightTemplate" resultType="java.lang.Integer">
+        select id from cm_freight_template where id = #{freightId}
+    </select>
+
+    <select id="getFreightRule" resultType="com.caimei365.order.model.vo.FreightRuleVo">
+        select id, freightId, freightAmount, areaTax, freeType, freeCondition, productNum, allAmount
+        from cm_freight_rule cfr
+        left join cm_freight_template cft on cfr.freightId = cft.id
+        left join cm_freight_area cfa on cfr.id = cfa.ruleId
+        where cft.id = #{freightId} and cfa.cityId = #{cityId}
+    </select>
+
     <select id="getCart" resultType="com.caimei365.order.model.po.CartPo">
         SELECT productID as productID, userID as userId, productCount FROM cm_cart
         <where>