【JAVA】组织树_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 【JAVA】组织树

【JAVA】组织树

 2019/9/19 21:28:10  xurichusheng  程序员俱乐部  我要评论(0)
  • 摘要:JDK版本:jdk1.8及以上。1.组织表结构表名jpf_org2.组织类属性类名JpfOrgInfoimportjava.util.Date;importjava.util.List;importlombok.Data;importlombok.EqualsAndHashCode;@Data@EqualsAndHashCode(callSuper=false)publicclassJpfOrgInfo{//主键idprivateLongid;//组织编号privateStringorgNo
  • 标签:Java

?

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

?

  • 大小: 29.3 KB
  • 查看图片附件
发表评论
用户名: 匿名