Browse Source

运费模板

huangzhiguo 1 year ago
parent
commit
02fb263f9c

+ 67 - 0
src/main/java/com/caimei365/commodity/controller/ProductShopApi.java

@@ -6,6 +6,7 @@ import com.caimei365.commodity.model.dto.FeaturedDto;
 import com.caimei365.commodity.model.dto.ProductDto;
 import com.caimei365.commodity.model.dto.ProductDto;
 import com.caimei365.commodity.model.dto.SoldOutDto;
 import com.caimei365.commodity.model.dto.SoldOutDto;
 import com.caimei365.commodity.model.po.BrandPo;
 import com.caimei365.commodity.model.po.BrandPo;
+import com.caimei365.commodity.model.dto.FreightTemplateDto;
 import com.caimei365.commodity.model.search.ProductListVo;
 import com.caimei365.commodity.model.search.ProductListVo;
 import com.caimei365.commodity.model.vo.BrandVo;
 import com.caimei365.commodity.model.vo.BrandVo;
 import com.caimei365.commodity.model.vo.PaginationVo;
 import com.caimei365.commodity.model.vo.PaginationVo;
@@ -72,6 +73,72 @@ public class ProductShopApi {
         return shopService.getShopProducts(showFlag, shopId, name, productCode, validFlag, featuredFlag, commodityType, bigTypeId, smallTypeId, tinyTypeId, groundMall, newvalidFlag, pageNum, pageSize);
         return shopService.getShopProducts(showFlag, shopId, name, productCode, validFlag, featuredFlag, commodityType, bigTypeId, smallTypeId, tinyTypeId, groundMall, newvalidFlag, pageNum, pageSize);
     }
     }
 
 
+    /**
+     * 供应商 -- 运费模板
+     * @param shopId
+     * @param pageNum
+     * @param pageSize
+     * @return
+     */
+    @GetMapping("/getFreightTemplate")
+    public ResponseJson getFreightTemplate( Integer shopId,
+                                            @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
+                                           @RequestParam(value = "pageSize", defaultValue = "20") int pageSize) {
+        if (null == shopId) {
+            ResponseJson.error(-1,"供应商Id不能为空", null);
+        }
+        return shopService.getFreightTemplate(shopId, pageNum, pageSize);
+    }
+
+    /**
+     * 复制运费模板
+     * @param id
+     * @return
+     */
+    @PostMapping("/getFreightTemplateById/{id}")
+    public ResponseJson getFreightTemplateById(@PathVariable("id") Integer id) {
+        if (null == id ){
+            ResponseJson.error(-1,"需复制的运费模板Id不能为空", null);
+        }
+        return shopService.copeFreightTemplateById(id);
+    }
+    /**
+     * 选择地区
+     * @return
+     */
+    @ApiOperation("选择地区")
+    @GetMapping("/getArea")
+    public ResponseJson getArea(Integer freightId, Integer ruleId) {
+        return shopService.getArea(freightId, ruleId);
+    }
+
+    /**
+     * 供应商 -- 新增运费模板
+     * @param freightTemplateDto
+     * @return
+     */
+    @ApiOperation("供应商 -- 新增运费模板")
+    @PostMapping("/product/saveFreightTemplate")
+    public ResponseJson saveFreightTemplate(FreightTemplateDto freightTemplateDto) {
+        if (null == freightTemplateDto) {
+            return ResponseJson.error(-1, "运费模板不能为空",null);
+        }
+        return shopService.saveFreightTemplate(freightTemplateDto);
+    }
+
+    /**
+     * 删除运费模板
+     * @param id
+     * @return
+     */
+    @ApiOperation("删除运费模板")
+    @GetMapping("/delFreight")
+    public ResponseJson deleteFreightTemplate(Integer id) {
+        if (null == id) {
+            return ResponseJson.error(-1, "运费模板Id不能为空",null);
+        }
+        return shopService.deleteFreightTemplate(id);
+    }
     /**
     /**
      * 供应商-发布商品
      * 供应商-发布商品
      *
      *

+ 94 - 1
src/main/java/com/caimei365/commodity/mapper/ShopMapper.java

@@ -1,6 +1,6 @@
 package com.caimei365.commodity.mapper;
 package com.caimei365.commodity.mapper;
 
 
-import com.caimei365.commodity.model.dto.Sku;
+import com.caimei365.commodity.model.dto.*;
 import com.caimei365.commodity.model.po.*;
 import com.caimei365.commodity.model.po.*;
 import com.caimei365.commodity.model.search.ProductListVo;
 import com.caimei365.commodity.model.search.ProductListVo;
 import com.caimei365.commodity.model.vo.*;
 import com.caimei365.commodity.model.vo.*;
@@ -60,6 +60,99 @@ public interface ShopMapper {
      */
      */
     String getCodeByTypeId(Integer bigTypeId, Integer smallTypeId, Integer tinyTypeId);
     String getCodeByTypeId(Integer bigTypeId, Integer smallTypeId, Integer tinyTypeId);
 
 
+    /**
+     * 获取供应商运费模板集合
+     * @param shopId
+     * @return
+     */
+    List<FreightTemplateVo> getTemplate(@Param("shopId") Integer shopId);
+
+    /**
+     * 根据Id获取模板信息
+     * @param id
+     * @return
+     */
+    FreightTemplateDto getTemplateById(@Param("id") Integer id);
+
+    /**
+     * 获取运费模板下所有运费规则
+     * @param Ids
+     * @return
+     */
+    List<FreightRuleVo> getRule(List<Integer> Ids);
+
+    /**
+     * 根据模板Id获取模板运费规则
+     * @param freightId
+     * @return
+     */
+    List<FreightRuleDto> getRuleById(@Param("freightId") Integer freightId);
+
+    /**
+     * 运费规则下所有区域集合
+     * @param Ids
+     * @return
+     */
+    List<FreightAreaVo> getArea(List<Integer> Ids);
+
+    /**
+     * 省份集合
+     * @return
+     */
+    List<ProvinceDto> getProvince();
+
+    /**
+     * 市集合
+     * @param freightId
+     * @param ruleId
+     * @return
+     */
+    List<CityDto> getCity(@Param("freightId") Integer freightId, @Param("ruleId") Integer ruleId);
+    /**
+     * 保存运费模板
+     * @param freightTemplateDto
+     * @return
+     */
+    void insertTemplate(FreightTemplateDto freightTemplateDto);
+
+    /**
+     * 保存运费模板规则
+     * @param freightRuleDto
+     * @return
+     */
+    void insertRule(FreightRuleDto freightRuleDto);
+
+    /**
+     * 保存运费模板规则地区
+     * @param freightAreaDto
+     * @return
+     */
+    void insertArea(FreightAreaDto freightAreaDto);
+
+    /**
+     * 修改运费模板
+     * @param freightTemplateDto
+     */
+    void updateTemplate(FreightTemplateDto freightTemplateDto);
+
+    /**
+     * 修改运费模板规则
+     * @param freightRuleDto
+     */
+    void updateRule(FreightRuleDto freightRuleDto);
+
+    /**
+     * 删除运费模板规则地区
+     * @param ruleId
+     * @param ids
+     */
+    void deleteArea(Integer ruleId, List<Integer> ids);
+
+    /**
+     * 删除运费模板
+     * @param id
+     */
+    void deleteTemplate (@Param("id") Integer id);
     /**
     /**
      * 发布商品
      * 发布商品
      */
      */

+ 32 - 0
src/main/java/com/caimei365/commodity/model/dto/CityDto.java

@@ -0,0 +1,32 @@
+package com.caimei365.commodity.model.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2023/8/9
+ */
+@Data
+public class CityDto implements Serializable {
+
+    /**
+     * 省份Id
+     */
+    private Integer provinceId;
+    /**
+     * 市Id
+     */
+    private Integer cityId;
+    /**
+     * 市名称
+     */
+    private String name;
+    /**
+     * 归属的运费规则
+     */
+    private Integer type;
+}

+ 37 - 0
src/main/java/com/caimei365/commodity/model/dto/FreightAreaDto.java

@@ -0,0 +1,37 @@
+package com.caimei365.commodity.model.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2023/8/9
+ */
+@Data
+public class FreightAreaDto implements Serializable {
+
+    private Integer id;
+    /**
+     * 运费规则Id
+     */
+    private Integer ruleId;
+    /**
+     * 归属的运费规则
+     */
+    private Integer type;
+    /**
+     * 省Id
+     */
+    private Integer provinceId;
+    /**
+     * 市Id
+     */
+    private Integer cityId;
+    /**
+     * 添加时间
+     */
+    private String addTime;
+}

+ 51 - 0
src/main/java/com/caimei365/commodity/model/dto/FreightRuleDto.java

@@ -0,0 +1,51 @@
+package com.caimei365.commodity.model.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2023/8/9
+ */
+@Data
+public class FreightRuleDto implements Serializable {
+
+    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;
+
+    /**
+     * 运费规则对应地区集合
+     */
+    private List<FreightAreaDto> freightAreaList;
+}

+ 42 - 0
src/main/java/com/caimei365/commodity/model/dto/FreightTemplateDto.java

@@ -0,0 +1,42 @@
+package com.caimei365.commodity.model.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2023/8/9
+ */
+@Data
+public class FreightTemplateDto implements Serializable {
+
+    private Integer id;
+    /**
+     * 运费模板名称
+     */
+    private Integer name;
+    /**
+     * 供应商Id
+     */
+    private Integer shopId;
+    /**
+     * 添加时间
+     */
+    private String addTime;
+    /**
+     * 修改时间
+     */
+    private String updateTime;
+    /**
+     * 删除标记 0使用 其他删除
+     */
+    private Integer delFlag;
+    /**
+     * 运费模板对应规则集合
+     */
+    private List<FreightRuleDto> freightRuleList;
+}

+ 10 - 0
src/main/java/com/caimei365/commodity/model/dto/ProductDto.java

@@ -79,6 +79,16 @@ public class ProductDto implements Serializable {
      */
      */
     @ApiModelProperty("是否含税:0不含税,1含税,2未知")
     @ApiModelProperty("是否含税:0不含税,1含税,2未知")
     private Integer includedTax;
     private Integer includedTax;
+    /**
+     * 物流方式 0包邮、1使用运费模板、2到付
+     */
+    @ApiModelProperty("物流方式 0包邮、1使用运费模板、2到付")
+    private Integer freePostFlag;
+    /**
+     * 运费模板Id
+     */
+    @ApiModelProperty("运费模板Id")
+    private Integer freightTemplateId;
     /**
     /**
      * 品牌名称
      * 品牌名称
      */
      */

+ 29 - 0
src/main/java/com/caimei365/commodity/model/dto/ProvinceDto.java

@@ -0,0 +1,29 @@
+package com.caimei365.commodity.model.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2023/8/9
+ */
+@Data
+public class ProvinceDto implements Serializable {
+
+    /**
+     * 省份Id
+     */
+    private Integer provinceId;
+    /**
+     * 省名称
+     */
+    private String name;
+    /**
+     * 市集合
+     */
+    private List<CityDto> cityList;
+}

+ 24 - 0
src/main/java/com/caimei365/commodity/model/dto/RegionDto.java

@@ -0,0 +1,24 @@
+package com.caimei365.commodity.model.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2023/8/9
+ */
+@Data
+public class RegionDto implements Serializable {
+    /**
+     * 区域名称
+     */
+    private String name;
+    /**
+     * 省集合
+     */
+    private List<ProvinceDto> provinceList;
+}

+ 5 - 1
src/main/java/com/caimei365/commodity/model/po/ProductPo.java

@@ -139,9 +139,13 @@ public class ProductPo implements Serializable {
      */
      */
     private Integer actStatus;
     private Integer actStatus;
     /**
     /**
-     * 是否包邮 0包邮 1到付
+     * 物流方式 0包邮、1到付、2使用运费模板
      */
      */
     private Integer freePostFlag;
     private Integer freePostFlag;
+    /**
+     * 运费模板Id
+     */
+    private Integer freightTemplateId;
     /**
     /**
      * 商品类型:0其它类型(默认),1妆字号,2械字号
      * 商品类型:0其它类型(默认),1妆字号,2械字号
      */
      */

+ 30 - 0
src/main/java/com/caimei365/commodity/model/vo/FreightAreaVo.java

@@ -0,0 +1,30 @@
+package com.caimei365.commodity.model.vo;
+
+import lombok.Data;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2023/8/9
+ */
+@Data
+public class FreightAreaVo {
+    private Integer id;
+    /**
+     * 运费规则Id
+     */
+    private Integer ruleId;
+    /**
+     * 省Id
+     */
+    private Integer provinceId;
+    /**
+     * 市Id
+     */
+    private Integer townId;
+    /**
+     * 添加时间
+     */
+    private String addTime;
+}

+ 50 - 0
src/main/java/com/caimei365/commodity/model/vo/FreightRuleVo.java

@@ -0,0 +1,50 @@
+package com.caimei365.commodity.model.vo;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2023/8/9
+ */
+@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;
+
+    /**
+     * 运费规则对应地区集合
+     */
+    private List<FreightAreaVo> freightAreaList;
+}

+ 41 - 0
src/main/java/com/caimei365/commodity/model/vo/FreightTemplateVo.java

@@ -0,0 +1,41 @@
+package com.caimei365.commodity.model.vo;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2023/8/9
+ */
+@Data
+public class FreightTemplateVo {
+
+    private Integer id;
+    /**
+     * 运费模板名称
+     */
+    private Integer name;
+    /**
+     * 供应商Id
+     */
+    private Integer shopId;
+    /**
+     * 添加时间
+     */
+    private String addTime;
+    /**
+     * 修改时间
+     */
+    private String updateTime;
+    /**
+     * 删除标记 0使用 其他删除
+     */
+    private Integer delFlag;
+    /**
+     * 运费模板对应规则集合
+     */
+    private List<FreightRuleVo> freightRuleList;
+}

+ 34 - 0
src/main/java/com/caimei365/commodity/service/ShopService.java

@@ -3,6 +3,7 @@ package com.caimei365.commodity.service;
 import com.caimei365.commodity.model.ResponseJson;
 import com.caimei365.commodity.model.ResponseJson;
 import com.caimei365.commodity.model.dto.BrandDto;
 import com.caimei365.commodity.model.dto.BrandDto;
 import com.caimei365.commodity.model.dto.FeaturedDto;
 import com.caimei365.commodity.model.dto.FeaturedDto;
+import com.caimei365.commodity.model.dto.FreightTemplateDto;
 import com.caimei365.commodity.model.dto.ProductDto;
 import com.caimei365.commodity.model.dto.ProductDto;
 import com.caimei365.commodity.model.po.BrandPo;
 import com.caimei365.commodity.model.po.BrandPo;
 import com.caimei365.commodity.model.search.ProductListVo;
 import com.caimei365.commodity.model.search.ProductListVo;
@@ -48,6 +49,39 @@ public interface ShopService {
      */
      */
     ResponseJson<Map<String, Object>> getShopProducts(Integer showFlag,Integer shopId, String name, String productCode, Integer validFlag, Integer featuredFlag, Integer commodityType, Integer bigTypeId, Integer smallTypeId, Integer tinyTypeId, Integer groundMall, Integer newvalidFlag, int pageNum, int pageSize);
     ResponseJson<Map<String, Object>> getShopProducts(Integer showFlag,Integer shopId, String name, String productCode, Integer validFlag, Integer featuredFlag, Integer commodityType, Integer bigTypeId, Integer smallTypeId, Integer tinyTypeId, Integer groundMall, Integer newvalidFlag, int pageNum, int pageSize);
 
 
+    /**
+     * 供应商 -- 运费模板
+     * @param pageNum
+     * @param pageSize
+     * @return
+     */
+    ResponseJson getFreightTemplate(Integer shopId, Integer pageNum, Integer pageSize);
+
+    /**
+     * 根据模板Id 复制一份新的运费模板
+     * @param id
+     * @return
+     */
+    ResponseJson copeFreightTemplateById(Integer id);
+
+    /**
+     * 选择地区
+     * @return
+     */
+    ResponseJson getArea(Integer freightId, Integer ruleId);
+    /**
+     * 供应商 -- 新增运费模板
+     * @param freightTemplateDto
+     * @return
+     */
+    ResponseJson saveFreightTemplate(FreightTemplateDto freightTemplateDto);
+
+    /**
+     * 删除运费模板
+     * @param id
+     * @return
+     */
+    ResponseJson deleteFreightTemplate(Integer id);
     /**
     /**
      * 供应商-发布商品
      * 供应商-发布商品
      *
      *

+ 242 - 4
src/main/java/com/caimei365/commodity/service/impl/ShopServiceImpl.java

@@ -8,10 +8,7 @@ import com.caimei365.commodity.mapper.PriceMapper;
 import com.caimei365.commodity.mapper.PromotionsMapper;
 import com.caimei365.commodity.mapper.PromotionsMapper;
 import com.caimei365.commodity.mapper.ShopMapper;
 import com.caimei365.commodity.mapper.ShopMapper;
 import com.caimei365.commodity.model.ResponseJson;
 import com.caimei365.commodity.model.ResponseJson;
-import com.caimei365.commodity.model.dto.BrandDto;
-import com.caimei365.commodity.model.dto.FeaturedDto;
-import com.caimei365.commodity.model.dto.ProductDto;
-import com.caimei365.commodity.model.dto.Sku;
+import com.caimei365.commodity.model.dto.*;
 import com.caimei365.commodity.model.po.*;
 import com.caimei365.commodity.model.po.*;
 import com.caimei365.commodity.model.search.ProductListVo;
 import com.caimei365.commodity.model.search.ProductListVo;
 import com.caimei365.commodity.model.vo.*;
 import com.caimei365.commodity.model.vo.*;
@@ -24,6 +21,7 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
 import org.springframework.util.Assert;
 import org.springframework.util.Assert;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
@@ -157,6 +155,221 @@ public class ShopServiceImpl implements ShopService {
         return ResponseJson.success(map);
         return ResponseJson.success(map);
     }
     }
 
 
+    /**
+     * 供应商 -- 运费模板
+     *
+     * @param pageNum
+     * @param pageSize
+     * @return
+     */
+    @Override
+    public ResponseJson getFreightTemplate(Integer shopId, Integer pageNum, Integer pageSize) {
+        PageHelper.startPage(pageNum, pageSize);
+        List<FreightTemplateVo> shopTemplate = shopMapper.getTemplate(shopId);
+        // 设置模板信息
+        List<FreightTemplateVo> freightTemplateVos = setFreightTemplate(shopTemplate);
+        PaginationVo<FreightTemplateVo> paginationVo = new PaginationVo<>(freightTemplateVos);
+        return ResponseJson.success(paginationVo);
+    }
+
+    /**
+     * 根据模板Id 复制一份新的运费模板
+     *
+     * @param id
+     * @return
+     */
+    @Override
+    public ResponseJson copeFreightTemplateById(Integer id) {
+        // 获取运费模板信息
+        FreightTemplateDto template = shopMapper.getTemplateById(id);
+        if (null != template) {
+            // 插入新的运费模板
+            shopMapper.insertTemplate(template);
+            // 获取运费模板规则
+            List<FreightRuleDto> rule = shopMapper.getRuleById(id);
+            if (null == rule || rule.size() <= 0) {
+                return ResponseJson.error(-1,"运费模板规则异常",null);
+            }
+            // 获取规则地区
+            List<Integer> ruleIds = rule.stream().map(FreightRuleDto::getId).collect(Collectors.toList());
+            List<FreightAreaVo> area = shopMapper.getArea(ruleIds);
+            if (null == area || area.size() <= 0) {
+                return ResponseJson.error(-1,"运费模板规则地区异常",null);
+            }
+            // 复制运费规则
+            for (FreightRuleDto freightRuleDto : rule) {
+                FreightRuleDto ruleDto = new FreightRuleDto();
+                BeanUtils.copyProperties(freightRuleDto, ruleDto);
+                ruleDto.setFreightId(template.getId());
+                shopMapper.insertRule(ruleDto);
+                // 复制规则地区
+                List<FreightAreaVo> areaVoList = area.stream().filter(a -> a.getRuleId().equals(freightRuleDto.getId())).collect(Collectors.toList());
+                for (FreightAreaVo freightAreaVo : areaVoList) {
+                    FreightAreaDto areaDto = new FreightAreaDto();
+                    BeanUtils.copyProperties(freightAreaVo, areaDto);
+                    areaDto.setRuleId(ruleDto.getId());
+                    shopMapper.insertArea(areaDto);
+                }
+            }
+        } else {
+            return ResponseJson.error(-1,"运费模板信息异常",null);
+        }
+        return ResponseJson.success();
+    }
+
+    /**
+     * 选择地区
+     *
+     * @return
+     */
+    @Override
+    public ResponseJson getArea(Integer freightId, Integer ruleId) {
+        // 区域
+        List<RegionDto> regionList = new ArrayList<>();
+        // 添加区域 东北、华东、华北、华中、华南、西南、西北
+        RegionDto regionDto = new RegionDto();
+        regionDto.setName("东北");
+        regionList.add(regionDto);
+        regionDto = new RegionDto();
+        regionDto.setName("华东");
+        regionList.add(regionDto);
+        regionDto = new RegionDto();
+        regionDto.setName("华北");
+        regionList.add(regionDto);
+        regionDto = new RegionDto();
+        regionDto.setName("华中");
+        regionList.add(regionDto);
+        regionDto = new RegionDto();
+        regionDto.setName("华南");
+        regionList.add(regionDto);
+        regionDto = new RegionDto();
+        regionDto.setName("西南");
+        regionList.add(regionDto);
+        regionDto = new RegionDto();
+        regionDto.setName("西北");
+        regionList.add(regionDto);
+        // 省份集合
+        List<ProvinceDto> provinceList = shopMapper.getProvince();
+        // 市集合
+        List<CityDto> cityList = shopMapper.getCity(freightId, ruleId);
+        for (ProvinceDto procince: provinceList) {
+            List<CityDto> collect = cityList.stream().filter(c -> c.getProvinceId().equals(procince.getProvinceId())).collect(Collectors.toList());
+            procince.setCityList(collect);
+        }
+        for (RegionDto region : regionList) {
+            List<ProvinceDto> collect = null;
+            if ("东北".equals(region.getName())) {
+                collect = provinceList.stream().filter(p -> p.getName().contains("辽宁") || p.getName().contains("吉林") || p.getName().contains("黑龙江")).collect(Collectors.toList());
+                region.setProvinceList(collect);
+            }
+            if ("华东".equals(region.getName())) {
+                collect = provinceList.stream().filter(p -> p.getName().contains("上海") || p.getName().contains("江苏") || p.getName().contains("浙江")
+                        || p.getName().contains("安徽") || p.getName().contains("福建") || p.getName().contains("江西") || p.getName().contains("山东")).collect(Collectors.toList());
+                region.setProvinceList(collect);
+            }
+            if ("华北".equals(region.getName())) {
+                collect = provinceList.stream().filter(p -> p.getName().contains("北京") || p.getName().contains("天津") || p.getName().contains("河北")
+                        || p.getName().contains("山西") || p.getName().contains("内蒙古")).collect(Collectors.toList());
+                region.setProvinceList(collect);
+            }
+            if ("华中".equals(region.getName())) {
+                collect = provinceList.stream().filter(p -> p.getName().contains("河南") || p.getName().contains("湖北") || p.getName().contains("湖南")).collect(Collectors.toList());
+                region.setProvinceList(collect);
+            }
+            if ("华南".equals(region.getName())) {
+                collect = provinceList.stream().filter(p -> p.getName().contains("广东") || p.getName().contains("广西") || p.getName().contains("海南")).collect(Collectors.toList());
+                region.setProvinceList(collect);
+            }
+            if ("西南".equals(region.getName())) {
+                collect = provinceList.stream().filter(p -> p.getName().contains("重庆") || p.getName().contains("四川") || p.getName().contains("贵州")
+                        || p.getName().contains("云南") || p.getName().contains("西藏")).collect(Collectors.toList());
+                region.setProvinceList(collect);
+            }
+            if ("西北".equals(region.getName())) {
+                collect = provinceList.stream().filter(p -> p.getName().contains("陕西") || p.getName().contains("甘肃") || p.getName().contains("青海")
+                        || p.getName().contains("宁夏") || p.getName().contains("新疆")).collect(Collectors.toList());
+                region.setProvinceList(collect);
+            }
+        }
+
+        return ResponseJson.success(regionList);
+    }
+
+    /**
+     * 供应商 -- 新增运费模板
+     *
+     * @param freightTemplateDto
+     * @return
+     */
+    @Override
+    public ResponseJson saveFreightTemplate(FreightTemplateDto freightTemplateDto) {
+        if (null == freightTemplateDto) {
+            return ResponseJson.error(-1, "运费模板不能为空",null);
+        }
+        if (null == freightTemplateDto.getFreightRuleList()) {
+            return ResponseJson.error(-1, "运费模板对应规则不能为空", null);
+        }
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        String format = dateFormat.format(new Date());
+        if (null == freightTemplateDto.getId()) {
+            // 新增运费模板
+
+            freightTemplateDto.setAddTime(format);
+            shopMapper.insertTemplate(freightTemplateDto);
+            // 添加运费模板规则
+            for (FreightRuleDto ruleDto : freightTemplateDto.getFreightRuleList()) {
+                ruleDto.setFreightId(freightTemplateDto.getId());
+                shopMapper.insertRule(ruleDto);
+                // 添加运费模板规则地区
+                if (null == ruleDto.getFreightAreaList()) {
+                    // 设置手动回滚
+                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                    return ResponseJson.error(-1, "运费模板规则锁执行地区不能为空", null);
+                }
+                for (FreightAreaDto areaDto : ruleDto.getFreightAreaList()) {
+                    areaDto.setRuleId(ruleDto.getId());
+                    areaDto.setAddTime(format);
+                    shopMapper.insertArea(areaDto);
+                }
+            }
+        } else {
+            // 修改
+            freightTemplateDto.setUpdateTime(format);
+            shopMapper.updateTemplate(freightTemplateDto);
+            for (FreightRuleDto ruleDto : freightTemplateDto.getFreightRuleList()) {
+                shopMapper.updateRule(ruleDto);
+                if (null == ruleDto.getFreightAreaList()) {
+                    // 设置手动回滚
+                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                    return ResponseJson.error(-1, "运费模板规则锁执行地区不能为空", null);
+                }
+                List<Integer> ids = new ArrayList<>();
+                for (FreightAreaDto areaDto : ruleDto.getFreightAreaList()) {
+                    areaDto.setRuleId(ruleDto.getId());
+                    areaDto.setAddTime(format);
+                    if (null == areaDto.getId()) {
+                        shopMapper.insertArea(areaDto);
+                    }
+                    ids.add(areaDto.getId());
+                }
+                shopMapper.deleteArea(ruleDto.getId(),ids);
+            }
+        }
+        return ResponseJson.success();
+    }
+
+    /**
+     * 删除运费模板
+     *
+     * @param id
+     * @return
+     */
+    @Override
+    public ResponseJson deleteFreightTemplate(Integer id) {
+        shopMapper.deleteTemplate(id);
+        return ResponseJson.success();
+    }
+
     /**
     /**
      * 供应商-发布商品
      * 供应商-发布商品
      *
      *
@@ -230,6 +443,12 @@ public class ShopServiceImpl implements ShopService {
         if (StringUtils.isBlank(productDto.getSkus()) && StringUtils.isBlank(productDto.getMallSkus())) {
         if (StringUtils.isBlank(productDto.getSkus()) && StringUtils.isBlank(productDto.getMallSkus())) {
             return ResponseJson.error("参数异常:商品sku不能为空!", null);
             return ResponseJson.error("参数异常:商品sku不能为空!", null);
         }
         }
+        if (null == productDto.getFreePostFlag()) {
+            return ResponseJson.error("参数异常,物流方式不能为空",null);
+        }
+        if (2 == productDto.getFreePostFlag() && null == productDto.getFreightTemplateId()) {
+            return ResponseJson.error("参数异常,运费模板Id不能为空",null);
+        }
         List<Sku> skus = JSON.parseArray(productDto.getSkus(), Sku.class);
         List<Sku> skus = JSON.parseArray(productDto.getSkus(), Sku.class);
         if (null != skus && skus.size() > 0) {
         if (null != skus && skus.size() > 0) {
         skus.forEach(s -> {
         skus.forEach(s -> {
@@ -714,4 +933,23 @@ public class ShopServiceImpl implements ShopService {
     }
     }
 
 
 
 
+    private List<FreightTemplateVo> setFreightTemplate(List<FreightTemplateVo> templateVos) {
+        if (null != templateVos) {
+            List<Integer> templateIds = templateVos.stream().map(FreightTemplateVo::getId).collect(Collectors.toList());
+            List<FreightRuleVo> rule = shopMapper.getRule(templateIds);
+            List<Integer> ruleIds = rule.stream().map(FreightRuleVo::getId).collect(Collectors.toList());
+            List<FreightAreaVo> area = shopMapper.getArea(ruleIds);
+            // 将地区与运费规则关联
+            for (FreightRuleVo ruleVo : rule) {
+                List<FreightAreaVo> areaVoList = area.stream().filter(a -> a.getRuleId().equals(ruleVo.getId())).collect(Collectors.toList());
+                ruleVo.setFreightAreaList(areaVoList);
+            }
+            // 将运费规则与运费模板关联
+            for (FreightTemplateVo templateVo : templateVos) {
+                List<FreightRuleVo> ruleVoList = rule.stream().filter(r -> r.getFreightId().equals(templateVo.getId())).collect(Collectors.toList());
+                templateVo.setFreightRuleList(ruleVoList);
+            }
+        }
+        return templateVos;
+    }
 }
 }

+ 129 - 0
src/main/resources/mapper/ShopMapper.xml

@@ -51,6 +51,12 @@
         <if test="searchKey != null and  searchKey != ''">
         <if test="searchKey != null and  searchKey != ''">
             searchKey,
             searchKey,
         </if>
         </if>
+        <if test="freePostFlag != null and  freePostFlag != ''">
+            freePostFlag,
+        </if>
+        <if test="freightTemplateId != null and  freightTemplateId != ''">
+            freightTemplateId,
+        </if>
         <if test="allAreaFlag != null and  allAreaFlag != ''">
         <if test="allAreaFlag != null and  allAreaFlag != ''">
             allAreaFlag,
             allAreaFlag,
         </if>
         </if>
@@ -136,6 +142,12 @@
         <if test="searchKey != null and  searchKey != ''">
         <if test="searchKey != null and  searchKey != ''">
             #{searchKey},
             #{searchKey},
         </if>
         </if>
+        <if test="freePostFlag != null and  freePostFlag != ''">
+            #{freePostFlag},
+        </if>
+        <if test="freightTemplateId != null and  freightTemplateId != ''">
+            #{freightTemplateId},
+        </if>
         <if test="allAreaFlag != null and  allAreaFlag != ''">
         <if test="allAreaFlag != null and  allAreaFlag != ''">
             #{allAreaFlag},
             #{allAreaFlag},
         </if>
         </if>
@@ -576,6 +588,121 @@
             </if>
             </if>
         </where>
         </where>
     </select>
     </select>
+
+    <select id="getTemplate" resultType="com.caimei365.commodity.model.vo.FreightTemplateVo">
+        select id, name, shopId, addTime, updateTime, delFlag from cm_freight_template
+        where delFlag = 0 and shopId = #{shopId}
+        order by id desc
+    </select>
+
+    <select id="getTemplateById" resultType="com.caimei365.commodity.model.dto.FreightTemplateDto">
+        select name, shopId, addTime, updateTime, delFlag from cm_freight_template
+        where delFlag = 0 and id = #{id}
+    </select>
+
+    <select id="getRule" resultType="com.caimei365.commodity.model.vo.FreightRuleVo">
+        select id, freightId, freightAmount, areaTax, freeType, freeCondition, productNum, allAmount from cm_freight_rule
+        where
+            <if test="ids.size()>0">
+                freightId in
+                <foreach collection="ids" item="id" open="(" separator="," close=")">
+                    #{id}
+                </foreach>
+            </if>
+    </select>
+
+    <select id="getRuleById" resultType="com.caimei365.commodity.model.dto.FreightRuleDto">
+        select id, freightId, freightAmount, areaTax, freeType, freeCondition, productNum, allAmount from cm_freight_rule
+        where freightId = #{freightId}
+    </select>
+
+    <select id="getArea" resultType="com.caimei365.commodity.model.vo.FreightAreaVo">
+        select id, ruleId, type, provinceId, townId, addTime from cm_freight_area
+        where
+        <if test="ids.size()>0">
+            ruleId in
+            <foreach collection="ids" item="id" open="(" separator="," close=")">
+                #{id}
+            </foreach>
+        </if>
+    </select>
+
+    <select id="getProvince" resultType="com.caimei365.commodity.model.dto.ProvinceDto">
+        SELECT provinceID AS provinceId, name FROM province WHERE validFlag = 1
+    </select>
+
+    <select id="getCity" resultType="com.caimei365.commodity.model.dto.CityDto">
+        SELECT c.provinceID AS provinceId, c.cityID AS cityId, name , cf.type
+        FROM city c
+        left join
+            (
+            SELECT cfa.type, cfa.cityId FROM cm_freight_area cfa
+            LEFT JOIN cm_freight_rule cfr ON cfr.id = cfa.ruleId
+            <WHERE>
+                <if test="freightId != null and freightId != ''">
+                    and cfr.freightId = #{freightId}
+                </if>
+                <if test="ruleId != null and ruleId != ''">
+                    and cfr.id = #{ruleId}
+                </if>
+            </WHERE>
+            ) cf ON c.cityId = cf.cityId
+        where c.validFlag = 1
+    </select>
+
+    <insert id="insertTemplate" keyProperty="id" keyColumn="id" parameterType="com.caimei365.commodity.model.dto.FreightTemplateDto">
+        insert into cm_freight_template
+            ( name, shopId, addTime, delFlag )
+        values( #{name}, #{shopId}, #{addTime}, 0 )
+    </insert>
+
+    <insert id="insertRule" keyProperty="id" keyColumn="id" parameterType="com.caimei365.commodity.model.dto.FreightRuleDto">
+        insert into cm_freight_rule
+            ( freightId, freightAmount, areaTax, freeType, freeCondition, productNum, allAmount )
+            values ( #{freightId}, #{freightAmount}, #{areaTax}, #{freeType}, #{freeCondition}, #{productNum}, #{allAmount})
+    </insert>
+
+    <insert id="insertArea">
+        insert into cm_freight_area
+            ( ruleId, type, provinceId, cityId, addTime )
+        values ( #{ruleId}, #{type}, #{provinceId}, #{cityId}, now() )
+    </insert>
+
+    <update id="updateTemplate">
+        update cm_freight_template
+        set name = #{name},
+            updateTime = #{updateTime}
+        where id = #{id}
+    </update>
+
+    <update id="updateRule">
+        update cm_freight_rule
+        set freightAmount = #{freightAmount},
+            areaTax = #{areaTax},
+            freeType = #{freeType},
+            freeCondition = #{freeCondition},
+            productNum = #{productNum},
+            allAmount = #{allAmount}
+        where id = #{id}
+    </update>
+
+    <delete id="deleteArea">
+        delete from cm_freight_area
+        where ruleId = #{ruleId}
+            <if test="ids.size() > 0">
+                and id not in
+                <foreach collection="ids" item="id" open="(" separator="," close=")">
+                    #{id}
+                </foreach>
+            </if>
+    </delete>
+
+    <update id="deleteTemplate">
+        update cm_freight_template
+        set delFlag = 1
+        where id = #{id}
+    </update>
+
     <select id="getImageByProductId" resultType="com.caimei365.commodity.model.po.ProductImagePo">
     <select id="getImageByProductId" resultType="com.caimei365.commodity.model.po.ProductImagePo">
         select productImageID as id, productID as productId, shopID as shopId, addTime, image, mainFlag, sortIndex
         select productImageID as id, productID as productId, shopID as shopId, addTime, image, mainFlag, sortIndex
         from productimage
         from productimage
@@ -609,6 +736,8 @@
                serviceNumber,
                serviceNumber,
                supplierTaxPoint,
                supplierTaxPoint,
                priceFlag,
                priceFlag,
+               freePostFlag,
+               freightTemplateId,
                actFlag,
                actFlag,
                (select ladderPriceFlag from cm_sku where productId=p.productId and organizeId = 0 order by price asc LIMIT 1) as ladderPriceFlag,
                (select ladderPriceFlag from cm_sku where productId=p.productId and organizeId = 0 order by price asc LIMIT 1) as ladderPriceFlag,
                addTime,
                addTime,