?
JDK 版本:jdk 1.8 及以上。
?
1. 组织表结构
?? 表名? jpf_org

?
2. 组织类属性
?? 类名 JpfOrgInfo
class="java" name="code">import java.util.Date;
import java.util.List;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = false)
public class JpfOrgInfo {
// 主键id
private Long id;
// 组织编号
private String orgNo;
// 组织名称
private String orgName;
// 父组织编号
private String parentNo;
// 层级:C公司,S系统,D部门,A区域,G小组
private String level;
// 状态:1正常,2废弃
private String status;
// 创建人
private Long createId;
// 创建时间
private Date createTime;
// 更新人
private Long updateId;
// 更新时间
private Date updateTime;
// 父组织名称
private String parentName;
// 子节点
private List<JpfOrgInfo> children;
// 父节点
private List<JpfOrgInfo> parents;
}
?
3. 组织工具类
?? 类名? OrgUtils
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class OrgUtils {
/**
* 获取指定组织的所有上级节点
*
* @param orgNo 指定组织编号
* @param list 所有的组织信息
* @return List
* @author
* @date 2019年8月29日
* @since JDK 1.8
*/
public static List<JpfOrgInfo> getParents(String orgNo, List<JpfOrgInfo> list) {
if (CommonUtil.isBlank(orgNo) || CommonUtil.isBlank(list)) {
return null;
}
Map<String, JpfOrgInfo> map = list.stream()
.collect(Collectors.toMap(JpfOrgInfo::getOrgNo, a -> a, (k1, k2) -> k1));
JpfOrgInfo curOrg = map.get(orgNo);
if (curOrg == null) {
return null;
}
List<JpfOrgInfo> orgList = new ArrayList<>();
orgList.add(curOrg);
String parentNo = curOrg.getParentNo();
// parentNo为空表示递归到了顶层组织
while (!CommonUtil.isBlank(parentNo) && !Constant.EMPTY_ORG_NO.equals(parentNo)) {
/* 递归查找每个组织的父级组织,一直到顶层组织 */
JpfOrgInfo parent = map.get(parentNo);
orgList.add(parent);
parentNo = parent.getParentNo();
}
return orgList;
}
/**
* 获取指定组织及其所有下级组织
* <p>结果包含父级组织</p>
* @param pNo 父组织编号
* @param list 所有的组织
* @return List
* @author
* @date 2019年9月4日
* @since JDK 1.8
*/
public static List<JpfOrgInfo> getChildren(String pNo, List<JpfOrgInfo> list) {
if (CommonUtil.isBlank(pNo) || CommonUtil.isBlank(list)) {
return null;
}
// 获取指定的父级组织
List<JpfOrgInfo> roots = list.stream().filter(aa -> (pNo.equals(aa.getOrgNo()))).collect(Collectors.toList());
if (CommonUtil.isBlank(roots)) {
return null;
}
// 获取子组织
// List<JpfOrgInfo> subs = list.stream().filter(bb -> (!pNo.equals(bb.getOrgNo()))).collect(Collectors.toList());
roots.forEach(root -> buildSub(root, list));
return roots;
}
private static void buildSub(JpfOrgInfo parent, List<JpfOrgInfo> subs) {
List<JpfOrgInfo> childs = subs.stream().filter(sub -> (sub.getParentNo().equals(parent.getOrgNo())))
.collect(Collectors.toList());
if (!CommonUtil.isBlank(childs)) {
parent.setChildren(childs);
childs.forEach(child -> buildSub(child, subs));
}
}
/**
* 获取指定组织及其所有下级组织
* <p>结果不包含父级组织</p>
*
* @param list 所有的组织
* @param pNo 父组织编号
* @param childMenu 返回值:子组织
* @author
* @date 2019年9月4日
* @since JDK 1.8
*/
public static void getChildren(List<JpfOrgInfo> list, String pNo, List<JpfOrgInfo> childMenu) {
if (!CommonUtil.isBlank(pNo) && !CommonUtil.isBlank(list)) {
for (JpfOrgInfo mu : list) {
// 遍历出父id等于参数的id,add进子节点集合
if (mu.getParentNo().equals(pNo)) {
// 递归遍历下一级
getChildren(list, mu.getOrgNo(), childMenu);
childMenu.add(mu);
}
}
}
}
}
?
4. List 转树形结构
private List<JpfOrgInfo> buildTree(List<JpfOrgInfo> list, String orgNo) {
if (CommonUtil.isBlank(list)) {
return new ArrayList<>();
}
List<JpfOrgInfo> treeList = new ArrayList<>();
for (JpfOrgInfo org : list) {
if (CommonUtil.isBlank(org.getParentNo()) || "00000000".equals(org.getParentNo())
|| orgNo.equals(org.getOrgNo())) {
// 找到根
treeList.add(org);
}
for (JpfOrgInfo orgNode : list) {
if (org.getOrgNo().equals(orgNode.getParentNo())) {
if (CommonUtil.isBlank(org.getChildren())) {
org.setChildren(new ArrayList<>());
}
org.getChildren().add(orgNode);
}
}
}
return treeList;
}
?调用? buildTree(list, "");
?