`
xurichusheng
  • 浏览: 336349 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

【JAVA】组织树

    博客分类:
  • java
阅读更多

 

JDK 版本:jdk 1.8 及以上。

 

1. 组织表结构

   表名  jpf_org



 

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

 

  • 大小: 29.3 KB
1
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics