有这么一个需求,当前用户只能查看他所属部门以及下面的所有子部门,原生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;
    }
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
原因: 实际参数列表和形式参数列表长度不同
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
currentUserOrgCode = sysUser.getOrgCode();
改成这样获取当前用户的orgCode试试
请问这句报错。getOrgCode() 这个过不了呢?哪里来的呢?
(LoginUser) SecurityUtils.getSubject().getPrincipal().getOrgCode()
说明没有拿到当前登陆的用户对象
报错日志发一下
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
也。我发的日志啷个不在了呢?
OrgCode哪里来的
(LoginUser) SecurityUtils.getSubject().getPrincipal().getOrgCode()
当前登录用户对象里拿到的