Browse Source

优化获取下一环节的候选人

zhouhao 6 years ago
parent
commit
d164a57fc5

+ 45 - 7
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/service/imp/BpmActivityServiceImpl.java

@@ -1,11 +1,19 @@
 package org.hswebframework.web.workflow.service.imp;
 
+import org.activiti.engine.ProcessEngine;
 import org.activiti.engine.delegate.DelegateExecution;
 import org.activiti.engine.delegate.Expression;
+import org.activiti.engine.delegate.VariableScope;
 import org.activiti.engine.impl.Condition;
 import org.activiti.engine.impl.RepositoryServiceImpl;
 import org.activiti.engine.impl.bpmn.behavior.UserTaskActivityBehavior;
 import org.activiti.engine.impl.bpmn.parser.BpmnParse;
+import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl;
+import org.activiti.engine.impl.context.Context;
+import org.activiti.engine.impl.delegate.ExpressionGetInvocation;
+import org.activiti.engine.impl.el.ExpressionManager;
+import org.activiti.engine.impl.javax.el.ELContext;
+import org.activiti.engine.impl.juel.ExpressionFactoryImpl;
 import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
 import org.activiti.engine.impl.pvm.PvmActivity;
 import org.activiti.engine.impl.pvm.PvmTransition;
@@ -13,9 +21,13 @@ import org.activiti.engine.impl.pvm.process.ActivityImpl;
 import org.activiti.engine.impl.pvm.process.ProcessElementImpl;
 import org.activiti.engine.impl.task.TaskDefinition;
 import org.activiti.engine.repository.ProcessDefinition;
+import org.activiti.engine.runtime.Execution;
 import org.activiti.engine.runtime.ProcessInstance;
 import org.hswebframework.web.workflow.service.BpmActivityService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
 
 import java.util.*;
 import java.util.function.Predicate;
@@ -28,6 +40,9 @@ import java.util.stream.Collectors;
 @Service
 public class BpmActivityServiceImpl extends AbstractFlowableService implements BpmActivityService {
 
+    @Autowired
+    private ProcessEngine processEngine;
+
     /**
      * 获取指定节点
      *
@@ -90,7 +105,7 @@ public class BpmActivityServiceImpl extends AbstractFlowableService implements B
     }
 
     @Override
-    public List<TaskDefinition> getNextActivities(String procDefId, String activityId,DelegateExecution execution) {
+    public List<TaskDefinition> getNextActivities(String procDefId, String activityId, DelegateExecution execution) {
         ActivityImpl activity;
         if (activityId != null) {
             activity = getActivityById(procDefId, activityId);
@@ -112,7 +127,7 @@ public class BpmActivityServiceImpl extends AbstractFlowableService implements B
 
     @Override
     public List<TaskDefinition> getTaskDefinition(ActivityImpl activityImpl, DelegateExecution execution) {
-        List<TaskDefinition> taskDefinitionList = new ArrayList<>();
+        Set<TaskDefinition> taskDefinitionList = new HashSet<>();
         List<TaskDefinition> nextTaskDefinition;
         if ("userTask".equals(activityImpl.getProperty("type"))) {
             TaskDefinition taskDefinition = ((UserTaskActivityBehavior) activityImpl.getActivityBehavior()).getTaskDefinition();
@@ -121,16 +136,39 @@ public class BpmActivityServiceImpl extends AbstractFlowableService implements B
             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"))) {
+                PvmActivity pvmActivity = tr.getSource(); //获取线路的终点节点
+
+                boolean exclusiveGateway = "exclusiveGateway".equals(pvmActivity.getProperty("type"));
+                boolean parallelGateway = "parallelGateway".equals(pvmActivity.getProperty("type"));
+
+                if (exclusiveGateway || parallelGateway) {
                     outTransitionsTemp = pvmActivity.getOutgoingTransitions();
                     if (outTransitionsTemp.size() == 1) {
                         nextTaskDefinition = getTaskDefinition((ActivityImpl) outTransitionsTemp.get(0).getDestination(), execution);
                         taskDefinitionList.addAll(nextTaskDefinition);
                     } else if (outTransitionsTemp.size() > 1) {
                         for (PvmTransition transition : outTransitionsTemp) {
-                            Condition condition = (Condition) transition.getProperty(BpmnParse.PROPERTYNAME_CONDITION);
-                            if (condition.evaluate(transition.getId(), execution)) {
+                            String condition = (String) transition.getProperty(BpmnParse.PROPERTYNAME_CONDITION_TEXT);
+                            if (StringUtils.isEmpty(condition)) {
+                                nextTaskDefinition = getTaskDefinition((ActivityImpl) transition.getDestination(), execution);
+                                if (exclusiveGateway) {
+                                    if (!CollectionUtils.isEmpty(nextTaskDefinition)) {
+                                        taskDefinitionList.add(nextTaskDefinition.get(0));
+                                    }
+                                } else {
+                                    taskDefinitionList.addAll(nextTaskDefinition);
+                                }
+                                continue;
+                            }
+                            ExpressionManager expressionManager = ((ProcessEngineConfigurationImpl) processEngine.getProcessEngineConfiguration()).getExpressionManager();
+
+                            ELContext elContext = expressionManager.getElContext(execution);
+
+                            ExpressionFactoryImpl factory = new ExpressionFactoryImpl();
+
+                            Object e = factory.createValueExpression(elContext, condition, Object.class).getValue(elContext);
+
+                            if (Boolean.TRUE.equals(e)) {
                                 nextTaskDefinition = getTaskDefinition((ActivityImpl) transition.getDestination(), execution);
                                 taskDefinitionList.addAll(nextTaskDefinition);
                             }
@@ -141,7 +179,7 @@ public class BpmActivityServiceImpl extends AbstractFlowableService implements B
                 }
             }
         }
-        return taskDefinitionList;
+        return new ArrayList<>(taskDefinitionList);
     }
 
     @Override

+ 1 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/service/imp/ProcessConfigurationServiceImpl.java

@@ -89,6 +89,7 @@ public class ProcessConfigurationServiceImpl implements ProcessConfigurationServ
 
                     return dimension.getCandidateUserIdList()
                             .stream()
+                            .distinct()
                             .map(userId ->
                                     Lazy.val(() -> new CandidateInfo() {
                                         @Override

+ 4 - 1
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/web/FlowableProcessController.java

@@ -145,6 +145,7 @@ public class FlowableProcessController {
         ProcessDefinition definition = repositoryService.createProcessDefinitionQuery()
                 .processDefinitionKey(defineKey)
                 .active()
+                .latestVersion()
                 .singleResult();
 
         if (null == definition) {
@@ -375,7 +376,9 @@ public class FlowableProcessController {
                 .flatMap(key ->
                         processConfigurationService
                                 .getActivityConfiguration(authentication.getUser().getId(), task.getProcessDefinitionId(), key)
-                                .getCandidateInfo(task).stream())
+                                .getCandidateInfo(task)
+                                .stream())
+                .distinct()
                 .map(CandidateDetail::of)
                 .collect(Collectors.toList());
 

+ 13 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/web/response/CandidateDetail.java

@@ -43,4 +43,17 @@ public class CandidateDetail implements Bean {
 
         return detail;
     }
+
+    @Override
+    public int hashCode() {
+        return userId.hashCode();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (obj instanceof CandidateDetail) {
+            return ((CandidateDetail) obj).getUserId().equals(userId);
+        }
+        return super.equals(obj);
+    }
 }