KKSU
2024-11-26 c245fd8c67c75ebec392d52b29af7d532282a737
feat(mall): 新增运费模板功能

- 添加运费模板新增和编辑页面
- 实现运费模板数据加载和保存
- 新增世界地址列表接口和相关实体
- 更新BsApi类中的请求URL和参数
- 优化RedisKeyExpirationListener类
4 files added
8 files modified
513 ■■■■ changed files
src/main/java/cc/mrbird/febs/common/listener/RedisKeyExpirationListener.java 10 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/AdminMallGoodsCategoryController.java 6 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/MallAddressWorld.java 25 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/mapper/MallAddressWorldMapper.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/IApiMallGoodsCategoryService.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallGoodsCategoryServiceImpl.java 27 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/CommonService.java 3 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/AdminWorldAddressVo.java 12 ●●●●● patch | view | raw | blame | history
src/main/java/com/best/javaSdk/BsApi.java 14 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/goods/carriageRuleAdd-bak.html 297 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/goods/carriageRuleAdd.html 55 ●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/goods/carriageRuleUpdate.html 54 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/listener/RedisKeyExpirationListener.java
@@ -1,26 +1,18 @@
package cc.mrbird.febs.common.listener;
import cc.mrbird.febs.common.enumerates.OrderStatusEnum;
import cc.mrbird.febs.common.utils.AppContants;
import cc.mrbird.febs.mall.entity.MallOrderInfo;
import cc.mrbird.febs.mall.mapper.MallOrderInfoMapper;
import cn.hutool.core.util.StrUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.stereotype.Component;
import java.util.List;
/**
 * @author wzy
 * @date 2021-04-16
 **/
@Slf4j
@Component
//@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {
    public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
src/main/java/cc/mrbird/febs/mall/controller/AdminMallGoodsCategoryController.java
@@ -9,7 +9,6 @@
import cc.mrbird.febs.mall.entity.MallStoreItem;
import cc.mrbird.febs.mall.service.IAdminMallGoodsCategoryService;
import cc.mrbird.febs.mall.service.IApiMallGoodsCategoryService;
import cc.mrbird.febs.mall.vo.AdminAddAddressTreeVo;
import cc.mrbird.febs.mall.vo.AdminMallGoodsCategoryTreeVo;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -134,6 +133,11 @@
        return new FebsResponse().success().data(mallGoodsCategoryService.findAllCategoryList());
    }
    @GetMapping(value = "/addressMYXL")
    public FebsResponse addressMYXL() {
        return new FebsResponse().success().data(mallGoodsCategoryService.findAllAddressList());
    }
    /**
     * 商品分类-选择
     */
src/main/java/cc/mrbird/febs/mall/entity/MallAddressWorld.java
New file
@@ -0,0 +1,25 @@
package cc.mrbird.febs.mall.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
@Data
@TableName("mall_address_world")
public class MallAddressWorld  implements Serializable {
    private static final long serialVersionUID = 1L;
    private Long id;
    private Long pid;
    private String path;
    private String level;
    private String name;
    private String nameEn;
    private String namePinyin;
    private String code;
    @TableField(exist = false)
    private List<MallAddressWorld> childrens;
}
src/main/java/cc/mrbird/febs/mall/mapper/MallAddressWorldMapper.java
New file
@@ -0,0 +1,7 @@
package cc.mrbird.febs.mall.mapper;
import cc.mrbird.febs.mall.entity.MallAddressWorld;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface MallAddressWorldMapper  extends BaseMapper<MallAddressWorld> {
}
src/main/java/cc/mrbird/febs/mall/service/IApiMallGoodsCategoryService.java
@@ -1,6 +1,7 @@
package cc.mrbird.febs.mall.service;
import cc.mrbird.febs.mall.entity.MallGoodsCategory;
import cc.mrbird.febs.mall.vo.AdminWorldAddressVo;
import cc.mrbird.febs.mall.vo.MallGoodsCategoryVo;
import com.baomidou.mybatisplus.extension.service.IService;
@@ -13,4 +14,6 @@
    List<MallGoodsCategory> findChildCategoryListById(Long id);
    List<MallGoodsCategory> findRecommendCategory();
    List<AdminWorldAddressVo> findAllAddressList();
}
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallGoodsCategoryServiceImpl.java
@@ -1,14 +1,20 @@
package cc.mrbird.febs.mall.service.impl;
import cc.mrbird.febs.mall.entity.MallAddressWorld;
import cc.mrbird.febs.mall.entity.MallGoodsCategory;
import cc.mrbird.febs.mall.mapper.MallAddressWorldMapper;
import cc.mrbird.febs.mall.mapper.MallGoodsCategoryMapper;
import cc.mrbird.febs.mall.service.IApiMallGoodsCategoryService;
import cc.mrbird.febs.mall.vo.AdminWorldAddressVo;
import cc.mrbird.febs.mall.vo.MallGoodsCategoryVo;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/**
@@ -20,6 +26,7 @@
@RequiredArgsConstructor
public class ApiMallGoodsCategoryServiceImpl extends ServiceImpl<MallGoodsCategoryMapper, MallGoodsCategory> implements IApiMallGoodsCategoryService {
    private final MallAddressWorldMapper mallAddressWorldMapper;
    @Override
    public List<MallGoodsCategoryVo> findAllCategoryList() {
@@ -35,4 +42,24 @@
    public List<MallGoodsCategory> findRecommendCategory() {
        return this.baseMapper.selectRecommendCategoryList();
    }
    @Override
    public List<AdminWorldAddressVo> findAllAddressList() {
        List<AdminWorldAddressVo> objects = new ArrayList<>();
        LambdaQueryWrapper<MallAddressWorld> addressWorldLambdaQueryWrapper = new LambdaQueryWrapper<>();
        addressWorldLambdaQueryWrapper.eq(MallAddressWorld::getPid, 131)
                .eq(MallAddressWorld::getLevel, 3)
                .orderByAsc(MallAddressWorld::getId);
        // 执行查询
        List<MallAddressWorld> mallAddressWorlds = mallAddressWorldMapper.selectList(addressWorldLambdaQueryWrapper);
        if(CollUtil.isNotEmpty(mallAddressWorlds)){
            mallAddressWorlds.forEach(item -> {
                AdminWorldAddressVo adminWorldAddressVo = new AdminWorldAddressVo();
                adminWorldAddressVo.setId(item.getId());
                adminWorldAddressVo.setName(item.getName()+"-"+item.getNameEn()+"-"+item.getNamePinyin());
                objects.add(adminWorldAddressVo);
            });
        }
        return objects;
    }
}
src/main/java/cc/mrbird/febs/mall/service/impl/CommonService.java
@@ -99,7 +99,8 @@
         *               partnerKey  :  ER5DFRT320D4ed6FAFs3G410Fs977
         *               Endpoint    :http://sgp-seaedi.800best.com/Malaysia/kdapi/api/proces
         */
        String url = "http://sgp-seaedi.800best.com/Malaysia/kdapi/api/proces";
//        String url = "http://sgp-seaedi.800best.com/Malaysia/kdapi/api/proces";
        String url = "http://open-sgp.800best.com/api-server/m9api/api/process";
        String partnerID = "MY_LEADING";
        String partnerKey = "ER5DFRT320D4ed6FAFs3G410Fs977";
        String format = "JSON";
src/main/java/cc/mrbird/febs/mall/vo/AdminWorldAddressVo.java
New file
@@ -0,0 +1,12 @@
package cc.mrbird.febs.mall.vo;
import io.swagger.annotations.ApiModel;
import lombok.Data;
@Data
@ApiModel(value = "AdminSelectListLeaderVo", description = "信息返回类")
public class AdminWorldAddressVo {
    private Long id;
    private String name;
}
src/main/java/com/best/javaSdk/BsApi.java
@@ -4,6 +4,7 @@
import com.best.javaSdk.kdTraceQuery.request.KdTraceQueryReq;
import com.best.javaSdk.kdTraceQuery.request.MailNos;
import com.best.javaSdk.kdTraceQuery.response.KdTraceQueryRsp;
import com.best.javaSdk.kdTraceQuery.response.TraceLogs;
import java.util.ArrayList;
import java.util.List;
@@ -11,9 +12,9 @@
public class BsApi {
    public static void main(String[] args) {
        String url = "http://open-sgp.800best.com/api-server/m9api/api/process";
        String partnerID = "71";
        String partnerKey = "G95DIM64";
        String url = "http://sea-edi-hxtest.800best.com/Malaysia/kdapi/api/process";
        String partnerID = "M_TEST";
        String partnerKey = "TEST12345";
        String format = "JSON";
        Client client = new Client(url, partnerID, partnerKey, format);
@@ -21,12 +22,15 @@
        KdTraceQueryReq tdTraceQueryReq = new KdTraceQueryReq();
        MailNos mailNos = new MailNos();
        List<String> mailNo = new ArrayList<>();
        mailNo.add("JT689574278404");
        mailNo.add("451238000");
        mailNos.setMailNo(mailNo);
        tdTraceQueryReq.setMailNos(mailNos);
        tdTraceQueryReq.setLangType("zh-CN");
//        tdTraceQueryReq.setLangType("en-US");
        KdTraceQueryRsp kdTraceQueryRsp = client.executed(tdTraceQueryReq);
        System.out.println(JSONUtil.parseObj(kdTraceQueryRsp));
        List<TraceLogs> traceLogs = kdTraceQueryRsp.getTraceLogs();
        traceLogs.forEach(item1 -> item1.getTraces().getTrace().forEach(trace -> System.out.println(JSONUtil.toJsonStr(trace))) );
    }
}
src/main/resources/templates/febs/views/modules/goods/carriageRuleAdd-bak.html
New file
@@ -0,0 +1,297 @@
<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},
            ],
        })
        let provinceChoiceExist = "";
        $('#test3').on('click', function (){
            let provinceChoice = provinceSet.getValue('name');
            if(provinceChoice == null || provinceChoice == ""){
                febs.alert.warn('指定省份不能为空');
                return false;
            }
            let provinceChoiceStr = "";
            for (let i = 0; i < provinceChoice.length; i++) {
                //判断字符串是否出现过  =-1则没有出现
                if(provinceChoiceExist.indexOf(provinceChoice[i]) != -1){
                    febs.alert.warn('['+provinceChoice[i]+'],指定省份不能重复');
                    return false;
                }
                provinceChoiceStr = provinceChoiceStr + provinceChoice[i]+",";
                provinceChoiceExist = provinceChoiceExist + 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/carriageRuleAdd.html
@@ -120,52 +120,23 @@
                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},
            ],
            data: [],
        })
        febs.get(ctx + 'admin/goodsCategory/addressMYXL', null, function(res) {
            provinceSet.update({
                // data : res.data,
                data : res.data.map(province => ({
                    name: province.name,
                    value: province.id,
                    selected: false
                })),
                autoRow: true,
            });
        })
        let provinceChoiceExist = "";
        $('#test3').on('click', function (){
            let provinceChoice = provinceSet.getValue('name');
            console.log(provinceChoice);
            if(provinceChoice == null || provinceChoice == ""){
                febs.alert.warn('指定省份不能为空');
                return false;
src/main/resources/templates/febs/views/modules/goods/carriageRuleUpdate.html
@@ -123,48 +123,18 @@
                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},
            ],
            data: [],
        })
        febs.get(ctx + 'admin/goodsCategory/addressMYXL', null, function(res) {
            provinceSet.update({
                // data : res.data,
                data : res.data.map(province => ({
                    name: province.name,
                    value: province.id,
                    selected: false
                })),
                autoRow: true,
            });
        })
        let provinceChoiceExist = "";