Sfoglia il codice sorgente

优化组织机构

zhouhao 7 anni fa
parent
commit
3ab29caa43
19 ha cambiato i file con 324 aggiunte e 64 eliminazioni
  1. 5 0
      hsweb-examples/hsweb-examples-cloud/hsweb-examples-cloud-gateway/pom.xml
  2. 17 0
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/Department.java
  3. 17 0
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/District.java
  4. 19 0
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/Organization.java
  5. 6 0
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/PersonnelAuthorization.java
  6. 18 0
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/Position.java
  7. 23 0
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/simple/SimpleDepartment.java
  8. 22 0
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/simple/SimpleDistrict.java
  9. 28 0
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/simple/SimpleOrganization.java
  10. 11 2
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/simple/SimplePersonnelAuthorization.java
  11. 26 0
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/simple/SimplePosition.java
  12. 1 2
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-entity/src/main/java/org/hswebframework/web/entity/organizational/DepartmentEntity.java
  13. 8 0
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-service/hsweb-system-organizational-service-api/src/main/java/org/hswebframework/web/service/organizational/DepartmentService.java
  14. 2 0
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-service/hsweb-system-organizational-service-api/src/main/java/org/hswebframework/web/service/organizational/OrganizationalService.java
  15. 2 0
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-service/hsweb-system-organizational-service-api/src/main/java/org/hswebframework/web/service/organizational/PersonService.java
  16. 27 1
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-service/hsweb-system-organizational-service-simple/src/main/java/org/hswebframework/web/service/organizational/simple/SimpleDepartmentService.java
  17. 13 44
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-service/hsweb-system-organizational-service-simple/src/main/java/org/hswebframework/web/service/organizational/simple/SimpleOrganizationalService.java
  18. 74 15
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-service/hsweb-system-organizational-service-simple/src/main/java/org/hswebframework/web/service/organizational/simple/SimplePersonService.java
  19. 5 0
      pom.xml

+ 5 - 0
hsweb-examples/hsweb-examples-cloud/hsweb-examples-cloud-gateway/pom.xml

@@ -46,6 +46,7 @@
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-starter-eureka</artifactId>
         </dependency>
+
         <dependency>
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-starter-zuul</artifactId>
@@ -58,5 +59,9 @@
             <groupId>ch.qos.logback</groupId>
             <artifactId>logback-classic</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-configuration-processor</artifactId>
+        </dependency>
     </dependencies>
 </project>

+ 17 - 0
hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/Department.java

@@ -0,0 +1,17 @@
+package org.hswebframework.web.organizational.authorization;
+
+import java.io.Serializable;
+
+/**
+ * @author zhouhao
+ * @since 3.0
+ */
+public interface Department extends Serializable {
+    String getId();
+
+    String getName();
+
+    String getCode();
+
+    Organization getOrg();
+}

+ 17 - 0
hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/District.java

@@ -0,0 +1,17 @@
+package org.hswebframework.web.organizational.authorization;
+
+import java.io.Serializable;
+
+/**
+ * @author zhouhao
+ * @since 3.0
+ */
+public interface District extends Serializable {
+    String getId();
+
+    String getName();
+
+    String getFullName();
+
+    String getCode();
+}

+ 19 - 0
hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/Organization.java

@@ -0,0 +1,19 @@
+package org.hswebframework.web.organizational.authorization;
+
+import java.io.Serializable;
+
+/**
+ * @author zhouhao
+ * @since 3.0
+ */
+public interface Organization extends Serializable {
+    String getId();
+
+    String getName();
+
+    String getFullName();
+
+    String getCode();
+
+    District getDistrict();
+}

+ 6 - 0
hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/PersonnelAuthorization.java

@@ -81,6 +81,12 @@ public interface PersonnelAuthorization extends Serializable {
      */
     Set<TreeNode<String>> getDepartmentIds();
 
+    Set<Position> getPositions();
+
+    default Optional<Position> getPosition(String id) {
+        return getPositions().stream().filter(position -> position.getId().equals(id)).findFirst();
+    }
+
     /**
      * @return 根地区ID
      */

+ 18 - 0
hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/Position.java

@@ -0,0 +1,18 @@
+package org.hswebframework.web.organizational.authorization;
+
+import java.io.Serializable;
+
+/**
+ * @author zhouhao
+ * @since 3.0
+ */
+public interface Position extends Serializable {
+    String getId();
+
+    String getCode();
+
+    String getName();
+
+    Department getDepartment();
+
+}

+ 23 - 0
hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/simple/SimpleDepartment.java

@@ -0,0 +1,23 @@
+package org.hswebframework.web.organizational.authorization.simple;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.hswebframework.web.organizational.authorization.Department;
+import org.hswebframework.web.organizational.authorization.Organization;
+
+/**
+ * @author zhouhao
+ * @since 3.0
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class SimpleDepartment implements Department {
+    private String id;
+    private String name;
+    private String code;
+    private Organization org;
+}

+ 22 - 0
hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/simple/SimpleDistrict.java

@@ -0,0 +1,22 @@
+package org.hswebframework.web.organizational.authorization.simple;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.hswebframework.web.organizational.authorization.District;
+
+/**
+ * @author zhouhao
+ * @since 3.0
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class SimpleDistrict implements District {
+    private String id;
+    private String name;
+    private String fullName;
+    private String code;
+}

+ 28 - 0
hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/simple/SimpleOrganization.java

@@ -0,0 +1,28 @@
+package org.hswebframework.web.organizational.authorization.simple;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.hswebframework.web.organizational.authorization.District;
+import org.hswebframework.web.organizational.authorization.Organization;
+
+/**
+ * @author zhouhao
+ * @since 3.0
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class SimpleOrganization implements Organization {
+    private String id;
+
+    private String name;
+
+    private String fullName;
+
+    private String code;
+
+    private District district;
+}

+ 11 - 2
hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/simple/SimplePersonnelAuthorization.java

@@ -2,6 +2,7 @@ package org.hswebframework.web.organizational.authorization.simple;
 
 import org.hswebframework.web.organizational.authorization.Personnel;
 import org.hswebframework.web.organizational.authorization.PersonnelAuthorization;
+import org.hswebframework.web.organizational.authorization.Position;
 import org.hswebframework.web.organizational.authorization.TreeNode;
 import org.hswebframework.web.organizational.authorization.relation.Relations;
 
@@ -9,8 +10,6 @@ import java.util.Collections;
 import java.util.Set;
 
 /**
- * TODO 完成注释
- *
  * @author zhouhao
  */
 public class SimplePersonnelAuthorization implements PersonnelAuthorization {
@@ -20,6 +19,16 @@ public class SimplePersonnelAuthorization implements PersonnelAuthorization {
     private Set<TreeNode<String>> positionIds;
     private Set<TreeNode<String>> departmentIds;
     private Relations             relations;
+    private Set<Position>         positions;
+
+    public void setPositions(Set<Position> positions) {
+        this.positions = positions;
+    }
+
+    @Override
+    public Set<Position> getPositions() {
+        return positions;
+    }
 
     @Override
     public Personnel getPersonnel() {

+ 26 - 0
hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/simple/SimplePosition.java

@@ -0,0 +1,26 @@
+package org.hswebframework.web.organizational.authorization.simple;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.hswebframework.web.organizational.authorization.Department;
+import org.hswebframework.web.organizational.authorization.Position;
+
+/**
+ * @author zhouhao
+ * @since 3.0
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class SimplePosition implements Position {
+    private String id;
+
+    private String name;
+
+    private String code;
+
+    private Department department;
+}

+ 1 - 2
hsweb-system/hsweb-system-organizational/hsweb-system-organizational-entity/src/main/java/org/hswebframework/web/entity/organizational/DepartmentEntity.java

@@ -27,7 +27,7 @@ import java.util.List;
  *
  * @author hsweb-generator-online
  */
-public interface DepartmentEntity extends TreeSortSupportEntity<String>, OrgAttachEntity, DepartmentAttachEntity {
+public interface DepartmentEntity extends  TreeSortSupportEntity<String>, OrgAttachEntity, DepartmentAttachEntity {
  /*-------------------------------------------
     |               属性名常量               |
     ===========================================*/
@@ -38,7 +38,6 @@ public interface DepartmentEntity extends TreeSortSupportEntity<String>, OrgAtta
     /**
      * 所在组织id
      */
-    @Deprecated
     String orgId     = "orgId";
     /**
      * 部门编码

+ 8 - 0
hsweb-system/hsweb-system-organizational/hsweb-system-organizational-service/hsweb-system-organizational-service-api/src/main/java/org/hswebframework/web/service/organizational/DepartmentService.java

@@ -20,6 +20,8 @@ import org.hswebframework.web.entity.organizational.DepartmentEntity;
 import org.hswebframework.web.service.CrudService;
 import org.hswebframework.web.service.TreeService;
 
+import java.util.List;
+
 /**
  * 部门 服务类
  *
@@ -29,4 +31,10 @@ public interface DepartmentService extends
         TreeService<DepartmentEntity, String>
         , CrudService<DepartmentEntity, String> {
 
+    List<DepartmentEntity> selectByOrgId(String orgId);
+
+    DepartmentEntity selectByCode(String code);
+
+    List<DepartmentEntity> selectByName(String name);
+
 }

+ 2 - 0
hsweb-system/hsweb-system-organizational/hsweb-system-organizational-service/hsweb-system-organizational-service-api/src/main/java/org/hswebframework/web/service/organizational/OrganizationalService.java

@@ -37,4 +37,6 @@ public interface OrganizationalService extends
 
     OrganizationalEntity selectByCode(String code);
 
+    OrganizationalEntity selectByName(String name);
+
 }

+ 2 - 0
hsweb-system/hsweb-system-organizational/hsweb-system-organizational-service/hsweb-system-organizational-service-api/src/main/java/org/hswebframework/web/service/organizational/PersonService.java

@@ -33,6 +33,8 @@ public interface PersonService extends CrudService<PersonEntity, String> {
 
     int updateByPk(PersonAuthBindEntity authBindEntity);
 
+    List<PersonEntity> selectByName(String name);
+
     PersonAuthBindEntity selectAuthBindByPk(String id);
 
     List<PersonEntity> selectByPositionId(String positionId);

+ 27 - 1
hsweb-system/hsweb-system-organizational/hsweb-system-organizational-service/hsweb-system-organizational-service-simple/src/main/java/org/hswebframework/web/service/organizational/simple/SimpleDepartmentService.java

@@ -20,19 +20,27 @@ import org.hswebframework.web.dao.organizational.DepartmentDao;
 import org.hswebframework.web.entity.organizational.DepartmentEntity;
 import org.hswebframework.web.id.IDGenerator;
 import org.hswebframework.web.service.AbstractTreeSortService;
+import org.hswebframework.web.service.EnableCacheAllEvictTreeSortService;
 import org.hswebframework.web.service.GenericEntityService;
 import org.hswebframework.web.service.organizational.DepartmentService;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.CacheConfig;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
 
+import java.util.Collection;
+import java.util.List;
+
 /**
  * 默认的服务实现
  *
  * @author hsweb-generator-online
  */
 @Service("departmentService")
+@CacheConfig(cacheNames = "department")
 public class SimpleDepartmentService
-        extends AbstractTreeSortService<DepartmentEntity, String>
+        extends EnableCacheAllEvictTreeSortService<DepartmentEntity, String>
         implements DepartmentService {
     @Autowired
     private DepartmentDao departmentDao;
@@ -46,4 +54,22 @@ public class SimpleDepartmentService
     protected IDGenerator<String> getIDGenerator() {
         return IDGenerator.MD5;
     }
+
+    @Override
+    @Cacheable(cacheNames = "'org-id:'+#orgId")
+    public List<DepartmentEntity> selectByOrgId(String orgId) {
+        return createQuery().where(DepartmentEntity.orgId, orgId).listNoPaging();
+    }
+
+    @Override
+    @Cacheable(cacheNames = "'name:'+#name")
+    public List<DepartmentEntity> selectByName(String name) {
+        return createQuery().where(DepartmentEntity.name, name).listNoPaging();
+    }
+
+    @Override
+    @Cacheable(cacheNames = "'code:'+#code")
+    public DepartmentEntity selectByCode(String code) {
+        return createQuery().where(DepartmentEntity.code, code).single();
+    }
 }

+ 13 - 44
hsweb-system/hsweb-system-organizational/hsweb-system-organizational-service/hsweb-system-organizational-service-simple/src/main/java/org/hswebframework/web/service/organizational/simple/SimpleOrganizationalService.java

@@ -20,19 +20,16 @@ import org.hswebframework.web.commons.entity.DataStatus;
 import org.hswebframework.web.dao.organizational.OrganizationalDao;
 import org.hswebframework.web.entity.organizational.OrganizationalEntity;
 import org.hswebframework.web.id.IDGenerator;
-import org.hswebframework.web.service.AbstractTreeSortService;
+import org.hswebframework.web.service.EnableCacheAllEvictTreeSortService;
 import org.hswebframework.web.service.organizational.OrganizationalService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cache.annotation.CacheConfig;
 import org.springframework.cache.annotation.CacheEvict;
 import org.springframework.cache.annotation.Cacheable;
-import org.springframework.cache.annotation.Caching;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.StringUtils;
 
-import java.util.Collection;
-import java.util.List;
 import java.util.Objects;
 
 /**
@@ -42,7 +39,7 @@ import java.util.Objects;
  */
 @Service("organizationalService")
 @CacheConfig(cacheNames = "organizational")
-public class SimpleOrganizationalService extends AbstractTreeSortService<OrganizationalEntity, String>
+public class SimpleOrganizationalService extends EnableCacheAllEvictTreeSortService<OrganizationalEntity, String>
         implements OrganizationalService {
     @Autowired
     private OrganizationalDao organizationalDao;
@@ -58,50 +55,12 @@ public class SimpleOrganizationalService extends AbstractTreeSortService<Organiz
     }
 
     @Override
-    @Caching(evict = {
-            @CacheEvict(key = "'id:'+#result"),
-            @CacheEvict(key = "'code:'+#entity.code"),
-            @CacheEvict(allEntries = true, condition = "#entity.children!=null")
-    })
+    @CacheEvict(allEntries = true)
     public String insert(OrganizationalEntity entity) {
         entity.setStatus(DataStatus.STATUS_ENABLED);
         return super.insert(entity);
     }
 
-    @Override
-    @Cacheable(key = "'id:'+#id")
-    public OrganizationalEntity selectByPk(String id) {
-        return super.selectByPk(id);
-    }
-
-    @Override
-    @CacheEvict(allEntries = true)
-    public int updateByPk(List<OrganizationalEntity> data) {
-        return super.updateByPk(data);
-    }
-
-    @Caching(evict = {
-            @CacheEvict(key = "'id:'+#id"),
-            @CacheEvict(key = "'code:'+#entity.code"),
-            @CacheEvict(allEntries = true, condition = "#entity.children!=null")
-    })
-    @Override
-    public int updateByPk(String id, OrganizationalEntity entity) {
-        return super.updateByPk(id, entity);
-    }
-
-    @Override
-    @CacheEvict(allEntries = true)
-    public int updateBatch(Collection<OrganizationalEntity> data) {
-        return super.updateBatch(data);
-    }
-
-    @Override
-    @CacheEvict(allEntries = true)
-    public int deleteByPk(String id) {
-        return super.deleteByPk(id);
-    }
-
     @Override
     @CacheEvict(allEntries = true)
     public void disable(String id) {
@@ -131,4 +90,14 @@ public class SimpleOrganizationalService extends AbstractTreeSortService<Organiz
         }
         return createQuery().where(OrganizationalEntity.code, code).single();
     }
+
+    @Override
+    @Cacheable(key = "'name:'+#name")
+    @Transactional(readOnly = true)
+    public OrganizationalEntity selectByName(String name) {
+        if (StringUtils.isEmpty(name)) {
+            return null;
+        }
+        return createQuery().where(OrganizationalEntity.name, name).single();
+    }
 }

+ 74 - 15
hsweb-system/hsweb-system-organizational/hsweb-system-organizational-service/hsweb-system-organizational-service-simple/src/main/java/org/hswebframework/web/service/organizational/simple/SimplePersonService.java

@@ -24,20 +24,16 @@ import org.hswebframework.web.entity.authorization.UserEntity;
 import org.hswebframework.web.entity.authorization.bind.BindRoleUserEntity;
 import org.hswebframework.web.entity.organizational.*;
 import org.hswebframework.web.id.IDGenerator;
-import org.hswebframework.web.organizational.authorization.Personnel;
-import org.hswebframework.web.organizational.authorization.PersonnelAuthorization;
-import org.hswebframework.web.organizational.authorization.PersonnelAuthorizationManager;
-import org.hswebframework.web.organizational.authorization.TreeNode;
+import org.hswebframework.web.organizational.authorization.*;
 import org.hswebframework.web.organizational.authorization.relation.Relation;
 import org.hswebframework.web.organizational.authorization.relation.SimpleRelation;
 import org.hswebframework.web.organizational.authorization.relation.SimpleRelations;
-import org.hswebframework.web.organizational.authorization.simple.SimplePersonnel;
-import org.hswebframework.web.organizational.authorization.simple.SimplePersonnelAuthorization;
+import org.hswebframework.web.organizational.authorization.simple.*;
 import org.hswebframework.web.service.DefaultDSLQueryService;
 import org.hswebframework.web.service.GenericEntityService;
 import org.hswebframework.web.service.authorization.AuthorizationSettingTypeSupplier;
 import org.hswebframework.web.service.authorization.UserService;
-import org.hswebframework.web.service.organizational.PersonService;
+import org.hswebframework.web.service.organizational.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cache.annotation.CacheConfig;
 import org.springframework.cache.annotation.CacheEvict;
@@ -45,6 +41,7 @@ import org.springframework.cache.annotation.Cacheable;
 import org.springframework.cache.annotation.Caching;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
 
 import java.util.*;
 import java.util.function.BiConsumer;
@@ -65,7 +62,7 @@ import static org.springframework.util.StringUtils.isEmpty;
 public class SimplePersonService extends GenericEntityService<PersonEntity, String>
         implements PersonService, PersonnelAuthorizationManager, AuthorizationSettingTypeSupplier {
 
-    private static String SETTING_TYPE_PERSON = "person";
+    private static String SETTING_TYPE_PERSON   = "person";
     private static String SETTING_TYPE_POSITION = "position";
 
     @Autowired
@@ -106,11 +103,11 @@ public class SimplePersonService extends GenericEntityService<PersonEntity, Stri
     @Caching(evict = {
             @CacheEvict(key = "'id:'+#result"),
             @CacheEvict(key = "'auth:persion-id'+#result"),
-            @CacheEvict(key = "'auth-bind'+#result")
+            @CacheEvict(key = "'auth-bind'+#result"),
+            @CacheEvict(key = "'person-name'+#authBindEntity.name")
     })
     public String insert(PersonAuthBindEntity authBindEntity) {
         authBindEntity.setStatus(DataStatus.STATUS_ENABLED);
-        // TODO: 17-6-1 应该使用锁,防止并发同步用户,导致多个人员使用相同的用户
         if (authBindEntity.getPersonUser() != null) {
             syncUserInfo(authBindEntity);
         }
@@ -125,10 +122,10 @@ public class SimplePersonService extends GenericEntityService<PersonEntity, Stri
     @Caching(evict = {
             @CacheEvict(key = "'id:'+#authBindEntity.id"),
             @CacheEvict(key = "'auth:persion-id'+#authBindEntity.id"),
-            @CacheEvict(key = "'auth-bind'+#authBindEntity.id")
+            @CacheEvict(key = "'auth-bind'+#authBindEntity.id"),
+            @CacheEvict(key = "'person-name'+#authBindEntity.name")
     })
     public int updateByPk(PersonAuthBindEntity authBindEntity) {
-        // TODO: 17-6-1 应该使用锁,防止并发同步用户,导致多个人员使用相同的用户
         if (authBindEntity.getPositionIds() != null) {
             personPositionDao.deleteByPersonId(authBindEntity.getId());
             syncPositionInfo(authBindEntity.getId(), authBindEntity.getPositionIds());
@@ -139,6 +136,15 @@ public class SimplePersonService extends GenericEntityService<PersonEntity, Stri
         return this.updateByPk(((PersonEntity) authBindEntity));
     }
 
+    @Override
+    @Cacheable(key = "'person-name'+#name")
+    public List<PersonEntity> selectByName(String name) {
+        if (StringUtils.isEmpty(name)) {
+            return new ArrayList<>();
+        }
+        return createQuery().where(PersonEntity.name, name).listNoPaging();
+    }
+
     @Override
     @Cacheable(key = "'auth-bind'+#id")
     public PersonAuthBindEntity selectAuthBindByPk(String id) {
@@ -239,7 +245,7 @@ public class SimplePersonService extends GenericEntityService<PersonEntity, Stri
                             userService.update(oldUser.getId(), user);
                             return oldUser.getId();
                         };
-        UserEntity userEntity=entityFactory.newInstance(UserEntity.class);
+        UserEntity userEntity = entityFactory.newInstance(UserEntity.class);
 //
 //        if (roleIds != null) {
 //            BindRoleUserEntity tmp = entityFactory.newInstance(BindRoleUserEntity.class);
@@ -259,6 +265,7 @@ public class SimplePersonService extends GenericEntityService<PersonEntity, Stri
 
 
     @Override
+    @CacheEvict(allEntries = true)
     public int deleteByPk(String id) {
         personPositionDao.deleteByPersonId(id);
         return super.deleteByPk(id);
@@ -281,22 +288,31 @@ public class SimplePersonService extends GenericEntityService<PersonEntity, Stri
                 .listNoPaging().stream()
                 .map(PersonPositionEntity::getPositionId)
                 .collect(Collectors.toSet());
+
+        Map<String, DepartmentEntity> departmentCache = new HashMap<>();
+        Map<String, PositionEntity> positionCache = new HashMap<>();
+        Map<String, OrganizationalEntity> orgCache = new HashMap<>();
+        Map<String, DistrictEntity> districtCache = new HashMap<>();
+
         //获取所有职位,并得到根职位(树结构)
         List<PositionEntity> positionEntities = getAllChildrenAndReturnRootNode(positionDao, positionIds, PositionEntity::setChildren, rootPosList -> {
             //根据职位获取部门
             Set<String> departmentIds = rootPosList.stream().map(PositionEntity::getDepartmentId).collect(Collectors.toSet());
+            rootPosList.forEach(positionEntity -> positionCache.put(positionEntity.getId(), positionEntity));
             if (!CollectionUtils.isEmpty(departmentIds)) {
                 List<DepartmentEntity> departmentEntities = getAllChildrenAndReturnRootNode(departmentDao, departmentIds, DepartmentEntity::setChildren, rootDepList -> {
+                    rootDepList.forEach(departmentEntity -> departmentCache.put(departmentEntity.getId(), departmentEntity));
                     //根据部门获取机构
                     Set<String> orgIds = rootDepList.stream().map(DepartmentEntity::getOrgId).collect(Collectors.toSet());
                     if (!CollectionUtils.isEmpty(orgIds)) {
                         List<OrganizationalEntity> orgEntities = getAllChildrenAndReturnRootNode(organizationalDao, orgIds, OrganizationalEntity::setChildren, rootOrgList -> {
+                            rootOrgList.forEach(org -> orgCache.put(org.getId(), org));
                             //根据机构获取行政区域
                             Set<String> districtIds = rootOrgList.stream().map(OrganizationalEntity::getDistrictId).filter(Objects::nonNull).collect(Collectors.toSet());
                             if (!CollectionUtils.isEmpty(districtIds)) {
                                 List<DistrictEntity> districtEntities =
                                         getAllChildrenAndReturnRootNode(districtDao, districtIds, DistrictEntity::setChildren, rootDistrictList -> {
-
+                                            rootDistrictList.forEach(dist -> districtCache.put(dist.getId(), dist));
                                         });
                                 authorization.setDistrictIds(transformationTreeNode(null, districtEntities));
                             }
@@ -309,6 +325,49 @@ public class SimplePersonService extends GenericEntityService<PersonEntity, Stri
         });
         authorization.setPositionIds(transformationTreeNode(null, positionEntities));
 
+        Set<Position> positions = positionEntities.parallelStream()
+                .map(positionEntity -> {
+                    DepartmentEntity departmentEntity = departmentCache.get(positionEntity.getDepartmentId());
+                    if (departmentEntity == null) {
+                        return null;
+                    }
+                    OrganizationalEntity organizationalEntity = orgCache.get(departmentEntity.getOrgId());
+                    if (organizationalEntity == null) {
+                        return null;
+                    }
+                    DistrictEntity districtEntity = districtCache.get(organizationalEntity.getDistrictId());
+                    District district = districtEntity == null ? null : SimpleDistrict.builder()
+                            .code(districtEntity.getCode())
+                            .id(districtEntity.getId())
+                            .name(districtEntity.getName())
+                            .fullName(districtEntity.getFullName())
+                            .build();
+
+                    Organization organization = SimpleOrganization.builder()
+                            .id(organizationalEntity.getId())
+                            .name(organizationalEntity.getName())
+                            .fullName(organizationalEntity.getFullName())
+                            .code(organizationalEntity.getCode())
+                            .district(district)
+                            .build();
+                    Department department = SimpleDepartment
+                            .builder()
+                            .id(departmentEntity.getId())
+                            .name(departmentEntity.getName())
+                            .code(departmentEntity.getCode())
+                            .org(organization)
+                            .build();
+
+                    return SimplePosition
+                            .builder()
+                            .id(positionEntity.getId())
+                            .name(positionEntity.getName())
+                            .department(department)
+                            .code("")
+                            .build();
+                }).filter(Objects::nonNull)
+                .collect(Collectors.toSet());
+        authorization.setPositions(positions);
         //获取关系
         List<RelationInfoEntity> relationInfoList = DefaultDSLQueryService.createQuery(relationInfoDao)
                 .where(RelationInfoEntity.relationFrom, personId)
@@ -387,7 +446,7 @@ public class SimplePersonService extends GenericEntityService<PersonEntity, Stri
     }
 
     @Override
-    @Cacheable(cacheNames = "person", key = "'auth:user-id'+#userId")
+    @Cacheable(key = "'auth:user-id'+#userId")
     public PersonnelAuthorization getPersonnelAuthorizationByUserId(String userId) {
         PersonEntity entity = createQuery().where(PersonEntity.userId, userId).single();
         if (entity == null) {

+ 5 - 0
pom.xml

@@ -249,6 +249,11 @@
     </build>
 
     <dependencies>
+        <dependency>
+            <groupId>io.reactivex.rxjava2</groupId>
+            <artifactId>rxjava</artifactId>
+            <version>2.1.8</version>
+        </dependency>
         <dependency>
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>