xiaoyong931011
2023-02-09 ae99a4a7654a6a3d8fd8343c22c415930f0a18cb
后台运费模板功能
14 files added
8 files modified
1375 ■■■■■ changed files
src/main/java/cc/mrbird/febs/mall/controller/AdminMallGoodsController.java 43 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/ViewMallGoodsController.java 29 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/AdminCarriageRuleAddDto.java 30 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/AdminCarriageRuleAddInfoDto.java 27 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/AdminCarriageRuleUpdateDto.java 33 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/MallCarriageRule.java 16 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/MallCarriageRuleInfo.java 31 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/MallGoods.java 6 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/mapper/MallCarriageRuleInfoMapper.java 13 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/mapper/MallCarriageRuleMapper.java 11 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/mapper/MallGoodsMapper.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/IAdminMallGoodsService.java 15 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallGoodsService.java 186 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/AdminMallCarriageRuleInfoVo.java 22 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/AdminMallCarriageRuleVo.java 29 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MallCarriageRuleInfoMapper.xml 25 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MallCarriageRuleMapper.xml 19 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MallGoodsMapper.xml 11 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/goods/carriageRuleAdd.html 294 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/goods/carriageRuleList.html 154 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/goods/carriageRuleUpdate.html 327 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/mallMember/mallAgentRecord.html 51 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/AdminMallGoodsController.java
@@ -7,11 +7,9 @@
import cc.mrbird.febs.common.entity.QueryRequest;
import cc.mrbird.febs.common.enumerates.DataDictionaryEnum;
import cc.mrbird.febs.common.utils.OssUtils;
import cc.mrbird.febs.mall.dto.AddMallGoodsDto;
import cc.mrbird.febs.mall.dto.MallGoodsUpdateDto;
import cc.mrbird.febs.mall.dto.RankAwardUpdateDto;
import cc.mrbird.febs.mall.dto.UpMallGoodsDto;
import cc.mrbird.febs.mall.dto.*;
import cc.mrbird.febs.mall.entity.DataDictionaryCustom;
import cc.mrbird.febs.mall.entity.MallCarriageRule;
import cc.mrbird.febs.mall.entity.MallGoods;
import cc.mrbird.febs.mall.entity.MallGoodsCategory;
import cc.mrbird.febs.mall.mapper.DataDictionaryCustomMapper;
@@ -210,5 +208,42 @@
        return adminMallGoodsService.deliveryHomeUpdate(adminHomeDeliverySettingVo);
    }
    /**
     * 运费模板列表
     */
    @GetMapping("carriageRuleList")
    public FebsResponse carriageRuleList(MallCarriageRule mallCarriageRule, QueryRequest request) {
        Map<String, Object> data = getDataTable(adminMallGoodsService.getMallCarriageRuleListInPage(mallCarriageRule, request));
        return new FebsResponse().success().data(data);
    }
    /**
     * 运费模板列表-删除
     */
    @GetMapping("carriageRuleDel/{id}")
    @ControllerEndpoint(operation = "运费模板列表-删除", exceptionMessage = "操作失败")
    public FebsResponse carriageRuleDel(@NotNull(message = "{required}") @PathVariable Long id) {
        return adminMallGoodsService.carriageRuleDelById(id);
    }
    /**
     * 运费模板列表-新增
     */
    @PostMapping("carriageRuleAdd")
    @ControllerEndpoint(operation = " 商品-新增", exceptionMessage = "操作失败")
    public FebsResponse carriageRuleAdd(@RequestBody @Valid AdminCarriageRuleAddDto adminCarriageRuleAddDto) {
        return adminMallGoodsService.carriageRuleAdd(adminCarriageRuleAddDto);
    }
    /**
     * 运费模板列表-更新
     */
    @PostMapping("carriageRuleUpdate")
    @ControllerEndpoint(operation = "运费模板列表-更新", exceptionMessage = "操作失败")
    public FebsResponse carriageRuleUpdate(@RequestBody @Valid AdminCarriageRuleUpdateDto adminCarriageRuleUpdateDto) {
        return adminMallGoodsService.carriageRuleUpdate(adminCarriageRuleUpdateDto);
    }
}
src/main/java/cc/mrbird/febs/mall/controller/ViewMallGoodsController.java
@@ -139,4 +139,33 @@
        model.addAttribute("homeDeliverySetting", adminHomeDeliverySettingVo);
        return FebsUtil.view("modules/goods/deliveryHomeUpdate");
    }
    /**
     * 运费模板列表
     */
    @GetMapping("carriageRuleList")
    @RequiresPermissions("carriageRuleList:view")
    public String carriageRuleList() {
        return FebsUtil.view("modules/goods/carriageRuleList");
    }
    /**
     * 运费模板-新增
     */
    @GetMapping("carriageRuleAdd")
    @RequiresPermissions("carriageRuleAdd:add")
    public String carriageRuleAdd() {
        return FebsUtil.view("modules/goods/carriageRuleAdd");
    }
    /**
     * 运费模板-编辑-详情
     */
    @GetMapping("carriageRuleUpdate/{id}")
    @RequiresPermissions("carriageRuleUpdate:update")
    public String carriageRuleUpdate(@PathVariable long id, Model model) {
        AdminMallCarriageRuleVo adminMallCarriageRuleVo = mallGoodsService.selectCarriageRuleByRuleId(id);
        model.addAttribute("carriageRule", adminMallCarriageRuleVo);
        return FebsUtil.view("modules/goods/carriageRuleUpdate");
    }
}
src/main/java/cc/mrbird/febs/mall/dto/AdminCarriageRuleAddDto.java
New file
@@ -0,0 +1,30 @@
package cc.mrbird.febs.mall.dto;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.List;
@Data
@ApiModel(value = "AdminCarriageRuleAddDto", description = "运费模板参数类")
public class AdminCarriageRuleAddDto {
    //名称
    @NotBlank(message = "标题不能为空")
    private String ruleName;
    @NotNull(message = "计价方式不能为空")
    private Integer valuationType;
    //基本数量
    private BigDecimal basicCntDefault;
    //基本价格
    private BigDecimal basicPriceDefault;
    //超出的部分的基数数量
    private BigDecimal moreCntDefault;
    //超出的部分的基数的价格
    private BigDecimal morePriceDefault;
    private List<AdminCarriageRuleAddInfoDto> adminCarriageRuleAddInfoDtos;
}
src/main/java/cc/mrbird/febs/mall/dto/AdminCarriageRuleAddInfoDto.java
New file
@@ -0,0 +1,27 @@
package cc.mrbird.febs.mall.dto;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import java.math.BigDecimal;
@Data
@ApiModel(value = "AdminCarriageRuleAddInfoDto", description = "运费模板子表参数类")
public class AdminCarriageRuleAddInfoDto {
    //模板id
    private Long ruleId;
    //计价方式(1:按件算 2:按重量算)
    private Integer valuationType;
    //计价单位(件,KG)
    private String valuationUnit;
    //指定区域(没有指定区域,则为默认)
    private String areaAddress;
    //基本数量
    private BigDecimal basicCnt;
    //基本价格
    private BigDecimal basicPrice;
    //超出的部分的基数数量
    private BigDecimal moreCnt;
    //超出的部分的基数的价格
    private BigDecimal morePrice;
}
src/main/java/cc/mrbird/febs/mall/dto/AdminCarriageRuleUpdateDto.java
New file
@@ -0,0 +1,33 @@
package cc.mrbird.febs.mall.dto;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.List;
@Data
@ApiModel(value = "AdminCarriageRuleUpdateDto", description = "运费模板更新参数类")
public class AdminCarriageRuleUpdateDto {
    private Long id;
    //名称
    @NotBlank(message = "标题不能为空")
    private String ruleName;
    @NotNull(message = "计价方式不能为空")
    private Integer valuationType;
    //基本数量
    private BigDecimal basicCntDefault;
    //基本价格
    private BigDecimal basicPriceDefault;
    //超出的部分的基数数量
    private BigDecimal moreCntDefault;
    //超出的部分的基数的价格
    private BigDecimal morePriceDefault;
    private List<AdminCarriageRuleAddInfoDto> adminCarriageRuleAddInfoDtos;
}
src/main/java/cc/mrbird/febs/mall/entity/MallCarriageRule.java
New file
@@ -0,0 +1,16 @@
package cc.mrbird.febs.mall.entity;
import cc.mrbird.febs.common.entity.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
/**
 * 运费模板表
 */
@Data
@TableName("mall_carriage_rule")
public class MallCarriageRule extends BaseEntity {
    //名称
    private String name;
}
src/main/java/cc/mrbird/febs/mall/entity/MallCarriageRuleInfo.java
New file
@@ -0,0 +1,31 @@
package cc.mrbird.febs.mall.entity;
import cc.mrbird.febs.common.entity.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.math.BigDecimal;
/**
 * 运费模板子表
 */
@Data
@TableName("mall_carriage_rule_info")
public class MallCarriageRuleInfo extends BaseEntity {
    //模板id
    private Long ruleId;
    //计价方式(1:按件算 2:按重量算)
    private Integer valuationType;
    //计价单位(件,KG)
    private String valuationUnit;
    //指定区域(没有指定区域,则为默认)
    private String areaAddress;
    //基本数量
    private BigDecimal basicCnt;
    //基本价格
    private BigDecimal basicPrice;
    //超出的部分的基数数量
    private BigDecimal moreCnt;
    //超出的部分的基数的价格
    private BigDecimal morePrice;
}
src/main/java/cc/mrbird/febs/mall/entity/MallGoods.java
@@ -116,5 +116,11 @@
    private BigDecimal carriage;
    private String wxCodeImg;
    //运费方式  (1:固定运费 2:运费模板)
    private Integer carriageType;
    //运费金额
    private BigDecimal carriageAmount;
    //运费模板ID
    private Long carriageRuleId;
}
src/main/java/cc/mrbird/febs/mall/mapper/MallCarriageRuleInfoMapper.java
New file
@@ -0,0 +1,13 @@
package cc.mrbird.febs.mall.mapper;
import cc.mrbird.febs.mall.entity.MallCarriageRuleInfo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface MallCarriageRuleInfoMapper extends BaseMapper<MallCarriageRuleInfo> {
    List<MallCarriageRuleInfo> selectMallCarriageRuleInfoByRuleIdAndAreaAddress(@Param("ruleId")long id, @Param("areaAddress")String areaAddress);
}
src/main/java/cc/mrbird/febs/mall/mapper/MallCarriageRuleMapper.java
New file
@@ -0,0 +1,11 @@
package cc.mrbird.febs.mall.mapper;
import cc.mrbird.febs.mall.entity.MallCarriageRule;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
public interface MallCarriageRuleMapper extends BaseMapper<MallCarriageRule> {
    IPage<MallCarriageRule> selectMallCarriageRuleListInPage(Page<MallCarriageRule> page, MallCarriageRule mallCarriageRule);
}
src/main/java/cc/mrbird/febs/mall/mapper/MallGoodsMapper.java
@@ -55,4 +55,7 @@
    List<MallGoodsListVo> selectMallGoodsListQueryNoPage(@Param("record")MallGoodsQueryDto queryDto);
    List<MallGoods> selectMallGoodsListQueryByRuleId(@Param("id")Long id);
    List<MallGoods> selectMallGoodsListQueryByRuleIdAndIsSale(@Param("id")Long id, @Param("isSale")Integer ishotStateYes);
}
src/main/java/cc/mrbird/febs/mall/service/IAdminMallGoodsService.java
@@ -2,9 +2,8 @@
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.common.entity.QueryRequest;
import cc.mrbird.febs.mall.dto.AddMallGoodsDto;
import cc.mrbird.febs.mall.dto.MallGoodsUpdateDto;
import cc.mrbird.febs.mall.dto.UpMallGoodsDto;
import cc.mrbird.febs.mall.dto.*;
import cc.mrbird.febs.mall.entity.MallCarriageRule;
import cc.mrbird.febs.mall.entity.MallGoods;
import cc.mrbird.febs.mall.entity.MallGoodsCategory;
import cc.mrbird.febs.mall.vo.*;
@@ -42,4 +41,14 @@
    IPage<AdminHomeDeliverySettingVo> getDeliveryHomeListInPage(AdminHomeDeliverySettingVo adminHomeDeliverySettingVo, QueryRequest request);
    FebsResponse deliveryHomeUpdate(AdminHomeDeliverySettingVo adminHomeDeliverySettingVo);
    IPage<MallCarriageRule> getMallCarriageRuleListInPage(MallCarriageRule mallCarriageRule, QueryRequest request);
    FebsResponse carriageRuleDelById(Long id);
    FebsResponse carriageRuleAdd(AdminCarriageRuleAddDto adminCarriageRuleAddDto);
    AdminMallCarriageRuleVo selectCarriageRuleByRuleId(long id);
    FebsResponse carriageRuleUpdate(AdminCarriageRuleUpdateDto adminCarriageRuleUpdateDto);
}
src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallGoodsService.java
@@ -13,6 +13,7 @@
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -39,6 +40,8 @@
    private final MallGoodsStyleMapper mallGoodsStyleMapper;
    private final MallGoodsImagesMapper mallGoodsImagesMapper;
    private final MallShoppingCartMapper mallShoppingCartMapper;
    private final MallCarriageRuleMapper mallCarriageRuleMapper;
    private final MallCarriageRuleInfoMapper mallCarriageRuleInfoMapper;
    @Override
    public IPage<AdminMallGoodsVo> getCategoryListInPage(MallGoods mallGoods, QueryRequest request) {
@@ -525,4 +528,187 @@
        dataDictionaryCustomMapper.updateById(dataDictionaryCustom);
        return new FebsResponse().success();
    }
    @Override
    public IPage<MallCarriageRule> getMallCarriageRuleListInPage(MallCarriageRule mallCarriageRule, QueryRequest request) {
        Page<MallCarriageRule> page = new Page<>(request.getPageNum(), request.getPageSize());
        IPage<MallCarriageRule> mallCarriageRules = mallCarriageRuleMapper.selectMallCarriageRuleListInPage(page, mallCarriageRule);
        return mallCarriageRules;
    }
    @Override
    @Transactional
    public FebsResponse carriageRuleDelById(Long id) {
        MallCarriageRule mallCarriageRule = mallCarriageRuleMapper.selectById(id);
        if(ObjectUtil.isEmpty(mallCarriageRule)){
            return new FebsResponse().fail().message("操作失败");
        }
        List<MallGoods> mallGoods = this.baseMapper.selectMallGoodsListQueryByRuleId(id);
        if(CollUtil.isNotEmpty(mallGoods)){
            StringBuffer goodsNameBuffer = new StringBuffer();
            for(MallGoods goods : mallGoods){
                goodsNameBuffer.append(goods.getGoodsName());
                goodsNameBuffer.append(",");
            }
            return new FebsResponse().fail().message(goodsNameBuffer+"正在使用当前模板,请先编辑商品信息");
        }
        QueryWrapper<MallCarriageRuleInfo> objectQueryWrapper = new QueryWrapper<>();
        objectQueryWrapper.eq("rule_id",id);
        mallCarriageRuleInfoMapper.delete(objectQueryWrapper);
        mallCarriageRuleMapper.deleteById(id);
        return new FebsResponse().success();
    }
    @Override
    @Transactional
    public FebsResponse carriageRuleAdd(AdminCarriageRuleAddDto adminCarriageRuleAddDto) {
        String ruleName = adminCarriageRuleAddDto.getRuleName();
        QueryWrapper<MallCarriageRule> objectQueryWrapper = new QueryWrapper<>();
        objectQueryWrapper.eq("name",ruleName);
        List<MallCarriageRule> mallCarriageRules = mallCarriageRuleMapper.selectList(objectQueryWrapper);
        if(CollUtil.isNotEmpty(mallCarriageRules)){
            return new FebsResponse().fail().message("标题不能重复");
        }
        MallCarriageRule mallCarriageRule = new MallCarriageRule();
        mallCarriageRule.setName(ruleName);
        mallCarriageRuleMapper.insert(mallCarriageRule);
        Long ruleId = mallCarriageRule.getId();
        /**
         * 生成默认的运费规则
         */
        MallCarriageRuleInfo mallCarriageRuleInfoDefault = new MallCarriageRuleInfo();
        mallCarriageRuleInfoDefault.setRuleId(ruleId);
        //计价方式(1:按件算 2:按重量算)
        mallCarriageRuleInfoDefault.setValuationType(adminCarriageRuleAddDto.getValuationType());
        mallCarriageRuleInfoDefault.setValuationUnit(
                adminCarriageRuleAddDto.getValuationType() == 1?"件":"千克"
        );
        mallCarriageRuleInfoDefault.setBasicCnt(adminCarriageRuleAddDto.getBasicCntDefault());
        mallCarriageRuleInfoDefault.setBasicPrice(adminCarriageRuleAddDto.getBasicPriceDefault());
        mallCarriageRuleInfoDefault.setMoreCnt(adminCarriageRuleAddDto.getMoreCntDefault());
        mallCarriageRuleInfoDefault.setMorePrice(adminCarriageRuleAddDto.getMorePriceDefault());
        mallCarriageRuleInfoMapper.insert(mallCarriageRuleInfoDefault);
        List<AdminCarriageRuleAddInfoDto> adminCarriageRuleAddInfoDtos = adminCarriageRuleAddDto.getAdminCarriageRuleAddInfoDtos();
        if(CollUtil.isNotEmpty(adminCarriageRuleAddInfoDtos)){
            for(AdminCarriageRuleAddInfoDto adminCarriageRuleAddInfoDto : adminCarriageRuleAddInfoDtos){
                MallCarriageRuleInfo mallCarriageRuleInfo = new MallCarriageRuleInfo();
                mallCarriageRuleInfo.setRuleId(ruleId);
                mallCarriageRuleInfo.setAreaAddress(adminCarriageRuleAddInfoDto.getAreaAddress());
                //计价方式(1:按件算 2:按重量算)
                mallCarriageRuleInfo.setValuationType(adminCarriageRuleAddDto.getValuationType());
                mallCarriageRuleInfo.setValuationUnit(
                        adminCarriageRuleAddDto.getValuationType() == 1?"件":"千克"
                );
                mallCarriageRuleInfo.setBasicCnt(adminCarriageRuleAddInfoDto.getBasicCnt());
                mallCarriageRuleInfo.setBasicPrice(adminCarriageRuleAddInfoDto.getBasicPrice());
                mallCarriageRuleInfo.setMoreCnt(adminCarriageRuleAddInfoDto.getMoreCnt());
                mallCarriageRuleInfo.setMorePrice(adminCarriageRuleAddInfoDto.getMorePrice());
                mallCarriageRuleInfoMapper.insert(mallCarriageRuleInfo);
            }
        }
        return new FebsResponse().success().message("操作成功");
    }
    @Override
    public AdminMallCarriageRuleVo selectCarriageRuleByRuleId(long id) {
        AdminMallCarriageRuleVo adminMallCarriageRuleVo = new AdminMallCarriageRuleVo();
        MallCarriageRule mallCarriageRule = mallCarriageRuleMapper.selectById(id);
        adminMallCarriageRuleVo.setId(id);
        adminMallCarriageRuleVo.setRuleName(mallCarriageRule.getName());
        List<MallCarriageRuleInfo> mallCarriageRuleInfos = mallCarriageRuleInfoMapper.selectMallCarriageRuleInfoByRuleIdAndAreaAddress(id,null);
        if(CollUtil.isNotEmpty(mallCarriageRuleInfos)){
            List<AdminMallCarriageRuleInfoVo> adminCarriageRuleInfoVos = new ArrayList<>();
            for(MallCarriageRuleInfo mallCarriageRuleInfo : mallCarriageRuleInfos){
                if(StrUtil.isNotEmpty(mallCarriageRuleInfo.getAreaAddress())){
                    AdminMallCarriageRuleInfoVo adminMallCarriageRuleInfoVo = new AdminMallCarriageRuleInfoVo();
                    adminMallCarriageRuleInfoVo.setId(mallCarriageRuleInfo.getId());
                    adminMallCarriageRuleInfoVo.setAreaAddress(mallCarriageRuleInfo.getAreaAddress());
                    adminMallCarriageRuleInfoVo.setBasicCnt(mallCarriageRuleInfo.getBasicCnt());
                    adminMallCarriageRuleInfoVo.setBasicPrice(mallCarriageRuleInfo.getBasicPrice());
                    adminMallCarriageRuleInfoVo.setMoreCnt(mallCarriageRuleInfo.getMoreCnt());
                    adminMallCarriageRuleInfoVo.setMorePrice(mallCarriageRuleInfo.getMorePrice());
                    adminCarriageRuleInfoVos.add(adminMallCarriageRuleInfoVo);
                }else{
                    //默认规则
                    adminMallCarriageRuleVo.setBasicCntDefault(mallCarriageRuleInfo.getBasicCnt());
                    adminMallCarriageRuleVo.setBasicPriceDefault(mallCarriageRuleInfo.getBasicPrice());
                    adminMallCarriageRuleVo.setMoreCntDefault(mallCarriageRuleInfo.getMoreCnt());
                    adminMallCarriageRuleVo.setMorePriceDefault(mallCarriageRuleInfo.getMorePrice());
                    adminMallCarriageRuleVo.setValuationType(mallCarriageRuleInfo.getValuationType());
                }
            }
            adminMallCarriageRuleVo.setAdminCarriageRuleInfoVos(adminCarriageRuleInfoVos);
        }
        return adminMallCarriageRuleVo;
    }
    @Override
    @Transactional
    public FebsResponse carriageRuleUpdate(AdminCarriageRuleUpdateDto adminCarriageRuleUpdateDto) {
        Long id = adminCarriageRuleUpdateDto.getId();
        MallCarriageRule mallCarriageRule = mallCarriageRuleMapper.selectById(id);
        if(ObjectUtil.isEmpty(mallCarriageRule)){
            return new FebsResponse().fail().message("运费模板不存在");
        }
        List<MallGoods> mallGoods = this.baseMapper.selectMallGoodsListQueryByRuleIdAndIsSale(id,MallGoods.ISHOT_STATE_YES);
        if(CollUtil.isNotEmpty(mallGoods)){
            StringBuffer goodsNameBuffer = new StringBuffer();
            for(MallGoods goods : mallGoods){
                goodsNameBuffer.append(goods.getGoodsName());
                goodsNameBuffer.append(",");
            }
            return new FebsResponse().fail().message(goodsNameBuffer+"正在使用当前模板,请先下架商品");
        }
        //删除现有的所有运费模板子表数据
        List<MallCarriageRuleInfo> mallCarriageRuleInfos = mallCarriageRuleInfoMapper.selectMallCarriageRuleInfoByRuleIdAndAreaAddress(id, null);
        if(CollUtil.isNotEmpty(mallCarriageRuleInfos)){
            for(MallCarriageRuleInfo mallCarriageRuleInfo : mallCarriageRuleInfos){
                mallCarriageRuleInfoMapper.deleteById(mallCarriageRuleInfo.getId());
            }
        }
        /**
         * 生成运费模板子表数据
         */
        MallCarriageRuleInfo mallCarriageRuleInfoDefault = new MallCarriageRuleInfo();
        mallCarriageRuleInfoDefault.setRuleId(id);
        //计价方式(1:按件算 2:按重量算)
        mallCarriageRuleInfoDefault.setValuationType(adminCarriageRuleUpdateDto.getValuationType());
        mallCarriageRuleInfoDefault.setValuationUnit(
                adminCarriageRuleUpdateDto.getValuationType() == 1?"件":"千克"
        );
        mallCarriageRuleInfoDefault.setBasicCnt(adminCarriageRuleUpdateDto.getBasicCntDefault());
        mallCarriageRuleInfoDefault.setBasicPrice(adminCarriageRuleUpdateDto.getBasicPriceDefault());
        mallCarriageRuleInfoDefault.setMoreCnt(adminCarriageRuleUpdateDto.getMoreCntDefault());
        mallCarriageRuleInfoDefault.setMorePrice(adminCarriageRuleUpdateDto.getMorePriceDefault());
        mallCarriageRuleInfoMapper.insert(mallCarriageRuleInfoDefault);
        List<AdminCarriageRuleAddInfoDto> adminCarriageRuleAddInfoDtos = adminCarriageRuleUpdateDto.getAdminCarriageRuleAddInfoDtos();
        if(CollUtil.isNotEmpty(adminCarriageRuleAddInfoDtos)){
            for(AdminCarriageRuleAddInfoDto adminCarriageRuleAddInfoDto : adminCarriageRuleAddInfoDtos){
                MallCarriageRuleInfo mallCarriageRuleInfo = new MallCarriageRuleInfo();
                mallCarriageRuleInfo.setRuleId(id);
                mallCarriageRuleInfo.setAreaAddress(adminCarriageRuleAddInfoDto.getAreaAddress());
                //计价方式(1:按件算 2:按重量算)
                mallCarriageRuleInfo.setValuationType(mallCarriageRuleInfoDefault.getValuationType());
                mallCarriageRuleInfo.setValuationUnit(
                        mallCarriageRuleInfoDefault.getValuationType() == 1?"件":"千克"
                );
                mallCarriageRuleInfo.setBasicCnt(adminCarriageRuleAddInfoDto.getBasicCnt());
                mallCarriageRuleInfo.setBasicPrice(adminCarriageRuleAddInfoDto.getBasicPrice());
                mallCarriageRuleInfo.setMoreCnt(adminCarriageRuleAddInfoDto.getMoreCnt());
                mallCarriageRuleInfo.setMorePrice(adminCarriageRuleAddInfoDto.getMorePrice());
                mallCarriageRuleInfoMapper.insert(mallCarriageRuleInfo);
            }
        }
        return new FebsResponse().success().message("操作成功");
    }
}
src/main/java/cc/mrbird/febs/mall/vo/AdminMallCarriageRuleInfoVo.java
New file
@@ -0,0 +1,22 @@
package cc.mrbird.febs.mall.vo;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import java.math.BigDecimal;
@Data
@ApiModel(value = "AdminMallCarriageRuleInfoVo", description = "运费模板子表返回参数类")
public class AdminMallCarriageRuleInfoVo {
    private Long id;
    //指定区域(没有指定区域,则为默认)
    private String areaAddress;
    //基本数量
    private BigDecimal basicCnt;
    //基本价格
    private BigDecimal basicPrice;
    //超出的部分的基数数量
    private BigDecimal moreCnt;
    //超出的部分的基数的价格
    private BigDecimal morePrice;
}
src/main/java/cc/mrbird/febs/mall/vo/AdminMallCarriageRuleVo.java
New file
@@ -0,0 +1,29 @@
package cc.mrbird.febs.mall.vo;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
@Data
@ApiModel(value = "AdminMallCarriageRuleVo", description = "运费模板返回参数类")
public class AdminMallCarriageRuleVo {
    private Long id;
    //名称
    private String ruleName;
    private Integer valuationType;
    //基本数量
    private BigDecimal basicCntDefault;
    //基本价格
    private BigDecimal basicPriceDefault;
    //超出的部分的基数数量
    private BigDecimal moreCntDefault;
    //超出的部分的基数的价格
    private BigDecimal morePriceDefault;
    private List<AdminMallCarriageRuleInfoVo> adminCarriageRuleInfoVos;
}
src/main/resources/mapper/modules/MallCarriageRuleInfoMapper.xml
New file
@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cc.mrbird.febs.mall.mapper.MallCarriageRuleInfoMapper">
<!--    <select id="selectByMemberIdAndState" resultType="cc.mrbird.febs.mall.entity.MallAgentRecord">-->
<!--        select a.* from mall_agent_record a-->
<!--        where a.member_id = #{memberId}-->
<!--            and a.state = #{state}-->
<!--        limit 1-->
<!--    </select>-->
    <select id="selectMallCarriageRuleInfoByRuleIdAndAreaAddress" resultType="cc.mrbird.febs.mall.entity.MallCarriageRuleInfo">
        SELECT
            a.*
        FROM mall_carriage_rule_info a
        <where>
            a.rule_id = #{ruleId}
            <if test="areaAddress != null and areaAddress != ''">
                and a.area_address like concat('%',  #{areaAddress},'%')
            </if>
        </where>
        GROUP BY a.id order by a.CREATED_TIME desc
    </select>
</mapper>
src/main/resources/mapper/modules/MallCarriageRuleMapper.xml
New file
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cc.mrbird.febs.mall.mapper.MallCarriageRuleMapper">
<!--    <select id="selectByMemberIdAndState" resultType="cc.mrbird.febs.mall.entity.MallAgentRecord">-->
<!--        select a.* from mall_agent_record a-->
<!--        where a.member_id = #{memberId}-->
<!--            and a.state = #{state}-->
<!--        limit 1-->
<!--    </select>-->
    <select id="selectMallCarriageRuleListInPage" resultType="cc.mrbird.febs.mall.entity.MallCarriageRule">
        SELECT
            a.*
        FROM mall_carriage_rule a
        GROUP BY a.id order by a.CREATED_TIME desc
    </select>
</mapper>
src/main/resources/mapper/modules/MallGoodsMapper.xml
@@ -341,4 +341,15 @@
        </if>
    </select>
    <select id="selectMallGoodsListQueryByRuleId" resultType="cc.mrbird.febs.mall.entity.MallGoods">
        select a.goods_name from mall_goods a where a.carriage_rule_id = #{id}
    </select>
    <select id="selectMallGoodsListQueryByRuleIdAndIsSale" resultType="cc.mrbird.febs.mall.entity.MallGoods">
        select a.goods_name
        from mall_goods a
        where a.carriage_rule_id = #{id}
            and a.is_sale = #{isSale}
    </select>
</mapper>
src/main/resources/templates/febs/views/modules/goods/carriageRuleAdd.html
New file
@@ -0,0 +1,294 @@
<div class="layui-fluid layui-anim febs-anim" id="febs-carriage-rule-add" lay-title="运费模板新增">
    <div class="layui-row febs-container">
        <div class="layui-col-md12">
            <div class="layui-fluid" id="carriage-rule-add">
                <form class="layui-form" action="" lay-filter="carriage-rule-add-form">
                    <div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief">
                        <ul class="layui-tab-title">
                            <li class="layui-this">运费模板</li>
                        </ul>
                        <div class="layui-tab-content">
                            <div class="layui-tab-item layui-show">
                                <blockquote class="layui-elem-quote blue-border">基本信息</blockquote>
                                <div class="layui-row layui-col-space10 layui-form-item">
                                    <div class="layui-col-lg6">
                                        <label class="layui-form-label febs-form-item-require">标题:</label>
                                        <div class="layui-input-block">
                                            <input type="text" name="ruleName" lay-verify="required" placeholder="" autocomplete="off" class="layui-input">
                                        </div>
                                    </div>
                                </div>
                                <div class="layui-form-item">
                                    <label class="layui-form-label febs-form-item-require">计价方式:</label>
                                    <div class="layui-input-block">
                                        <input type="radio" name="valuationType" value="1" title="按件算" checked />
                                        <input type="radio" name="valuationType" value="2" title="按重量算" />
                                    </div>
                                </div>
                                <blockquote class="layui-elem-quote blue-border">默认规则</blockquote>
                                <div class="layui-form-item">
                                    <label class="layui-form-label febs-form-item-require">默认运费:</label>
                                    <div class="layui-input-inline" style="width: 80px">
                                        <input type="text" name="basicCntDefault" lay-verify="required" autocomplete="off" class="layui-input" >
                                    </div>
                                    <div class="layui-form-mid">件内,</div>
                                    <div class="layui-input-inline" style="width: 80px">
                                        <input type="text" name="basicPriceDefault" lay-verify="required" autocomplete="off" class="layui-input" >
                                    </div>
                                    <div class="layui-form-mid">元,</div>
                                    <div class="layui-form-mid">每增加</div>
                                    <div class="layui-input-inline" style="width: 80px">
                                        <input type="text" name="moreCntDefault" lay-verify="required" autocomplete="off" class="layui-input" >
                                    </div>
                                    <div class="layui-form-mid">件,增加运费</div>
                                    <div class="layui-input-inline" style="width: 80px">
                                        <input type="text" name="morePriceDefault" lay-verify="required" autocomplete="off" class="layui-input" >
                                    </div>
                                    <div class="layui-form-mid">元。</div>
                                </div>
                                <div class="layui-form-item multi-rule-table">
                                    <div class="layui-row layui-col-space10 layui-form-item">
                                        <blockquote class="layui-elem-quote blue-border">为指定省份设置运费</blockquote>
                                        <div class="layui-col-lg6">
                                            <label class="layui-form-label febs-form-item-require">指定省份:</label>
                                            <div class="layui-input-block">
                                                <div id="province-set"></div>
                                            </div>
                                        </div>
                                        <div class="layui-col-lg6">
                                            <button type="button" class="layui-btn layui-btn-normal layui-btn" id="test3" >添加</button>
                                        </div>
                                    </div>
                                    <div class="layui-form-item">
                                        <div class="layui-input-block">
                                            <table id="multiRule" lay-filter="multiRule"></table>
                                        </div>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                    <div class="layui-form-item febs-hide">
                        <button class="layui-btn" lay-submit="" lay-filter="carriage-rule-add-form-submit" id="submit">保存</button>
                    </div>
                </form>
            </div>
        </div>
    </div>
</div>
<style>
    .blue-border {
        border-left-color: #2db7f5;
        font-size: 18px;
    }
</style>
<script type="text/html" id="toolbar">
    <div class="layui-btn-container">
        <button class="layui-btn layui-btn-danger layui-btn-sm" type="button" lay-event="delSku">删除</button>
    </div>
</script>
<!-- 表格操作栏 end -->
<script data-th-inline="javascript">
    layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree','dropdown', 'laydate', 'layedit', 'upload', 'element', 'table', 'xmSelect'], function () {
        var $ = layui.jquery,
            febs = layui.febs,
            layer = layui.layer,
            table = layui.table,
            formSelects = layui.formSelects,
            treeSelect = layui.treeSelect,
            form = layui.form,
            laydate = layui.laydate,
            eleTree = layui.eleTree,
            $view = $('#carriage-rule-add'),
            layedit = layui.layedit,
            upload = layui.upload,
            validate = layui.validate,
            element = layui.element;
        form.render();
        formSelects.render();
        var provinceSet = xmSelect.render({
            el: '#province-set',
            toolbar: {
                show: true,
                list: [ 'ALL', 'CLEAR', 'REVERSE' ]
            },
            filterable: true,
            data: [
                {name: '北京市',value: 1,selected:false},
                {name: '天津市',value: 2,selected:false},
                {name: '河北省',value: 3,selected:false},
                {name: '山西省',value: 4,selected:false},
                {name: '辽宁省',value: 5,selected:false},
                {name: '吉林省',value: 6,selected:false},
                {name: '黑龙江省',value: 7,selected:false},
                {name: '上海市',value: 8,selected:false},
                {name: '江苏省',value: 9,selected:false},
                {name: '浙江省',value: 10,selected:false},
                {name: '安徽省',value: 11,selected:false},
                {name: '福建省',value: 12,selected:false},
                {name: '江西省',value: 13,selected:false},
                {name: '山东省',value: 14,selected:false},
                {name: '河南省',value: 15,selected:false},
                {name: '湖北省',value: 16,selected:false},
                {name: '湖南省',value: 17,selected:false},
                {name: '广东省',value: 18,selected:false},
                {name: '广西壮族自治区',value: 19,selected:false},
                {name: '海南省',value: 20,selected:false},
                {name: '重庆市',value: 21,selected:false},
                {name: '四川省',value: 22,selected:false},
                {name: '贵州省',value: 23,selected:false},
                {name: '云南省',value: 24,selected:false},
                {name: '西藏自治区',value: 25,selected:false},
                {name: '陕西省',value: 26,selected:false},
                {name: '甘肃省',value: 27,selected:false},
                {name: '青海省',value: 28,selected:false},
                {name: '宁夏回族自治区',value: 29,selected:false},
                {name: '内蒙古自治区',value: 30,selected:false},
                {name: '新疆维吾尔自治区',value: 31,selected:false},
                {name: '台湾省',value: 32,selected:false},
                {name: '香港特别行政区',value: 33,selected:false},
                {name: '澳门特别行政区',value: 34,selected:false},
            ],
        })
        $('#test3').on('click', function (){
            let provinceChoice = provinceSet.getValue('name');
            if(provinceChoice == null || provinceChoice == ""){
                febs.alert.warn('指定省份不能为空');
                return false;
            }
            let provinceChoiceStr = "";
            console.log(provinceChoice);
            for (let i = 0; i < provinceChoice.length; i++) {
                provinceChoiceStr = provinceChoiceStr + provinceChoice[i]+",";
            }
            console.log(provinceChoiceStr);
            let data = {};
            data.areaAddress = provinceChoiceStr;
            data.basicCnt = 1;
            data.basicPrice = 1;
            data.moreCnt = 1;
            data.morePrice = 1;
            addTableDate(data);
        });
        var ruleData=[];
        var tableIns = table.render({
            elem: '#multiRule'
            ,limit:999
            ,toolbar:"#toolbar"
            ,defaultToolbar:[]
            ,cols: [
                [
                ,{align: 'center', title: '请选择', colspan: 2}
                ,{field:'areaAddress', title:'指定省份', width:400, rowspan: 2,align: 'center'}
                ,{align: 'center', title: '规则( 2 件内,2 元,每 1 增加件,增加运费 1 元。)', colspan: 4}
                ],
                [ //表头
                {type: 'checkbox', rowspan: 2,align: 'center' }
                ,{field: 'index', title: '序号', width:100, rowspan: 2,align: 'center'}
                ,{field: 'basicCnt', title: '件内', width:200,edit:'text'}
                ,{field: 'basicPrice', title: '运费', width:200,edit:'text'}
                ,{field: 'moreCnt', title: '每增加', width:200,edit:'text'}
                ,{field: 'morePrice', title: '增加运费', width:200,edit:'text'}
            ]]
            ,data: []
        });
        table.on('toolbar(multiRule)', function(obj){
            var data = obj.data;
            var hasData = table.cache['multiRule'];
            var checkData = table.checkStatus('multiRule').data;
            if (checkData.length <= 0) {
                febs.alert.warn('请选择删除数据');
                return;
            }
            if(obj.event === 'delSku'){
                for (let i = 0; i < checkData.length; i++) {
                    var delData = checkData[i];
                    for (let j = 0; j < hasData.length; j++) {
                        if (hasData[j].index == delData.index) {
                            hasData.splice(j, 1);
                            break;
                        }
                    }
                }
                for (let i = 0; i < hasData.length; i++) {
                    hasData[i].index = i + 1;
                }
                ruleData=hasData;
                reloadTable(hasData);
            }
        });
        function addTableDate(data) {
            var hasData = table.cache['multiRule'];
            data.index = hasData.length + 1;
            ruleData.push(data);
            reloadTable(ruleData);
            return data.index;
        }
        function reloadTable(data) {
            table.reload('multiRule', {
                data : data
            });
        }
        table.on('edit(multiRule)', function(obj){
            var value = obj.value //得到修改后的值
                ,data = obj.data //得到所在行所有键值
                ,field = obj.field; //得到字段
            for (let i = 0; i < ruleData.length; i++) {
                if (ruleData[i].index == data.index) {
                    ruleData[i] = data;
                }
            }
        });
        form.on('submit(carriage-rule-add-form-submit)', function (data) {
            data.field.adminCarriageRuleAddInfoDtos = ruleData;
            $.ajax({
                'url':ctx + 'admin/goods/carriageRuleAdd',
                'type':'post',
                'dataType':'json',
                'headers' : {'Content-Type' : 'application/json;charset=utf-8'}, //接口json格式
                'traditional': true,//ajax传递数组必须添加属性
                'data':JSON.stringify(data.field),
                'success':function (data) {
                    if(data.code==200){
                        layer.closeAll();
                        febs.alert.success(data.message);
                        $('#febs-carriage-rule').find('#reset').click();
                    }else{
                        febs.alert.warn(data.message);
                    }
                },
                'error':function () {
                    febs.alert.warn('服务器繁忙');
                }
            })
            return false;
        });
    });
</script>
src/main/resources/templates/febs/views/modules/goods/carriageRuleList.html
New file
@@ -0,0 +1,154 @@
<div class="layui-fluid layui-anim febs-anim" id="febs-carriage-rule" lay-title="运费模板管理">
    <div class="layui-row febs-container">
        <div class="layui-col-md12">
            <div class="layui-card">
                <div class="layui-card-body febs-table-full">
                    <form class="layui-form layui-table-form" lay-filter="user-table-form">
                        <div class="layui-row">
                            <div class="layui-col-md2 layui-col-sm12 layui-col-xs12 table-action-area">
                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="add">
                                    新增
                                </div>
                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain table-action" id="query">
                                    <i class="layui-icon">&#xe848;</i>
                                </div>
                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset">
                                    <i class="layui-icon">&#xe79b;</i>
                                </div>
                            </div>
                        </div>
                    </form>
                    <table lay-filter="carriageRuleTable" lay-data="{id: 'carriageRuleTable'}"></table>
                    <style type="text/css">
                        .layui-table-cell{
                            text-align:center;
                            height: auto;
                            white-space: nowrap; /*文本不会换行,在同一行显示*/
                            overflow: hidden; /*超出隐藏*/
                            text-overflow: ellipsis; /*省略号显示*/
                        }
                        .layui-table img{
                            max-width:100px
                        }
                    </style>
                </div>
            </div>
        </div>
    </div>
</div>
<!-- 表格操作栏 start -->
<script type="text/html" id="user-option">
    <span shiro:lacksPermission="user:view,user:update,user:delete">
        <span class="layui-badge-dot febs-bg-orange"></span> 无权限
    </span>
    <a lay-event="edit" shiro:hasPermission="user:update"><i
            class="layui-icon febs-edit-area febs-blue">&#xe7a5;</i></a>
</script>
<style>
    .layui-form-onswitch {
        background-color: #5FB878 !important;
    }
</style>
<!-- 表格操作栏 end -->
<script data-th-inline="none" type="text/javascript">
    // 引入组件并初始化
    layui.use([ 'jquery', 'form', 'table', 'febs'], function () {
        var $ = layui.jquery,
            febs = layui.febs,
            form = layui.form,
            table = layui.table,
            $view = $('#febs-carriage-rule'),
            $query = $view.find('#query'),
            $reset = $view.find('#reset'),
            $searchForm = $view.find('form'),
            $add = $view.find('#add'),
            sortObject = {field: 'phone', type: null},
            tableIns;
        form.render();
        // 表格初始化
        initTable();
        // 初始化表格操作栏各个按钮功能
        table.on('tool(carriageRuleTable)', function (obj) {
            var data = obj.data,
                layEvent = obj.event;
            if (layEvent === 'carriageRuleDel') {
                febs.modal.confirm('删除', '确认删除['+data.name+']运费模板?', function () {
                    carriageRuleDel(data.id);
                });
            }
            if (layEvent === 'carriageRuleUpdate') {
                febs.modal.open('运费模板编辑', 'modules/goods/carriageRuleUpdate/' + data.id, {
                    btn: ['提交', '取消'],
                    area:['100%','100%'],
                    yes: function (index, layero) {
                        $('#febs-carriage-rule-update').find('#submit').trigger('click');
                    },
                    btn2: function () {
                        layer.closeAll();
                    }
                });
            }
        });
        function carriageRuleDel(id) {
            febs.get(ctx + 'admin/goods/carriageRuleDel/' + id, null, function () {
                febs.alert.success('操作成功');
                $query.click();
            });
        }
        // 查询按钮
        $query.on('click', function () {
            var params = $.extend(getQueryParams(), {field: sortObject.field, order: sortObject.type});
            tableIns.reload({where: params, page: {curr: 1}});
        });
        // 刷新按钮
        $reset.on('click', function () {
            $searchForm[0].reset();
            sortObject.type = 'null';
            tableIns.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject});
        });
        $add.on('click', function () {
            febs.modal.open('运费模板新增', 'modules/goods/carriageRuleAdd/', {
                btn: ['提交', '取消'],
                area:['100%','100%'],
                yes: function (index, layero) {
                    $('#febs-carriage-rule-add').find('#submit').trigger('click');
                },
                btn2: function () {
                    layer.closeAll();
                }
            });
        });
        function initTable() {
            tableIns = febs.table.init({
                elem: $view.find('table'),
                id: 'carriageRuleTable',
                url: ctx + 'admin/goods/carriageRuleList',
                cols: [[
                    {field: 'name', title: '标题', minWidth: 100,align:'left'},
                    {field: 'createdTime', title: '创建时间', minWidth: 140,align:'left'},
                    {title: '操作',
                        templet: function (d) {
                                return ''
                                + '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="carriageRuleUpdate" shiro:hasPermission="user:update">编辑</button>'
                                    + '<button class="layui-btn layui-btn-normal layui-btn-xs febs-bg-red" lay-event="carriageRuleDel" shiro:hasPermission="user:update">删除</button>'
                        },minWidth: 160,align:'center'}
                ]]
            });
        }
        // 获取查询参数
        function getQueryParams() {
            return {
            };
        }
    })
</script>
src/main/resources/templates/febs/views/modules/goods/carriageRuleUpdate.html
New file
@@ -0,0 +1,327 @@
<div class="layui-fluid layui-anim febs-anim" id="febs-carriage-rule-update" lay-title="运费模板编辑">
    <div class="layui-row febs-container">
        <div class="layui-col-md12">
            <div class="layui-fluid" id="carriage-rule-update">
                <form class="layui-form" action="" lay-filter="carriage-rule-update-form">
                    <div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief">
                        <ul class="layui-tab-title">
                            <li class="layui-this">运费模板</li>
                        </ul>
                        <div class="layui-tab-content">
                            <div class="layui-tab-item layui-show">
                                <blockquote class="layui-elem-quote blue-border">基本信息</blockquote>
                                <input type="text" name="id"
                                       placeholder="" autoComplete="off" class="layui-input febs-hide">
                                <div class="layui-row layui-col-space10 layui-form-item">
                                    <div class="layui-col-lg6">
                                        <label class="layui-form-label febs-form-item-require">标题:</label>
                                        <div class="layui-input-block">
                                            <input type="text" name="ruleName" lay-verify="required" placeholder="" autocomplete="off" class="layui-input">
                                        </div>
                                    </div>
                                </div>
                                <div class="layui-form-item">
                                    <label class="layui-form-label febs-form-item-require">计价方式:</label>
                                    <div class="layui-input-block">
                                        <input type="radio" name="valuationType" value="1" title="按件算" checked />
                                        <input type="radio" name="valuationType" value="2" title="按重量算" />
                                    </div>
                                </div>
                                <blockquote class="layui-elem-quote blue-border">默认规则</blockquote>
                                <div class="layui-form-item">
                                    <label class="layui-form-label febs-form-item-require">默认运费:</label>
                                    <div class="layui-input-inline" style="width: 80px">
                                        <input type="text" name="basicCntDefault" lay-verify="required" autocomplete="off" class="layui-input" >
                                    </div>
                                    <div class="layui-form-mid">件内,</div>
                                    <div class="layui-input-inline" style="width: 80px">
                                        <input type="text" name="basicPriceDefault" lay-verify="required" autocomplete="off" class="layui-input" >
                                    </div>
                                    <div class="layui-form-mid">元,</div>
                                    <div class="layui-form-mid">每增加</div>
                                    <div class="layui-input-inline" style="width: 80px">
                                        <input type="text" name="moreCntDefault" lay-verify="required" autocomplete="off" class="layui-input" >
                                    </div>
                                    <div class="layui-form-mid">件,增加运费</div>
                                    <div class="layui-input-inline" style="width: 80px">
                                        <input type="text" name="morePriceDefault" lay-verify="required" autocomplete="off" class="layui-input" >
                                    </div>
                                    <div class="layui-form-mid">元。</div>
                                </div>
                                <div class="layui-form-item multi-rule-table">
                                    <div class="layui-row layui-col-space10 layui-form-item">
                                        <blockquote class="layui-elem-quote blue-border">为指定省份设置运费</blockquote>
                                        <div class="layui-col-lg6">
                                            <label class="layui-form-label febs-form-item-require">指定省份:</label>
                                            <div class="layui-input-block">
                                                <div id="province-set"></div>
                                            </div>
                                        </div>
                                        <div class="layui-col-lg6">
                                            <button type="button" class="layui-btn layui-btn-normal layui-btn" id="test3" >添加</button>
                                        </div>
                                    </div>
                                    <div class="layui-form-item">
                                        <div class="layui-input-block">
                                            <table id="multiRule" lay-filter="multiRule"></table>
                                        </div>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                    <div class="layui-form-item febs-hide">
                        <button class="layui-btn" lay-submit="" lay-filter="carriage-rule-update-form-submit" id="submit">保存</button>
                    </div>
                </form>
            </div>
        </div>
    </div>
</div>
<style>
    .blue-border {
        border-left-color: #2db7f5;
        font-size: 18px;
    }
</style>
<script type="text/html" id="toolbar">
    <div class="layui-btn-container">
        <button class="layui-btn layui-btn-danger layui-btn-sm" type="button" lay-event="delSku">删除</button>
    </div>
</script>
<!-- 表格操作栏 end -->
<script data-th-inline="javascript">
    layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree','dropdown', 'laydate', 'layedit', 'upload', 'element', 'table', 'xmSelect'], function () {
        var $ = layui.jquery,
            febs = layui.febs,
            layer = layui.layer,
            table = layui.table,
            formSelects = layui.formSelects,
            treeSelect = layui.treeSelect,
            form = layui.form,
            laydate = layui.laydate,
            eleTree = layui.eleTree,
            $view = $('#carriage-rule-update'),
            layedit = layui.layedit,
            carriageRule = [[${carriageRule}]],
            upload = layui.upload,
            validate = layui.validate,
            element = layui.element;
        form.render();
        formSelects.render();
        var provinceSet = xmSelect.render({
            el: '#province-set',
            toolbar: {
                show: true,
                list: [ 'ALL', 'CLEAR', 'REVERSE' ]
            },
            filterable: true,
            data: [
                {name: '北京市',value: 1,selected:false},
                {name: '天津市',value: 2,selected:false},
                {name: '河北省',value: 3,selected:false},
                {name: '山西省',value: 4,selected:false},
                {name: '辽宁省',value: 5,selected:false},
                {name: '吉林省',value: 6,selected:false},
                {name: '黑龙江省',value: 7,selected:false},
                {name: '上海市',value: 8,selected:false},
                {name: '江苏省',value: 9,selected:false},
                {name: '浙江省',value: 10,selected:false},
                {name: '安徽省',value: 11,selected:false},
                {name: '福建省',value: 12,selected:false},
                {name: '江西省',value: 13,selected:false},
                {name: '山东省',value: 14,selected:false},
                {name: '河南省',value: 15,selected:false},
                {name: '湖北省',value: 16,selected:false},
                {name: '湖南省',value: 17,selected:false},
                {name: '广东省',value: 18,selected:false},
                {name: '广西壮族自治区',value: 19,selected:false},
                {name: '海南省',value: 20,selected:false},
                {name: '重庆市',value: 21,selected:false},
                {name: '四川省',value: 22,selected:false},
                {name: '贵州省',value: 23,selected:false},
                {name: '云南省',value: 24,selected:false},
                {name: '西藏自治区',value: 25,selected:false},
                {name: '陕西省',value: 26,selected:false},
                {name: '甘肃省',value: 27,selected:false},
                {name: '青海省',value: 28,selected:false},
                {name: '宁夏回族自治区',value: 29,selected:false},
                {name: '内蒙古自治区',value: 30,selected:false},
                {name: '新疆维吾尔自治区',value: 31,selected:false},
                {name: '台湾省',value: 32,selected:false},
                {name: '香港特别行政区',value: 33,selected:false},
                {name: '澳门特别行政区',value: 34,selected:false},
            ],
        })
        $('#test3').on('click', function (){
            let provinceChoice = provinceSet.getValue('name');
            if(provinceChoice == null || provinceChoice == ""){
                febs.alert.warn('指定省份不能为空');
                return false;
            }
            let provinceChoiceStr = "";
            console.log(provinceChoice);
            for (let i = 0; i < provinceChoice.length; i++) {
                provinceChoiceStr = provinceChoiceStr + provinceChoice[i]+",";
            }
            console.log(provinceChoiceStr);
            let data = {};
            data.areaAddress = provinceChoiceStr;
            data.basicCnt = 1;
            data.basicPrice = 1;
            data.moreCnt = 1;
            data.morePrice = 1;
            addTableDate(data);
        });
        let ruleData=[];
        let tableIns = table.render({
            elem: '#multiRule'
            ,limit:999
            ,toolbar:"#toolbar"
            ,defaultToolbar:[]
            ,cols: [
                [
                ,{align: 'center', title: '请选择', colspan: 2}
                ,{field:'areaAddress', title:'指定省份', width:400, rowspan: 2,align: 'center'}
                ,{align: 'center', title: '规则( 2 件内,2 元,每 1 增加件,增加运费 1 元。)', colspan: 4}
                ],
                [ //表头
                {type: 'checkbox', rowspan: 2,align: 'center' }
                ,{field: 'index', title: '序号', width:100, rowspan: 2,align: 'center'}
                ,{field: 'basicCnt', title: '件内', width:200,edit:'text'}
                ,{field: 'basicPrice', title: '运费', width:200,edit:'text'}
                ,{field: 'moreCnt', title: '每增加', width:200,edit:'text'}
                ,{field: 'morePrice', title: '增加运费', width:200,edit:'text'}
            ]]
            ,data: []
        });
        initValue();
        function initValue() {
            form.val("carriage-rule-update-form", {
                "id": carriageRule.id,
                "ruleName": carriageRule.ruleName,
                "valuationType": carriageRule.valuationType,
                "basicCntDefault": carriageRule.basicCntDefault,
                "basicPriceDefault": carriageRule.basicPriceDefault,
                "moreCntDefault": carriageRule.moreCntDefault,
                "morePriceDefault": carriageRule.morePriceDefault
            });
            let carriageRuleInfos = carriageRule.adminCarriageRuleInfoVos;
            if(Array.isArray(carriageRuleInfos) && carriageRuleInfos.length){
                for (let i = 0; i < carriageRuleInfos.length; i++) {
                    carriageRuleInfos[i].index = i+1;
                }
            }
            if (carriageRuleInfos) {
                ruleData = carriageRuleInfos;
                reloadTable(carriageRuleInfos);
            }
        }
        let delCarriageRuleInfo = [];
        table.on('toolbar(multiRule)', function(obj){
            var data = obj.data;
            var hasData = table.cache['multiRule'];
            var checkData = table.checkStatus('multiRule').data;
            if (checkData.length <= 0) {
                febs.alert.warn('请选择删除数据');
                return;
            }
            if(obj.event === 'delSku'){
                for (let i = 0; i < checkData.length; i++) {
                    var delData = checkData[i];
                    for (let j = 0; j < hasData.length; j++) {
                        if (hasData[j].index == delData.index) {
                            if (delData.id) {
                                delCarriageRuleInfo.push(delData.id);
                            }
                            hasData.splice(j, 1);
                            break;
                        }
                    }
                }
                for (let i = 0; i < hasData.length; i++) {
                    hasData[i].index = i + 1;
                }
                ruleData=hasData;
                reloadTable(hasData);
            }
        });
        function addTableDate(data) {
            var hasData = table.cache['multiRule'];
            data.index = hasData.length + 1;
            ruleData.push(data);
            reloadTable(ruleData);
            return data.index;
        }
        function reloadTable(data) {
            table.reload('multiRule', {
                data : data
            });
        }
        table.on('edit(multiRule)', function(obj){
            var value = obj.value //得到修改后的值
                ,data = obj.data //得到所在行所有键值
                ,field = obj.field; //得到字段
            for (let i = 0; i < ruleData.length; i++) {
                if (ruleData[i].index == data.index) {
                    ruleData[i] = data;
                }
            }
        });
        form.on('submit(carriage-rule-update-form-submit)', function (data) {
            data.field.delCarriageRuleInfoIds=delCarriageRuleInfo;
            data.field.adminCarriageRuleAddInfoDtos = ruleData;
            $.ajax({
                'url':ctx + 'admin/goods/carriageRuleUpdate',
                'type':'post',
                'dataType':'json',
                'headers' : {'Content-Type' : 'application/json;charset=utf-8'}, //接口json格式
                'traditional': true,//ajax传递数组必须添加属性
                'data':JSON.stringify(data.field),
                'success':function (data) {
                    if(data.code==200){
                        layer.closeAll();
                        febs.alert.success(data.message);
                        $('#febs-carriage-rule').find('#reset').click();
                    }else{
                        febs.alert.warn(data.message);
                    }
                },
                'error':function () {
                    febs.alert.warn('服务器繁忙');
                }
            })
            return false;
        });
    });
</script>
src/main/resources/templates/febs/views/modules/mallMember/mallAgentRecord.html
@@ -33,19 +33,6 @@
                                            </select>
                                        </div>
                                    </div>
<!--                                    <div class="layui-inline">-->
<!--                                        <label class="layui-form-label layui-form-label-sm">会员类型</label>-->
<!--                                        <div class="layui-input-inline">-->
<!--                                            <select name="level">-->
<!--                                                <option value="">请选择</option>-->
<!--                                                <option value="FIRST_LEVEL">普通会员</option>-->
<!--                                                <option value="SECOND_LEVEL">一星</option>-->
<!--                                                <option value="THIRD_LEVEL">二星</option>-->
<!--                                                <option value="FOUR_LEVEL">三星</option>-->
<!--                                                <option value="FIFTH_LEVEL">四星</option>-->
<!--                                            </select>-->
<!--                                        </div>-->
<!--                                    </div>-->
                                </div>
                            </div>
                            <div class="layui-col-md2 layui-col-sm12 layui-col-xs12 table-action-area">
@@ -145,15 +132,9 @@
                url: ctx + 'admin/mallMember/getAgentApplyList',
                defaultToolbar:[],
                cols: [[
                    {field: 'memberName', title: '微信昵称', minWidth: 150,align:'left'},
                    {field: 'name', title: '姓名', minWidth: 100,align:'left'},
                    {field: 'phone', title: '电话', minWidth: 100,align:'left'},
                    {field: 'province', title: '省', minWidth: 100,align:'left'},
                    {field: 'city', title: '市', minWidth: 100,align:'left'},
                    {field: 'area', title: '区、县', minWidth: 100,align:'left'},
                    {field: 'storeAddress', title: '详细地址', minWidth: 100,align:'left'},
                    {field: 'storeName', title: '店铺名称', minWidth: 100,align:'left'},
                    {field: 'state', title: '申请状态',
                    {field:'memberName', title:'微信昵称', width:100, rowspan: 3,align: 'center'}
                    ,{align: 'center', title: '基本信息', colspan: 7}
                    ,{field: 'state', title: '申请状态',
                        templet: function (d) {
                            if (d.state === 1) {
                                return '<span style="color:green;">申请中</span>'
@@ -164,8 +145,30 @@
                            }else{
                                return ''
                            }
                        }, minWidth: 100,align:'center'},
                    {field: 'createdTime', title: '申请时间', minWidth: 180,align:'center'},
                        }, minWidth: 100,rowspan: 3,align:'center'},
                    ,{field:'createdTime', title:'申请时间', width:100,rowspan: 3,align: 'center'}
                    ],[
                    // {field: 'memberName', title: '微信昵称', minWidth: 150,align:'left'},
                    {field: 'name', title: '姓名', minWidth: 100,align:'left'},
                    {field: 'phone', title: '电话', minWidth: 100,align:'left'},
                    {field: 'province', title: '省', minWidth: 100,align:'left'},
                    {field: 'city', title: '市', minWidth: 100,align:'left'},
                    {field: 'area', title: '区、县', minWidth: 100,align:'left'},
                    {field: 'storeAddress', title: '详细地址', minWidth: 100,align:'left'},
                    {field: 'storeName', title: '店铺名称', minWidth: 100,align:'left'},
                    // {field: 'state', title: '申请状态',
                    //     templet: function (d) {
                    //         if (d.state === 1) {
                    //             return '<span style="color:green;">申请中</span>'
                    //         }else if (d.state === 2) {
                    //             return '<span style="color:blue;">通过</span>'
                    //         }else if (d.state === 3) {
                    //             return '<span style="color:red;">拒绝</span>'
                    //         }else{
                    //             return ''
                    //         }
                    //     }, minWidth: 100,align:'center'},
                    // {field: 'createdTime', title: '申请时间', minWidth: 180,align:'center'},
                    {title: '操作',
                        templet: function (d) {
                            if(d.state === 1 ){