354 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			HTML
		
	
	
		
		
			
		
	
	
			354 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			HTML
		
	
	
|  | {layout name="layout2" /} | |||
|  | <link rel="stylesheet" href="/static/lib/dtree/dtree.css" media="all"> | |||
|  | <link rel="stylesheet" href="/static/lib/dtree/font/dtreefont.css" media="all"> | |||
|  | 
 | |||
|  |     <div class="layui-row " style="margin-top: 10px;background: #f2f2f2"> | |||
|  |         <div class="layui-col-md5"> | |||
|  |             <div class="layui-card"> | |||
|  |                 <div class="layui-card-header">选择地区</div> | |||
|  |                 <div class="layui-card-body"> | |||
|  |                     <div style="height: 280px;overflow: auto;"> | |||
|  |                         <ul id="cskTree1" class="dtree" data-id="0"></ul> | |||
|  |                     </div> | |||
|  |                 </div> | |||
|  |             </div> | |||
|  |         </div> | |||
|  |         <div class="layui-col-md2"> | |||
|  |             <div style="height: 280px;text-align: center"> | |||
|  |                 <button class="layui-btn layui-btn-sm layui-btn-normal" style="margin-top: 180px;" id="csk_btn">选择</button> | |||
|  |             </div> | |||
|  |         </div> | |||
|  |         <div class="layui-col-md5"> | |||
|  |             <div class="layui-card"> | |||
|  |                 <div class="layui-card-header">已选地区</div> | |||
|  |                 <div class="layui-card-body"> | |||
|  |                     <div style="height: 280px;overflow: auto;"> | |||
|  |                         <ul id="cskTree2" class="dtree" data-id="-1"></ul> | |||
|  |                     </div> | |||
|  |                 </div> | |||
|  |             </div> | |||
|  |         </div> | |||
|  |     </div> | |||
|  | 
 | |||
|  | <div class="layui-form-item layui-hide"> | |||
|  |     <input type="button" lay-submit lay-filter="area-freight-submit" id="area-freight-submit" value="确认"> | |||
|  | </div> | |||
|  | 
 | |||
|  | <script type="text/javascript" src="/static/lib/dtree/areaData.js"></script> | |||
|  | <script type="text/javascript" src="/static/lib/dtree/dtree.js"></script> | |||
|  | <script src="/static/common/js/area.js"></script> | |||
|  | <script src="/static/common/js/array.js"></script> | |||
|  | <script> | |||
|  |     var selectedIds = '';//编辑的id | |||
|  |     var regionIds = [];//格式化后的需要编辑的id | |||
|  |     function editSelected(data) { | |||
|  |         selectedIds = data; | |||
|  |         regionIds = selectedIds.split(","); | |||
|  |     } | |||
|  | 
 | |||
|  |     var data = array_column(areas,'id'); | |||
|  | 
 | |||
|  |     layui.config({ | |||
|  |         version:"{$front_version}", | |||
|  |         base: '/static/lib/' | |||
|  |     }).extend({ | |||
|  |         likeedit: 'likeedit/likeedit', | |||
|  |         dtree:'dtree/dtree' | |||
|  |     }).use(['table', 'form', 'element', 'likeedit','dtree'], function() { | |||
|  |         var form = layui.form | |||
|  |             ,$ = layui.$ | |||
|  |             ,table = layui.table | |||
|  |             , element = layui.element | |||
|  |             ,dtree = layui.dtree | |||
|  |             , likeedit = layui.likeedit; | |||
|  | 
 | |||
|  |         var source = areaDatas;//树状结构的完整数据(用于渲染树形结构插件) | |||
|  |         //组装选中地区id几其相关地区id | |||
|  |         selectedIds += ',' + getAboutIds(regionIds); | |||
|  | 
 | |||
|  |         //渲染数据框1的地区选中 | |||
|  |         dtree.render({ | |||
|  |             elem: "#cskTree1", | |||
|  |             data:areaDatas, | |||
|  |             checkbar:true, | |||
|  |             initLevel: 1, | |||
|  |             skin: "laySimple", | |||
|  |             checkbarType:"all", | |||
|  |             load:true, | |||
|  |             done: function(res, $ul, first){ | |||
|  |                 dtree.chooseDataInit("cskTree1",selectedIds); // 初始化选中 | |||
|  | 
 | |||
|  |                 //把需要编辑的选中的数据在数据框2中选中 | |||
|  |                 var editParam = dtree.getCheckbarNodesParam("cskTree1");  // 获取选中数据 | |||
|  |                 checkedData = editParam; | |||
|  |                 delData = []; | |||
|  |                 dtree.reload("cskTree2",{data:editParam}); | |||
|  |             } | |||
|  |         }); | |||
|  | 
 | |||
|  |         var checkedData = [];//选中的数据; | |||
|  |         var delData = [];//删除的数据 | |||
|  |         //渲染地区数据框2的数据 | |||
|  |         var dtreeDiv = dtree.render({ | |||
|  |             elem: "#cskTree2", | |||
|  |             data: [], | |||
|  |             checkbar:true, | |||
|  |             response:{treeId:"nodeId",title:"context"}, | |||
|  |             dataFormat:"list", | |||
|  |             skin: "laySimple", | |||
|  |             none: "暂无", | |||
|  |             toolbar:true, | |||
|  |             toolbarShow:["delete"], | |||
|  |             toolbarWay:"fixed", // "contextmenu":右键菜单(默认),"fixed":"固定在节点后","follow":"跟随节点动态呈现" | |||
|  |             toolbarStyle: {title: "选中"}, | |||
|  |             toolbarFun: { | |||
|  |                 delTreeNode: function(treeNode, $div){ | |||
|  |                     delData.push(treeNode); | |||
|  |                     dtreeDiv.changeTreeNodeDel(true); // 删除成功 | |||
|  |                 } | |||
|  |             }, | |||
|  |         }); | |||
|  | 
 | |||
|  |         //框1中选择的数据 在框2中显示 | |||
|  |         $("#csk_btn").click(function(){ | |||
|  |             var param = dtree.getCheckbarNodesParam("cskTree1");  // 获取选中数据 | |||
|  |             if(param.length == 0) { | |||
|  |                 layer.msg("请至少选择一个"); | |||
|  |             } | |||
|  |             checkedData = param; | |||
|  |             delData = []; | |||
|  |             dtree.reload("cskTree2",{data:param}); | |||
|  |         }); | |||
|  | 
 | |||
|  |         //点击确认时,把编辑过的框2的数据返回到地区编辑页 | |||
|  |         $("#area-freight-submit").click(function(){ | |||
|  |             dtreeDiv.setDisabledAllNodes('cskTree2'); | |||
|  |             var data = dtreeDiv.getAllDisabledNodesParam('cskTree2'); | |||
|  |             var needDel = [];//需要删除的数据 | |||
|  |             //1,遍历删除的地区id;1级不处理,2级,3级处理 | |||
|  |             for (var x = 0; x < delData.length; x++){ | |||
|  | 
 | |||
|  |                 if (delData[x]['level'] == 2){ | |||
|  |                     var sameLevel = []; | |||
|  |                     var partner = 0; | |||
|  |                     //删除上一级,同2级中,数量只有一个时,不删除上级 | |||
|  |                     for (var i = 0; i < data.length; i++){ | |||
|  |                         if (data[i]['level'] == 2){ | |||
|  |                             sameLevel.push(data[i]); | |||
|  |                         } | |||
|  |                         if (data[i]['nodeId'] == delData[x]['parentId']){ | |||
|  |                             partner = i; | |||
|  |                         } | |||
|  |                     } | |||
|  | 
 | |||
|  |                     if (sameLevel.length > 1){ | |||
|  |                         needDel.push(data[partner]['nodeId']); | |||
|  |                     } | |||
|  |                 } | |||
|  | 
 | |||
|  |                 if (delData[x]['level'] == 3){ | |||
|  |                     for (var a = 0;a < data.length; a++){ | |||
|  |                         if (data[a]['nodeId'] == delData[x]['parentId']){ | |||
|  |                             for (var b = 0;b < data.length; b++){ | |||
|  |                                 if (data[b]['nodeId'] == data[a]['parentId']){ | |||
|  |                                     needDel.push(data[b]['nodeId']); | |||
|  |                                 } | |||
|  |                             } | |||
|  |                             needDel.push(data[a]['nodeId']); | |||
|  |                         } | |||
|  |                     } | |||
|  |                 } | |||
|  |             } | |||
|  | 
 | |||
|  | 
 | |||
|  |             for (var f =0; f < delData.length;){ | |||
|  |                 if (delData[f]['level'] == 1){ | |||
|  |                     delData.splice(f,1); | |||
|  |                 } else { | |||
|  |                     f++; | |||
|  |                 } | |||
|  |             } | |||
|  | 
 | |||
|  | 
 | |||
|  |             var result = []; | |||
|  |             for (var d = 0; d < data.length; d++){ | |||
|  |                 if(needDel.indexOf(data[d]['nodeId']) == -1) { | |||
|  |                     result.push(data[d]); | |||
|  |                 } | |||
|  |             } | |||
|  | 
 | |||
|  |             var lastData = []; | |||
|  |             var firstDataIds = []; | |||
|  |             var secondDataIds = []; | |||
|  | 
 | |||
|  |             for (var e = 0; e < result.length; e++){ | |||
|  |                 if (result[e]['level'] == 1){ | |||
|  |                     var sourceFirst = getFirstChildBySource(source,result[e]['nodeId']);//完整数据中一级的子级(二,三级) | |||
|  |                     var resultFirst = getChild(result,result[e]['nodeId']);//选中的数据中一级的子级数量 | |||
|  | 
 | |||
|  |                     if (sourceFirst.length == resultFirst.length){ | |||
|  |                         lastData.push(result[e]); | |||
|  |                         firstDataIds.push(result[e]['nodeId']); | |||
|  |                     } | |||
|  |                 } | |||
|  |             } | |||
|  | 
 | |||
|  |             //检查非全选时,二级是否全选 | |||
|  |             for (var m =0; m < result.length; m++){ | |||
|  | 
 | |||
|  |                 if((result[m]['level'] == 2) && (firstDataIds.indexOf(result[m]['parentId']) == -1)){ | |||
|  | 
 | |||
|  |                     var sourceSecond = getSecondChildBySource(source,result[m]['nodeId']); | |||
|  |                     var resultSecond = getFirstChild(result,result[m]['nodeId']); | |||
|  | 
 | |||
|  |                     if (sourceSecond.length == resultSecond.length){ | |||
|  |                         lastData.push(result[m]); | |||
|  |                         secondDataIds.push(result[m]['nodeId']); | |||
|  |                     } | |||
|  |                 } | |||
|  |             } | |||
|  | 
 | |||
|  | 
 | |||
|  |             //检查非全选时,三级是否全选 | |||
|  |             for (var n =0; n < result.length; n++){ | |||
|  | 
 | |||
|  |                 if((result[n]['level'] == 3) && (secondDataIds.indexOf(result[n]['parentId']) == -1)){ | |||
|  |                     //三级的上级(二级id)的上级是否在firstData中 | |||
|  |                     var thirdLeader = getSecondLeader(source,result[n]['nodeId']); | |||
|  | 
 | |||
|  |                     if (firstDataIds.indexOf(thirdLeader) == -1){ | |||
|  |                         lastData.push(result[n]); | |||
|  |                     } | |||
|  |                 } | |||
|  |             } | |||
|  | 
 | |||
|  |             parent.window.callTree && parent.window.callTree(lastData); | |||
|  | 
 | |||
|  |         }); | |||
|  | 
 | |||
|  | 
 | |||
|  |         //获取3级的上级 | |||
|  |         function getSecondLeader(data,id) { | |||
|  |             for (var i = 0; i < data.length; i++) { | |||
|  |                 var firstChildren = data[i]['children']; | |||
|  |                 for (var x =0; x < firstChildren.length; x++){ | |||
|  |                     var  secondChildren = firstChildren[x]['children']; | |||
|  |                     for (var y = 0; y < secondChildren.length; y++){ | |||
|  |                         if (secondChildren[y]['id'] == id){ | |||
|  |                             return data[i]['id']; | |||
|  |                         } | |||
|  |                     } | |||
|  |                 } | |||
|  |             } | |||
|  |             return 0; | |||
|  |         } | |||
|  | 
 | |||
|  |         //获取一级下的子级(二级,三级) | |||
|  |         function getFirstChildBySource(data,pid) { | |||
|  |             var child = []; | |||
|  |             for (var i = 0; i < data.length; i++){ | |||
|  |                 if (data[i]['id'] == pid){ | |||
|  |                     var firstChildren = data[i]['children']; | |||
|  |                     for (var x =0; x < firstChildren.length; x++){ | |||
|  |                         child.push(firstChildren[x]); | |||
|  |                         var  secondChildren = firstChildren[x]['children']; | |||
|  |                         for (var y = 0; y < secondChildren.length; y++){ | |||
|  |                             child.push(secondChildren[y]); | |||
|  |                         } | |||
|  |                     } | |||
|  |                 } | |||
|  |             } | |||
|  |             return child; | |||
|  |         } | |||
|  | 
 | |||
|  |         //获取二级下的子级(三级) | |||
|  |         function getSecondChildBySource(data,pid) { | |||
|  |             var child = []; | |||
|  |             for (var i = 0; i < data.length; i++){ | |||
|  |                 var firstChildren = data[i]['children']; | |||
|  |                 for (var x =0; x < firstChildren.length; x++){ | |||
|  |                     if(firstChildren[x]['id'] == pid){ | |||
|  |                         var  secondChildren = firstChildren[x]['children']; | |||
|  |                         for (var y = 0; y < secondChildren.length; y++){ | |||
|  |                             child.push(secondChildren[y]); | |||
|  |                         } | |||
|  |                     } | |||
|  |                 } | |||
|  |             } | |||
|  |             return child; | |||
|  |         } | |||
|  | 
 | |||
|  |         //获取下级 | |||
|  |         function getChild(data,pid) { | |||
|  |             var child = []; | |||
|  |             for (var i = 0; i < data.length; i++){ | |||
|  |                 if (data[i]['parentId'] == pid){ | |||
|  |                     child.push(data[i]); | |||
|  |                     for (var a = 0; a < data.length; a++){ | |||
|  |                         if (data[a]['parentId'] == data[i]['nodeId']){ | |||
|  |                             child.push(data[a]); | |||
|  |                         } | |||
|  |                     } | |||
|  |                 } | |||
|  |             } | |||
|  |             return child; | |||
|  |         } | |||
|  | 
 | |||
|  |         //第一个下级 | |||
|  |         function getFirstChild(data,pid) { | |||
|  |             var firstChild = []; | |||
|  |             for (var i = 0; i < data.length; i++){ | |||
|  |                 if (data[i]['parentId'] == pid){ | |||
|  |                     firstChild.push(data[i]); | |||
|  |                 } | |||
|  |             } | |||
|  |             return firstChild; | |||
|  |         } | |||
|  | 
 | |||
|  | 
 | |||
|  |         //获取父类id | |||
|  |         function getParentIds(ids) { | |||
|  |             var call_ids=[]; | |||
|  |             for(var i in ids){ | |||
|  |                 if(data[ids[i]]['parent_id']!=0){ | |||
|  |                     ids.push(data[ids[i]]['parent_id']); | |||
|  |                     call_ids.push(data[ids[i]]['parent_id']); | |||
|  |                 } | |||
|  |             } | |||
|  |             if(call_ids.length!=0){ | |||
|  |                 ids=ids.concat(getParentIds(call_ids)); | |||
|  |             } | |||
|  |             return ids; | |||
|  |         } | |||
|  | 
 | |||
|  | 
 | |||
|  |         //获取子类id | |||
|  |         function getChildrenIds(ids){ | |||
|  |             var call_ids=[]; | |||
|  |             for(var i in ids){ | |||
|  |                 if(data[ids[i]]['level']==3){ | |||
|  |                     continue; | |||
|  |                 } | |||
|  |                 for(var j in data){ | |||
|  |                     if(ids[i] == data[j]['parent_id']){ | |||
|  |                         ids.push(data[j]['id']); | |||
|  |                         call_ids.push(data[j]['id']); | |||
|  |                     } | |||
|  |                 } | |||
|  |             } | |||
|  |             if(call_ids.length!=0){ | |||
|  |                 ids=ids.concat(getChildrenIds(call_ids)); | |||
|  |             } | |||
|  |             return ids; | |||
|  |         } | |||
|  | 
 | |||
|  |         //获取有关的地区id | |||
|  |         function getAboutIds(ids){ | |||
|  |             result = getChildrenIds(ids); | |||
|  |             result = result.concat(getParentIds(ids)); | |||
|  |             return array_unique(result); | |||
|  |         } | |||
|  | 
 | |||
|  |     }); | |||
|  | 
 | |||
|  | </script> |