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

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

初试:

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

SysDepartServiceImpl.java

    @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是否为空,我们要改造成判断部门最大的层级来查找顶级部门。

FindsDepartsChildrenUtil.java

    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接口 当前用户只能查看他所属部门以及下面的所有子部门

SysDepartController.java

@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{
                LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
                currentUserOrgCode = sysUser.getOrgCode();
            }

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

9 条评论

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

    impl\SysDepartServiceImpl.java
    Error:(44, 8) java: org.jeecg.modules.system.service.impl.SysDepartServiceImpl不是抽象的, 并且未覆盖org.jeecg.modules.system.service.ISysDepartService中的抽象方法queryTreeList()
    Error:(67, 9) java: 方法不会覆盖或实现超类型的方法

    SysDepartController.java
    Error:(112, 107) java: 找不到符号
    符号: 方法 getOrgCode()
    位置: 类 java.lang.Object
    Error:(112, 54) java: 不兼容的类型: org.jeecg.common.system.vo.LoginUser无法转换为java.lang.String
    Error:(115, 73) java: 无法将接口 org.jeecg.modules.system.service.ISysDepartService中的方法 queryTreeList应用到给定类型;
    需要: 没有参数
    找到: java.lang.String
    原因: 实际参数列表和形式参数列表长度不同

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

      LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
      currentUserOrgCode = sysUser.getOrgCode();

      改成这样获取当前用户的orgCode试试

  2. HH Google Chrome 78 Google Chrome 78 Windows 10 Windows 10

    请问这句报错。getOrgCode() 这个过不了呢?哪里来的呢?

    (LoginUser) SecurityUtils.getSubject().getPrincipal().getOrgCode()

    1. 鸽子 鸽子 Mozilla Compatible Mozilla Compatible iPhone iOS 13.3 iPhone iOS 13.3

      说明没有拿到当前登陆的用户对象

    2. 鸽子 鸽子 Mozilla Compatible Mozilla Compatible iPad iOS 13.3 iPad iOS 13.3

      报错日志发一下

      1. HH Google Chrome 78 Google Chrome 78 Windows 10 Windows 10

        44行
        public class SysDepartServiceImpl extends ServiceImpl implements ISysDepartService {

        67行
        @Override

        112行
        currentUserOrgCode = (LoginUser) SecurityUtils.getSubject().getPrincipal().getOrgCode();

        115行
        List list = sysDepartService.queryTreeList(currentUserOrgCode);

        112行这个显示红字警告,提示 cannot resolve method ‘getOrgCode()’

        getOrgCode

        1. HH Google Chrome 78 Google Chrome 78 Windows 10 Windows 10

          也。我发的日志啷个不在了呢?

  3. 冷风吹心 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()
      当前登录用户对象里拿到的