diff --git a/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/relation/LinkedRelations.java b/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/relation/LinkedRelations.java index 94b975ae1..3090bd328 100644 --- a/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/relation/LinkedRelations.java +++ b/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/relation/LinkedRelations.java @@ -5,7 +5,7 @@ import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; -public interface LinkedRelations { +public interface LinkedRelations { /** * 获取指定方向以及维度的关系链,如: 我是李四的经理,张三是我的经理 @@ -135,9 +135,19 @@ public interface LinkedRelations { return stream().collect(Collectors.toList()); } + /** + * 获取所有的关系目标标识,通常是人员的id + * + * @return 人员id + */ + default List allTarget() { + return stream().map(Relation::getTarget).collect(Collectors.toList()); + } + /** * @return 全部关系信息的stream */ Stream stream(); + C deep(); } diff --git a/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/relation/PersonRelations.java b/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/relation/PersonRelations.java index 19fbd17bd..2be1835da 100644 --- a/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/relation/PersonRelations.java +++ b/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/relation/PersonRelations.java @@ -12,6 +12,4 @@ public interface PersonRelations extends LinkedRelations { */ OrgRelations org(); - - } diff --git a/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/relation/RelationsManager.java b/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/relation/RelationsManager.java index 3c93d8f00..6714e46dd 100644 --- a/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/relation/RelationsManager.java +++ b/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/relation/RelationsManager.java @@ -4,6 +4,16 @@ import java.util.List; public interface RelationsManager { + /** + * 根据人员id获取人员的关系链 + *
+     *     PersonRelations me = getPersonRelationsByPersonId(personId);
+     *     me.department().relations("总监").all()
+     * 
+ * + * @param personId 人员id + * @return 人员关系链 + */ PersonRelations getPersonRelationsByPersonId(String personId); PersonRelations getPersonRelationsByUserId(String userId); diff --git a/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-local/src/main/java/org/hswebframework/web/service/organizational/simple/relations/DefaultDepartmentRelations.java b/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-local/src/main/java/org/hswebframework/web/service/organizational/simple/relations/DefaultDepartmentRelations.java index 4486ee0b9..6699ce887 100644 --- a/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-local/src/main/java/org/hswebframework/web/service/organizational/simple/relations/DefaultDepartmentRelations.java +++ b/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-local/src/main/java/org/hswebframework/web/service/organizational/simple/relations/DefaultDepartmentRelations.java @@ -75,7 +75,6 @@ public class DefaultDepartmentRelations extends DefaultLinkedRelations relationStream = positions.stream() .flatMap(position -> { List personEntities = cache.get(position.getId()); @@ -118,15 +116,17 @@ public class DefaultDepartmentRelations extends DefaultLinkedRelations> positionSupplier = Lazy.val(() -> { List departmentId = getAllDepartmentId(); if (CollectionUtils.isEmpty(departmentId)) { @@ -152,6 +153,7 @@ public class DefaultDepartmentRelations extends DefaultLinkedRelations positions; }, Supplier.class); + //获取所有的部门 private Supplier> allDepartmentId = createLazyIdSupplier(() -> { Set departmentId = new HashSet<>(targetIdSupplier.get()); if (CollectionUtils.isEmpty(departmentId)) { @@ -168,7 +170,6 @@ public class DefaultDepartmentRelations extends DefaultLinkedRelations implements Linked case ALL: query .nest() - .nest() - .is("relationTypeFrom", dimension).is("relationId", relation) - .end() + .nest() + .is("relationTypeFrom", dimension).is("relationId", relation) + .end() .or() - .nest() - .is("relationTypeTo", dimension).is("relationId", relation) - .end() + .nest() + .is("relationTypeTo", dimension).is("relationId", relation) + .end() .end(); break; @@ -121,6 +119,17 @@ public class DefaultLinkedRelations implements Linked }); } + @Override + public C deep() { + if (this.getClass() != DefaultLinkedRelations.class) { + throw new UnsupportedOperationException("子类未实现deep方法"); + } + return (C) new DefaultLinkedRelations(serviceContext, () -> all() + .stream() + .map(Relation::getTarget) + .collect(Collectors.toList())); + } + @Override public Stream stream() { return relationStream(targetIdSupplier); diff --git a/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-local/src/main/java/org/hswebframework/web/service/organizational/simple/relations/DefaultOrgRelations.java b/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-local/src/main/java/org/hswebframework/web/service/organizational/simple/relations/DefaultOrgRelations.java index 105d3bfe8..a4ed8f65e 100644 --- a/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-local/src/main/java/org/hswebframework/web/service/organizational/simple/relations/DefaultOrgRelations.java +++ b/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-local/src/main/java/org/hswebframework/web/service/organizational/simple/relations/DefaultOrgRelations.java @@ -3,6 +3,7 @@ package org.hswebframework.web.service.organizational.simple.relations; import org.hswebframework.web.entity.organizational.DepartmentEntity; import org.hswebframework.web.organizational.authorization.relation.DepartmentRelations; import org.hswebframework.web.organizational.authorization.relation.OrgRelations; +import org.hswebframework.web.organizational.authorization.relation.Relation; import java.util.List; import java.util.function.Supplier; @@ -34,9 +35,14 @@ public class DefaultOrgRelations extends DefaultLinkedRelations im public DepartmentRelations department() { return new DefaultDepartmentRelations(serviceContext, () -> serviceContext .getDepartmentService() - .selectByOrgIds(targetIdSupplier.get(),includeChildren,includeParents) + .selectByOrgIds(targetIdSupplier.get(), includeChildren, includeParents) .stream() .map(DepartmentEntity::getId) .collect(Collectors.toList())); } + + @Override + public OrgRelations deep() { + return new DefaultOrgRelations(serviceContext, () -> stream().map(Relation::getTarget).collect(Collectors.toList())); + } } diff --git a/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-local/src/main/java/org/hswebframework/web/service/organizational/simple/relations/DefaultPersonRelations.java b/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-local/src/main/java/org/hswebframework/web/service/organizational/simple/relations/DefaultPersonRelations.java index ec5108eac..140709cf2 100644 --- a/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-local/src/main/java/org/hswebframework/web/service/organizational/simple/relations/DefaultPersonRelations.java +++ b/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-local/src/main/java/org/hswebframework/web/service/organizational/simple/relations/DefaultPersonRelations.java @@ -1,13 +1,10 @@ package org.hswebframework.web.service.organizational.simple.relations; import org.hswebframework.web.organizational.authorization.relation.*; -import org.hswebframework.web.service.authorization.UserService; -import org.hswebframework.web.service.organizational.PersonService; -import org.hswebframework.web.service.organizational.RelationInfoService; -import java.util.Collections; import java.util.List; import java.util.function.Supplier; +import java.util.stream.Collectors; public class DefaultPersonRelations extends DefaultLinkedRelations implements PersonRelations { @@ -17,11 +14,23 @@ public class DefaultPersonRelations extends DefaultLinkedRelations getAllOrg() { - return serviceContext.getPersonService().selectAllOrgId(targetIdSupplier.get()); + return serviceContext + .getPersonService() + .selectAllOrgId(targetIdSupplier.get()); } protected List getAllDepartment() { - return serviceContext.getPersonService().selectAllDepartmentId(targetIdSupplier.get()); + return serviceContext + .getPersonService() + .selectAllDepartmentId(targetIdSupplier.get()); + } + + @Override + public PersonRelations deep() { + return new DefaultPersonRelations(serviceContext, () -> all() + .stream() + .map(Relation::getTarget) + .collect(Collectors.toList())); } @Override diff --git a/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-starter/src/test/java/org/hswebframework/web/starter/organizational/RelationsManagerTests.groovy b/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-starter/src/test/java/org/hswebframework/web/starter/organizational/RelationsManagerTests.groovy index af9743e5a..618fd9574 100644 --- a/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-starter/src/test/java/org/hswebframework/web/starter/organizational/RelationsManagerTests.groovy +++ b/hsweb-system/hsweb-system-organizational/hsweb-system-organizational-starter/src/test/java/org/hswebframework/web/starter/organizational/RelationsManagerTests.groovy @@ -174,7 +174,6 @@ class RelationsManagerTests extends Specification { .relations("总监") .all() - def orgRelationList = pre .org() .andParents() diff --git a/hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dimension/parser/RelationCandidateDimensionParserStrategy.java b/hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dimension/parser/RelationCandidateDimensionParserStrategy.java index 74e8e098f..7e9654f96 100644 --- a/hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dimension/parser/RelationCandidateDimensionParserStrategy.java +++ b/hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dimension/parser/RelationCandidateDimensionParserStrategy.java @@ -5,7 +5,8 @@ import lombok.extern.slf4j.Slf4j; import org.hswebframework.expands.script.engine.DynamicScriptEngine; import org.hswebframework.expands.script.engine.DynamicScriptEngineFactory; import org.hswebframework.web.Maps; -import org.hswebframework.web.commons.entity.GenericEntity; +import org.hswebframework.web.entity.authorization.UserEntity; +import org.hswebframework.web.entity.organizational.PersonEntity; import org.hswebframework.web.organizational.authorization.relation.PersonRelations; import org.hswebframework.web.organizational.authorization.relation.Relation; import org.hswebframework.web.organizational.authorization.relation.RelationsManager; @@ -81,8 +82,10 @@ public class RelationCandidateDimensionParserStrategy implements CandidateDimens return (String) o; } else if (o instanceof Relation) { Object target = ((Relation) o).getTargetObject(); - if (target instanceof GenericEntity) { - return String.valueOf(((GenericEntity) target).getId()); + if (target instanceof PersonEntity) { + return ((PersonEntity) target).getUserId(); + } else if (target instanceof UserEntity) { + return ((UserEntity) target).getId(); } else { return ((Relation) o).getRelation(); }