有这么一个需求,当前用户只能查看他所属部门以及下面的所有子部门,原生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()
当前登录用户对象里拿到的