【JAVA】组织树

阅读更多

 

JDK 版本:jdk 1.8 及以上。

 

1. 组织表结构

   表名  jpf_org


【JAVA】组织树_第1张图片
 

2. 组织类属性

   类名 JpfOrgInfo

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 children;
	// 父节点
	private List 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 getParents(String orgNo, List list) {

		if (CommonUtil.isBlank(orgNo) || CommonUtil.isBlank(list)) {
			return null;
		}

		Map map = list.stream()
				.collect(Collectors.toMap(JpfOrgInfo::getOrgNo, a -> a, (k1, k2) -> k1));

		JpfOrgInfo curOrg = map.get(orgNo);

		if (curOrg == null) {
			return null;
		}
		List 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;
	}
	
	/**
	 * 获取指定组织及其所有下级组织
	 * 

结果包含父级组织

* @param pNo 父组织编号 * @param list 所有的组织 * @return List * @author * @date 2019年9月4日 * @since JDK 1.8 */ public static List getChildren(String pNo, List list) { if (CommonUtil.isBlank(pNo) || CommonUtil.isBlank(list)) { return null; } // 获取指定的父级组织 List roots = list.stream().filter(aa -> (pNo.equals(aa.getOrgNo()))).collect(Collectors.toList()); if (CommonUtil.isBlank(roots)) { return null; } // 获取子组织 // List 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 subs) { List 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)); } } /** * 获取指定组织及其所有下级组织 *

结果不包含父级组织

* * @param list 所有的组织 * @param pNo 父组织编号 * @param childMenu 返回值:子组织 * @author * @date 2019年9月4日 * @since JDK 1.8 */ public static void getChildren(List list, String pNo, List 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 buildTree(List list, String orgNo) {

		if (CommonUtil.isBlank(list)) {
			return new ArrayList<>();
		}

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

 

  • 【JAVA】组织树_第2张图片
  • 大小: 29.3 KB
  • 查看图片附件

你可能感兴趣的:(java,树形结构)