瀏覽代碼

优化组织架构

zhouhao 8 年之前
父節點
當前提交
e7da493b77
共有 9 個文件被更改,包括 145 次插入98 次删除
  1. 3 1
      hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/AuthorizationAutoConfiguration.java
  2. 54 35
      hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/builder/SimpleDataAccessConfigBuilderFactory.java
  3. 4 3
      hsweb-commons/hsweb-commons-entity/src/main/java/org/hswebframework/web/commons/entity/TreeSupportEntity.java
  4. 4 1
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-entity/src/main/java/org/hswebframework/web/entity/organizational/DepartmentEntity.java
  5. 4 0
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-entity/src/main/java/org/hswebframework/web/entity/organizational/OrganizationalEntity.java
  6. 3 2
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-entity/src/main/java/org/hswebframework/web/entity/organizational/SimpleDepartmentEntity.java
  7. 2 2
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-entity/src/main/java/org/hswebframework/web/entity/organizational/SimpleOrganizationalEntity.java
  8. 71 53
      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
  9. 0 1
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-starter/src/test/java/org/hswebframework/web/starter/organizational/DepartmentTests.java

+ 3 - 1
hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/AuthorizationAutoConfiguration.java

@@ -9,6 +9,7 @@ import org.hswebframework.web.authorization.simple.builder.SimpleDataAccessConfi
 import org.hswebframework.web.authorization.simple.builder.SimpleFieldAccessConfigBuilderFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
@@ -33,7 +34,8 @@ public class AuthorizationAutoConfiguration {
 
     @Bean
     @ConditionalOnMissingBean(DataAccessConfigBuilderFactory.class)
-    public DataAccessConfigBuilderFactory dataAccessConfigBuilderFactory() {
+    @ConfigurationProperties(prefix = "hsweb.authorization.data-access", ignoreInvalidFields = true)
+    public SimpleDataAccessConfigBuilderFactory dataAccessConfigBuilderFactory() {
         SimpleDataAccessConfigBuilderFactory factory = new SimpleDataAccessConfigBuilderFactory();
         if (null != dataAccessConfigConverts) {
             dataAccessConfigConverts.forEach(factory::addConvert);

+ 54 - 35
hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/builder/SimpleDataAccessConfigBuilderFactory.java

@@ -7,6 +7,8 @@ import org.hswebframework.web.authorization.builder.DataAccessConfigBuilderFacto
 import org.hswebframework.web.authorization.simple.SimpleCustomDataAccessConfig;
 import org.hswebframework.web.authorization.simple.SimpleOwnCreatedDataAccessConfig;
 
+import javax.annotation.PostConstruct;
+import java.util.Arrays;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Objects;
@@ -17,6 +19,12 @@ import java.util.Objects;
  * @author zhouhao
  */
 public class SimpleDataAccessConfigBuilderFactory implements DataAccessConfigBuilderFactory {
+
+    private List<String> defaultSupportConvert = Arrays.asList(
+            DataAccessConfig.DefaultType.CUSTOM
+//            DataAccessConfig.DefaultType.SCRIPT
+            , DataAccessConfig.DefaultType.OWN_CREATED);
+
     private List<DataAccessConfigConvert> converts = new LinkedList<>();
 
     public SimpleDataAccessConfigBuilderFactory addConvert(DataAccessConfigConvert configBuilderConvert) {
@@ -25,45 +33,56 @@ public class SimpleDataAccessConfigBuilderFactory implements DataAccessConfigBui
         return this;
     }
 
-    public SimpleDataAccessConfigBuilderFactory() {
-        converts.add(new DataAccessConfigConvert() {
-            @Override
-            public boolean isSupport(String type, String action, String config) {
-                return DataAccessConfig.DefaultType.OWN_CREATED.equals(type);
-            }
+    public void setDefaultSupportConvert(List<String> defaultSupportConvert) {
+        this.defaultSupportConvert = defaultSupportConvert;
+    }
+
+    public List<String> getDefaultSupportConvert() {
+        return defaultSupportConvert;
+    }
 
-            @Override
-            public DataAccessConfig convert(String type, String action, String config) {
-                return new SimpleOwnCreatedDataAccessConfig(action);
-            }
-        });
+    @PostConstruct
+    public void init() {
+        if (defaultSupportConvert.contains(DataAccessConfig.DefaultType.OWN_CREATED))
+            converts.add(new DataAccessConfigConvert() {
+                @Override
+                public boolean isSupport(String type, String action, String config) {
+                    return DataAccessConfig.DefaultType.OWN_CREATED.equals(type);
+                }
 
-        converts.add(new DataAccessConfigConvert() {
-            @Override
-            public boolean isSupport(String type, String action, String config) {
-                return DataAccessConfig.DefaultType.SCRIPT.equals(type);
-            }
+                @Override
+                public DataAccessConfig convert(String type, String action, String config) {
+                    return new SimpleOwnCreatedDataAccessConfig(action);
+                }
+            });
+        if (defaultSupportConvert.contains(DataAccessConfig.DefaultType.SCRIPT))
+            converts.add(new DataAccessConfigConvert() {
+                @Override
+                public boolean isSupport(String type, String action, String config) {
+                    return DataAccessConfig.DefaultType.SCRIPT.equals(type);
+                }
 
-            @Override
-            public DataAccessConfig convert(String type, String action, String config) {
-                SimpleOwnCreatedDataAccessConfig access = JSON.parseObject(config, SimpleOwnCreatedDataAccessConfig.class);
-                access.setAction(config);
-                return access;
-            }
-        });
-        converts.add(new DataAccessConfigConvert() {
-            @Override
-            public boolean isSupport(String type, String action, String config) {
-                return DataAccessConfig.DefaultType.CUSTOM.equals(type);
-            }
+                @Override
+                public DataAccessConfig convert(String type, String action, String config) {
+                    SimpleOwnCreatedDataAccessConfig access = JSON.parseObject(config, SimpleOwnCreatedDataAccessConfig.class);
+                    access.setAction(config);
+                    return access;
+                }
+            });
+        if (defaultSupportConvert.contains(DataAccessConfig.DefaultType.CUSTOM))
+            converts.add(new DataAccessConfigConvert() {
+                @Override
+                public boolean isSupport(String type, String action, String config) {
+                    return DataAccessConfig.DefaultType.CUSTOM.equals(type);
+                }
 
-            @Override
-            public DataAccessConfig convert(String type, String action, String config) {
-                SimpleCustomDataAccessConfig access = new SimpleCustomDataAccessConfig(config);
-                access.setAction(action);
-                return access;
-            }
-        });
+                @Override
+                public DataAccessConfig convert(String type, String action, String config) {
+                    SimpleCustomDataAccessConfig access = new SimpleCustomDataAccessConfig(config);
+                    access.setAction(action);
+                    return access;
+                }
+            });
     }
 
     @Override

+ 4 - 3
hsweb-commons/hsweb-commons-entity/src/main/java/org/hswebframework/web/commons/entity/TreeSupportEntity.java

@@ -19,12 +19,14 @@
 package org.hswebframework.web.commons.entity;
 
 
-import org.hibernate.validator.constraints.NotBlank;
 import org.hswebframework.web.id.IDGenerator;
 import org.hswebframwork.utils.RandomUtil;
 import org.hswebframwork.utils.StringUtils;
 
-import java.util.*;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 import java.util.function.BiConsumer;
 import java.util.function.Function;
 import java.util.function.Predicate;
@@ -38,7 +40,6 @@ public interface TreeSupportEntity<PK> extends GenericEntity<PK> {
 
     String parentId = "parentId";
 
-    @NotBlank
     String getPath();
 
     void setPath(String path);

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

@@ -18,6 +18,8 @@ package org.hswebframework.web.entity.organizational;
 
 import org.hswebframework.web.commons.entity.TreeSortSupportEntity;
 
+import java.util.List;
+
 /**
  * 部门 实体
  *
@@ -46,7 +48,7 @@ public interface DepartmentEntity extends TreeSortSupportEntity<String> {
     /**
      * 树结构编码
      */
-    String path  = "path";
+    String path      = "path";
     /**
      * 排序序号
      */
@@ -100,4 +102,5 @@ public interface DepartmentEntity extends TreeSortSupportEntity<String> {
      */
     void setEnabled(Boolean enabled);
 
+    void setChildren(List<DepartmentEntity> children);
 }

+ 4 - 0
hsweb-system/hsweb-system-organizational/hsweb-system-organizational-entity/src/main/java/org/hswebframework/web/entity/organizational/OrganizationalEntity.java

@@ -18,6 +18,8 @@ package org.hswebframework.web.entity.organizational;
 
 import org.hswebframework.web.commons.entity.TreeSortSupportEntity;
 
+import java.util.List;
+
 /**
  * 组织 实体
  *
@@ -104,6 +106,8 @@ public interface OrganizationalEntity extends TreeSortSupportEntity<String> {
      */
     void setOptionalRoles(java.util.List<String> optionalRoles);
 
+    void setChildren(List<OrganizationalEntity> children);
+
     /**
      * @return 是否启用
      */

+ 3 - 2
hsweb-system/hsweb-system-organizational/hsweb-system-organizational-entity/src/main/java/org/hswebframework/web/entity/organizational/SimpleDepartmentEntity.java

@@ -99,7 +99,8 @@ public class SimpleDepartmentEntity extends SimpleTreeSortSupportEntity<String>
         return children;
     }
 
-    public void setChildren(List<SimpleDepartmentEntity> children) {
-        this.children = children;
+    @SuppressWarnings("unchecked")
+    public void setChildren(List<DepartmentEntity> children) {
+        this.children = (List) children;
     }
 }

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

@@ -101,8 +101,8 @@ public class SimpleOrganizationalEntity extends SimpleTreeSortSupportEntity<Stri
         return children;
     }
 
-    public void setChildren(List<SimpleOrganizationalEntity> children) {
-        this.children = children;
+    public void setChildren(List<OrganizationalEntity> children) {
+        this.children = (List) children;
     }
 
     /**

+ 71 - 53
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

@@ -17,15 +17,10 @@
 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.dao.dynamic.QueryByEntityDao;
+import org.hswebframework.web.dao.organizational.*;
+import org.hswebframework.web.entity.organizational.*;
 import org.hswebframework.web.id.IDGenerator;
 import org.hswebframework.web.organizational.authorization.PersonnelAuthorization;
 import org.hswebframework.web.organizational.authorization.PersonnelAuthorizationManager;
@@ -38,12 +33,15 @@ 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.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.function.BiConsumer;
+import java.util.function.Consumer;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
 
-import static org.hswebframework.web.service.DefaultDSLQueryService.*;
-
 /**
  * 默认的服务实现
  *
@@ -61,6 +59,12 @@ public class SimplePersonService extends GenericEntityService<PersonEntity, Stri
     @Autowired
     private PositionDao positionDao;
 
+    @Autowired
+    private DepartmentDao departmentDao;
+
+    @Autowired
+    private OrganizationalDao organizationalDao;
+
     @Override
     protected IDGenerator<String> getIDGenerator() {
         return IDGenerator.MD5;
@@ -96,51 +100,63 @@ public class SimplePersonService extends GenericEntityService<PersonEntity, Stri
                 .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));
+        //获取所有职位,并得到根职位(树结构)
+        List<PositionEntity> positionEntities = getAllChildrenAndReturnRootNode(positionDao, positionIds, PositionEntity::setChildren, rootPosList -> {
+            //根据职位获取部门
+            Set<String> departmentIds = rootPosList.stream().map(PositionEntity::getDepartmentId).collect(Collectors.toSet());
+            if (null != departmentIds && !departmentIds.isEmpty()) {
+                List<DepartmentEntity> departmentEntities = getAllChildrenAndReturnRootNode(departmentDao, departmentIds, DepartmentEntity::setChildren, rootDepList -> {
+                    //根据部门获取机构
+                    Set<String> orgIds = rootDepList.stream().map(DepartmentEntity::getOrgId).collect(Collectors.toSet());
+                    if (null != orgIds && !orgIds.isEmpty()) {
+                        List<OrganizationalEntity> orgEntities = getAllChildrenAndReturnRootNode(organizationalDao, orgIds, OrganizationalEntity::setChildren, rootOrgList -> {
+                            //根据机构获取地区
+                            // TODO: 17-5-25
+                        });
+                        authorization.setOrgIds(transformationTreeNode(null, orgEntities));
+                    }
+                });
+                authorization.setDepartmentIds(transformationTreeNode(null, departmentEntities));
             }
-            // TODO: 17-5-24 初始化部门信息
-        }
-
+        });
+        authorization.setPositionIds(transformationTreeNode(null, positionEntities));
         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)));
-
+    /**
+     * 获取一个树形结构的数据,并返回根节点集合
+     *
+     * @param dao           查询dao接口
+     * @param rootIds       根节点ID集合
+     * @param childAccepter 子节点接收方法
+     * @param rootConsumer  根节点消费回调
+     * @param <T>           节点类型
+     * @return 根节点集合
+     */
+    protected <T extends TreeSupportEntity<String>> List<T> getAllChildrenAndReturnRootNode(QueryByEntityDao<T> dao,
+                                                                                            Set<String> rootIds,
+                                                                                            BiConsumer<T, List<T>> childAccepter,
+                                                                                            Consumer<List<T>> rootConsumer) {
+        //获取根节点
+        List<T> root = DefaultDSLQueryService.createQuery(dao)
+                .where().in(TreeSupportEntity.id, rootIds)
+                .list();
+        //节点不存在?
+        if (!root.isEmpty()) {
+            //所有子节点,使用节点的path属性进行快速查询,查询结果包含了根节点
+            List<T> allNode = DefaultDSLQueryService
+                    .createQuery(dao)
+                    //遍历生成查询条件: like path like ?||'%' or path like ?||'%'  ....
+                    .each(root, (query, data) -> query.or().like$(TreeSupportEntity.path, data.getPath()))
+                    .list();
+            //转为树形结构
+            List<T> tree = TreeSupportEntity
+                    .list2tree(allNode, childAccepter,
+                            (Predicate<T>) node -> rootIds.contains(node.getId()));  // 根节点判定
+            rootConsumer.accept(root);
+            return tree;
+        }
+        return Collections.emptyList();
     }
 
     public static <V extends TreeSupportEntity<String>> Set<TreeNode<String>> transformationTreeNode(V parent, List<V> data) {
@@ -164,6 +180,8 @@ public class SimplePersonService extends GenericEntityService<PersonEntity, Stri
 
     @Override
     public PersonnelAuthorization getPersonnelAuthorizationByUserId(String userId) {
-        return null;
+        PersonEntity entity = createQuery().where(PersonEntity.userId, userId).single();
+        assertNotNull(entity);
+        return getPersonnelAuthorizationByPersonId(entity.getId());
     }
 }

+ 0 - 1
hsweb-system/hsweb-system-organizational/hsweb-system-organizational-starter/src/test/java/org/hswebframework/web/starter/organizational/DepartmentTests.java

@@ -46,7 +46,6 @@ public class DepartmentTests extends SimpleWebApplicationTests {
         //todo 设置测试属性
         entity.setName("test");
         entity.setCode("2");
-
         // test add data
         String requestBody = JSON.toJSONString(entity);
         JSONObject result = testPost("/department").setUp(setup -> setup.contentType(MediaType.APPLICATION_JSON).content(requestBody)).exec().resultAsJson();