文章目录
递归循环构建树结构
先查最外层树节点数据,再递归遍历每一层子节点数据
java
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构建树结构
java
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);
}
}
}