Java后台模糊查询树

484 阅读1分钟

方案

  1. 模糊查询条件查库,得到目标数据
//dto为查询条件
List<Dept> queryResult = deptRepository.getBaseMapper().query(dto);

2、递归,把目标数据到根节点的所有节点找出来,并存起来

/**
 * 模糊匹配查询
 * @param queryResult 模糊查询的部门结果集
 * @param all 所有部门
 * @return
 */
public static List<Tree<String>> getDeptTree(List<Dept> queryResult, List<Dept> all){
    //ID分组
    Map<String, Dept> base = queryResult.stream()
            .collect(Collectors.toMap(SysDept::getId, ele -> ele, (v1, v2) -> v2));
    Map<String, Dept> origin = all.stream()
            .collect(Collectors.toMap(SysDept::getId, ele -> ele, (v1, v2) -> v2));
   //存放最终结果
    Map<String, Dept> result = new HashMap<>(queryResult.size());
    //遍历结果集
    for (Map.Entry<String,Dept> entry : base.entrySet()){
        result.put(entry.getKey(),entry.getValue());
        //递归找出全链路节点
        getAllParentId(result, entry.getValue().getParentId(), origin);
    }
    //转树
    return getDeptTree(SysConstant.ROOT_ID, new LinkedList<>(result.values()));
}
/**
 * 递归找出全链路节点
 * @param result 存放结果容器
 * @param parentId  父ID
 * @param origin  所有部门map
 */
private static void getAllParentId(Map<String, Dept> result, String parentId, Map<String, Dept> origin){
    //存在则跳过
    if (result.containsKey(parentId)){
        return;
    }
    //递归获取
    Dept dept = origin.get(parentId);
    if (null != dept){
        result.put(parentId,dept);
        //Constant.ROOT_ID 为根节点ID
        if (!dept.getParentId().equals(Constant.ROOT_ID)){
            getAllParentId(result, dept.getParentId(), origin);
        }
    }
}

3、把第二步的结果转成树输出

/**
 * 集合转树,这里用的是hutool的 treeUtil
 * @param rootId 根节点ID
 * @param list 目标集合
 * @return
 */
public static List<Tree<String>> getDeptTree(String rootId,List<Dept> list){
    //树配置
    TreeNodeConfig nodeConfig = new TreeNodeConfig();
    nodeConfig.setIdKey("id");
    nodeConfig.setParentIdKey("parentId");
    nodeConfig.setNameKey("name");
    nodeConfig.setWeightKey("orderNum");
    List<Tree<String>> result;
    //生成树
    result = TreeUtil.build(list, rootId, nodeConfig, (object, tree) -> {
        tree.setId(object.getId());
        tree.setParentId(object.getParentId());
        tree.setName(object.getName());
        tree.setWeight(object.getOrderNum());
        tree.putExtra("type", object.getType());
        tree.putExtra("status", object.getStatus());
    });
    return result;
}