Przeglądaj źródła

优化通知节点执行

caixiaofeng 6 miesięcy temu
rodzic
commit
106bd5655b

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

@@ -101,6 +101,47 @@ public class ProcessElementUtil {
         return null;
     }
 
+    /**
+     * 获取字段扩展
+     *
+     * @param element
+     * @param fieldName
+     * @return
+     */
+    public static FieldExtension getFieldExtension(TaskWithFieldExtensions element, String fieldName) {
+        List<FieldExtension> fieldExtensions = element.getFieldExtensions();
+        for (FieldExtension fieldExtension : fieldExtensions) {
+            if (fieldName.equals(fieldExtension.getFieldName())) {
+                return fieldExtension;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 获取字段扩展值
+     *
+     * @param element
+     * @param fieldName
+     * @return
+     */
+    public static String getFieldExtensionValue(TaskWithFieldExtensions element, String fieldName) {
+        FieldExtension fieldExtension = getFieldExtension(element, fieldName);
+        return fieldExtension != null ? fieldExtension.getStringValue() : null;
+    }
+
+    /**
+     * 获取字段扩展表达式
+     *
+     * @param element
+     * @param fieldName
+     * @return
+     */
+    public static String getFieldExtensionExpression(TaskWithFieldExtensions element, String fieldName) {
+        FieldExtension fieldExtension = getFieldExtension(element, fieldName);
+        return fieldExtension != null ? fieldExtension.getExpression() : null;
+    }
+
     /**
      * 递归获取父执行
      *

+ 20 - 17
flow-workflow/flow-workflow-biz/src/main/java/com/flow/delegate/NotifyDelegate.java

@@ -1,20 +1,22 @@
 package com.flow.delegate;
 
-import com.flow.entity.FlowDefine;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.flow.entity.Notify;
 import com.flow.entity.User;
-import com.flow.entity.node.NotifyNode;
 import com.flow.enums.NotifyEnum;
 import com.flow.enums.NotifyTypeEnum;
-import com.flow.service.FlowDefineService;
+import com.flow.flowable.utils.ProcessElementUtil;
 import com.flow.service.NotifyService;
 import com.flow.service.UserService;
 import lombok.extern.slf4j.Slf4j;
+import org.flowable.bpmn.model.MultiInstanceLoopCharacteristics;
+import org.flowable.bpmn.model.ServiceTask;
 import org.flowable.common.engine.impl.el.ExpressionManager;
+import org.flowable.engine.delegate.BpmnError;
 import org.flowable.engine.delegate.DelegateExecution;
 import org.flowable.engine.delegate.JavaDelegate;
 import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
-import org.flowable.engine.impl.persistence.entity.ExecutionEntityImpl;
+import org.flowable.http.common.impl.ExpressionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.mail.SimpleMailMessage;
@@ -22,14 +24,11 @@ import org.springframework.mail.javamail.JavaMailSender;
 import org.springframework.stereotype.Component;
 
 import java.time.LocalDateTime;
-import java.util.List;
 
 
 @Slf4j
 @Component
 public class NotifyDelegate implements JavaDelegate {
-    @Autowired
-    private FlowDefineService flowDefineService;
     @Autowired
     private JavaMailSender mailSender;
     @Value("${spring.mail.username}")
@@ -43,18 +42,22 @@ public class NotifyDelegate implements JavaDelegate {
 
     @Override
     public void execute(DelegateExecution execution) {
-        ExecutionEntityImpl entity = (ExecutionEntityImpl) execution;
-        String activityId = execution.getCurrentActivityId();
-        FlowDefine define = flowDefineService.getDefine(entity.getProcessDefinitionId());
-        NotifyNode notifyNode = define.getNode(execution.getCurrentActivityId(), NotifyNode.class);
-        List<NotifyTypeEnum> typeEnums = notifyNode.getTypes();
+        ServiceTask notifyServiceTask = (ServiceTask) execution.getCurrentFlowElement();
+        String types = ProcessElementUtil.getFieldExtensionValue(notifyServiceTask, "types");
+        String subject = ProcessElementUtil.getFieldExtensionExpression(notifyServiceTask, "subject");
+        String content = ProcessElementUtil.getFieldExtensionExpression(notifyServiceTask, "content");
+        if (StringUtils.isBlank(types) || StringUtils.isBlank(subject) || StringUtils.isBlank(content)) {
+            throw new BpmnError("notify.error", "通知参数异常");
+        }
         ExpressionManager expressionManager = processEngineConfiguration.getExpressionManager();
-        String content = (String) expressionManager.createExpression(notifyNode.getContent()).getValue(execution);
-        String subject = (String) expressionManager.createExpression(notifyNode.getSubject()).getValue(execution);
-        // 通知
-        String assignee = execution.getVariableLocal(String.format("%sItem", activityId), String.class);
+        subject = ExpressionUtils.getStringFromField(expressionManager.createExpression(subject), execution);
+        content = ExpressionUtils.getStringFromField(expressionManager.createExpression(content), execution);
+        MultiInstanceLoopCharacteristics loopCharacteristics = notifyServiceTask.getLoopCharacteristics();
+        String assignee = execution.getVariableLocal(loopCharacteristics.getElementVariable(), String.class);
         User user = userService.getByUsername(assignee);
-        for (NotifyTypeEnum typeEnum : typeEnums) {
+        String[] typeArray = types.split(",");
+        for (String type : typeArray) {
+            NotifyTypeEnum typeEnum = NotifyTypeEnum.match(type);
             switch (typeEnum) {
                 case SITE:
                     // 站内通知

+ 6 - 0
flow-workflow/flow-workflow-entity/src/main/java/com/flow/entity/node/NotifyNode.java

@@ -9,6 +9,7 @@ import org.flowable.bpmn.model.*;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
+import java.util.stream.Collectors;
 
 @EqualsAndHashCode(callSuper = true)
 @Data
@@ -35,6 +36,11 @@ public class NotifyNode extends AssigneeNode {
         multiInstanceLoopCharacteristics.setInputDataItem(String.format("${%sCollection}", this.getId()));
         serviceTask.setLoopCharacteristics(multiInstanceLoopCharacteristics);
         // 扩展属性
+        FieldExtension typeExtension = new FieldExtension();
+        typeExtension.setFieldName("types");
+        String types = this.types.stream().map(NotifyTypeEnum::getType).collect(Collectors.joining(","));
+        typeExtension.setStringValue(types);
+        serviceTask.getFieldExtensions().add(typeExtension);
         FieldExtension subjectExtension = new FieldExtension();
         subjectExtension.setFieldName("subject");
         subjectExtension.setExpression(this.subject);

+ 10 - 0
flow-workflow/flow-workflow-entity/src/main/java/com/flow/enums/NotifyTypeEnum.java

@@ -4,6 +4,8 @@ import com.fasterxml.jackson.annotation.JsonValue;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
 
+import java.util.Arrays;
+
 @Getter
 @AllArgsConstructor
 public enum NotifyTypeEnum {
@@ -17,4 +19,12 @@ public enum NotifyTypeEnum {
     @JsonValue
     private final String type;
     private final String description;
+
+    public static NotifyTypeEnum match(String type) {
+        return Arrays.stream(NotifyTypeEnum.values())
+                .filter(e -> e.getType().equals(type))
+                .findFirst()
+                .orElseThrow(() -> new IllegalArgumentException("通知类型错误"));
+    }
+
 }