文章目录
- 递归循环构建树结构
- hutool.TreeUtil.build构建树结构
递归循环构建树结构
先查最外层树节点数据,再递归遍历每一层子节点数据
public ApiResultDto<List<LocationDto>> getTreeByParams(LocationSearchDto searchDto, SecurityUser user) {// 最外层的树结构【此最外层是BUILDING,也就是BUILDING的parentId为null】,不是获取所有数据,与下不同searchDto.setProjectId(user.getProjectId());searchDto.setType(LocationType.BUILDING);List<LocationEntity> locationEntities = locationDao.findByParams(searchDto);List<LocationDto> locationDtos = locationEntities.stream().map(t -> {LocationDto dto = new LocationDto();dto.setId(t.getId());dto.setName(t.getName());dto.setType(t.getType());dto.setSort(t.getSort());dto.setSerialNum(t.getSerialNum());dto.setCode(t.getCode());dto.setParentId(t.getParentId());// 循环递归获取子节点iterChild(dto, user.getProjectId());return dto;}).collect(Collectors.toList());return ApiResultDto.success(locationDtos);}/*** 遍历子节点.** @param dto 空间dto*/private void iterChild(LocationDto dto, UUID projectId) {
// <select id="findChildById"
// parameterType="map" resultType="common.po.location.LocationEntity">
// select *
// from location
// where model_status = 1
// and parent_id = #{id}
// </select>List<LocationEntity> locations = locationDao.findChildById(dto.getId());if (CollectionUtils.isEmpty(locations)) {return;}List<LocationDto> locationDtos = locations.stream().map(t -> {LocationDto childDto = new LocationDto();childDto.setId(t.getId());childDto.setName(t.getName());childDto.setType(t.getType());childDto.setSort(t.getSort());childDto.setSerialNum(t.getSerialNum());childDto.setCode(t.getCode());childDto.setParentId(t.getParentId());// 递归遍历子节点iterChild(childDto, projectId);return childDto;}).collect(Collectors.toList());dto.setChildren(locationDtos);}
hutool.TreeUtil.build构建树结构
public ApiResultDto<List<Tree<UUID>>> getTreeByParams(LocationSearchDto searchDto, SecurityUser user) {// 查询到所有数据searchDto.setProjectId(user.getProjectId());List<LocationEntity> entities = locationDao.findByParams(searchDto);// 获取非第一层"BUILDING"的数据的父级信息【查询到子节点,要带出对应的所有父节点,如果不需要可以删除】List<LocationEntity> locationEntities = new ArrayList<>();locationEntities.addAll(entities);for (LocationEntity entity : entities) {addParentEntities(entity, locationEntities);}locationEntities = locationEntities.stream().distinct().collect(Collectors.toList());// 构建树,主要数据在treeNode中,其余数据在extra字段中List<TreeNode<UUID>> nodeList = new ArrayList<>();for (LocationEntity entity : locationEntities) {TreeNode<UUID> treeNode = new TreeNode<>(entity.getId(), entity.getParentId(), entity.getName(), null);nodeList.add(treeNode);Map<String, Object> extra = new HashMap<>();extra.put("name", entity.getName());extra.put("serialNum", entity.getSerialNum());extra.put("code", entity.getCode());extra.put("type", entity.getType());extra.put("sort", entity.getSort());if (MapUtils.isNotEmpty(extra)) {treeNode.setExtra(extra);}}List<Tree<UUID>> result = TreeUtil.build(nodeList, null);return ApiResultDto.success(result);}/*** 获取当前空间实体额所有上级实体.** @param entity 当前空间实体* @param res 结果*/private void addParentEntities(LocationEntity entity, List<LocationEntity> res) {if (Objects.nonNull(entity) && Objects.nonNull(entity.getParentId())) {LocationEntity parentEntity = locationDao.selectById(entity.getParentId());if (Objects.nonNull(parentEntity)) {res.add(parentEntity);addParentEntities(parentEntity, res);}}}