huangzhiguo пре 1 година
родитељ
комит
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.SoldOutDto;
 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.vo.BrandVo;
 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);
     }
 
+    /**
+     * 供应商 -- 运费模板
+     * @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;
 
-import com.caimei365.commodity.model.dto.Sku;
+import com.caimei365.commodity.model.dto.*;
 import com.caimei365.commodity.model.po.*;
 import com.caimei365.commodity.model.search.ProductListVo;
 import com.caimei365.commodity.model.vo.*;
@@ -60,6 +60,99 @@ public interface ShopMapper {
      */
     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未知")
     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;
     /**
-     * 是否包邮 0包邮 1到付
+     * 物流方式 0包邮、1到付、2使用运费模板
      */
     private Integer freePostFlag;
+    /**
+     * 运费模板Id
+     */
+    private Integer freightTemplateId;
     /**
      * 商品类型: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.dto.BrandDto;
 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.po.BrandPo;
 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);
 
+    /**
+     * 供应商 -- 运费模板
+     * @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.ShopMapper;
 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.search.ProductListVo;
 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.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
 import org.springframework.util.Assert;
 
 import javax.annotation.Resource;
@@ -157,6 +155,221 @@ public class ShopServiceImpl implements ShopService {
         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())) {
             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);
         if (null != skus && skus.size() > 0) {
         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 != ''">
             searchKey,
         </if>
+        <if test="freePostFlag != null and  freePostFlag != ''">
+            freePostFlag,
+        </if>
+        <if test="freightTemplateId != null and  freightTemplateId != ''">
+            freightTemplateId,
+        </if>
         <if test="allAreaFlag != null and  allAreaFlag != ''">
             allAreaFlag,
         </if>
@@ -136,6 +142,12 @@
         <if test="searchKey != null and  searchKey != ''">
             #{searchKey},
         </if>
+        <if test="freePostFlag != null and  freePostFlag != ''">
+            #{freePostFlag},
+        </if>
+        <if test="freightTemplateId != null and  freightTemplateId != ''">
+            #{freightTemplateId},
+        </if>
         <if test="allAreaFlag != null and  allAreaFlag != ''">
             #{allAreaFlag},
         </if>
@@ -576,6 +588,121 @@
             </if>
         </where>
     </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 productImageID as id, productID as productId, shopID as shopId, addTime, image, mainFlag, sortIndex
         from productimage
@@ -609,6 +736,8 @@
                serviceNumber,
                supplierTaxPoint,
                priceFlag,
+               freePostFlag,
+               freightTemplateId,
                actFlag,
                (select ladderPriceFlag from cm_sku where productId=p.productId and organizeId = 0 order by price asc LIMIT 1) as ladderPriceFlag,
                addTime,