Browse Source

优化关系

zhouhao 6 years ago
parent
commit
4f9ee89b78
9 changed files with 79 additions and 29 deletions
  1. 11 1
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/relation/LinkedRelations.java
  2. 0 2
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/relation/PersonRelations.java
  3. 10 0
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/relation/RelationsManager.java
  4. 11 5
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-local/src/main/java/org/hswebframework/web/service/organizational/simple/relations/DefaultDepartmentRelations.java
  5. 19 10
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-local/src/main/java/org/hswebframework/web/service/organizational/simple/relations/DefaultLinkedRelations.java
  6. 7 1
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-local/src/main/java/org/hswebframework/web/service/organizational/simple/relations/DefaultOrgRelations.java
  7. 15 6
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-local/src/main/java/org/hswebframework/web/service/organizational/simple/relations/DefaultPersonRelations.java
  8. 0 1
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-starter/src/test/java/org/hswebframework/web/starter/organizational/RelationsManagerTests.groovy
  9. 6 3
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dimension/parser/RelationCandidateDimensionParserStrategy.java

+ 11 - 1
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<C extends LinkedRelations>  {
+public interface LinkedRelations<C extends LinkedRelations> {
 
     /**
      * 获取指定方向以及维度的关系链,如: 我是李四的经理,张三是我的经理
@@ -135,9 +135,19 @@ public interface LinkedRelations<C extends LinkedRelations>  {
         return stream().collect(Collectors.toList());
     }
 
+    /**
+     * 获取所有的关系目标标识,通常是人员的id
+     *
+     * @return 人员id
+     */
+    default List<String> allTarget() {
+        return stream().map(Relation::getTarget).collect(Collectors.toList());
+    }
+
     /**
      * @return 全部关系信息的stream
      */
     Stream<Relation> stream();
 
+    C deep();
 }

+ 0 - 2
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<PersonRelations> {
      */
     OrgRelations org();
 
-
-
 }

+ 10 - 0
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获取人员的关系链
+     * <pre>
+     *     PersonRelations me = getPersonRelationsByPersonId(personId);
+     *     me.department().relations("总监").all()
+     * </pre>
+     *
+     * @param personId 人员id
+     * @return 人员关系链
+     */
     PersonRelations getPersonRelationsByPersonId(String personId);
 
     PersonRelations getPersonRelationsByUserId(String userId);

+ 11 - 5
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<Departmen
     @Override
     public DepartmentRelations not(String property, Object value) {
         departmentQuery.not(property, value);
-//        positionQuery.not(property, value);
 
         return super.not(property, value);
     }
@@ -83,7 +82,6 @@ public class DefaultDepartmentRelations extends DefaultLinkedRelations<Departmen
     @Override
     public DepartmentRelations is(String property, Object value) {
         departmentQuery.is(property, value);
-//        positionQuery.is(property, value);
         return super.is(property, value);
     }
 
@@ -104,7 +102,7 @@ public class DefaultDepartmentRelations extends DefaultLinkedRelations<Departmen
         if (CollectionUtils.isEmpty(positionIdList)) {
             return super.relationStream(allDepartmentId);
         }
-
+        //将岗位里的人员转为关系信息
         Stream<Relation> relationStream = positions.stream()
                 .flatMap(position -> {
                     List<PersonEntity> personEntities = cache.get(position.getId());
@@ -118,15 +116,17 @@ public class DefaultDepartmentRelations extends DefaultLinkedRelations<Departmen
                                 relation.setName(position.getName());
                                 relation.setTarget(person.getId());
                                 relation.setTargetObject(person);
+                                //固定方向,因为从逻辑都是某人是某部门的某岗位
                                 relation.setDirection(Relation.Direction.REVERSE);
+                                //维度默认为岗位
                                 relation.setDimension(Relation.TYPE_POSITION);
+                                //关系标识为岗位id
                                 relation.setRelation(position.getId());
                                 return (Relation) relation;
                             });
 
                 });
 
-
         return Stream.concat(relationStream, super.relationStream(allDepartmentId));
     }
 
@@ -135,6 +135,7 @@ public class DefaultDepartmentRelations extends DefaultLinkedRelations<Departmen
     }
 
     @SuppressWarnings("all")
+    //获取所有的岗位
     private Supplier<List<PositionEntity>> positionSupplier = Lazy.val(() -> {
         List<String> departmentId = getAllDepartmentId();
         if (CollectionUtils.isEmpty(departmentId)) {
@@ -152,6 +153,7 @@ public class DefaultDepartmentRelations extends DefaultLinkedRelations<Departmen
         return (Supplier) () -> positions;
     }, Supplier.class);
 
+    //获取所有的部门
     private Supplier<List<String>> allDepartmentId = createLazyIdSupplier(() -> {
         Set<String> departmentId = new HashSet<>(targetIdSupplier.get());
         if (CollectionUtils.isEmpty(departmentId)) {
@@ -168,7 +170,6 @@ public class DefaultDepartmentRelations extends DefaultLinkedRelations<Departmen
         }
         //包含子级
         if (includeChildren) {
-
             allChildren = departmentId.stream()
                     .map(serviceContext.getDepartmentService()::selectAllChildNode)
                     .flatMap(Collection::stream)
@@ -227,6 +228,11 @@ public class DefaultDepartmentRelations extends DefaultLinkedRelations<Departmen
                 .collect(Collectors.toList());
     }
 
+    @Override
+    public DepartmentRelations deep() {
+        return new DefaultDepartmentRelations(serviceContext, allDepartmentId);
+    }
+
     @Override
     @SuppressWarnings("unchecked")
     public PersonRelations persons() {

+ 19 - 10
hsweb-system/hsweb-system-organizational/hsweb-system-organizational-local/src/main/java/org/hswebframework/web/service/organizational/simple/relations/DefaultLinkedRelations.java

@@ -5,13 +5,11 @@ import org.hswebframework.ezorm.core.NestConditional;
 import org.hswebframework.ezorm.core.dsl.Query;
 import org.hswebframework.web.commons.entity.param.QueryParamEntity;
 import org.hswebframework.web.entity.organizational.PersonEntity;
-import org.hswebframework.web.organizational.authorization.relation.LinkedRelations;
-import org.hswebframework.web.organizational.authorization.relation.Relation;
-import org.hswebframework.web.organizational.authorization.relation.RelationTargetHolder;
-import org.hswebframework.web.organizational.authorization.relation.SimpleRelation;
+import org.hswebframework.web.organizational.authorization.relation.*;
 
 import java.util.List;
 import java.util.function.Supplier;
+import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 @SuppressWarnings("all")
@@ -41,13 +39,13 @@ public class DefaultLinkedRelations<C extends LinkedRelations> 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<C extends LinkedRelations> implements Linked
                 });
     }
 
+    @Override
+    public C deep() {
+        if (this.getClass() != DefaultLinkedRelations.class) {
+            throw new UnsupportedOperationException("子类未实现deep方法");
+        }
+        return (C) new DefaultLinkedRelations<C>(serviceContext, () -> all()
+                .stream()
+                .map(Relation::getTarget)
+                .collect(Collectors.toList()));
+    }
+
     @Override
     public Stream<Relation> stream() {
         return relationStream(targetIdSupplier);

+ 7 - 1
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<OrgRelations> 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()));
+    }
 }

+ 15 - 6
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<PersonRelations> implements PersonRelations {
 
@@ -17,11 +14,23 @@ public class DefaultPersonRelations extends DefaultLinkedRelations<PersonRelatio
     }
 
     protected List<String> getAllOrg() {
-        return serviceContext.getPersonService().selectAllOrgId(targetIdSupplier.get());
+        return serviceContext
+                .getPersonService()
+                .selectAllOrgId(targetIdSupplier.get());
     }
 
     protected List<String> 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

+ 0 - 1
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()

+ 6 - 3
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();
                 }