新建一个类 RecursiveRescreening.java。
参考如下类,即可重新拆分树形数据构造前台所需的新的树形数据。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.alibaba.fastjson.JSON;
public class RecursiveRescreening {
public static void main(String[] args) {
String jsonStr = "[{\"num\":\"1000\",\"name\":\"*******责任有限公司\",\"superiorDept\":\"-1\",\"leaderPerNums\":[],\"children\":[{\"num\":\"101\",\"name\":\"综合部\",\"superiorDept\":\"1000\",\"leaderPerNums\":[\"42\",\"6\"],\"children\":[{\"num\":\"3\",\"name\":\"周士大夫波\"},{\"num\":\"4\",\"name\":\"王玉11玲\"},{\"num\":\"5\",\"name\":\"于霞飞\"},{\"num\":\"6\",\"name\":\"康芳芳\"},{\"num\":\"7\",\"name\":\"冯亚11鑫\"},{\"num\":\"8\",\"name\":\"侯素蓉\"},{\"num\":\"9\",\"name\":\"关玲玲\"},{\"num\":\"10\",\"name\":\"高磊\"},{\"num\":\"11\",\"name\":\"董晓虹\"},{\"num\":\"42\",\"name\":\"左素平\"},{\"num\":\"64\",\"name\":\"杨雨欣\"},{\"num\":\"65\",\"name\":\"尚秀1忠\"},{\"num\":\"66\",\"name\":\"赵鹏伟\"}]},{\"num\":\"102\",\"name\":\"工程部\",\"superiorDept\":\"1000\",\"leaderPerNums\":[\"2\"],\"children\":[{\"num\":\"12\",\"name\":\"李鹏1翔\"},{\"num\":\"13\",\"name\":\"张学东\"},{\"num\":\"14\",\"name\":\"邱继1国\"},{\"num\":\"15\",\"name\":\"胡肥东\"},{\"num\":\"16\",\"name\":\"张利锋\"},{\"num\":\"17\",\"name\":\"冯超博\"},{\"num\":\"18\",\"name\":\"刘勇\"},{\"num\":\"51\",\"name\":\"高1福强\"},{\"num\":\"58\",\"name\":\"韩程\"},{\"num\":\"59\",\"name\":\"刘凯峰\"},{\"num\":\"73\",\"name\":\"武康\"},{\"num\":\"74\",\"name\":\"马窦\"}]},{\"num\":\"103\",\"name\":\"研发一部\",\"superiorDept\":\"1000\",\"leaderPerNums\":[\"20\"],\"children\":[{\"num\":\"20\",\"name\":\"柳江峰\"},{\"num\":\"21\",\"name\":\"马晶\"},{\"num\":\"22\",\"name\":\"李慧仙\"},{\"num\":\"23\",\"name\":\"崔耀强\"},{\"num\":\"24\",\"name\":\"陈星星\"},{\"num\":\"25\",\"name\":\"吕晓辉\"},{\"num\":\"26\",\"name\":\"郭文军\"},{\"num\":\"27\",\"name\":\"代靖\"},{\"num\":\"28\",\"name\":\"李跃跃\"},{\"num\":\"29\",\"name\":\"张力丰\"},{\"num\":\"49\",\"name\":\"李磊\"},{\"num\":\"52\",\"name\":\"胡懿\"},{\"num\":\"53\",\"name\":\"胡晓超\"},{\"num\":\"55\",\"name\":\"靳云南\"},{\"num\":\"56\",\"name\":\"张家玮\"},{\"num\":\"57\",\"name\":\"王文杰\"},{\"num\":\"60\",\"name\":\"刘利娜\"},{\"num\":\"61\",\"name\":\"张尧\"},{\"num\":\"62\",\"name\":\"董刚刚\"},{\"num\":\"63\",\"name\":\"李少华\"},{\"num\":\"69\",\"name\":\"杨瑞\"},{\"num\":\"70\",\"name\":\"张宇\"},{\"num\":\"72\",\"name\":\"王宇璐\"},{\"num\":\"76\",\"name\":\"杨世杰\"},{\"num\":\"77\",\"name\":\"武志亮\"}]},{\"num\":\"104\",\"name\":\"研发二部\",\"superiorDept\":\"1000\",\"leaderPerNums\":[\"30\"],\"children\":[{\"num\":\"30\",\"name\":\"方利红\"},{\"num\":\"31\",\"name\":\"李跃峰\"},{\"num\":\"32\",\"name\":\"赵海青\"},{\"num\":\"33\",\"name\":\"周权\"},{\"num\":\"34\",\"name\":\"魏志强\"},{\"num\":\"35\",\"name\":\"任燕卿\"},{\"num\":\"36\",\"name\":\"郝鹏勇\"},{\"num\":\"37\",\"name\":\"李国君\"},{\"num\":\"38\",\"name\":\"郭伟\"},{\"num\":\"39\",\"name\":\"何延峰\"},{\"num\":\"40\",\"name\":\"吴文凯\"},{\"num\":\"41\",\"name\":\"高婧\"},{\"num\":\"67\",\"name\":\"卞有界\"},{\"num\":\"68\",\"name\":\"王瑞\"},{\"num\":\"75\",\"name\":\"贾志伟\"}]},{\"num\":\"105\",\"name\":\"生产部\",\"superiorDept\":\"1000\",\"leaderPerNums\":[\"42\"],\"children\":[{\"num\":\"43\",\"name\":\"马泽\"},{\"num\":\"44\",\"name\":\"卢建安\"},{\"num\":\"71\",\"name\":\"马鸿飞\"}]},{\"num\":\"106\",\"name\":\"市场部\",\"superiorDept\":\"1000\",\"leaderPerNums\":[\"2\"],\"children\":[{\"num\":\"2\",\"name\":\"孙晋汝\"},{\"num\":\"45\",\"name\":\"柳山峰\"},{\"num\":\"46\",\"name\":\"李旭\"},{\"num\":\"47\",\"name\":\"郭忠文\"},{\"num\":\"48\",\"name\":\"赵敏\"},{\"num\":\"50\",\"name\":\"陈智\"},{\"num\":\"54\",\"name\":\"武万怀\"}]},{\"num\":\"1001\",\"name\":\"未分组\",\"superiorDept\":\"1000\",\"leaderPerNums\":[],\"children\":[{\"num\":\"1\",\"name\":\"管理员\"}]}]}]";
new RecursiveRescreening().rescreeningDeptAndPersonTree(jsonStr);
}
/**
* String jsonStr
* ="[{\"num\":\"1000\",\"name\":\"*******责任有限公司\",\"superiorDept\":\"-1\",\"leaderPerNums\":[],\"children\":[{\"num\":\"101\",\"name\":\"综合部\",\"superiorDept\":\"1000\",\"leaderPerNums\":[\"42\",\"6\"],\"children\":[{\"num\":\"3\",\"name\":\"士大夫\"},{\"num\":\"4\",\"name\":\"王玉玲\"},{\"num\":\"5\",\"name\":\"于霞飞\"},{\"num\":\"6\",\"name\":\"康芳芳\"},{\"num\":\"7\",\"name\":\"冯亚鑫\"},{\"num\":\"8\",\"name\":\"侯素蓉\"},{\"num\":\"9\",\"name\":\"关玲玲\"},{\"num\":\"10\",\"name\":\"高磊\"},{\"num\":\"11\",\"name\":\"董晓虹\"},{\"num\":\"42\",\"name\":\"左素平\"},{\"num\":\"64\",\"name\":\"杨雨欣\"},{\"num\":\"65\",\"name\":\"尚秀忠\"},{\"num\":\"66\",\"name\":\"赵鹏伟\"}]},{\"num\":\"102\",\"name\":\"工程部\",\"superiorDept\":\"1000\",\"leaderPerNums\":[\"2\"],\"children\":[{\"num\":\"12\",\"name\":\"李鹏翔\"},{\"num\":\"13\",\"name\":\"张学东\"},{\"num\":\"14\",\"name\":\"邱继国\"},{\"num\":\"15\",\"name\":\"胡肥东\"},{\"num\":\"16\",\"name\":\"张利锋\"},{\"num\":\"17\",\"name\":\"冯超博\"},{\"num\":\"18\",\"name\":\"刘勇\"},{\"num\":\"51\",\"name\":\"高福强\"},{\"num\":\"58\",\"name\":\"韩程\"},{\"num\":\"59\",\"name\":\"刘凯峰\"},{\"num\":\"73\",\"name\":\"武康\"},{\"num\":\"74\",\"name\":\"马窦\"}]},{\"num\":\"103\",\"name\":\"研发一部\",\"superiorDept\":\"1000\",\"leaderPerNums\":[\"20\"],\"children\":[{\"num\":\"20\",\"name\":\"柳江峰\"},{\"num\":\"21\",\"name\":\"马晶\"},{\"num\":\"22\",\"name\":\"李慧仙\"},{\"num\":\"23\",\"name\":\"崔耀强\"},{\"num\":\"24\",\"name\":\"陈星星\"},{\"num\":\"25\",\"name\":\"吕晓辉\"},{\"num\":\"26\",\"name\":\"郭文军\"},{\"num\":\"27\",\"name\":\"代靖\"},{\"num\":\"28\",\"name\":\"李跃跃\"},{\"num\":\"29\",\"name\":\"张力丰\"},{\"num\":\"49\",\"name\":\"李磊\"},{\"num\":\"52\",\"name\":\"胡懿\"},{\"num\":\"53\",\"name\":\"胡晓超\"},{\"num\":\"55\",\"name\":\"靳云南\"},{\"num\":\"56\",\"name\":\"张家玮\"},{\"num\":\"57\",\"name\":\"王文杰\"},{\"num\":\"60\",\"name\":\"刘利娜\"},{\"num\":\"61\",\"name\":\"张尧\"},{\"num\":\"62\",\"name\":\"董刚刚\"},{\"num\":\"63\",\"name\":\"李少华\"},{\"num\":\"69\",\"name\":\"杨瑞\"},{\"num\":\"70\",\"name\":\"张宇\"},{\"num\":\"72\",\"name\":\"王宇璐\"},{\"num\":\"76\",\"name\":\"杨世杰\"},{\"num\":\"77\",\"name\":\"武志亮\"}]},{\"num\":\"104\",\"name\":\"研发二部\",\"superiorDept\":\"1000\",\"leaderPerNums\":[\"30\"],\"children\":[{\"num\":\"30\",\"name\":\"方利红\"},{\"num\":\"31\",\"name\":\"李跃峰\"},{\"num\":\"32\",\"name\":\"赵海青\"},{\"num\":\"33\",\"name\":\"周权\"},{\"num\":\"34\",\"name\":\"魏志强\"},{\"num\":\"35\",\"name\":\"任燕卿\"},{\"num\":\"36\",\"name\":\"郝鹏勇\"},{\"num\":\"37\",\"name\":\"李国君\"},{\"num\":\"38\",\"name\":\"郭伟\"},{\"num\":\"39\",\"name\":\"何延峰\"},{\"num\":\"40\",\"name\":\"吴文凯\"},{\"num\":\"41\",\"name\":\"高婧\"},{\"num\":\"67\",\"name\":\"卞有界\"},{\"num\":\"68\",\"name\":\"王瑞\"},{\"num\":\"75\",\"name\":\"贾志伟\"}]},{\"num\":\"105\",\"name\":\"生产部\",\"superiorDept\":\"1000\",\"leaderPerNums\":[\"42\"],\"children\":[{\"num\":\"43\",\"name\":\"马泽\"},{\"num\":\"44\",\"name\":\"卢建安\"},{\"num\":\"71\",\"name\":\"马鸿飞\"}]},{\"num\":\"106\",\"name\":\"市场部\",\"superiorDept\":\"1000\",\"leaderPerNums\":[\"2\"],\"children\":[{\"num\":\"2\",\"name\":\"孙晋汝\"},{\"num\":\"45\",\"name\":\"柳山峰\"},{\"num\":\"46\",\"name\":\"李旭\"},{\"num\":\"47\",\"name\":\"郭忠文\"},{\"num\":\"48\",\"name\":\"赵敏\"},{\"num\":\"50\",\"name\":\"陈智\"},{\"num\":\"54\",\"name\":\"武万怀\"}]},{\"num\":\"1001\",\"name\":\"未分组\",\"superiorDept\":\"1000\",\"leaderPerNums\":[],\"children\":[{\"num\":\"1\",\"name\":\"管理员\"}]}]}]";
*
* @param jsonStr
* @return
*/
@SuppressWarnings("unchecked")
public List<Map<String, Object>> rescreeningDeptAndPersonTree(String jsonStr) {
List<Map<String, Object>> resultList = new ArrayList<>();
try {
List<Map<String, Object>> list = JSON.parseObject(jsonStr, List.class);
// 获取所有部门
List<Map<String, Object>> allDeptMapList = new ArrayList<>();
// 获取所有人员
List<Map<String, Object>> allPersonMapList = new ArrayList<>();
degui(list, allDeptMapList, allPersonMapList);
System.out.println(allDeptMapList);
System.out.println(allPersonMapList);
//部门编号和部门名称map集合
Map<String, String> deptNumAndDeptNameMap = new HashMap<>();
for (Map<String, Object> deptMap : allDeptMapList) {
deptNumAndDeptNameMap.put((String) deptMap.get("num"), (String) deptMap.get("name"));
}
//获取到没有没有子部门的部门。
List<String> deptNumList = new ArrayList<>();
for (Map<String, Object> deptMap : allDeptMapList) {
String deptNum = (String) deptMap.get("num");
if ((boolean) deptMap.get("disabled")) {
continue;
}
boolean isParentFlag = false;
for (Map<String, Object> twoLeveldeptMap : allDeptMapList) {
if (((String) twoLeveldeptMap.get("superiorDept")).equals(deptNum)) {
isParentFlag = true;
break;
}
}
if (!isParentFlag) {
deptNumList.add(deptNum);
}
}
//遍历该集合构造所需树形数据
for (String deptNum : deptNumList) {
Map<String, Object> deptMap = new HashMap<>();
//构造部门编号
deptMap.put("num", deptNum);
List<String> tmpDetpNumList = new ArrayList<>();
//获取某个部门的所有上级部门编号(包括自己)
getAllDeptNumList(deptNum, allDeptMapList, tmpDetpNumList);
List<String> realDeptNumList = new ArrayList<>();
//剔除根节点部门(山西博华科技有限公司)
for (int i = tmpDetpNumList.size() -2;i >= 0; i--) {
System.out.println("tmpDetpNumList.get(i):" + tmpDetpNumList.get(i));
realDeptNumList.add(tmpDetpNumList.get(i));
}
System.out.println("realDeptNumList" + realDeptNumList);
//构造某个部门和所有上级部门组成的名字
String name = "";
for (int i = 0; i < realDeptNumList.size(); i++) {
String num = realDeptNumList.get(i);
if (i == realDeptNumList.size() - 1) {
name = name + deptNumAndDeptNameMap.get(num);
} else {
name = name + deptNumAndDeptNameMap.get(num) + "/";
}
}
deptMap.put("name", name);
List<Map<String, Object>> deptPersonMapList = new ArrayList<>();
//获取该部门下人员list
for (Map<String, Object> personMap : allPersonMapList) {
if (((String) personMap.get("deptNum")).equals(deptNum)) {
deptPersonMapList.add(personMap);
}
}
deptMap.put("children",deptPersonMapList);
resultList.add(deptMap);
}
} catch (Exception e) {
resultList = new ArrayList<>();
e.printStackTrace();
}
System.out.println(resultList);
System.out.println(JSON.toJSONString(resultList));
return resultList;
}
/**
* 拆分人员和部门树形数据获取所有人员和部门信息List
*
* @param list
* @param allDeptMapList
* @param allPersonMapList
*/
@SuppressWarnings("unchecked")
public static void degui(List<Map<String, Object>> list, List<Map<String, Object>> allDeptMapList,
List<Map<String, Object>> allPersonMapList) {
String deptNum = "";
if (allDeptMapList != null && allDeptMapList.size() > 0) {
deptNum = (String) allDeptMapList.get(allDeptMapList.size() - 1).get("num");
}
for (Map<String, Object> map : list) {
String num = (String) map.get("num");
String name = (String) map.get("name");
if (map.get("leaderPerNums") != null && map.get("children") != null) {// 部门有子部门或者人
Map<String, Object> deptMap = new HashMap<>();
String superiorDept = (String) map.get("superiorDept");
deptMap.put("num", num);
deptMap.put("name", name);
deptMap.put("superiorDept", superiorDept);
deptMap.put("disabled", false);
allDeptMapList.add(deptMap);
degui((List<Map<String, Object>>) map.get("children"), allDeptMapList, allPersonMapList);
}
if (map.get("leaderPerNums") != null && map.get("children") == null) {// 部门底下没人没子部门
Map<String, Object> deptMap = new HashMap<>();
String superiorDept = (String) map.get("superiorDept");
deptMap.put("num", num);
deptMap.put("name", name);
deptMap.put("superiorDept", superiorDept);
deptMap.put("disabled", true);
allDeptMapList.add(deptMap);
}
if (map.get("leaderPerNums") == null && map.get("children") == null) {// 人
Map<String, Object> personMap = new HashMap<>();
personMap.put("num", num);
personMap.put("name", name);
personMap.put("deptNum", deptNum);
allPersonMapList.add(personMap);
}
}
}
/**
* 获取某个部门的所有上级部门
*
* @param deptNum
* @param allDeptMapList
* @param tmpDeptNumList
*/
public static void getAllDeptNumList(String deptNum, List<Map<String, Object>> allDeptMapList,
List<String> tmpDeptNumList) {
tmpDeptNumList.add(deptNum);
for (Map<String, Object> deptMap : allDeptMapList) {
String superiorDept = (String) deptMap.get("superiorDept");
if ((deptNum.equals((String) deptMap.get("num"))) && (!"-1".equals(superiorDept))) {
getAllDeptNumList(superiorDept, allDeptMapList, tmpDeptNumList);
}
}
return;
}
}