1、查询部门
/**
* 获取部门下拉树列表
*/
@GetMapping("/treeselect")
public AjaxResult treeselect(SysDept dept)
{
List<SysDept> depts = deptService.selectDeptList(dept);
return AjaxResult.success(deptService.buildDeptTreeSelect(depts));
}
2、将查询出来的部门集合放入写的下拉树处理
/**
* 构建前端所需要下拉树结构
*
* @param depts 部门列表
* @return 下拉树结构列表
*/
@Override
public List<TreeSelect> buildDeptTreeSelect(List<SysDept> depts)
{
List<SysDept> deptTrees = buildDeptTree(depts);
return deptTrees.stream().map(TreeSelect::new).collect(Collectors.toList());
}
3、遍历部门集合,将部门DeptId放入新的集合List<Long>
3.1、遍历部门集合,如果当前部门是顶级节点(即它没有父节点),遍历该部门的所有子节点,添加并放入集合中。
/**
* 构建前端所需要树结构
*
* @param depts 部门列表
* @return 树结构列表
*/
@Override
public List<SysDept> buildDeptTree(List<SysDept> depts)
{
List<SysDept> returnList = new ArrayList<SysDept>();
List<Long> tempList = new ArrayList<Long>();
for (SysDept dept : depts)
{
tempList.add(dept.getDeptId());
}
for (SysDept dept : depts)
{
// 如果是顶级节点, 遍历该父节点的所有子节点
if (!tempList.contains(dept.getParentId()))
{
recursionFn(depts, dept);
returnList.add(dept);
}
}
if (returnList.isEmpty())
{
returnList = depts;
}
return returnList;
}
4、recursionFn是一个递归的方法,第一参数是部门列表,第二个参数是部门对象。
4.1、根据传入的部门对象t,调用getChildList函数得到其子部门列表chidList.
4.2、将子部门列表的chidList存入部门对象
4.3、遍历子部门列表chidList
a.如果该子部门还有子部门,调用递归函数
b.如果没有则不在递归函数,直接返回上一级。
/**
* 递归列表
*/
private void recursionFn(List<SysDept> list, SysDept t)
{
// 得到子节点列表
List<SysDept> childList = getChildList(list, t);
t.setChildren(childList);
for (SysDept tChild : childList)
{
if (hasChild(list, tChild))
{
recursionFn(list, tChild);
}
}
}
5、判断是否有子节点
/**
* 判断是否有子节点
*/
private boolean hasChild(List<SysDept> list, SysDept t)
{
return getChildList(list, t).size() > 0;
}
6、getChildList是子节点函数
6.1、用迭代器给部门对象list<SysDept>,遍历过程中,每个部门对象n的parentId都是存在的
a.如果parentId不为空,并且部门对象n的parentId的值 等于 t的parentId(t是顶级节点遍历过来某一个对象, n为部门集合节点中下一个部门对象);
如果是,n是t部门的子部门之一,将n添加到子集合中,返回tList。
/**
* 得到子节点列表
*/
private List<SysDept> getChildList(List<SysDept> list, SysDept t)
{
List<SysDept> tlist = new ArrayList<SysDept>();
Iterator<SysDept> it = list.iterator();
while (it.hasNext())
{
SysDept n = (SysDept) it.next();
if (StringUtils.isNotNull(n.getParentId()) && n.getParentId().longValue() == t.getDeptId().longValue())
{
tlist.add(n);
}
}
return tlist;
}