feat:优化逻辑,实现预期目标
This commit is contained in:
parent
975526b811
commit
2b995f5d56
@ -6,6 +6,8 @@ import com.flyfish.framework.domain.AdminUserDetails;
|
|||||||
import com.flyfish.framework.domain.DepartmentQo;
|
import com.flyfish.framework.domain.DepartmentQo;
|
||||||
import com.flyfish.framework.domain.po.Department;
|
import com.flyfish.framework.domain.po.Department;
|
||||||
import com.flyfish.framework.enums.UserType;
|
import com.flyfish.framework.enums.UserType;
|
||||||
|
import com.flyfish.framework.service.DepartmentService;
|
||||||
|
import com.flyfish.framework.utils.DepartUtils;
|
||||||
import com.flyfish.framework.utils.UserUtils;
|
import com.flyfish.framework.utils.UserUtils;
|
||||||
import org.apache.commons.collections4.CollectionUtils;
|
import org.apache.commons.collections4.CollectionUtils;
|
||||||
import org.springframework.security.core.context.ReactiveSecurityContextHolder;
|
import org.springframework.security.core.context.ReactiveSecurityContextHolder;
|
||||||
@ -17,6 +19,7 @@ import reactor.core.publisher.Mono;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 部分或者校区controller
|
* 部分或者校区controller
|
||||||
@ -39,8 +42,16 @@ public class DepartmentController extends ReactiveTreeController<Department, Dep
|
|||||||
if (details.getType() == UserType.SUPER_ADMIN) {
|
if (details.getType() == UserType.SUPER_ADMIN) {
|
||||||
return reactiveService.getAll();
|
return reactiveService.getAll();
|
||||||
}
|
}
|
||||||
if (CollectionUtils.isNotEmpty(details.getVisibleDeparts())) {
|
if (CollectionUtils.isNotEmpty(details.getDepartments())) {
|
||||||
return reactiveService.getByIds(new ArrayList<>(details.getVisibleDeparts()));
|
DepartmentService departmentService = getService();
|
||||||
|
Set<String> departs = DepartUtils.mergeDeparts(details.getDepartments());
|
||||||
|
return departmentService.getSubCodes(departs)
|
||||||
|
.flatMapMany(codes -> {
|
||||||
|
List<String> merged = new ArrayList<>();
|
||||||
|
merged.addAll(codes);
|
||||||
|
merged.addAll(departs);
|
||||||
|
return departmentService.getByIds(merged);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
return Flux.empty();
|
return Flux.empty();
|
||||||
})
|
})
|
||||||
|
@ -155,7 +155,10 @@ public class AdminUserDetails implements UserDetails, IUser, AuthorizedUserDetai
|
|||||||
@Override
|
@Override
|
||||||
public String getAuthority() {
|
public String getAuthority() {
|
||||||
if (StringUtils.isBlank(authority) && null != departments) {
|
if (StringUtils.isBlank(authority) && null != departments) {
|
||||||
authority = departments.stream().findFirst().map(Domain::getId).orElse(null);
|
authority = departments.stream()
|
||||||
|
.min(Comparator.comparing(Department::getDepth))
|
||||||
|
.map(Domain::getId)
|
||||||
|
.orElse(null);
|
||||||
}
|
}
|
||||||
return authority;
|
return authority;
|
||||||
}
|
}
|
||||||
|
@ -2,14 +2,16 @@ package com.flyfish.framework.service;
|
|||||||
|
|
||||||
import com.flyfish.framework.domain.AdminUserDetails;
|
import com.flyfish.framework.domain.AdminUserDetails;
|
||||||
import com.flyfish.framework.domain.DepartmentQo;
|
import com.flyfish.framework.domain.DepartmentQo;
|
||||||
import com.flyfish.framework.domain.authorized.AuthorizedUserDetails;
|
|
||||||
import com.flyfish.framework.domain.base.Qo;
|
import com.flyfish.framework.domain.base.Qo;
|
||||||
import com.flyfish.framework.domain.po.Department;
|
import com.flyfish.framework.domain.po.Department;
|
||||||
|
import com.flyfish.framework.domain.tree.TreeDomain;
|
||||||
import com.flyfish.framework.enums.UserType;
|
import com.flyfish.framework.enums.UserType;
|
||||||
import com.flyfish.framework.service.impl.BaseReactiveServiceImpl;
|
import com.flyfish.framework.service.impl.BaseReactiveServiceImpl;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.collections4.CollectionUtils;
|
import org.apache.commons.collections4.CollectionUtils;
|
||||||
import org.apache.commons.lang3.BooleanUtils;
|
import org.apache.commons.lang3.BooleanUtils;
|
||||||
import org.springframework.data.mongodb.core.ReactiveMongoOperations;
|
import org.springframework.data.mongodb.core.ReactiveMongoOperations;
|
||||||
|
import org.springframework.data.mongodb.core.aggregation.Aggregation;
|
||||||
import org.springframework.data.mongodb.core.query.Criteria;
|
import org.springframework.data.mongodb.core.query.Criteria;
|
||||||
import org.springframework.data.mongodb.core.query.Query;
|
import org.springframework.data.mongodb.core.query.Query;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
@ -17,7 +19,7 @@ import reactor.core.publisher.Flux;
|
|||||||
import reactor.core.publisher.Mono;
|
import reactor.core.publisher.Mono;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.util.List;
|
import java.util.Collection;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@ -27,6 +29,7 @@ import java.util.stream.Collectors;
|
|||||||
* @author wangyu
|
* @author wangyu
|
||||||
*/
|
*/
|
||||||
@Service
|
@Service
|
||||||
|
@Slf4j
|
||||||
public class DepartmentService extends BaseReactiveServiceImpl<Department> {
|
public class DepartmentService extends BaseReactiveServiceImpl<Department> {
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
@ -51,10 +54,36 @@ public class DepartmentService extends BaseReactiveServiceImpl<Department> {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public Flux<Department> getList(Qo<Department> query) {
|
public Flux<Department> getList(Qo<Department> query) {
|
||||||
|
return convertQo(query).flatMapMany(super::getList);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 在一批编码中找到深度最小的值
|
||||||
|
*
|
||||||
|
* @param codes 编码们
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
private Mono<Integer> getMinDepthInIds(Collection<String> codes) {
|
||||||
|
return reactiveMongoOperations.aggregate(
|
||||||
|
Aggregation.newAggregation(Aggregation.group().min("depth").as("depth")),
|
||||||
|
Department.class, Department.class)
|
||||||
|
.single()
|
||||||
|
.map(TreeDomain::getDepth);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换qo,经过可见部门转换,更加私密
|
||||||
|
*
|
||||||
|
* @param query 查询
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
private Mono<Qo<Department>> convertQo(Qo<Department> query) {
|
||||||
if (query instanceof DepartmentQo) {
|
if (query instanceof DepartmentQo) {
|
||||||
DepartmentQo qo = (DepartmentQo) query;
|
DepartmentQo qo = (DepartmentQo) query;
|
||||||
// 如果是非管理员
|
// 如果是非管理员
|
||||||
if (qo.getUser().getType() != UserType.SUPER_ADMIN) {
|
if (qo.getUser().getType() != UserType.SUPER_ADMIN) {
|
||||||
|
// 占位,包装查询实体
|
||||||
|
Mono<Qo<Department>> mono = Mono.just(qo);
|
||||||
// 使用列表内的部门作为条件
|
// 使用列表内的部门作为条件
|
||||||
AdminUserDetails userDetails = (AdminUserDetails) query.getUser();
|
AdminUserDetails userDetails = (AdminUserDetails) query.getUser();
|
||||||
// 查询根节点下的节点
|
// 查询根节点下的节点
|
||||||
@ -63,18 +92,21 @@ public class DepartmentService extends BaseReactiveServiceImpl<Department> {
|
|||||||
qo.setIds(userDetails.getVisibleDeparts());
|
qo.setIds(userDetails.getVisibleDeparts());
|
||||||
// 不递归,指定深度,保证单层
|
// 不递归,指定深度,保证单层
|
||||||
if (BooleanUtils.isNotTrue(qo.getRecursive())) {
|
if (BooleanUtils.isNotTrue(qo.getRecursive())) {
|
||||||
// 指定深度
|
// 指定深度,从可见的列表中获取
|
||||||
int maxDepth = userDetails.getDepartments().stream().max((a, b) -> a.getDepth() - b.getDepth())
|
mono = getMinDepthInIds(userDetails.getVisibleDeparts())
|
||||||
.map(Department::getDepth)
|
.map(depth -> {
|
||||||
.orElse(0);
|
qo.setDepth(depth);
|
||||||
qo.setDepth(maxDepth);
|
return qo;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// 父id均为空,返回所有可见部门即可
|
||||||
if (null == qo.getParentId() && CollectionUtils.isEmpty(qo.getParentIds())) {
|
if (null == qo.getParentId() && CollectionUtils.isEmpty(qo.getParentIds())) {
|
||||||
qo.setIds(userDetails.getVisibleDeparts());
|
qo.setIds(userDetails.getVisibleDeparts());
|
||||||
}
|
}
|
||||||
|
return mono;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return super.getList(query);
|
return Mono.just(query);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,7 @@ import com.flyfish.framework.utils.CopyUtils;
|
|||||||
import com.flyfish.framework.utils.DepartUtils;
|
import com.flyfish.framework.utils.DepartUtils;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.apache.commons.collections4.CollectionUtils;
|
import org.apache.commons.collections4.CollectionUtils;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.springframework.security.core.userdetails.UserDetails;
|
import org.springframework.security.core.userdetails.UserDetails;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import reactor.core.publisher.Mono;
|
import reactor.core.publisher.Mono;
|
||||||
@ -52,8 +53,11 @@ public class UserDetailsConverter {
|
|||||||
Set<Role.Authority> authorities = user.getRoles().stream()
|
Set<Role.Authority> authorities = user.getRoles().stream()
|
||||||
.flatMap(role -> null == role.getAuthorities() ? Stream.empty() : role.getAuthorities().stream())
|
.flatMap(role -> null == role.getAuthorities() ? Stream.empty() : role.getAuthorities().stream())
|
||||||
.collect(Collectors.toSet());
|
.collect(Collectors.toSet());
|
||||||
|
// 默认使用用户当前选择的权限进行查询
|
||||||
|
String authority = user.getAuthority();
|
||||||
// 根据权限组装查询条件
|
// 根据权限组装查询条件
|
||||||
Set<String> departs = DepartUtils.mergeDeparts(user.getDepartments());
|
Set<String> departs = StringUtils.isNotBlank(authority) ? Collections.singleton(authority) :
|
||||||
|
DepartUtils.mergeDeparts(user.getDepartments());
|
||||||
// 查询所有子部门id
|
// 查询所有子部门id
|
||||||
return departmentService.getSubCodes(departs)
|
return departmentService.getSubCodes(departs)
|
||||||
.map(codes -> {
|
.map(codes -> {
|
||||||
|
Loading…
Reference in New Issue
Block a user