编程知识 cdmana.com

java 三级联动

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

 

就是这样的效果

 

四级联动

 

 

版权声明
本文为[简小姐]所创,转载请带上原文链接,感谢
https://my.oschina.net/liudandan/blog/4713074

Tags java jdk
Scroll to Top