1, 先看数据库中存储的结构
2,JDK8 生成层级关系
BaseResult<List<JtlSysDictDTO>> searchRes = jtlSysDictService.findList(param);
if ("area_type".equals(param.getType())) {
List<AreaTree> treeList = searchRes.getValue().stream()
.filter(area -> !area.getValue().equals(area.getParentId()))
.map(area -> {
AreaTree node = new AreaTree();
node.setValue(area.getValue());
node.setParentId(area.getParentId());
node.setLabel(area.getLabel());
node.setLevel(area.getLevel());
return node;
}).collect(Collectors.toList());
return BaseResult.successWithData(TreeUtil.bulidArea(treeList, "0"));
} else {
return searchRes;
}
工具类:
import java.util.ArrayList;
import java.util.List;
public class TreeUtil {
/**
* 两层循环实现建树
*
* @param treeNodes 传入的树节点列表
* @return
*/
public static <T extends TreeNode> List<T> bulid(List<T> treeNodes, Integer root) {
List<T> trees = new ArrayList<>();
for (T treeNode : treeNodes) {
if (root.intValue() == treeNode.getParentId().intValue()) {
trees.add(treeNode);
}
for (T it : treeNodes) {
if (it.getParentId().intValue() == treeNode.getId().intValue()) {
if (treeNode.getChildren() == null) {
treeNode.setChildren(new ArrayList<>());
}
treeNode.add(it);
}
}
}
return trees;
}
/**
* 两层循环实现建树
*
* @param treeNodes 传入的树节点列表
* @return
*/
public static <T extends AreaNode> List<T> bulidArea(List<T> treeNodes, Object root) {
List<T> trees = new ArrayList<>();
for (T treeNode : treeNodes) {
if (root.equals(treeNode.getParentId())) {
trees.add(treeNode);
}
for (T it : treeNodes) {
if (it.getParentId().equals(treeNode.getValue())) {
if (treeNode.getChildren() == null) {
treeNode.setChildren(new ArrayList<>());
}
treeNode.add(it);
}
}
}
return trees;
}
/**
* 使用递归方法建树
*
* @param treeNodes
* @return
*/
public static <T extends TreeNode> List<T> buildByRecursive(List<T> treeNodes, Object root) {
List<T> trees = new ArrayList<T>();
for (T treeNode : treeNodes) {
if (root.equals(treeNode.getParentId())) {
trees.add(findChildren(treeNode, treeNodes));
}
}
return trees;
}
/**
* 递归查找子节点
*
* @param treeNodes
* @return
*/
public static <T extends TreeNode> T findChildren(T treeNode, List<T> treeNodes) {
for (T it : treeNodes) {
if (treeNode.getId().equals(it.getParentId())) {
if (treeNode.getChildren() == null) {
treeNode.setChildren(new ArrayList<>());
}
treeNode.add(findChildren(it, treeNodes));
}
}
return treeNode;
}
public class AreaTree extends AreaNode {
private String label;
private String value;
private String parentId;
private String level;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
public String getParentId() {
return parentId;
}
public void setParentId(String parentId) {
this.parentId = parentId;
}
public String getLevel() {
return level;
}
public void setLevel(String level) {
this.level = level;
}
public AreaTree() {
}
public AreaTree(String value, String label, String parentId, String level) {
this.value = value;
this.parentId = parentId;
this.label = label;
this.level = level;
}
}
import java.util.ArrayList;
import java.util.List;
public class AreaNode {
protected String value;
protected String parentId;
protected List<AreaNode> children = new ArrayList<AreaNode>();
protected String lable;
public String getLable() {
return lable;
}
public void setLable(String lable) {
this.lable = lable;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getParentId() {
return parentId;
}
public void setParentId(String parentId) {
this.parentId = parentId;
}
public List<AreaNode> getChildren() {
return children;
}
public void setChildren(List<AreaNode> children) {
this.children = children;
}
public void add(AreaNode node) {
children.add(node);
}
}
3 注意了 这个里边写的就是主要的方法
BaseResult result = new BaseResult();
CloudUser user = SecurityUtils.getUser();
if (null == user) {
return BaseResult.error("请登录后操作");
}
List<AreaTreeVo> areaList = new ArrayList<>();
List<JtlCompanyDTO> listCompany = new ArrayList<>();
List<String> regionIds = new ArrayList<>();
BaseResult<List<JtlCompanyDTO>> myChirldIndustrialOrgList = companyService.getMyChirldIndustrialOrgList(user.getOrgId(), orgName, industryType, orgStatus);
if (myChirldIndustrialOrgList.isSuccess() && !CollectionUtils.isEmpty(myChirldIndustrialOrgList.getValue())) {
List<JtlCompanyDTO> values = myChirldIndustrialOrgList.getValue();
for (JtlCompanyDTO org : values) {
regionIds.add(org.getRegionId());
listCompany.add(org);
}
//查询省市县 树形的
BaseResult<List<AreaTreeVo>> list1 = sysDictService.findAreaList();
if (list1.isSuccess() && !CollectionUtils.isEmpty(list1.getValue())) {
List<AreaTreeVo> value = list1.getValue();
value.stream().forEach(areaTreeVo -> { //省
List<AreaNodeVo> areaNodeVos = new ArrayList<>();
areaTreeVo.getChildren().stream().forEach(areaNodeVo -> { //市
List<AreaNodeVo> areaNodeVos2 = new ArrayList<>();
areaNodeVo.getChildren().stream().forEach(areaNodeVo1 -> { //县
//如果包含的有的话只需要把单位名称放到返回值中
if (regionIds.contains(areaNodeVo1.getValue())) {
List<CompanyDto> companyDtos2 = new ArrayList<>();
//便利单位信息 获取
for (JtlCompanyDTO companyDTO : listCompany) {
if (areaNodeVo1.getValue().equals(companyDTO.getRegionId())) {
regionIds.remove(companyDTO.getRegionId());
CompanyDto dto = new CompanyDto();
dto.setCompanyId(companyDTO.getId());
dto.setCompanyName(companyDTO.getOrgName());
dto.setReginId(companyDTO.getRegionId());
dto.setPosition(companyDTO.getPosition());
dto.setDeviceState(companyDTO.getOrgState());
dto.setIndustryTypeName(companyDTO.getIndustryTypeName());
companyDtos2.add(dto);
areaNodeVo1.setCompanyDtos(companyDtos2);
}
}
areaNodeVos2.add(areaNodeVo1);
areaNodeVo.setChildren(areaNodeVos2);
}
});
if (!CollectionUtils.isEmpty(areaNodeVos2)) {
areaNodeVos.add(areaNodeVo);
areaTreeVo.setChildren(areaNodeVos);
}
});
if (!CollectionUtils.isEmpty(areaNodeVos)) {
areaList.add(areaTreeVo);
}
});
}
}
result.setSuccess(true);
result.setValue(areaList);
return result;
返回的结果
@Data
public class AreaTreeVo extends AreaNodeVo {
private String label;
private String value;
private String parentId;
private String level;
}
@Data
public class AreaNodeVo extends CompanyDto{ // 这个地方注意了
private String value;
private String parentId;
private String label;
private List<AreaNodeVo> children = new ArrayList<>();
}
public class CompanyDto {
/*
单位名称
*/
private String companyName;
/*
单位id
*/
private Long companyId;
// 管控策略
private String strategy;
//单位状态
private Integer deviceState;
// 行业类型
private String industryTypeName;
// 经纬度
private String position;
private String reginId;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
protected Date createTime;
protected List<CompanyDto> companyDtos = new ArrayList<>();
}
就是这样的效果
四级联动