3-2 部门层级树接口

创建用于展示的 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);
	}
}

mapper

<select id="getAllDept" resultMap="BaseResultMap">
    select
    <include refid="Base_Column_List" />
    from sys_dept
</select>

转换部门树算法

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);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值