caixiaofeng 5 місяців тому
батько
коміт
75b191fe75

+ 15 - 0
flow-common/flow-common-flowable-starter/src/main/java/com/flow/flowable/utils/ProcessElementUtil.java

@@ -160,6 +160,21 @@ public class ProcessElementUtil {
         return fieldExtension != null ? fieldExtension.getExpression() : null;
     }
 
+    /**
+     * 设置扩展字段
+     * @param element
+     * @param key
+     * @param value
+     */
+    public static void setFieldExtensionExpression(TaskWithFieldExtensions element, String key, String value) {
+        List<FieldExtension> fieldExtensions = element.getFieldExtensions();
+        FieldExtension fieldExtension = new FieldExtension();
+        fieldExtension.setFieldName(key);
+        fieldExtension.setExpression(value);
+        fieldExtensions.add(fieldExtension);
+        element.setFieldExtensions(fieldExtensions);
+    }
+
     /**
      * 递归获取父执行
      *

+ 24 - 0
flow-workflow/flow-workflow-biz/src/main/java/com/flow/behavior/HttpActivityBehavior.java

@@ -0,0 +1,24 @@
+package com.flow.behavior;
+
+import lombok.extern.slf4j.Slf4j;
+import org.flowable.common.engine.api.delegate.Expression;
+import org.flowable.engine.delegate.DelegateExecution;
+import org.flowable.engine.impl.bpmn.behavior.AbstractBpmnActivityBehavior;
+import org.springframework.stereotype.Component;
+
+@Slf4j
+@Component
+public class HttpActivityBehavior extends AbstractBpmnActivityBehavior {
+    protected Expression url;
+    protected Expression method;
+    protected Expression headers;
+    protected Expression params;
+    protected Expression requestTimeout;
+
+    @Override
+    public void execute(DelegateExecution execution) {
+
+
+        leave(execution);
+    }
+}

+ 24 - 0
flow-workflow/flow-workflow-biz/src/main/java/com/flow/behavior/MicroActivityBehavior.java

@@ -0,0 +1,24 @@
+package com.flow.behavior;
+
+import lombok.extern.slf4j.Slf4j;
+import org.flowable.common.engine.api.delegate.Expression;
+import org.flowable.engine.delegate.DelegateExecution;
+import org.flowable.engine.impl.bpmn.behavior.AbstractBpmnActivityBehavior;
+import org.springframework.stereotype.Component;
+
+@Slf4j
+@Component
+public class MicroActivityBehavior extends AbstractBpmnActivityBehavior {
+    protected Expression url;
+    protected Expression method;
+    protected Expression headers;
+    protected Expression params;
+    protected Expression requestTimeout;
+
+    @Override
+    public void execute(DelegateExecution execution) {
+
+
+        leave(execution);
+    }
+}

+ 21 - 0
flow-workflow/flow-workflow-biz/src/main/java/com/flow/behavior/MqActivityBehavior.java

@@ -0,0 +1,21 @@
+package com.flow.behavior;
+
+import lombok.extern.slf4j.Slf4j;
+import org.flowable.common.engine.api.delegate.Expression;
+import org.flowable.engine.delegate.DelegateExecution;
+import org.flowable.engine.impl.bpmn.behavior.AbstractBpmnActivityBehavior;
+import org.springframework.stereotype.Component;
+
+@Slf4j
+@Component
+public class MqActivityBehavior extends AbstractBpmnActivityBehavior {
+    protected Expression queue;
+    protected Expression params;
+
+    @Override
+    public void execute(DelegateExecution execution) {
+        log.info("MQ消息发送");
+
+        leave(execution);
+    }
+}

+ 46 - 0
flow-workflow/flow-workflow-entity/src/main/java/com/flow/entity/node/TriggerNode.java

@@ -0,0 +1,46 @@
+package com.flow.entity.node;
+
+import com.flow.common.core.exception.BaseException;
+import com.flow.entity.node.trigger.Trigger;
+import com.google.common.collect.Lists;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.flowable.bpmn.model.FlowElement;
+import org.flowable.bpmn.model.SequenceFlow;
+import org.flowable.bpmn.model.ServiceTask;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class TriggerNode extends Node {
+    private Trigger trigger;
+
+    @Override
+    public List<FlowElement> convert() {
+        ArrayList<FlowElement> elements = Lists.newArrayList();
+        // 服务节点
+        ServiceTask serviceTask = new ServiceTask();
+        serviceTask.setId(this.getId());
+        serviceTask.setName(this.getName());
+        serviceTask.setExecutionListeners(this.buidEventListener());
+        if(Objects.isNull(this.trigger)){
+            throw new BaseException("触发器不能为空");
+        }
+        this.trigger.initImpl(serviceTask);
+        elements.add(serviceTask);
+        // 下一个节点的连线
+        Node next = this.getNext();
+        SequenceFlow sequenceFlow = this.buildSequence(next);
+        elements.add(sequenceFlow);
+        // 下一个节点
+        if (Objects.nonNull(next)) {
+            next.setBranchId(this.getBranchId());
+            List<FlowElement> flowElements = next.convert();
+            elements.addAll(flowElements);
+        }
+        return elements;
+    }
+}

+ 25 - 0
flow-workflow/flow-workflow-entity/src/main/java/com/flow/entity/node/trigger/ClassTrigger.java

@@ -0,0 +1,25 @@
+package com.flow.entity.node.trigger;
+
+import com.flow.flowable.utils.ProcessElementUtil;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.flowable.bpmn.model.ServiceTask;
+
+import java.util.Map;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class ClassTrigger extends Trigger {
+    private String implementationType;
+    private String implementation;
+    private Map<String, String> params;
+
+    @Override
+    public void initImpl(ServiceTask serviceTask) {
+        serviceTask.setImplementationType(this.implementationType);
+        serviceTask.setImplementation(this.implementation);
+        for (String key : params.keySet()) {
+            ProcessElementUtil.setFieldExtensionExpression(serviceTask, key, params.get(key));
+        }
+    }
+}

+ 43 - 0
flow-workflow/flow-workflow-entity/src/main/java/com/flow/entity/node/trigger/HttpTrigger.java

@@ -0,0 +1,43 @@
+package com.flow.entity.node.trigger;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.flow.common.core.exception.BaseException;
+import com.flow.common.core.util.ApplicationContextUtil;
+import com.flow.flowable.utils.ProcessElementUtil;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.flowable.bpmn.model.ImplementationType;
+import org.flowable.bpmn.model.ServiceTask;
+
+import java.util.Map;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class HttpTrigger extends Trigger {
+    private String url;
+    private String method;
+    private Map<String, Object> headers;
+    private Map<String, Object> params;
+    private Map<String, Object> body;
+    private Long requestTimeout = 0L;
+
+    @Override
+    public void initImpl(ServiceTask serviceTask) {
+        try {
+            serviceTask.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION);
+            serviceTask.setImplementation("${httpActivityBehavior}");
+            ObjectMapper objectMapper = ApplicationContextUtil.getBean(ObjectMapper.class);
+            ProcessElementUtil.setFieldExtensionExpression(serviceTask, "url", this.url);
+            String headers = objectMapper.writeValueAsString(this.headers);
+            ProcessElementUtil.setFieldExtensionExpression(serviceTask, "headers", headers);
+            String params = objectMapper.writeValueAsString(this.params);
+            ProcessElementUtil.setFieldExtensionExpression(serviceTask, "params", params);
+            String body = objectMapper.writeValueAsString(this.body);
+            ProcessElementUtil.setFieldExtensionExpression(serviceTask, "body", body);
+            ProcessElementUtil.setFieldExtensionExpression(serviceTask, "requestTimeout", String.valueOf(this.requestTimeout));
+        } catch (JsonProcessingException e) {
+            throw new BaseException("HttpTrigger params json error");
+        }
+    }
+}

+ 42 - 0
flow-workflow/flow-workflow-entity/src/main/java/com/flow/entity/node/trigger/MicroTrigger.java

@@ -0,0 +1,42 @@
+package com.flow.entity.node.trigger;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.flow.common.core.exception.BaseException;
+import com.flow.common.core.util.ApplicationContextUtil;
+import com.flow.flowable.utils.ProcessElementUtil;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.flowable.bpmn.model.ImplementationType;
+import org.flowable.bpmn.model.ServiceTask;
+
+import java.util.Map;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class MicroTrigger extends Trigger {
+    private String url;
+    private String method;
+    private Map<String, Object> headers;
+    private Map<String, Object> params;
+    private Map<String, Object> body;
+
+    @Override
+    public void initImpl(ServiceTask serviceTask) {
+        try {
+            serviceTask.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION);
+            serviceTask.setImplementation("${microActivityBehavior}");
+            ProcessElementUtil.setFieldExtensionExpression(serviceTask, "url", this.url);
+            ProcessElementUtil.setFieldExtensionExpression(serviceTask, "method", this.method);
+            ObjectMapper objectMapper = ApplicationContextUtil.getBean(ObjectMapper.class);
+            String headers = objectMapper.writeValueAsString(this.headers);
+            ProcessElementUtil.setFieldExtensionExpression(serviceTask, "headers", headers);
+            String params = objectMapper.writeValueAsString(this.params);
+            ProcessElementUtil.setFieldExtensionExpression(serviceTask, "params", params);
+            String body = objectMapper.writeValueAsString(this.body);
+            ProcessElementUtil.setFieldExtensionExpression(serviceTask, "body", body);
+        } catch (JsonProcessingException e) {
+            throw new BaseException("MqTrigger params json error");
+        }
+    }
+}

+ 34 - 0
flow-workflow/flow-workflow-entity/src/main/java/com/flow/entity/node/trigger/MqTrigger.java

@@ -0,0 +1,34 @@
+package com.flow.entity.node.trigger;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.flow.common.core.exception.BaseException;
+import com.flow.common.core.util.ApplicationContextUtil;
+import com.flow.flowable.utils.ProcessElementUtil;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.flowable.bpmn.model.ImplementationType;
+import org.flowable.bpmn.model.ServiceTask;
+
+import java.util.Map;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class MqTrigger extends Trigger {
+    private String queue;
+    protected Map<String, Object> params;
+
+    @Override
+    public void initImpl(ServiceTask serviceTask) {
+        try {
+            serviceTask.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION);
+            serviceTask.setImplementation("${mqActivityBehavior}");
+            ProcessElementUtil.setFieldExtensionExpression(serviceTask, "queue", this.queue);
+            ObjectMapper objectMapper = ApplicationContextUtil.getBean(ObjectMapper.class);
+            String params = objectMapper.writeValueAsString(this.params);
+            ProcessElementUtil.setFieldExtensionExpression(serviceTask, "params", params);
+        } catch (JsonProcessingException e) {
+            throw new BaseException("MqTrigger params json error");
+        }
+    }
+}

+ 20 - 0
flow-workflow/flow-workflow-entity/src/main/java/com/flow/entity/node/trigger/Trigger.java

@@ -0,0 +1,20 @@
+package com.flow.entity.node.trigger;
+
+import com.fasterxml.jackson.annotation.JsonSubTypes;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import lombok.Data;
+import org.flowable.bpmn.model.ServiceTask;
+
+@Data
+@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type", defaultImpl = Trigger.class, visible = true)
+@JsonSubTypes({
+        @JsonSubTypes.Type(value = MqTrigger.class, name = "mq"),
+        @JsonSubTypes.Type(value = HttpTrigger.class, name = "http"),
+        @JsonSubTypes.Type(value = MicroTrigger.class, name = "micro"),
+        @JsonSubTypes.Type(value = ClassTrigger.class, name = "class")
+})
+public abstract class Trigger {
+    private TriggerType type;
+
+    public abstract void initImpl(ServiceTask serviceTask);
+}

+ 18 - 0
flow-workflow/flow-workflow-entity/src/main/java/com/flow/entity/node/trigger/TriggerType.java

@@ -0,0 +1,18 @@
+package com.flow.entity.node.trigger;
+
+import com.fasterxml.jackson.annotation.JsonValue;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public enum TriggerType {
+    MQ("mq", "消息队列"),
+    MICRO("micro", "微服务"),
+    CLASS("class", "类"),
+    HTTP("http", "HTTP");
+
+    private final String name;
+    @JsonValue
+    final String type;
+}