项目场景:
查询相关用户以及放入对应的部门、接口优化
问题描述
用户在进入界面,点击弹窗,查看下拉框的相关用户以及对应的用户。
原因分析:
接口执行过长,用户界面展示的内容为空。
解决方案:
优化接口:
1、第一个,查询是根据单个roleKey查询,查询条件只需要支持数组,传数组进去查一次。
2、下面一个,就是先循环用户,取到部门id数组,然后通过部门id数组,查询一次,把部门全部查询出来。
3、再循环一次部门,通过部门id建立key,map、再循环用户,通过用户的部门id找到部门,然后把部门放到用户里面。
@Override
public List<SysUser> getUserByRole(SysUser user) {
String roleCode = resultRole;
String[] roleKeyObj = roleCode.split(",");
List<Long> list = new ArrayList<>();
List<SysRole> roleByKeys = roleMapper.getRoleByKeys(roleKeyObj);
roleByKeys.forEach(item->{
list.add(item.getRoleId());
});
if (list.size() > 0) {
Long[] roleIds = list.stream().toArray(Long[]::new);
user.setRoleIds(roleIds);
}
List<SysUser> userList = userMapper.getUserListByRoleId(user);
List<Long> deptIdList = new ArrayList<>();
if (userList.size() > 0) {
userList.forEach(item->{
// System.out.println("item.getNickName() = " + item.getNickName());
if(item.getDeptId() !=null){
deptIdList.add(item.getDeptId());
}
});
// 以部门id设置key,value是部门对象
HashMap<Long, SysDept> SysDeptHashMap = new HashMap<>();
if(deptIdList.size()>0){
Long[] deptIds = deptIdList.stream().toArray(Long[]::new);
List<SysDept> sysDepts = deptMapper.selectDeptByIds(deptIds);
sysDepts.forEach(item->{
SysDeptHashMap.put(item.getDeptId(),item);
});
}
// 判断用户的部门id是否一致,则将部门放入用户对象
for(SysUser sysUser:userList){
if(sysUser.getDeptId() !=null){
if(SysDeptHashMap.containsKey(sysUser.getDeptId())){
SysDept sysDept = SysDeptHashMap.get(sysUser.getDeptId());
sysUser.setDept(sysDept);
}
}
}
}
return userList;
}