feat(mall): 新增运费模板功能
- 添加运费模板新增和编辑页面
- 实现运费模板数据加载和保存
- 新增世界地址列表接口和相关实体
- 更新BsApi类中的请求URL和参数
- 优化RedisKeyExpirationListener类
 
	
	
	
	
	
	
		
		8 files modified
	
		
		4 files added
	
	
 
	
	
	
	
	
	
	
	
 |  |  | 
 |  |  | 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) { | 
 
 |  |  | 
 |  |  | 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; | 
 |  |  | 
 |  |  |         return new FebsResponse().success().data(mallGoodsCategoryService.findAllCategoryList()); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @GetMapping(value = "/addressMYXL") | 
 |  |  |     public FebsResponse addressMYXL() { | 
 |  |  |         return new FebsResponse().success().data(mallGoodsCategoryService.findAllAddressList()); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 商品分类-选择 | 
 |  |  |      */ | 
 
| New file | 
 |  |  | 
 |  |  | 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; | 
 |  |  | } | 
 
| New file | 
 |  |  | 
 |  |  | 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> { | 
 |  |  | } | 
 
 |  |  | 
 |  |  | 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; | 
 |  |  |  | 
 |  |  | 
 |  |  |     List<MallGoodsCategory> findChildCategoryListById(Long id); | 
 |  |  |  | 
 |  |  |     List<MallGoodsCategory> findRecommendCategory(); | 
 |  |  |  | 
 |  |  |     List<AdminWorldAddressVo> findAllAddressList(); | 
 |  |  | } | 
 
 |  |  | 
 |  |  | 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; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  | 
 |  |  | @RequiredArgsConstructor | 
 |  |  | public class ApiMallGoodsCategoryServiceImpl extends ServiceImpl<MallGoodsCategoryMapper, MallGoodsCategory> implements IApiMallGoodsCategoryService { | 
 |  |  |  | 
 |  |  |     private final MallAddressWorldMapper mallAddressWorldMapper; | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public List<MallGoodsCategoryVo> findAllCategoryList() { | 
 |  |  | 
 |  |  |     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; | 
 |  |  |     } | 
 |  |  | } | 
 
 |  |  | 
 |  |  |          *               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"; | 
 
| New file | 
 |  |  | 
 |  |  | 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; | 
 |  |  |  | 
 |  |  | } | 
 
 |  |  | 
 |  |  | 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; | 
 |  |  | 
 |  |  | 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); | 
 |  |  | 
 |  |  |         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))) ); | 
 |  |  |  | 
 |  |  |     } | 
 |  |  | } | 
 
| New file | 
 |  |  | 
 |  |  | <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> | 
 
 |  |  | 
 |  |  |                 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; | 
 
 |  |  | 
 |  |  |                 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 = ""; |