浏览代码

解决抄送/跳转节点反序列化问题

caixiaofeng 6 月之前
父节点
当前提交
cbc0154ba6

+ 5 - 6
flow-common/flow-common-flowable-starter/src/main/java/com/flow/flowable/behavior/CopyActivityBehavior.java

@@ -3,8 +3,7 @@ package com.flow.flowable.behavior;
 import com.flow.flowable.cmd.CopyProcessInstanceCmd;
 import com.flow.flowable.event.CustomFlowableEngineEvent;
 import com.flow.flowable.event.CustomFlowableEventType;
-import com.flow.flowable.model.CopyServiceTask;
-import org.flowable.bpmn.model.MultiInstanceLoopCharacteristics;
+import org.flowable.common.engine.api.delegate.Expression;
 import org.flowable.common.engine.api.delegate.event.FlowableEventDispatcher;
 import org.flowable.engine.ManagementService;
 import org.flowable.engine.delegate.DelegateExecution;
@@ -12,18 +11,18 @@ import org.flowable.engine.impl.bpmn.behavior.AbstractBpmnActivityBehavior;
 import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
 import org.flowable.engine.impl.persistence.entity.*;
 import org.flowable.engine.impl.util.CommandContextUtil;
+import org.flowable.http.common.impl.ExpressionUtils;
 
 import java.util.List;
 import java.util.Objects;
 
 public class CopyActivityBehavior extends AbstractBpmnActivityBehavior {
+    private static final long serialVersionUID = 1L;
+    protected Expression assignee;
 
     @Override
     public void execute(DelegateExecution execution) {
-        CopyServiceTask copyServiceTask = (CopyServiceTask) execution.getCurrentFlowElement();
-        MultiInstanceLoopCharacteristics loopCharacteristics = copyServiceTask.getLoopCharacteristics();
-        String elementVariable = loopCharacteristics.getElementVariable();
-        String assignee = execution.getVariableLocal(elementVariable, String.class);
+        String assignee = ExpressionUtils.getStringFromField(this.assignee, execution);
         ActivityInstanceEntityManager activityInstanceEntityManager = CommandContextUtil.getActivityInstanceEntityManager();
         List<ActivityInstanceEntity> activityInstanceEntities = activityInstanceEntityManager.findActivityInstancesByExecutionAndActivityId(execution.getId(), execution.getCurrentActivityId());
         for (ActivityInstanceEntity activityInstanceEntity : activityInstanceEntities) {

+ 2 - 0
flow-common/flow-common-flowable-starter/src/main/java/com/flow/flowable/behavior/JumpActivityBehavior.java

@@ -18,6 +18,8 @@ import org.springframework.util.StringUtils;
 import java.util.Objects;
 
 public class JumpActivityBehavior extends AbstractBpmnActivityBehavior {
+    private static final long serialVersionUID = 1L;
+    protected Expression targetNode;
 
     @Override
     public void execute(DelegateExecution execution) {

+ 1 - 2
flow-common/flow-common-flowable-starter/src/main/java/com/flow/flowable/configure/FlowableConfigure.java

@@ -6,7 +6,6 @@ import com.flow.flowable.converter.CustomServiceTaskXMLConverter;
 import com.flow.flowable.converter.JumpServiceTaskXMLConverter;
 import com.flow.flowable.expression.VariableBetweenExpressionFunction;
 import com.flow.flowable.expression.VariableContainsAllExpressionFunction;
-import com.flow.flowable.mapper.CustomProcessDefinitionDataManager;
 import com.flow.flowable.parser.factory.CustomDefaultActivityBehaviorFactory;
 import com.flow.flowable.parser.handler.CopyServiceTaskParseHandler;
 import com.flow.flowable.parser.handler.JumpServiceTaskParseHandler;
@@ -71,7 +70,7 @@ public class FlowableConfigure implements EngineConfigurationConfigurer<SpringPr
         if (Objects.nonNull(this.deploymentCache)) {
             engineConfiguration.setProcessDefinitionCache(deploymentCache);
             engineConfiguration.setProcessDefinitionCacheLimit(1000);
-            engineConfiguration.setProcessDefinitionDataManager(new CustomProcessDefinitionDataManager(engineConfiguration, this.deploymentCache));
+            // engineConfiguration.setProcessDefinitionDataManager(new CustomProcessDefinitionDataManager(engineConfiguration, this.deploymentCache));
         }
     }
 }

+ 17 - 0
flow-common/flow-common-flowable-starter/src/main/java/com/flow/flowable/parser/factory/CustomDefaultActivityBehaviorFactory.java

@@ -1,8 +1,25 @@
 package com.flow.flowable.parser.factory;
 
+import com.flow.flowable.behavior.CopyActivityBehavior;
+import com.flow.flowable.behavior.JumpActivityBehavior;
+import org.flowable.bpmn.model.ServiceTask;
+import org.flowable.engine.impl.bpmn.helper.ClassDelegate;
+import org.flowable.engine.impl.bpmn.parser.FieldDeclaration;
 import org.flowable.engine.impl.bpmn.parser.factory.DefaultActivityBehaviorFactory;
 
+import java.util.List;
+
 public class CustomDefaultActivityBehaviorFactory extends DefaultActivityBehaviorFactory {
 
 
+    public CopyActivityBehavior createCopyActivityBehavior(ServiceTask serviceTask) {
+        List<FieldDeclaration> fieldDeclarations = super.createFieldDeclarations(serviceTask.getFieldExtensions());
+        return (CopyActivityBehavior) ClassDelegate.defaultInstantiateDelegate(CopyActivityBehavior.class, fieldDeclarations);
+    }
+
+    public JumpActivityBehavior createJumpActivityBehavior(ServiceTask serviceTask) {
+        List<FieldDeclaration> fieldDeclarations = super.createFieldDeclarations(serviceTask.getFieldExtensions());
+        return (JumpActivityBehavior) ClassDelegate.defaultInstantiateDelegate(JumpActivityBehavior.class, fieldDeclarations);
+    }
+
 }

+ 6 - 7
flow-common/flow-common-flowable-starter/src/main/java/com/flow/flowable/parser/handler/CopyServiceTaskParseHandler.java

@@ -1,13 +1,13 @@
 package com.flow.flowable.parser.handler;
 
-import com.flow.flowable.behavior.CopyActivityBehavior;
 import com.flow.flowable.model.CopyServiceTask;
+import com.flow.flowable.parser.factory.CustomDefaultActivityBehaviorFactory;
 import org.flowable.bpmn.model.BaseElement;
 import org.flowable.bpmn.model.ServiceTask;
 import org.flowable.engine.impl.bpmn.parser.BpmnParse;
-import org.flowable.engine.impl.bpmn.parser.handler.ServiceTaskParseHandler;
+import org.flowable.engine.impl.bpmn.parser.handler.AbstractActivityBpmnParseHandler;
 
-public class CopyServiceTaskParseHandler extends ServiceTaskParseHandler {
+public class CopyServiceTaskParseHandler extends AbstractActivityBpmnParseHandler<ServiceTask> {
     @Override
     public Class<? extends BaseElement> getHandledType() {
         return CopyServiceTask.class;
@@ -15,9 +15,8 @@ public class CopyServiceTaskParseHandler extends ServiceTaskParseHandler {
 
     @Override
     protected void executeParse(BpmnParse bpmnParse, ServiceTask serviceTask) {
-        super.executeParse(bpmnParse, serviceTask);
-        if (serviceTask.getBehavior() == null) {
-            serviceTask.setBehavior(new CopyActivityBehavior());
-        }
+        CustomDefaultActivityBehaviorFactory activityBehaviorFactory = (CustomDefaultActivityBehaviorFactory) bpmnParse.getActivityBehaviorFactory();
+        serviceTask.setBehavior(activityBehaviorFactory.createCopyActivityBehavior(serviceTask));
     }
+
 }

+ 6 - 7
flow-common/flow-common-flowable-starter/src/main/java/com/flow/flowable/parser/handler/JumpServiceTaskParseHandler.java

@@ -1,13 +1,13 @@
 package com.flow.flowable.parser.handler;
 
-import com.flow.flowable.behavior.JumpActivityBehavior;
 import com.flow.flowable.model.JumpServiceTask;
+import com.flow.flowable.parser.factory.CustomDefaultActivityBehaviorFactory;
 import org.flowable.bpmn.model.BaseElement;
 import org.flowable.bpmn.model.ServiceTask;
 import org.flowable.engine.impl.bpmn.parser.BpmnParse;
-import org.flowable.engine.impl.bpmn.parser.handler.ServiceTaskParseHandler;
+import org.flowable.engine.impl.bpmn.parser.handler.AbstractActivityBpmnParseHandler;
 
-public class JumpServiceTaskParseHandler extends ServiceTaskParseHandler {
+public class JumpServiceTaskParseHandler extends AbstractActivityBpmnParseHandler<ServiceTask> {
     @Override
     public Class<? extends BaseElement> getHandledType() {
         return JumpServiceTask.class;
@@ -15,9 +15,8 @@ public class JumpServiceTaskParseHandler extends ServiceTaskParseHandler {
 
     @Override
     protected void executeParse(BpmnParse bpmnParse, ServiceTask serviceTask) {
-        super.executeParse(bpmnParse, serviceTask);
-        if (serviceTask.getBehavior() == null) {
-            serviceTask.setBehavior(new JumpActivityBehavior());
-        }
+        CustomDefaultActivityBehaviorFactory activityBehaviorFactory = (CustomDefaultActivityBehaviorFactory) bpmnParse.getActivityBehaviorFactory();
+        serviceTask.setBehavior(activityBehaviorFactory.createJumpActivityBehavior(serviceTask));
     }
+
 }

+ 27 - 5
flow-common/flow-common-flowable-starter/src/main/java/com/flow/flowable/validator/CustomServiceTaskValidator.java

@@ -1,7 +1,11 @@
 package com.flow.flowable.validator;
 
+import com.flow.flowable.utils.ProcessElementUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.flowable.bpmn.model.FieldExtension;
 import org.flowable.bpmn.model.Process;
 import org.flowable.bpmn.model.ServiceTask;
+import org.flowable.bpmn.model.TaskWithFieldExtensions;
 import org.flowable.validation.ValidationError;
 import org.flowable.validation.validator.impl.ServiceTaskValidator;
 
@@ -11,12 +15,30 @@ public class CustomServiceTaskValidator extends ServiceTaskValidator {
 
     @Override
     protected void verifyType(Process process, ServiceTask serviceTask, List<ValidationError> errors) {
-        if ("copy".equalsIgnoreCase(serviceTask.getType())) {
-            return;
+        String type = serviceTask.getType();
+        if (StringUtils.isNotEmpty(type)) {
+            if (type.equalsIgnoreCase("copy")) {
+                this.validateFieldDeclarationsForCopy(process, serviceTask, serviceTask.getFieldExtensions(), errors);
+            } else if (type.equalsIgnoreCase("jump")) {
+                this.validateFieldDeclarationsForJump(process, serviceTask, serviceTask.getFieldExtensions(), errors);
+            } else {
+                super.verifyType(process, serviceTask, errors);
+            }
         }
-        if ("jump".equalsIgnoreCase(serviceTask.getType())) {
-            return;
+    }
+
+
+    private void validateFieldDeclarationsForCopy(Process process, TaskWithFieldExtensions task, List<FieldExtension> fieldExtensions, List<ValidationError> errors) {
+        String assignee = ProcessElementUtil.getFieldExtensionExpression(task, "assignee");
+        if (StringUtils.isBlank(assignee)) {
+            addError(errors, "flowable-copyTask-no-assignee", process, task, "抄送节点缺少assignee属性");
+        }
+    }
+
+    private void validateFieldDeclarationsForJump(Process process, TaskWithFieldExtensions task, List<FieldExtension> fieldExtensions, List<ValidationError> errors) {
+        String targetNode = ProcessElementUtil.getFieldExtensionValue(task, "targetNode");
+        if (StringUtils.isBlank(targetNode)) {
+            addError(errors, "flowable-jumpTask-no-targetNode", process, task, "跳转节点缺少targetNode属性");
         }
-        super.verifyType(process, serviceTask, errors);
     }
 }