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.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 简单查找相关的方法 ==========

View File

@ -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);
}
}