jeecg-boot二次开发——查找某部门下的子部门

有这么一个需求,当前用户只能查看他所属部门以及下面的所有子部门,原生jeecg-boot好像并没有根据某个部门查询子部门的方法,只有个queryTreeList用来查询所有部门树

初试:

直接改造SysDepartServiceImpl.java文件的queryTreeList方法
给queryTreeList方法加一个参数startNode,表示要查询的部门及子部门
然后从数据库查询部门时加个like过滤条件。

    @Override
    public List<SysDepartTreeModel> queryTreeList(String startNode) {
        LambdaQueryWrapper<SysDepart> query = new LambdaQueryWrapper<SysDepart>();
        query.eq(SysDepart::getDelFlag, CommonConstant.DEL_FLAG_0.toString());
        query.orderByAsc(SysDepart::getDepartOrder);
        if (!StringUtils.isEmpty(startNode)){
            query.like(SysDepart::getOrgCode, startNode + "%");
        }
        List<SysDepart> list = this.list(query);
        // 调用wrapTreeDataToTreeList方法生成树状数据
        List<SysDepartTreeModel> listResult = FindsDepartsChildrenUtil.wrapTreeDataToTreeList(list);
        return listResult;
    }

本以为这样就可以了,postman调用queryTreeList接口后发现查询出来的部门树为空,但确实从数据库里查出部门数据了,看来是封装部门树的过程中除了问题。

再战

我们顺着queryTreeList继续往下找,该方法是调用wrapTreeDataToTreeList生成的部门树,顺着wrapTreeDataToTreeList再往下找,可以发现问题出在了findChildren方法里查找顶级部门的逻辑(如下),他的判定方式是判断parentId是否为空,我们要改造成判断部门最大的层级来查找顶级部门。

    private static List<SysDepartTreeModel> findChildren(List<SysDepartTreeModel> recordList,
                                                         List<DepartIdModel> departIdList) {

        List<SysDepartTreeModel> treeList = new ArrayList<>();
        for (int i = 0; i < recordList.size(); i++) {
            SysDepartTreeModel branch = recordList.get(i);
            if (oConvertUtils.isEmpty(branch.getParentId())) {
                treeList.add(branch);
                DepartIdModel departIdModel = new DepartIdModel().convert(branch);
                departIdList.add(departIdModel);
            }
        }
        getGrandChildren(treeList,recordList,departIdList);
        return treeList;
    }

根据orgCode的命名规则,字数越短肯定部门层级越高,所以可以这样来写:

重写findChildren方法
    /**
     * 该方法是找到并封装顶级父类的节点到TreeList集合
     * @param recordList
     * @param departIdList
     * @return
     */
    private static List<SysDepartTreeModel> findChildren(List<SysDepartTreeModel> recordList,
                                                         List<DepartIdModel> departIdList) {

        List<SysDepartTreeModel> treeList = new ArrayList<>();

        //按组织层级排序
        Collections.sort(recordList, new Comparator<SysDepartTreeModel>() {
            @Override
            public int compare(SysDepartTreeModel sysDepartTreeModel, SysDepartTreeModel t1) {
                return sysDepartTreeModel.getOrgCode().length() - t1.getOrgCode().length();
            }
        });
        //最大组织代码长度
        int maxDeptLen = 0;
        if (!recordList.isEmpty()){
            maxDeptLen = recordList.get(0).getOrgCode().length();
        }

        for (int i = 0; i < recordList.size(); i++) {
            SysDepartTreeModel branch = recordList.get(i);
            if (maxDeptLen == branch.getOrgCode().length()) {
                treeList.add(branch);
                DepartIdModel departIdModel = new DepartIdModel().convert(branch);
                departIdList.add(departIdModel);
            }
        }
        getGrandChildren(treeList,recordList,departIdList);
        return treeList;
    }

应用

/queryTreeList接口 当前用户只能查看他所属部门以及下面的所有子部门

@RequestMapping(value = "/queryTreeList", method = RequestMethod.GET)
    public Result<List<SysDepartTreeModel>> queryTreeList(@RequestParam(required = false) String startNode) {
        Result<List<SysDepartTreeModel>> result = new Result<>();
        try {
            //非admin用户只能查询到自己的子部门
            String currentUserOrgCode;
            if (SecurityUtils.getSubject().hasRole("admin")){
                currentUserOrgCode = null;
            }else{
                currentUserOrgCode = (LoginUser) SecurityUtils.getSubject().getPrincipal().getOrgCode();
            }

            List<SysDepartTreeModel> list = sysDepartService.queryTreeList(currentUserOrgCode);
            result.setResult(list);
            result.setSuccess(true);
        } catch (Exception e) {
            log.error(e.getMessage(),e);
        }
        return result;
    }

2 条评论

[/0o0] [..^v^..] [0_0] [T.T] [=3-❤] [❤.❤] [^v^] [-.0] [!- -] [=x=] [→_→] [><] 更多 »
昵称
  1. 冷风吹心 Google Chrome 78 Google Chrome 78 Windows 10 Windows 10

    OrgCode哪里来的

    1. 鸽子 鸽子 Google Chrome 77 Google Chrome 77 Windows 10 Windows 10

      (LoginUser) SecurityUtils.getSubject().getPrincipal().getOrgCode()
      当前登录用户对象里拿到的