Selaa lähdekoodia

fix: 通过FixedValue属性方式获取监听器扩展字段

LesanOuO 7 kuukautta sitten
vanhempi
sitoutus
b2d81e0763

+ 5 - 6
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/BpmnModelUtils.java

@@ -23,6 +23,7 @@ import org.flowable.bpmn.model.Process;
 import org.flowable.bpmn.model.*;
 import org.flowable.common.engine.api.FlowableException;
 import org.flowable.common.engine.impl.util.io.BytesStreamSource;
+import org.flowable.engine.impl.el.FixedValue;
 
 import java.util.*;
 
@@ -370,12 +371,10 @@ public class BpmnModelUtils {
         flowableListener.getFieldExtensions().add(fieldExtension);
     }
 
-    public static BpmSimpleModelNodeVO.ListenerHandler parseListenerConfig(FlowableListener flowableListener) {
-        FieldExtension fieldExtension = flowableListener.getFieldExtensions().stream()
-                .filter(item -> item.getFieldName().equals("listenerConfig"))
-                .findFirst().orElse(null);
-        Assert.notNull(fieldExtension, "监听器扩展字段({})不能为空", fieldExtension);
-        return JsonUtils.parseObject(fieldExtension.getStringValue(), BpmSimpleModelNodeVO.ListenerHandler.class);
+    public static BpmSimpleModelNodeVO.ListenerHandler parseListenerConfig(FixedValue fixedValue) {
+        String expressionText = fixedValue.getExpressionText();
+        Assert.notNull(expressionText, "监听器扩展字段({})不能为空", expressionText);
+        return JsonUtils.parseObject(expressionText, BpmSimpleModelNodeVO.ListenerHandler.class);
     }
 
     // ========== BPM 简单查找相关的方法 ==========

+ 13 - 26
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java

@@ -1,21 +1,18 @@
 package cn.iocoder.yudao.module.bpm.service.task.listener;
 
 import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.lang.Assert;
 import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO;
 import cn.iocoder.yudao.module.bpm.enums.definition.BpmListenerParamTypeEnum;
-import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils;
-import cn.iocoder.yudao.module.bpm.service.definition.BpmModelService;
 import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
 import jakarta.annotation.Resource;
+import lombok.Setter;
 import lombok.extern.slf4j.Slf4j;
-import org.flowable.bpmn.model.BpmnModel;
-import org.flowable.bpmn.model.FlowableListener;
-import org.flowable.bpmn.model.UserTask;
 import org.flowable.engine.delegate.TaskListener;
 import org.flowable.engine.history.HistoricProcessInstance;
+import org.flowable.engine.impl.el.FixedValue;
 import org.flowable.task.service.delegate.DelegateTask;
+import org.springframework.context.annotation.Scope;
 import org.springframework.http.HttpEntity;
 import org.springframework.http.HttpMethod;
 import org.springframework.http.ResponseEntity;
@@ -38,34 +35,32 @@ import static cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModel
  */
 @Component
 @Slf4j
+@Scope("prototype")
 public class BpmUserTaskListener implements TaskListener {
 
     public static final String DELEGATE_EXPRESSION = "${bpmUserTaskListener}";
 
-    @Resource
-    private BpmModelService modelService;
-
     @Resource
     private BpmProcessInstanceService processInstanceService;
 
     @Resource
     private RestTemplate restTemplate;
 
+    @Setter
+    private FixedValue listenerConfig;
+
     @Override
     public void notify(DelegateTask delegateTask) {
         // 1. 获取所需基础信息
         HistoricProcessInstance processInstance = processInstanceService.getHistoricProcessInstance(delegateTask.getProcessInstanceId());
-        BpmnModel bpmnModel = modelService.getBpmnModelByDefinitionId(delegateTask.getProcessDefinitionId());
-        UserTask userTask = (UserTask) BpmnModelUtils.getFlowElementById(bpmnModel, delegateTask.getTaskDefinitionKey());
-        BpmSimpleModelNodeVO.ListenerHandler listenerHandler = getListenerHandlerByEvent(delegateTask.getEventName(),
-                userTask.getTaskListeners());
+        BpmSimpleModelNodeVO.ListenerHandler listenerHandler = parseListenerConfig(listenerConfig);
 
         // 2. 获取请求头和请求体
         Map<String, Object> processVariables = processInstance.getProcessVariables();
         MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
         MultiValueMap<String, String> body = new LinkedMultiValueMap<>();
-        parseListenerMap(listenerHandler.getHeader(), processVariables, headers);
-        parseListenerMap(listenerHandler.getBody(), processVariables, body);
+        parseListenerParam(listenerHandler.getHeader(), processVariables, headers);
+        parseListenerParam(listenerHandler.getBody(), processVariables, body);
         // 2.1 请求头默认参数
         if (StrUtil.isNotEmpty(delegateTask.getTenantId())) {
             headers.add(HEADER_TENANT_ID, delegateTask.getTenantId());
@@ -100,9 +95,9 @@ public class BpmUserTaskListener implements TaskListener {
         // 4. 是否需要后续操作?TODO 芋艿:待定!
     }
 
-    private void parseListenerMap(List<BpmSimpleModelNodeVO.ListenerHandler.ListenerParam> list,
-                                  Map<String, Object> processVariables,
-                                  MultiValueMap<String, String> to) {
+    private void parseListenerParam(List<BpmSimpleModelNodeVO.ListenerHandler.ListenerParam> list,
+                                    Map<String, Object> processVariables,
+                                    MultiValueMap<String, String> to) {
         if (CollUtil.isEmpty(list)) {
             return;
         }
@@ -115,12 +110,4 @@ public class BpmUserTaskListener implements TaskListener {
         });
     }
 
-    private BpmSimpleModelNodeVO.ListenerHandler getListenerHandlerByEvent(String eventName, List<FlowableListener> node) {
-        FlowableListener flowableListener = node.stream()
-                .filter(item -> item.getEvent().equals(eventName))
-                .findFirst().orElse(null);
-        Assert.notNull(flowableListener, "监听器({})不能为空", flowableListener);
-        return parseListenerConfig(flowableListener);
-    }
-
 }