diff --git a/flyfish-user/src/main/java/com/flyfish/framework/domain/DepartmentQo.java b/flyfish-user/src/main/java/com/flyfish/framework/domain/DepartmentQo.java index 4498165..24ccaa7 100644 --- a/flyfish-user/src/main/java/com/flyfish/framework/domain/DepartmentQo.java +++ b/flyfish-user/src/main/java/com/flyfish/framework/domain/DepartmentQo.java @@ -1,7 +1,7 @@ package com.flyfish.framework.domain; -import com.flyfish.framework.domain.tree.TreeQo; import com.flyfish.framework.domain.po.Department; +import com.flyfish.framework.domain.tree.TreeQo; import lombok.Getter; import lombok.Setter; @@ -14,4 +14,8 @@ import lombok.Setter; @Setter public class DepartmentQo extends TreeQo { + /** + * 额外的参数,仅针对getList指定,一般用于回显父级部门 + */ + private String additional; } diff --git a/flyfish-user/src/main/java/com/flyfish/framework/domain/RoleQo.java b/flyfish-user/src/main/java/com/flyfish/framework/domain/RoleQo.java index 94ff3b1..c4b4b72 100644 --- a/flyfish-user/src/main/java/com/flyfish/framework/domain/RoleQo.java +++ b/flyfish-user/src/main/java/com/flyfish/framework/domain/RoleQo.java @@ -6,6 +6,8 @@ import com.flyfish.framework.domain.po.Role; import lombok.Getter; import lombok.Setter; +import java.util.List; + /** * 角色查询实体 * @@ -15,10 +17,21 @@ import lombok.Setter; @Setter public class RoleQo extends NameLikeQo { + /** + * 是否仅管理员可选 + */ private Boolean admin; + /** + * 是否系统内置 + */ private Boolean system; + /** + * 额外的查询拼接,仅用于getList,用于查询回显 + */ + private List additions; + @Override public CriteriaBuilder criteriaBuilder() { return super.criteriaBuilder().with("admin", "system"); diff --git a/flyfish-user/src/main/java/com/flyfish/framework/service/DepartmentService.java b/flyfish-user/src/main/java/com/flyfish/framework/service/DepartmentService.java index 8b2827e..86cb854 100644 --- a/flyfish-user/src/main/java/com/flyfish/framework/service/DepartmentService.java +++ b/flyfish-user/src/main/java/com/flyfish/framework/service/DepartmentService.java @@ -10,6 +10,7 @@ import com.flyfish.framework.service.impl.BaseReactiveServiceImpl; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.BooleanUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.data.mongodb.core.ReactiveMongoOperations; import org.springframework.data.mongodb.core.aggregation.Aggregation; import org.springframework.data.mongodb.core.query.Criteria; @@ -19,10 +20,14 @@ import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import javax.annotation.Resource; +import java.util.ArrayList; import java.util.Collection; +import java.util.HashSet; import java.util.Set; import java.util.stream.Collectors; +import static org.apache.commons.lang3.ObjectUtils.defaultIfNull; + /** * 部门服务 * @@ -65,7 +70,9 @@ public class DepartmentService extends BaseReactiveServiceImpl { */ private Mono getMinDepthInIds(Collection codes) { return reactiveMongoOperations.aggregate( - Aggregation.newAggregation(Aggregation.group().min("depth").as("depth")), + Aggregation.newAggregation( + Aggregation.match(Criteria.where("_id").in(codes)), + Aggregation.group().min("depth").as("depth")), Department.class, Department.class) .single() .map(TreeDomain::getDepth); @@ -104,6 +111,12 @@ public class DepartmentService extends BaseReactiveServiceImpl { if (null == qo.getParentId() && CollectionUtils.isEmpty(qo.getParentIds())) { qo.setIds(userDetails.getVisibleDeparts()); } + // 如果存在额外的id,追加记录 + if (StringUtils.isNotBlank(qo.getAdditional())) { + Collection ids = defaultIfNull(qo.getIds(), new HashSet<>()); + ids.add(qo.getAdditional()); + qo.setIds(ids); + } return mono; } } diff --git a/flyfish-user/src/main/java/com/flyfish/framework/service/PermissionService.java b/flyfish-user/src/main/java/com/flyfish/framework/service/PermissionService.java index 9e7ad98..81d2424 100644 --- a/flyfish-user/src/main/java/com/flyfish/framework/service/PermissionService.java +++ b/flyfish-user/src/main/java/com/flyfish/framework/service/PermissionService.java @@ -5,6 +5,10 @@ import com.flyfish.framework.domain.po.Permission; import com.flyfish.framework.service.impl.BaseReactiveServiceImpl; import org.springframework.stereotype.Service; +/** + * 权限服务 + * @author wangyu + */ @Service public class PermissionService extends BaseReactiveServiceImpl { diff --git a/flyfish-user/src/main/java/com/flyfish/framework/service/RoleService.java b/flyfish-user/src/main/java/com/flyfish/framework/service/RoleService.java index 76be54a..4dda8cb 100644 --- a/flyfish-user/src/main/java/com/flyfish/framework/service/RoleService.java +++ b/flyfish-user/src/main/java/com/flyfish/framework/service/RoleService.java @@ -2,16 +2,29 @@ package com.flyfish.framework.service; import com.flyfish.framework.domain.PermissionQo; +import com.flyfish.framework.domain.RoleQo; +import com.flyfish.framework.domain.base.Domain; +import com.flyfish.framework.domain.base.IUser; +import com.flyfish.framework.domain.base.Qo; import com.flyfish.framework.domain.po.Permission; import com.flyfish.framework.domain.po.Role; import com.flyfish.framework.enums.RoleType; +import com.flyfish.framework.enums.UserType; import com.flyfish.framework.service.impl.BaseReactiveServiceImpl; import lombok.RequiredArgsConstructor; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.BooleanUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.data.mongodb.core.ReactiveMongoOperations; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; import org.springframework.stereotype.Service; +import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import java.util.Collections; +import java.util.Set; +import java.util.stream.Collectors; @Service @RequiredArgsConstructor @@ -19,6 +32,8 @@ public class RoleService extends BaseReactiveServiceImpl { private final PermissionService permissionService; + private final ReactiveMongoOperations reactiveMongoOperations; + /** * 如果是管理员,设置拥有所有权限 * @@ -46,4 +61,42 @@ public class RoleService extends BaseReactiveServiceImpl { return super.create(role); }); } + + /** + * 获取创建的主键集合 + * + * @param user 用户 + * @return 结果 + */ + private Mono> getOwnedIds(IUser user) { + Query query = Query.query(Criteria.where("creatorId").is(user.getId())); + query.fields().include("_id"); + return reactiveMongoOperations.find(query, Role.class).map(Domain::getId).collect(Collectors.toSet()); + } + + /** + * 查询时,根据用户过滤可见项 + * + * @param query 查询 + * @return 结果 + */ + @Override + public Flux getList(Qo query) { + // 基于创建者进行筛选 + if (query instanceof RoleQo) { + IUser user = query.getUser(); + if (user.getType() != UserType.SUPER_ADMIN) { + return getOwnedIds(user) + .flatMapMany(ids -> { + RoleQo qo = (RoleQo) query; + qo.setIds(ids); + if (CollectionUtils.isEmpty(qo.getAdditions())) { + qo.getIds().addAll(qo.getAdditions()); + } + return super.getList(qo); + }); + } + } + return super.getList(query); + } } diff --git a/flyfish-web/src/main/java/com/flyfish/framework/controller/reactive/ReactiveTreeController.java b/flyfish-web/src/main/java/com/flyfish/framework/controller/reactive/ReactiveTreeController.java index b986190..7980a42 100644 --- a/flyfish-web/src/main/java/com/flyfish/framework/controller/reactive/ReactiveTreeController.java +++ b/flyfish-web/src/main/java/com/flyfish/framework/controller/reactive/ReactiveTreeController.java @@ -12,6 +12,7 @@ import org.springframework.web.bind.annotation.PathVariable; import reactor.core.publisher.Mono; import java.util.Collections; +import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -69,9 +70,17 @@ public abstract class ReactiveTreeController, Q extends List roots = filtered.stream() .filter(item -> null != item && TreeDomain.ROOT.equals(item.getParentId())) .collect(Collectors.toList()); - // 不是从根开始,直接查出 + // 不是从根开始,找到最小深度结果,直接放在根下 if (CollectionUtils.isEmpty(roots)) { - return filtered; + int depth = filtered.stream() + .min(Comparator.comparing(TreeDomain::getDepth)) + .map(TreeDomain::getDepth) + .orElse(0); + roots = filtered.stream().filter(d -> d.getDepth() == depth).collect(Collectors.toList()); + // 如果仍然为空,舍弃,直接返回 + if (CollectionUtils.isEmpty(roots)) { + return filtered; + } } // 第四步,根据父id的map填充根tree return applyChildren(roots, group);