3-2 部门层级树接口

原创 2018年04月16日 09:50:24

创建用于展示的 dto 对象

@Getter
@Setter
@ToString
public class DeptLevelDto extends SysDept{
	
	private List<DeptLevelDto> deptList = new ArrayList<>();
	
	// sysDept 转换 DeptLevelDto
	public static DeptLevelDto adapt(SysDept sysDept) {
		DeptLevelDto deptLevelDto = new DeptLevelDto();
		BeanUtils.copyProperties(sysDept, deptLevelDto);
		return deptLevelDto;
	}
}

SysTreeService

@Service
public class SysTreeService {
	
	@Autowired
	private SysDeptMapper sysDeptMapper;
	
	public List<DeptLevelDto> deptTree(){
		List<SysDept> deptList = sysDeptMapper.getAllDept();
		List<DeptLevelDto> deptLevelDtoList = Lists.newArrayList();    // pom 文件添加 assertj-core依赖
		for(SysDept sysDept: deptList) {
			DeptLevelDto deptLevelDto = DeptLevelDto.adapt(sysDept);
			deptLevelDtoList.add(deptLevelDto);
		}
		return deptListToTree(deptLevelDtoList);
	}
}

转换部门树算法

public List<DeptLevelDto> deptListToTree(List<DeptLevelDto> deptLevelDtoList){
		// pom 添加 commons-collections依赖
		if(CollectionUtils.isEmpty(deptLevelDtoList)) {
			return Lists.newArrayList();
		}
		
		// level -> [dept1,dept2, ...]
		// Multimap<String, DeptLevelDto> 相当于 map<String, List<DeptLevelDto>>
		Multimap<String, DeptLevelDto> levelDeptDtoMap = ArrayListMultimap.create();	// pom 添加 guava 依赖
		List<DeptLevelDto> rootList = Lists.newArrayList();
		
		// 归类
		for(DeptLevelDto deptLevelDto : deptLevelDtoList) {
			levelDeptDtoMap.put(deptLevelDto.getLevel(), deptLevelDto);
			if(LevelUtil.ROOT.equals(deptLevelDto.getLevel())) {
				rootList.add(deptLevelDto);
			}
		}
		
		// rootList 按照 seq 从小到大进行排序
		Collections.sort(rootList, new Comparator<DeptLevelDto>() {
			public int compare(DeptLevelDto o1, DeptLevelDto o2) {
				// 返回值为int类型,大于0表示正序,小于0表示逆序
				return o1.getSeq() - o2.getSeq();
			}
		});
		
		transformDeptTree(rootList, LevelUtil.ROOT, levelDeptDtoMap);
		return rootList;
	}
	
	// 对 rootlist 的下级进行递归排序
	public void transformDeptTree(List<DeptLevelDto> deptLevelDtoList, String level, Multimap<String, DeptLevelDto> levelDeptDtoMap) {
		for (int i = 0; i < deptLevelDtoList.size(); i++) {
			// 遍历该层的每个元素	例如:根元素的第一个 deptLevelDto 部门 0.0
                        DeptLevelDto deptLevelDto = deptLevelDtoList.get(i);
                        // 处理当前层级的数据	例如:nextLevel = 0.0
                        String nextLevel = LevelUtil.calculateLevel(level, deptLevelDto.getId());
                        // 处理下一层
                        List<DeptLevelDto> tempDeptList = (List<DeptLevelDto>) levelDeptDtoMap.get(nextLevel);
                        // 如果下一层有数据	例如:0.0 -> [0.0.1, 0.0.2, ...]
                        if (CollectionUtils.isNotEmpty(tempDeptList)) {
                            // 排序
                            Collections.sort(tempDeptList, deptSeqComparator);
                            // 设置下一层部门
                            deptLevelDto.setDeptList(tempDeptList);
                            // 进入到下一层处理
                            transformDeptTree(tempDeptList, nextLevel, levelDeptDtoMap);
                        }
		}
	}
	
	public Comparator<DeptLevelDto> deptSeqComparator = new Comparator<DeptLevelDto>() {
            public int compare(DeptLevelDto o1, DeptLevelDto o2) {
                return o1.getSeq() - o2.getSeq();
            }
        };
controller 
@RequestMapping("/tree")
@ResponseBody
public JsonData tree() {
	List<DeptLevelDto> deptLevelDtoList = sysTreeService.deptTree();
	return JsonData.success(deptLevelDtoList);
}


Android 多级部门树(支持无限级),支持部门级别多选

  • 2014年03月14日 09:54
  • 950KB
  • 下载

mysql树查询及分层级

drop procedure proc_fi_deptment; DELIMITER // create PROCEDURE proc_fi_deptment() BEGIN /* ...
  • liu1765686161
  • liu1765686161
  • 2015-11-27 15:12:50
  • 2998

Android多级树形结构列表(理论上可以无限级)

转载请注明出处 http://blog.csdn.net/stevenduan17最近有需求做多级树形结构的列表,使用ExpandableListView不能实现,无奈,只能自己写了,主要时层级之间使...
  • StevenDuan17
  • StevenDuan17
  • 2016-12-23 16:34:59
  • 457

java 递归得到部门树

Java代码   public DepartmentUserTreeNode getTree(String location,String  name) {          List de...
  • csdnxingyuntian
  • csdnxingyuntian
  • 2017-04-26 21:28:54
  • 3413

Android打造一个高性能无限层级显示的树形控件(Android树形控件)

最近公司的Android项目里有一个地方需要选择某公司的所有部门,因为手机屏幕有限所以并不能像网页那样显示树状结构,但是如果只是用列表依次显示所有的部门又会让用户很难找到想要找的部门(即使加上搜索功能...
  • hqocshheqing
  • hqocshheqing
  • 2016-08-11 21:23:34
  • 4281

android 基于树结构的任意层级列表

最近写了一个基于树结构的任意层级列表,其展现效果就类似于android原生的ExpandableListView啦,不过自己写一个也是挺好玩的。在这里我主要是使用到了树这种数据结构来实现任意层级可展开...
  • Ivan_zgj
  • Ivan_zgj
  • 2016-03-18 16:34:26
  • 1010

利用递归形成一个层级树

在我们的开发中,很多时候在显示一个具有层级结构的下拉框,效果如下: 在数据库中的数据是通过一个parentId实现的。我在学习汤阳光同志的视频中,领略了其思想,利用递归实现了自己的层级树。 ...
  • xxssyyyyssxx
  • xxssyyyyssxx
  • 2016-04-29 15:30:26
  • 1332

Mybatis之高级映射collection (递归查出树形数据之查询部门及部门下所有人员 单节点)

第一步:创建树形数据Beanpublic class DeptTree { private String id; private String name; private Li...
  • FANTASY522272820
  • FANTASY522272820
  • 2017-04-11 14:57:33
  • 3517

一个多层级节点用户树的设计构思

由于近期一个项目要开发一个多层级用户体系,并且还要支持部分链条的可移动性,经过初步构思,已经有了一个初步的思路,今天在这里简单分享一下。...
  • yanyan19880509
  • yanyan19880509
  • 2016-07-24 01:05:14
  • 990

Android实现多层级Spinner列表选项实时更新树形层级

Android实现多层级Spinner列表选项实时更新树形层级 运行结果如图: Java代码: package com.example.spinnerdemo; ...
  • zhangphil
  • zhangphil
  • 2015-11-19 08:58:58
  • 2215
收藏助手
不良信息举报
您举报文章:3-2 部门层级树接口
举报原因:
原因补充:

(最多只允许输入30个字)