浏览代码

Merge branch 'master' of github.com:/hs-web/hsweb-framework

# Conflicts:
#	hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/SimpleFieldFilterDataAccessConfig.java
zhouhao 7 年之前
父节点
当前提交
c42e492751
共有 19 个文件被更改,包括 296 次插入46 次删除
  1. 3 7
      hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/SimpleFieldFilterDataAccessConfig.java
  2. 16 0
      hsweb-commons/hsweb-commons-service/hsweb-commons-service-simple/src/main/java/org/hswebframework/web/service/AbstractTreeSortService.java
  3. 13 0
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/OrganizationalAuthorizationAutoConfiguration.java
  4. 1 1
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/access/DataAccessType.java
  5. 42 0
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/simple/CustomScope.java
  6. 35 0
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/simple/CustomScopeDataAccessConfigConvert.java
  7. 28 0
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/simple/SimpleCustomScopeDataAccessConfig.java
  8. 7 0
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/simple/SimpleScopeDataAccessConfig.java
  9. 4 8
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/simple/handler/AbstractScopeDataAccessHandler.java
  10. 46 0
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/simple/handler/CustomScopeHandler.java
  11. 0 0
      hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/simple/handler/DistrictScopeDataAccessHandler.java
  12. 2 0
      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
  13. 5 5
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/test/resources/processes/SimpleProcess.bpmn20.xml
  14. 1 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable/src/main/java/org/hswebframework/web/workflow/flowable/FlowableAutoConfiguration.java
  15. 11 2
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable/src/main/java/org/hswebframework/web/workflow/flowable/service/BpmActivityService.java
  16. 49 10
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable/src/main/java/org/hswebframework/web/workflow/flowable/service/imp/BpmActivityServiceImp.java
  17. 4 1
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable/src/main/java/org/hswebframework/web/workflow/flowable/service/imp/BpmTaskServiceImp.java
  18. 24 7
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable/src/test/java/org/hswebframework/web/workflow/flowable/ControllerTest.java
  19. 5 5
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable/src/test/resources/processes/SimpleProcess.bpmn20.xml

+ 3 - 7
hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/SimpleFieldFilterDataAccessConfig.java

@@ -6,6 +6,8 @@ import java.util.Arrays;
 import java.util.HashSet;
 import java.util.Set;
 
+import static org.hswebframework.web.authorization.access.DataAccessConfig.DefaultType.DENY_FIELDS;
+
 /**
  * 默认配置实现
  *
@@ -16,8 +18,6 @@ import java.util.Set;
 public class SimpleFieldFilterDataAccessConfig extends AbstractDataAccessConfig implements FieldFilterDataAccessConfig {
     private Set<String> fields;
 
-    private String type = DefaultType.DENY_FIELDS;
-
     public SimpleFieldFilterDataAccessConfig() {
     }
 
@@ -36,10 +36,6 @@ public class SimpleFieldFilterDataAccessConfig extends AbstractDataAccessConfig
 
     @Override
     public String getType() {
-        return type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
+        return DENY_FIELDS;
     }
 }

+ 16 - 0
hsweb-commons/hsweb-commons-service/hsweb-commons-service-simple/src/main/java/org/hswebframework/web/service/AbstractTreeSortService.java

@@ -17,9 +17,11 @@
 
 package org.hswebframework.web.service;
 
+import org.hswebframework.utils.RandomUtil;
 import org.hswebframework.web.commons.entity.TreeSortSupportEntity;
 import org.hswebframework.web.commons.entity.TreeSupportEntity;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -52,9 +54,22 @@ public abstract class AbstractTreeSortService<E extends TreeSortSupportEntity<PK
         return createQuery().where(TreeSupportEntity.parentId, parentId).noPaging().list();
     }
 
+    protected void applyPath(E entity) {
+        if (!StringUtils.isEmpty(entity.getParentId())) return;
+        if (!StringUtils.isEmpty(entity.getPath())) return;
+
+        TreeSortSupportEntity<PK> parent = selectByPk(entity.getParentId());
+        if (null == parent) {
+            entity.setParentId(null);
+        } else {
+            entity.setPath(parent.getPath() + "-" + RandomUtil.randomChar(4));
+        }
+    }
+
     @Override
     public PK insert(E entity) {
         if (entity.getId() == null) entity.setId(getIDGenerator().generate());
+        applyPath(entity);
         List<E> childrenList = new ArrayList<>();
         TreeSupportEntity.expandTree2List(entity, childrenList, getIDGenerator());
         super.insert(entity);
@@ -87,6 +102,7 @@ public abstract class AbstractTreeSortService<E extends TreeSortSupportEntity<PK
     public PK saveOrUpdateForSingle(E entity) {
         assertNotNull(entity);
         PK id = entity.getId();
+        applyPath(entity);
         if (null == id || this.selectByPk(id) == null) {
             if (null == id)
                 entity.setId(getIDGenerator().generate());

+ 13 - 0
hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/OrganizationalAuthorizationAutoConfiguration.java

@@ -23,6 +23,13 @@ public class OrganizationalAuthorizationAutoConfiguration implements BeanPostPro
         return new AreaScopeDataAccessHandler();
     }
 
+
+    @Bean
+    @ConditionalOnMissingBean(CustomScopeHandler.class)
+    public CustomScopeHandler customScopeHandler() {
+        return new CustomScopeHandler();
+    }
+
     @Bean
     @ConditionalOnMissingBean(DepartmentScopeDataAccessHandler.class)
     public DepartmentScopeDataAccessHandler departmentScopeDataAccessHandler() {
@@ -53,6 +60,12 @@ public class OrganizationalAuthorizationAutoConfiguration implements BeanPostPro
         return new ScopeDataAccessConfigConvert();
     }
 
+    @Bean
+    @ConditionalOnMissingBean(CustomScopeDataAccessConfigConvert.class)
+    public CustomScopeDataAccessConfigConvert customScopeDataAccessConfigConvert() {
+        return new CustomScopeDataAccessConfigConvert();
+    }
+
     @Override
     public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
         return bean;

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

@@ -40,6 +40,6 @@ public interface DataAccessType extends Serializable {
     /**
      * 自定义范围
      */
-    String SCOPE_TYPE_CUSTOM    = "CUSTOM";
+    String SCOPE_TYPE_CUSTOM    = "CUSTOM_SCOPE";
 
 }

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

@@ -0,0 +1,42 @@
+package org.hswebframework.web.organizational.authorization.simple;
+
+import java.io.Serializable;
+import java.util.Set;
+
+/**
+ * 自定义范围
+ *
+ * @author zhouhao
+ */
+public class CustomScope implements Serializable {
+
+    private String type;
+
+    private Set<String> ids;
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public Set<String> getIds() {
+        return ids;
+    }
+
+    public void setIds(Set<String> ids) {
+        this.ids = ids;
+    }
+
+    @Override
+    public int hashCode() {
+        return (type + "" + ids).hashCode();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        return obj instanceof CustomScope && hashCode() == obj.hashCode();
+    }
+}

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

@@ -0,0 +1,35 @@
+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 org.hswebframework.web.organizational.authorization.access.DataAccessType;
+
+import java.util.Arrays;
+import java.util.List;
+
+import static org.hswebframework.web.organizational.authorization.access.DataAccessType.*;
+
+/**
+ * TODO 完成注释
+ *
+ * @author zhouhao
+ */
+public class CustomScopeDataAccessConfigConvert implements DataAccessConfigConvert {
+    private static final List<String> supportTypes = Arrays.asList(
+            DataAccessType.SCOPE_TYPE_CUSTOM
+    );
+
+    @Override
+    public boolean isSupport(String type, String action, String config) {
+        return supportTypes.contains(type);
+    }
+
+    @Override
+    public DataAccessConfig convert(String type, String action, String config) {
+        SimpleCustomScopeDataAccessConfig accessConfig = JSON.parseObject(config, SimpleCustomScopeDataAccessConfig.class);
+        accessConfig.setAction(action);
+
+        return accessConfig;
+    }
+}

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

@@ -0,0 +1,28 @@
+package org.hswebframework.web.organizational.authorization.simple;
+
+import org.hswebframework.web.authorization.simple.AbstractDataAccessConfig;
+import org.hswebframework.web.organizational.authorization.access.DataAccessType;
+
+import java.util.Set;
+
+/**
+ * 自定义范围配置
+ *
+ * @author zhouhao
+ */
+public class SimpleCustomScopeDataAccessConfig extends AbstractDataAccessConfig {
+    private Set<CustomScope> scope;
+
+    @Override
+    public String getType() {
+        return DataAccessType.SCOPE_TYPE_CUSTOM;
+    }
+
+    public Set<CustomScope> getScope() {
+        return scope;
+    }
+
+    public void setScope(Set<CustomScope> scope) {
+        this.scope = scope;
+    }
+}

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

@@ -28,6 +28,13 @@ public class SimpleScopeDataAccessConfig extends AbstractDataAccessConfig implem
         this.scope = scope;
     }
 
+    public SimpleScopeDataAccessConfig(String type, String scopeType, String action, Set<Object> scope) {
+        this.scopeType = scopeType;
+        this.scope = scope;
+        this.type = type;
+        setAction(action);
+    }
+
     @Override
     public String getScopeType() {
         return scopeType;

+ 4 - 8
hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/simple/handler/AbstractScopeDataAccessHandler.java

@@ -81,7 +81,7 @@ public abstract class AbstractScopeDataAccessHandler<E> implements DataAccessHan
         if (scopes.size() == 0) return true;
         else if (scopes.size() == 1) scope = scopes.iterator().next();
         else logger.warn("existing many scope :{} , try use config.", scopes);
-        scopes = access.getScope().stream().map(String::valueOf).collect(Collectors.toSet());
+        scopes = getTryOperationScope(access).stream().map(String::valueOf).collect(Collectors.toSet());
         if (scope == null && scopes.size() == 1) {
             scope = scopes.iterator().next();
         }
@@ -115,14 +115,10 @@ public abstract class AbstractScopeDataAccessHandler<E> implements DataAccessHan
             //判断是否满足条件(泛型为 getEntityClass)
             Class entityType = ClassUtils.getGenericType(controller.getClass(), 0);
             if (ClassUtils.instanceOf(entityType, getEntityClass())) {
-                QueryService<E, Object> queryService =
-                        ((QueryController<E, Object, Entity>) controller).getService();
+                @SuppressWarnings("unchecked")
+                QueryService<E, Object> queryService = ((QueryController<E, Object, Entity>) controller).getService();
                 E oldData = queryService.selectByPk(id);
-                if (oldData != null && ids.contains(getOperationScope(oldData))) {
-                    return false;
-                } else {
-                    return true;
-                }
+                return !(oldData != null && !ids.contains(getOperationScope(oldData)));
             } else {
                 errorMsg = "GenericType[0] not instance of " + getEntityClass();
             }

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

@@ -0,0 +1,46 @@
+package org.hswebframework.web.organizational.authorization.simple.handler;
+
+import org.hswebframework.web.authorization.access.DataAccessConfig;
+import org.hswebframework.web.authorization.access.DataAccessHandler;
+import org.hswebframework.web.authorization.access.ScopeDataAccessConfig;
+import org.hswebframework.web.boost.aop.context.MethodInterceptorParamContext;
+import org.hswebframework.web.organizational.authorization.access.DataAccessType;
+import org.hswebframework.web.organizational.authorization.simple.CustomScope;
+import org.hswebframework.web.organizational.authorization.simple.SimpleCustomScopeDataAccessConfig;
+import org.hswebframework.web.organizational.authorization.simple.SimpleScopeDataAccessConfig;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * TODO 完成注释
+ *
+ * @author zhouhao
+ */
+public class CustomScopeHandler implements DataAccessHandler {
+
+    private List<DataAccessHandler> handlers = Arrays.asList(
+            new AreaScopeDataAccessHandler(),
+            new DepartmentScopeDataAccessHandler(),
+            new OrgScopeDataAccessHandler(),
+            new PersonScopeDataAccessHandler(),
+            new PositionScopeDataAccessHandler()
+    );
+
+    @Override
+    public boolean isSupport(DataAccessConfig access) {
+        return access instanceof SimpleCustomScopeDataAccessConfig;
+    }
+
+    @Override
+    public boolean handle(DataAccessConfig access, MethodInterceptorParamContext context) {
+        return ((SimpleCustomScopeDataAccessConfig) access).getScope()
+                .stream()
+                .map(scope -> new SimpleScopeDataAccessConfig(scope.getType(), DataAccessType.SCOPE_TYPE_CUSTOM, access.getAction(), new HashSet<>(scope.getIds())))
+                .allMatch(accessConfig -> handlers.stream()
+                        .filter(handler -> handler.isSupport(accessConfig))
+                        .allMatch(handler -> handler.handle(accessConfig, context)));
+    }
+}

hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/simple/handler/AreaScopeDataAccessHandler.java → hsweb-system/hsweb-system-organizational/hsweb-system-organizational-authorization/src/main/java/org/hswebframework/web/organizational/authorization/simple/handler/DistrictScopeDataAccessHandler.java


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

@@ -105,6 +105,7 @@ public class SimplePersonService extends EnableCacheGenericEntityService<PersonE
     @Override
     @Caching(evict = {
             @CacheEvict(key = "'id:'+#result"),
+            @CacheEvict(key = "'auth:persion-id'+#result"),
             @CacheEvict(key = "'auth-bind'+#result")
     })
     public String insert(PersonAuthBindEntity authBindEntity) {
@@ -123,6 +124,7 @@ public class SimplePersonService extends EnableCacheGenericEntityService<PersonE
     @Override
     @Caching(evict = {
             @CacheEvict(key = "'id:'+#authBindEntity.id"),
+            @CacheEvict(key = "'auth:persion-id'+#authBindEntity.id"),
             @CacheEvict(key = "'auth-bind'+#authBindEntity.id")
     })
     public int updateByPk(PersonAuthBindEntity authBindEntity) {

文件差异内容过多而无法显示
+ 5 - 5
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/test/resources/processes/SimpleProcess.bpmn20.xml


+ 1 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable/src/main/java/org/hswebframework/web/workflow/flowable/FlowableAutoConfiguration.java

@@ -30,6 +30,7 @@ public class FlowableAutoConfiguration {
         return configuration -> {
             configuration
                     .setAsyncExecutorActivate(false)
+                    .setDatabaseSchemaUpdate("false")
                     .setJobExecutorActivate(false)
                     .setActivityFontName("宋体")
                     .setLabelFontName("宋体")

+ 11 - 2
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable/src/main/java/org/hswebframework/web/workflow/flowable/service/BpmActivityService.java

@@ -1,6 +1,7 @@
 package org.hswebframework.web.workflow.flowable.service;
 
 import org.activiti.engine.impl.pvm.process.ActivityImpl;
+import org.activiti.engine.impl.task.TaskDefinition;
 
 import java.util.List;
 import java.util.Map;
@@ -58,9 +59,17 @@ public interface BpmActivityService {
      *
      * @param procDefId        流程定义ID
      * @param activityId        图元ID
-     * @return List<ActivityImpl>  当前流程的所有节点资源
+     * @return List<TaskDefinition>  当前流程的所有下一环节资源
+     */
+    List<TaskDefinition> getNextActivitys(String procDefId, String activityId);
+
+    /**
+     * 根据图元获取办理环节数据
+     * @param activityImpl
+     * @param elString 根据连线条件conditionText获取输出节点,主要用于网关分支(预留)
+     * @return
      */
-    List<ActivityImpl> getNextActivitys(String procDefId, String activityId);
+    List<TaskDefinition> getTaskDefinition(ActivityImpl activityImpl, String elString);
 
     /**
      * 获取下一环节办理人

+ 49 - 10
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable/src/main/java/org/hswebframework/web/workflow/flowable/service/imp/BpmActivityServiceImp.java

@@ -2,7 +2,9 @@ package org.hswebframework.web.workflow.flowable.service.imp;
 
 import org.activiti.engine.delegate.Expression;
 import org.activiti.engine.impl.RepositoryServiceImpl;
+import org.activiti.engine.impl.bpmn.behavior.UserTaskActivityBehavior;
 import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
+import org.activiti.engine.impl.pvm.PvmActivity;
 import org.activiti.engine.impl.pvm.PvmTransition;
 import org.activiti.engine.impl.pvm.process.ActivityImpl;
 import org.activiti.engine.impl.task.TaskDefinition;
@@ -94,35 +96,72 @@ public class BpmActivityServiceImp extends FlowableAbstract implements BpmActivi
     }
 
     @Override
-    public List<ActivityImpl> getNextActivitys(String procDefId, String activityId) {
+    public List<TaskDefinition> getNextActivitys(String procDefId, String activityId) {
         ActivityImpl activity;
         if(activityId!=null)
             activity = getActivityById(procDefId, activityId);
         else
             activity = getStartEvent(procDefId);
         List<PvmTransition> pvmTransitions = activity.getOutgoingTransitions();
-        List<ActivityImpl> activities = new ArrayList<>();
+        List<TaskDefinition> taskDefinitions = new ArrayList<>();
         for(PvmTransition pvmTransition : pvmTransitions){
-            activities.add((ActivityImpl)pvmTransition.getDestination());
+            PvmActivity pvmActivity = pvmTransition.getDestination();
+            taskDefinitions.addAll(getTaskDefinition((ActivityImpl)pvmActivity,""));
         }
-        return activities;
+        return taskDefinitions;
+    }
+
+    @Override
+    public List<TaskDefinition> getTaskDefinition(ActivityImpl activityImpl, String elString) {
+        List<TaskDefinition> taskDefinitionList = new ArrayList<>();
+        List<TaskDefinition> nextTaskDefinition;
+        if("userTask".equals(activityImpl.getProperty("type"))){
+            TaskDefinition taskDefinition = ((UserTaskActivityBehavior)activityImpl.getActivityBehavior()).getTaskDefinition();
+            taskDefinitionList.add(taskDefinition);
+        }else{
+            List<PvmTransition> pvmTransitions = activityImpl.getOutgoingTransitions();
+            List<PvmTransition> outTransitionsTemp;
+            for(PvmTransition tr:pvmTransitions){
+                PvmActivity pvmActivity = tr.getDestination(); //获取线路的终点节点
+                if("exclusiveGateway".equals(pvmActivity.getProperty("type"))||"parallelGateway".equals(pvmActivity.getProperty("type"))){
+                    outTransitionsTemp = pvmActivity.getOutgoingTransitions();
+                    if(outTransitionsTemp.size() == 1){
+                        nextTaskDefinition =getTaskDefinition((ActivityImpl)outTransitionsTemp.get(0).getDestination(), elString);
+                        taskDefinitionList.addAll(nextTaskDefinition);
+                    }else if(outTransitionsTemp.size() > 1){
+                        for(PvmTransition tr1 : outTransitionsTemp){
+                            Object s = tr1.getProperty("conditionText");
+                            if(elString.equals(s.toString().trim())){
+                                nextTaskDefinition = getTaskDefinition((ActivityImpl)tr1.getDestination(), elString);
+                                taskDefinitionList.addAll(nextTaskDefinition);
+                            }
+                        }
+                    }
+                }else if("userTask".equals(pvmActivity.getProperty("type"))){
+                    taskDefinitionList.add(((UserTaskActivityBehavior)((ActivityImpl)pvmActivity).getActivityBehavior()).getTaskDefinition());
+                }
+            }
+        }
+        return taskDefinitionList;
     }
 
     @Override
     public Map<String, List<String>> getNextClaim(String procDefId, String activityId) {
-        List<ActivityImpl> activities = getNextActivitys(procDefId, activityId);
+        List<TaskDefinition> taskDefinitions = getNextActivitys(procDefId, activityId);
         Map<String, List<String>> map = new HashMap<>();
-        for(ActivityImpl activity : activities){
+        for(TaskDefinition taskDefinition : taskDefinitions){
             List<String> list = new ArrayList<>();
-            TaskDefinition taskDefinition = (TaskDefinition) activity.getProperty("taskDefinition");
-            if(taskDefinition.getAssigneeExpression()!=null)
+            if(taskDefinition!=null && taskDefinition.getAssigneeExpression()!=null)
                 list.add(taskDefinition.getAssigneeExpression().getExpressionText());
-            else if(taskDefinition.getCandidateUserIdExpressions()!=null){
+            else if(taskDefinition!=null && taskDefinition.getCandidateUserIdExpressions()!=null){
                 for(Expression expression : taskDefinition.getCandidateUserIdExpressions()){
                     list.add(expression.getExpressionText());
                 }
             }
-            map.put(activity.getId(),list);
+            if(taskDefinition.getNameExpression()!=null)
+                map.put(taskDefinition.getNameExpression().getExpressionText(),list);
+            else
+                map.put(taskDefinition.getKey(),list);
         }
         return map;
     }

+ 4 - 1
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable/src/main/java/org/hswebframework/web/workflow/flowable/service/imp/BpmTaskServiceImp.java

@@ -182,12 +182,15 @@ public class BpmTaskServiceImp extends FlowableAbstract implements BpmTaskServic
 
     @Override
     public ActivityImpl selectActivityImplByTask(String taskId) {
+        if(StringUtils.isNullOrEmpty(taskId)){
+            return new ActivityImpl(null,null);
+        }
         Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
         ProcessDefinitionEntity entity = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService).getDeployedProcessDefinition(task.getProcessDefinitionId());
         List<ActivityImpl> activities = entity.getActivities();
         ActivityImpl activity = null;
         for(ActivityImpl activity1 : activities){
-            if(activity1.getProperty("name").equals(task.getName())){
+            if(activity1.getProperty("type").equals("userTask") && activity1.getProperty("name").equals(task.getName())){
                 activity = activity1;
             }
         }

+ 24 - 7
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable/src/test/java/org/hswebframework/web/workflow/flowable/ControllerTest.java

@@ -48,7 +48,10 @@ public class ControllerTest extends SimpleWebApplicationTests {
     public ProcessInstance start() throws Exception {
         Map<String, Object> map = new HashMap<>();
         map.put("username", "admin");
-        return bpmProcessService.startProcessInstance("1", "test", null, null, "流程名", map);
+        map.put("leader", "zhangsan");
+        map.put("team", "lisi");
+        map.put("people", "wangwu");
+        return bpmProcessService.startProcessInstance("1", "testid", null, null, "流程名", map);
     }
 
     // 流程图元数据test
@@ -93,13 +96,20 @@ public class ControllerTest extends SimpleWebApplicationTests {
         System.out.println(activity);
         System.out.println("=========>>>");
         System.out.println("=========流程流转下一步,下一步为并行网关。>>>");
-        for (Task task:tasks) {
-            bpmTaskService.complete(task.getId(), "zhangsan",null,null);
-        }
+//        for (Task task:tasks) {
+//            bpmTaskService.complete(task.getId(), "zhangsan",null,null);
+//        }
         tasks = bpmTaskService.selectTaskByProcessId(processInstance.getId());
         Assert.assertNotNull(tasks);
         for (Task task:tasks) {
-            System.out.println("当前环节:"+task.getName()+"__办理人:"+task.getAssignee());
+            System.out.println("当前环节:"+task.getName()+"__id:"+task.getId()+"__办理人:"+task.getAssignee());
+
+            activity = bpmTaskService.selectActivityImplByTask(task.getId());
+            System.out.println("当前节点图元id:"+activity.getId());
+            System.out.println(activity);
+            System.out.println("=========>>>");
+            Map<String, List<String>> map = bpmActivityService.getNextClaim(task.getProcessDefinitionId(),activity.getId());
+            System.out.println("下一步执行json:"+JSON.toJSONString(map));
         }
         System.out.println("=========>>>");
         activity = bpmActivityService.getActivityByProcInstId(processInstance.getProcessDefinitionId(), processInstance.getId());
@@ -109,10 +119,17 @@ public class ControllerTest extends SimpleWebApplicationTests {
 
     }
 
+    @Autowired
+    RepositoryService repositoryService;
+
     @Test
     public void task(){
-        List<Task> task = bpmTaskService.selectTaskByProcessId("5");
-        System.out.println(task);
+        ActivityImpl activity = bpmTaskService.selectActivityImplByTask("");
+        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionKey("testid").orderByProcessDefinitionVersion().desc().singleResult();
+        Map<String, List<String>> map = bpmActivityService.getNextClaim(processDefinition.getId(),activity.getId());
+        System.out.println("=========>>>");
+        System.out.println(JSON.toJSONString(map));
+        System.out.println("=========>>>");
     }
 
     @Configuration

文件差异内容过多而无法显示
+ 5 - 5
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable/src/test/resources/processes/SimpleProcess.bpmn20.xml