?
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, "");
?