Browse Source

优化组织架构权限

zhouhao 8 years ago
parent
commit
1281863ffd
22 changed files with 543 additions and 34 deletions
  1. 46 0
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/DefaultPersonnelAuthorizationSupplier.java
  2. 33 1
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/OrganizationalAuthorizationAutoConfiguration.java
  3. 1 3
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/PersonnelAuthorization.java
  4. 74 0
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/PersonnelAuthorizationHolder.java
  5. 12 0
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/PersonnelAuthorizationManager.java
  6. 14 0
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/PersonnelAuthorizationSupplier.java
  7. 22 5
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/TreeNode.java
  8. 1 2
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/access/DataAccessType.java
  9. 34 0
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/simple/ScopeDataAccessConfigConvert.java
  10. 61 0
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/simple/SimplePersonnel.java
  11. 65 0
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/simple/SimplePersonnelAuthorization.java
  12. 45 0
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/simple/SimpleScopeDataAccessConfig.java
  13. 1 1
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/simple/AbstractScopeDataAccessHander.java
  14. 1 1
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/simple/AreaScopeDataAccessHandler.java
  15. 1 1
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/simple/DepartmentScopeDataAccessHandler.java
  16. 1 1
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/simple/OrgScopeDataAccessHandler.java
  17. 1 1
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/simple/PersonScopeDataAccessHandler.java
  18. 1 1
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/simple/PositionScopeDataAccessHandler.java
  19. 2 11
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-entity/src/main/java/org/hswebframework/web/entity/organizational/PositionEntity.java
  20. 3 4
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-entity/src/main/java/org/hswebframework/web/entity/organizational/SimplePositionEntity.java
  21. 6 0
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-service/hsweb-system-organizational-service-simple/pom.xml
  22. 118 2
      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

+ 46 - 0
hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/DefaultPersonnelAuthorizationSupplier.java

@@ -0,0 +1,46 @@
+package org.hswebframework.web.organizational.authorization;
+
+import org.hswebframework.web.ThreadLocalUtils;
+import org.hswebframework.web.authorization.Authentication;
+import org.hswebframework.web.authorization.AuthenticationSupplier;
+import org.hswebframework.web.organizational.authorization.entity.PersonAttachEntity;
+
+import java.util.Objects;
+
+/**
+ * TODO 完成注释
+ *
+ * @author zhouhao
+ */
+public class DefaultPersonnelAuthorizationSupplier implements PersonnelAuthorizationSupplier {
+    private PersonnelAuthorizationManager personnelAuthorizationManager;
+
+    private static final String threadLocalCacheKey = DefaultPersonnelAuthorizationSupplier.class.getName() + "_CACHE";
+
+    public DefaultPersonnelAuthorizationSupplier(PersonnelAuthorizationManager personnelAuthorizationManager) {
+        this.personnelAuthorizationManager = personnelAuthorizationManager;
+    }
+
+    @Override
+    public PersonnelAuthorization getByPersonId(String personId) {
+        return personnelAuthorizationManager.getPersonnelAuthorizationByPersonId(personId);
+    }
+
+    @Override
+    public PersonnelAuthorization getByUserId(String userId) {
+        return personnelAuthorizationManager.getPersonnelAuthorizationByUserId(userId);
+    }
+
+    @Override
+    public PersonnelAuthorization get() {
+        //TreadLocal Cache
+        return ThreadLocalUtils.get(threadLocalCacheKey, () ->
+                Authentication.current().map(authentication ->
+                        authentication.getAttribute(PersonAttachEntity.personId)
+                                .filter(Objects::nonNull)
+                                .map(String::valueOf)
+                                .map(this::getByPersonId)
+                                .orElseGet(() -> getByUserId(authentication.getUser().getId())))
+                        .orElse(null));
+    }
+}

+ 33 - 1
hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/OrganizationalAuthorizationAutoConfiguration.java

@@ -1,6 +1,10 @@
 package org.hswebframework.web.organizational.authorization;
 
 import org.hswebframework.web.organizational.authorization.simple.*;
+import org.hswebframework.web.organizational.authorization.simple.handler.*;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.config.BeanPostProcessor;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -11,7 +15,7 @@ import org.springframework.context.annotation.Configuration;
  * @author zhouhao
  */
 @Configuration
-public class OrganizationalAuthorizationAutoConfiguration {
+public class OrganizationalAuthorizationAutoConfiguration implements BeanPostProcessor {
 
     @Bean
     @ConditionalOnMissingBean(AreaScopeDataAccessHandler.class)
@@ -42,4 +46,32 @@ public class OrganizationalAuthorizationAutoConfiguration {
     public PositionScopeDataAccessHandler positionScopeDataAccessHandler() {
         return new PositionScopeDataAccessHandler();
     }
+
+    @Bean
+    @ConditionalOnMissingBean(ScopeDataAccessConfigConvert.class)
+    public ScopeDataAccessConfigConvert scopeDataAccessConfigConvert() {
+        return new ScopeDataAccessConfigConvert();
+    }
+
+    @Override
+    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
+        return bean;
+    }
+
+    @Override
+    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
+        if (bean instanceof PersonnelAuthorizationSupplier) {
+            PersonnelAuthorizationHolder.addSupplier(((PersonnelAuthorizationSupplier) bean));
+        }
+        return bean;
+    }
+
+    @Configuration
+    @ConditionalOnBean(PersonnelAuthorizationManager.class)
+    public static class PersonnelAuthorizationSupplierAutoConfiguration {
+        @Bean
+        public DefaultPersonnelAuthorizationSupplier personnelAuthorizationManager(PersonnelAuthorizationManager personnelAuthorizationManager) {
+            return new DefaultPersonnelAuthorizationSupplier(personnelAuthorizationManager);
+        }
+    }
 }

+ 1 - 3
hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/PersonnelAuthorization.java

@@ -25,9 +25,7 @@ public interface PersonnelAuthorization extends Serializable {
      * @see Authentication#getAttribute(String)
      */
     static Optional<PersonnelAuthorization> current() {
-        return Authentication.current()
-                .map(authentication -> authentication.<PersonnelAuthorization>getAttribute(PersonnelAuthorization.class.getName()))
-                .orElseGet(Optional::empty);
+        return Optional.ofNullable(PersonnelAuthorizationHolder.get());
     }
 
     /**

+ 74 - 0
hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/PersonnelAuthorizationHolder.java

@@ -0,0 +1,74 @@
+package org.hswebframework.web.organizational.authorization;
+
+import org.hswebframework.web.ThreadLocalUtils;
+import org.hswebframework.web.authorization.AuthenticationSupplier;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.concurrent.locks.ReadWriteLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+import java.util.function.Function;
+
+/**
+ * TODO 完成注释
+ *
+ * @author zhouhao
+ */
+public class PersonnelAuthorizationHolder {
+    private static final List<PersonnelAuthorizationSupplier> suppliers = new ArrayList<>();
+
+    private static final String CURRENT_USER_ID_KEY = PersonnelAuthorizationHolder.class.getName() + "_current_id";
+
+    private static final ReadWriteLock lock = new ReentrantReadWriteLock();
+
+    private static PersonnelAuthorization get(Function<PersonnelAuthorizationSupplier, PersonnelAuthorization> function) {
+        lock.readLock().lock();
+        try {
+            return suppliers.stream()
+                    .map(function)
+                    .filter(Objects::nonNull)
+                    .findFirst().orElse(null);
+        } finally {
+            lock.readLock().unlock();
+        }
+    }
+
+    /**
+     * @return 当前登录的用户权限信息
+     */
+    public static PersonnelAuthorization get() {
+        String currentId = ThreadLocalUtils.get(CURRENT_USER_ID_KEY);
+        if (currentId != null) {
+            return getByPersonId(currentId);
+        }
+        return get(PersonnelAuthorizationSupplier::get);
+    }
+
+    public static PersonnelAuthorization getByUserId(String userId) {
+        return get(supplier -> supplier.getByUserId(userId));
+    }
+
+    public static PersonnelAuthorization getByPersonId(String personId) {
+        return get(supplier -> supplier.getByPersonId(personId));
+    }
+
+    /**
+     * 初始化 {@link AuthenticationSupplier}
+     *
+     * @param supplier
+     */
+    public static void addSupplier(PersonnelAuthorizationSupplier supplier) {
+        lock.writeLock().lock();
+        try {
+            suppliers.add(supplier);
+        } finally {
+            lock.writeLock().unlock();
+        }
+    }
+
+    public static void setCurrentPersonId(String id) {
+        ThreadLocalUtils.put(PersonnelAuthorizationHolder.CURRENT_USER_ID_KEY, id);
+    }
+
+}

+ 12 - 0
hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/PersonnelAuthorizationManager.java

@@ -0,0 +1,12 @@
+package org.hswebframework.web.organizational.authorization;
+
+/**
+ * TODO 完成注释
+ *
+ * @author zhouhao
+ */
+public interface PersonnelAuthorizationManager {
+    PersonnelAuthorization getPersonnelAuthorizationByPersonId(String personId);
+
+    PersonnelAuthorization getPersonnelAuthorizationByUserId(String userId);
+}

+ 14 - 0
hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/PersonnelAuthorizationSupplier.java

@@ -0,0 +1,14 @@
+package org.hswebframework.web.organizational.authorization;
+
+import java.util.function.Supplier;
+
+/**
+ * TODO 完成注释
+ *
+ * @author zhouhao
+ */
+public interface PersonnelAuthorizationSupplier extends Supplier<PersonnelAuthorization> {
+    PersonnelAuthorization getByPersonId(String personId);
+
+    PersonnelAuthorization getByUserId(String userId);
+}

+ 22 - 5
hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/TreeNode.java

@@ -3,6 +3,7 @@ package org.hswebframework.web.organizational.authorization;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Set;
 import java.util.function.Predicate;
 
 /**
@@ -29,7 +30,7 @@ public class TreeNode<V> implements Serializable {
      */
     private int level;
 
-    private List<TreeNode<V>> children;
+    private Set<TreeNode<V>> children;
 
     public TreeNode<V> getParent() {
         return parent;
@@ -47,11 +48,11 @@ public class TreeNode<V> implements Serializable {
         this.value = value;
     }
 
-    public List<TreeNode<V>> getChildren() {
+    public Set<TreeNode<V>> getChildren() {
         return children;
     }
 
-    public void setChildren(List<TreeNode<V>> children) {
+    public void setChildren(Set<TreeNode<V>> children) {
         this.children = children;
     }
 
@@ -64,12 +65,28 @@ public class TreeNode<V> implements Serializable {
     }
 
     public List<V> getAllValue() {
-        List<V> values = new ArrayList<>(getChildren().size() + 1);
+        List<V> values = new ArrayList<>(children != null ? children.size() + 1 : 1);
         values.add(value);
-        children.stream().map(TreeNode::getAllValue).flatMap(List::stream).forEach(values::add);
+        if (null != children)
+            children.stream().map(TreeNode::getAllValue).flatMap(List::stream).forEach(values::add);
         return values;
     }
 
+    @Override
+    public int hashCode() {
+        if (value != null)
+            return value.hashCode();
+        return 0;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (obj instanceof TreeNode) {
+            return obj.hashCode() == hashCode();
+        }
+        return false;
+    }
+
     public List<V> getAllValue(Predicate<TreeNode<V>> filter) {
         List<V> values = new ArrayList<>(getChildren().size() + 1);
         if (filter.test(this))

+ 1 - 2
hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/access/DataAccessType.java

@@ -25,11 +25,10 @@ public interface DataAccessType extends Serializable {
      * 控制职位
      */
     String POSITION_SCOPE   = "POSITION_SCOPE";
-
     /**
      * 控制人员
      */
-    String PERSON_SCOPE = "PERSON_SCOPE";
+    String PERSON_SCOPE     = "PERSON_SCOPE";
 
     enum ScopeType implements Serializable {
         ONLY_SELF("只能查看自己"),

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

@@ -0,0 +1,34 @@
+package org.hswebframework.web.organizational.authorization.simple;
+
+import com.alibaba.fastjson.JSON;
+import org.hswebframework.web.authorization.access.DataAccessConfig;
+import org.hswebframework.web.authorization.simple.builder.DataAccessConfigConvert;
+
+import java.util.Arrays;
+import java.util.List;
+
+import static org.hswebframework.web.organizational.authorization.access.DataAccessType.*;
+
+/**
+ * TODO 完成注释
+ *
+ * @author zhouhao
+ */
+public class ScopeDataAccessConfigConvert implements DataAccessConfigConvert {
+    private static final List<String> supportTypes = Arrays.asList(
+            AREA_SCOPE, ORG_SCOPE, DEPARTMENT_SCOPE, POSITION_SCOPE, PERSON_SCOPE
+    );
+
+    @Override
+    public boolean isSupport(String type, String action, String config) {
+        return supportTypes.contains(type);
+    }
+
+    @Override
+    public DataAccessConfig convert(String type, String action, String config) {
+        SimpleScopeDataAccessConfig accessConfig = JSON.parseObject(config, SimpleScopeDataAccessConfig.class);
+        accessConfig.setAction(action);
+        accessConfig.setType(type);
+        return accessConfig;
+    }
+}

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

@@ -0,0 +1,61 @@
+package org.hswebframework.web.organizational.authorization.simple;
+
+import org.hswebframework.web.organizational.authorization.Personnel;
+
+/**
+ * TODO 完成注释
+ *
+ * @author zhouhao
+ */
+public class SimplePersonnel implements Personnel {
+    private String id;
+    private String name;
+    private String phone;
+    private String photo;
+    private String email;
+
+    @Override
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    @Override
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    @Override
+    public String getPhoto() {
+        return photo;
+    }
+
+    public void setPhoto(String photo) {
+        this.photo = photo;
+    }
+
+    @Override
+    public String getEmail() {
+        return email;
+    }
+
+    public void setEmail(String email) {
+        this.email = email;
+    }
+}

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

@@ -0,0 +1,65 @@
+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.TreeNode;
+
+import java.util.Set;
+
+/**
+ * TODO 完成注释
+ *
+ * @author zhouhao
+ */
+public class SimplePersonnelAuthorization implements PersonnelAuthorization {
+    private Personnel             personnel;
+    private Set<TreeNode<String>> areaIds;
+    private Set<TreeNode<String>> orgIds;
+    private Set<TreeNode<String>> positionIds;
+    private Set<TreeNode<String>> departmentIds;
+
+    @Override
+    public Personnel getPersonnel() {
+        return personnel;
+    }
+
+    public void setPersonnel(Personnel personnel) {
+        this.personnel = personnel;
+    }
+
+    @Override
+    public Set<TreeNode<String>> getAreaIds() {
+        return areaIds;
+    }
+
+    public void setAreaIds(Set<TreeNode<String>> areaIds) {
+        this.areaIds = areaIds;
+    }
+
+    @Override
+    public Set<TreeNode<String>> getOrgIds() {
+        return orgIds;
+    }
+
+    public void setOrgIds(Set<TreeNode<String>> orgIds) {
+        this.orgIds = orgIds;
+    }
+
+    @Override
+    public Set<TreeNode<String>> getPositionIds() {
+        return positionIds;
+    }
+
+    public void setPositionIds(Set<TreeNode<String>> positionIds) {
+        this.positionIds = positionIds;
+    }
+
+    @Override
+    public Set<TreeNode<String>> getDepartmentIds() {
+        return departmentIds;
+    }
+
+    public void setDepartmentIds(Set<TreeNode<String>> departmentIds) {
+        this.departmentIds = departmentIds;
+    }
+}

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

@@ -0,0 +1,45 @@
+package org.hswebframework.web.organizational.authorization.simple;
+
+import org.hswebframework.web.authorization.simple.AbstractDataAccessConfig;
+import org.hswebframework.web.organizational.authorization.access.DataAccessType;
+import org.hswebframework.web.organizational.authorization.access.ScopeDataAccessConfig;
+
+import java.util.Set;
+
+/**
+ * TODO 完成注释
+ *
+ * @author zhouhao
+ */
+public class SimpleScopeDataAccessConfig extends AbstractDataAccessConfig implements ScopeDataAccessConfig {
+    private DataAccessType.ScopeType scopeType;
+    private Set<String>              scope;
+    private String                   type;
+
+    @Override
+    public DataAccessType.ScopeType getScopeType() {
+        return scopeType;
+    }
+
+    public void setScopeType(DataAccessType.ScopeType scopeType) {
+        this.scopeType = scopeType;
+    }
+
+    @Override
+    public Set<String> getScope() {
+        return scope;
+    }
+
+    public void setScope(Set<String> scope) {
+        this.scope = scope;
+    }
+
+    @Override
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+}

+ 1 - 1
hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/simple/AbstractScopeDataAccessHander.java

@@ -1,4 +1,4 @@
-package org.hswebframework.web.organizational.authorization.simple;
+package org.hswebframework.web.organizational.authorization.simple.handler;
 
 import org.hsweb.ezorm.core.param.Term;
 import org.hswebframework.web.authorization.Permission;

+ 1 - 1
hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/simple/AreaScopeDataAccessHandler.java

@@ -1,4 +1,4 @@
-package org.hswebframework.web.organizational.authorization.simple;
+package org.hswebframework.web.organizational.authorization.simple.handler;
 
 import org.hsweb.ezorm.core.param.Term;
 import org.hsweb.ezorm.core.param.TermType;

+ 1 - 1
hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/simple/DepartmentScopeDataAccessHandler.java

@@ -1,4 +1,4 @@
-package org.hswebframework.web.organizational.authorization.simple;
+package org.hswebframework.web.organizational.authorization.simple.handler;
 
 import org.hsweb.ezorm.core.param.Term;
 import org.hsweb.ezorm.core.param.TermType;

+ 1 - 1
hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/simple/OrgScopeDataAccessHandler.java

@@ -1,4 +1,4 @@
-package org.hswebframework.web.organizational.authorization.simple;
+package org.hswebframework.web.organizational.authorization.simple.handler;
 
 import org.hsweb.ezorm.core.param.Term;
 import org.hsweb.ezorm.core.param.TermType;

+ 1 - 1
hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/simple/PersonScopeDataAccessHandler.java

@@ -1,4 +1,4 @@
-package org.hswebframework.web.organizational.authorization.simple;
+package org.hswebframework.web.organizational.authorization.simple.handler;
 
 import org.hsweb.ezorm.core.param.Term;
 import org.hsweb.ezorm.core.param.TermType;

+ 1 - 1
hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/simple/PositionScopeDataAccessHandler.java

@@ -1,4 +1,4 @@
-package org.hswebframework.web.organizational.authorization.simple;
+package org.hswebframework.web.organizational.authorization.simple.handler;
 
 import org.hsweb.ezorm.core.param.Term;
 import org.hsweb.ezorm.core.param.TermType;

+ 2 - 11
hsweb-system/hsweb-system-organizational/hsweb-system-organizational-entity/src/main/java/org/hswebframework/web/entity/organizational/PositionEntity.java

@@ -53,7 +53,7 @@ public interface PositionEntity extends TreeSortSupportEntity<String> {
     /**
      * 树结构编码
      */
-    String path     = "path";
+    String path         = "path";
     /**
      * 排序索引
      */
@@ -103,15 +103,6 @@ public interface PositionEntity extends TreeSortSupportEntity<String> {
      */
     void setRemark(String remark);
 
-    /**
-     * @return 排序索引
-     */
-    Long getSortIndex();
-
-    /**
-     * 设置 排序索引
-     */
-    void setSortIndex(Long sortIndex);
-
+    void setChildren(List<PositionEntity> children);
 
 }

+ 3 - 4
hsweb-system/hsweb-system-organizational/hsweb-system-organizational-entity/src/main/java/org/hswebframework/web/entity/organizational/SimplePositionEntity.java

@@ -16,9 +16,7 @@
  */
 package org.hswebframework.web.entity.organizational;
 
-import org.hswebframework.web.commons.entity.SimpleGenericEntity;
 import org.hswebframework.web.commons.entity.SimpleTreeSortSupportEntity;
-import org.hswebframework.web.commons.entity.TreeSupportEntity;
 
 import java.util.List;
 
@@ -45,8 +43,9 @@ public class SimplePositionEntity extends SimpleTreeSortSupportEntity<String> im
         return children;
     }
 
-    public void setChildren(List<SimplePositionEntity> children) {
-        this.children = children;
+    @SuppressWarnings("unchecked")
+    public void setChildren(List<PositionEntity> children) {
+        this.children = (List) children;
     }
 
     /**

+ 6 - 0
hsweb-system/hsweb-system-organizational/hsweb-system-organizational-service/hsweb-system-organizational-service-simple/pom.xml

@@ -38,5 +38,11 @@
             <artifactId>hsweb-system-organizational-service-api</artifactId>
             <version>${project.version}</version>
         </dependency>
+
+        <dependency>
+            <groupId>org.hswebframework.web</groupId>
+            <artifactId>hsweb-system-organizational-authorization</artifactId>
+            <version>${project.version}</version>
+        </dependency>
     </dependencies>
 </project>

+ 118 - 2
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

@@ -16,14 +16,34 @@
  */
 package org.hswebframework.web.service.organizational.simple;
 
+import com.alibaba.fastjson.JSON;
+import org.hswebframework.web.commons.entity.TreeSortSupportEntity;
+import org.hswebframework.web.commons.entity.TreeSupportEntity;
 import org.hswebframework.web.dao.organizational.PersonDao;
+import org.hswebframework.web.dao.organizational.PersonPositionDao;
+import org.hswebframework.web.dao.organizational.PositionDao;
 import org.hswebframework.web.entity.organizational.PersonEntity;
+import org.hswebframework.web.entity.organizational.PersonPositionEntity;
+import org.hswebframework.web.entity.organizational.PositionEntity;
+import org.hswebframework.web.entity.organizational.SimplePositionEntity;
 import org.hswebframework.web.id.IDGenerator;
+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.simple.SimplePersonnel;
+import org.hswebframework.web.organizational.authorization.simple.SimplePersonnelAuthorization;
+import org.hswebframework.web.service.DefaultDSLQueryService;
 import org.hswebframework.web.service.GenericEntityService;
 import org.hswebframework.web.service.organizational.PersonService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.*;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+
+import static org.hswebframework.web.service.DefaultDSLQueryService.*;
+
 /**
  * 默认的服务实现
  *
@@ -31,10 +51,16 @@ import org.springframework.stereotype.Service;
  */
 @Service("personService")
 public class SimplePersonService extends GenericEntityService<PersonEntity, String>
-        implements PersonService {
+        implements PersonService, PersonnelAuthorizationManager {
     @Autowired
     private PersonDao personDao;
 
+    @Autowired
+    private PersonPositionDao personPositionDao;
+
+    @Autowired
+    private PositionDao positionDao;
+
     @Override
     protected IDGenerator<String> getIDGenerator() {
         return IDGenerator.MD5;
@@ -45,9 +71,99 @@ public class SimplePersonService extends GenericEntityService<PersonEntity, Stri
         return personDao;
     }
 
-
     @Override
     public String insert(PersonEntity entity) {
         return super.insert(entity);
     }
+
+    @Override
+    public PersonnelAuthorization getPersonnelAuthorizationByPersonId(String personId) {
+        SimplePersonnelAuthorization authorization = new SimplePersonnelAuthorization();
+        PersonEntity entity = selectByPk(personId);
+        assertNotNull(entity);
+
+        SimplePersonnel personnel = new SimplePersonnel();
+        personnel.setId(entity.getId());
+        personnel.setEmail(entity.getEmail());
+        personnel.setName(entity.getName());
+        personnel.setPhone(entity.getPhone());
+        personnel.setPhoto(entity.getPhoto());
+        authorization.setPersonnel(personnel);
+
+        // 获取用户的职位ID集合(多个职位)
+        Set<String> positionIds = DefaultDSLQueryService.createQuery(personPositionDao)
+                .where(PersonPositionEntity.personId, personId)
+                .list().stream()
+                .map(PersonPositionEntity::getPositionId)
+                .collect(Collectors.toSet());
+        Set<String> departmentIds = null;
+
+        if (!positionIds.isEmpty()) {
+            //获取用户的职位信息
+            List<PositionEntity> positions = DefaultDSLQueryService.createQuery(positionDao)
+                    .where().in(PositionEntity.id, positionIds)
+                    .list();
+            //职位被删除了但是人员信息违背
+            if (!positions.isEmpty()) {
+                departmentIds = positions.stream().map(PositionEntity::getDepartmentId).collect(Collectors.toSet());
+                //所有子节点,使用树节点的path属性进行快速查询
+                //注意:如果path全为空,则可能导致查出全部职位
+                List<PositionEntity> allPositions = DefaultDSLQueryService
+                        .createQuery(positionDao)
+                        //遍历生成查询条件: like path like ?||'%' or path like ?||'%'  ....
+                        .each(positions, (query, position) -> query.or().like$(PositionEntity.path, position.getPath()))
+                        .list();
+                //转为树形结构
+                List<PositionEntity> rootPositions = TreeSupportEntity
+                        .list2tree(allPositions, PositionEntity::setChildren,
+                                // 人员的所在职位为根节点
+                                (Predicate<PositionEntity>) node -> positionIds.contains(node.getId()));
+                // 转为treeNode后设置到权限信息
+                authorization.setPositionIds(transformationTreeNode(null, rootPositions));
+            }
+            // TODO: 17-5-24 初始化部门信息
+        }
+
+        return authorization;
+    }
+
+    public static void main(String[] args) {
+        String json = "[{'id':'1','name':'test','parentId':'-1'},{'id':'2','name':'test2','parentId':'-1'}" +
+                ",{'id':'101','name':'test1-1','parentId':'1'},{'id':'102','name':'test1-2','parentId':'1'}]";
+
+        List<PositionEntity> positionEntities = (List) JSON.parseArray(json, SimplePositionEntity.class);
+
+        List<PositionEntity> rootPositions = TreeSupportEntity.list2tree(positionEntities,
+                PositionEntity::setChildren,
+                (Predicate<PositionEntity>) node -> "-1".equals(node.getParentId()));
+
+        System.out.println(JSON.toJSONString(rootPositions));
+
+        System.out.println(JSON.toJSONString(transformationTreeNode(null, rootPositions)));
+
+    }
+
+    public static <V extends TreeSupportEntity<String>> Set<TreeNode<String>> transformationTreeNode(V parent, List<V> data) {
+        Set<TreeNode<String>> treeNodes = new HashSet<>();
+        data.forEach(node -> {
+            TreeNode<String> treeNode = new TreeNode<>();
+            if (parent != null) {
+                TreeNode<String> parentNode = new TreeNode<>();
+                parentNode.setValue(parent.getId());
+                parentNode.setChildren(treeNodes);
+                treeNode.setParent(parentNode);
+            }
+            treeNode.setValue(node.getId());
+            if (node.getChildren() != null && !node.getChildren().isEmpty()) {
+                treeNode.setChildren(transformationTreeNode(node, node.getChildren()));
+            }
+            treeNodes.add(treeNode);
+        });
+        return treeNodes;
+    }
+
+    @Override
+    public PersonnelAuthorization getPersonnelAuthorizationByUserId(String userId) {
+        return null;
+    }
 }