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

This commit is contained in:
LesanOuO 2025-01-10 12:47:31 +08:00
parent 71b86e6207
commit b2d81e0763
2 changed files with 18 additions and 32 deletions

View File

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

View File

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