package cn.besteam.common.util;
|
|
import cn.besteam.modules.system.dto.SysDepartmentTreeModel;
|
import cn.hutool.core.collection.CollectionUtil;
|
import com.google.common.collect.Lists;
|
|
import java.util.Iterator;
|
import java.util.List;
|
import java.util.Objects;
|
import java.util.stream.Collectors;
|
|
/**
|
* @author jie
|
* @date 2021/3/9 11:54
|
*/
|
public class TreeFilterSysDepartmentTreeModelUtil {
|
|
|
/**
|
* 获取树状结构
|
* @param treeList 搜索的树列表
|
* @param hitIds 命中的ids
|
* @return
|
*/
|
public List<SysDepartmentTreeModel> searchNode(List<SysDepartmentTreeModel> treeList, List<Integer> hitIds) {
|
List<SysDepartmentTreeModel> filterTree = Lists.newArrayList();
|
for (SysDepartmentTreeModel t : treeList) {
|
SysDepartmentTreeModel node = filterTree(t, hitIds);
|
filterTree.add(node);
|
}
|
return filterTree.stream().filter(Objects::nonNull).collect(Collectors.toList());
|
}
|
|
/**
|
* 过滤树
|
* @param tree
|
* @param hitIds
|
* @return
|
*/
|
private SysDepartmentTreeModel filterTree(SysDepartmentTreeModel tree, List<Integer> hitIds) {
|
/*if(isRemoveNode(tree, hitIds)){
|
return null;
|
}*/
|
Iterator<SysDepartmentTreeModel> iterator = tree.getChildren().iterator();
|
while (iterator.hasNext()){
|
SysDepartmentTreeModel child = iterator.next();
|
deleteNode(child, iterator, hitIds);
|
}
|
return tree;
|
}
|
|
/**
|
* 删除节点
|
* @param child
|
* @param iterator
|
* @param hitIds
|
*/
|
private void deleteNode(SysDepartmentTreeModel child, Iterator<SysDepartmentTreeModel> iterator, List<Integer> hitIds) {
|
if(isRemoveNode(child, hitIds)){
|
iterator.remove();
|
return;
|
}
|
List<SysDepartmentTreeModel> childrenList = child.getChildren();
|
if(CollectionUtil.isEmpty(childrenList)){
|
return;
|
}
|
if(hitIds.contains(Integer.valueOf(child.getValue()))){
|
return;
|
}
|
Iterator<SysDepartmentTreeModel> children = childrenList.iterator();
|
while (children.hasNext()){
|
SysDepartmentTreeModel childChild = children.next();
|
deleteNode(childChild,children, hitIds);
|
}
|
}
|
|
/**
|
* 判断该节点是否该删除
|
* @param root
|
* @param hitIds 命中的节点
|
* @return ture 需要删除 false 不能被删除
|
*/
|
private boolean isRemoveNode(SysDepartmentTreeModel root, List<Integer> hitIds) {
|
List<SysDepartmentTreeModel> children = root.getChildren();
|
// 叶子节点
|
if(CollectionUtil.isEmpty(children)){
|
return !hitIds.contains(Integer.valueOf(root.getValue()));
|
}
|
// 子节点
|
if(hitIds.contains(Integer.valueOf(root.getValue()))){
|
return false;
|
}
|
boolean bool = true;
|
for (SysDepartmentTreeModel child : children) {
|
if(!isRemoveNode(child,hitIds)){
|
bool = false;
|
break;
|
}
|
}
|
return bool;
|
}
|
|
|
}
|