feat: Simple设计器-监听器完善

This commit is contained in:
Lesan 2025-01-08 14:22:52 +08:00
parent 60d1f1199d
commit 1fb8c9238a
3 changed files with 37 additions and 37 deletions

View File

@ -114,25 +114,6 @@ public class BpmnModelUtils {
return element != null ? JsonUtils.parseObject(element.getElementText(), clazz) : null; return element != null ? JsonUtils.parseObject(element.getElementText(), clazz) : null;
} }
/**
* 给节点添加Simple设计器配置Json
*
* @param userTask 节点
* @param node 节点对象
*/
public static void addSimpleConfigInfo(FlowElement userTask, Object node) {
addExtensionElementJson(userTask, "config", node);
}
/**
* 解析Simple设计器配置Json
*
* @param userTask 节点
*/
public static BpmSimpleModelNodeVO parseSimpleConfigInfo(FlowElement userTask) {
return parseExtensionElementJson(userTask, "config", BpmSimpleModelNodeVO.class);
}
/** /**
* 给节点添加候选人元素 * 给节点添加候选人元素
* *

View File

@ -5,6 +5,7 @@ import cn.hutool.core.lang.Assert;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.*; import cn.hutool.core.util.*;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
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.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO.ConditionGroups; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO.ConditionGroups;
import cn.iocoder.yudao.module.bpm.enums.definition.*; import cn.iocoder.yudao.module.bpm.enums.definition.*;
@ -439,9 +440,6 @@ public class SimpleModelUtils {
} }
// 设置监听器 // 设置监听器
addUserTaskListener(node, userTask); addUserTaskListener(node, userTask);
// 设置 Simple 设计器节点配置
// TODO @lesan只设置到 flowableListener 里面整个 node 太大了因为很多都保存过啦
addSimpleConfigInfo(userTask, node);
return userTask; return userTask;
} }
@ -453,6 +451,10 @@ public class SimpleModelUtils {
flowableListener.setEvent(TaskListener.EVENTNAME_CREATE); flowableListener.setEvent(TaskListener.EVENTNAME_CREATE);
flowableListener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); flowableListener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION);
flowableListener.setImplementation(DELEGATE_EXPRESSION); flowableListener.setImplementation(DELEGATE_EXPRESSION);
FieldExtension fieldExtension = new FieldExtension();
fieldExtension.setFieldName("listenerConfig");
fieldExtension.setStringValue(JsonUtils.toJsonString(node.getTaskCreateListener()));
flowableListener.getFieldExtensions().add(fieldExtension);
flowableListeners.add(flowableListener); flowableListeners.add(flowableListener);
} }
if (node.getTaskAssignListener() != null if (node.getTaskAssignListener() != null
@ -461,6 +463,10 @@ public class SimpleModelUtils {
flowableListener.setEvent(TaskListener.EVENTNAME_ASSIGNMENT); flowableListener.setEvent(TaskListener.EVENTNAME_ASSIGNMENT);
flowableListener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); flowableListener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION);
flowableListener.setImplementation(DELEGATE_EXPRESSION); flowableListener.setImplementation(DELEGATE_EXPRESSION);
FieldExtension fieldExtension = new FieldExtension();
fieldExtension.setFieldName("listenerConfig");
fieldExtension.setStringValue(JsonUtils.toJsonString(node.getTaskAssignListener()));
flowableListener.getFieldExtensions().add(fieldExtension);
flowableListeners.add(flowableListener); flowableListeners.add(flowableListener);
} }
if (node.getTaskCompleteListener() != null if (node.getTaskCompleteListener() != null
@ -469,6 +475,10 @@ public class SimpleModelUtils {
flowableListener.setEvent(TaskListener.EVENTNAME_COMPLETE); flowableListener.setEvent(TaskListener.EVENTNAME_COMPLETE);
flowableListener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); flowableListener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION);
flowableListener.setImplementation(DELEGATE_EXPRESSION); flowableListener.setImplementation(DELEGATE_EXPRESSION);
FieldExtension fieldExtension = new FieldExtension();
fieldExtension.setFieldName("listenerConfig");
fieldExtension.setStringValue(JsonUtils.toJsonString(node.getTaskCompleteListener()));
flowableListener.getFieldExtensions().add(fieldExtension);
flowableListeners.add(flowableListener); flowableListeners.add(flowableListener);
} }
if (CollUtil.isNotEmpty(flowableListeners)) { if (CollUtil.isNotEmpty(flowableListeners)) {

View File

@ -1,7 +1,9 @@
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.framework.common.util.json.JsonUtils;
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.framework.flowable.core.util.BpmnModelUtils;
@ -10,7 +12,9 @@ import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.flowable.bpmn.model.BpmnModel; import org.flowable.bpmn.model.BpmnModel;
import org.flowable.bpmn.model.FlowElement; import org.flowable.bpmn.model.FieldExtension;
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.task.service.delegate.DelegateTask; import org.flowable.task.service.delegate.DelegateTask;
@ -26,7 +30,6 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.HEADER_TENANT_ID; import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.HEADER_TENANT_ID;
import static cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils.parseSimpleConfigInfo;
/** /**
* BPM 用户任务通用监听器 * BPM 用户任务通用监听器
@ -53,9 +56,9 @@ public class BpmUserTaskListener implements TaskListener {
// 1. 获取所需基础信息 // 1. 获取所需基础信息
HistoricProcessInstance processInstance = processInstanceService.getHistoricProcessInstance(delegateTask.getProcessInstanceId()); HistoricProcessInstance processInstance = processInstanceService.getHistoricProcessInstance(delegateTask.getProcessInstanceId());
BpmnModel bpmnModel = modelService.getBpmnModelByDefinitionId(delegateTask.getProcessDefinitionId()); BpmnModel bpmnModel = modelService.getBpmnModelByDefinitionId(delegateTask.getProcessDefinitionId());
FlowElement userTask = BpmnModelUtils.getFlowElementById(bpmnModel, delegateTask.getTaskDefinitionKey()); UserTask userTask = (UserTask) BpmnModelUtils.getFlowElementById(bpmnModel, delegateTask.getTaskDefinitionKey());
BpmSimpleModelNodeVO node = parseSimpleConfigInfo(userTask); BpmSimpleModelNodeVO.ListenerHandler listenerHandler = getListenerHandlerByEvent(delegateTask.getEventName(),
BpmSimpleModelNodeVO.ListenerHandler listenerHandler = getListenerHandlerByEvent(delegateTask.getEventName(), node); userTask.getTaskListeners());
// 2. 获取请求头和请求体 // 2. 获取请求头和请求体
Map<String, Object> processVariables = processInstance.getProcessVariables(); Map<String, Object> processVariables = processInstance.getProcessVariables();
@ -79,8 +82,12 @@ public class BpmUserTaskListener implements TaskListener {
HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(body, headers); HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(body, headers);
ResponseEntity<String> responseEntity = restTemplate.exchange(listenerHandler.getPath(), HttpMethod.POST, ResponseEntity<String> responseEntity = restTemplate.exchange(listenerHandler.getPath(), HttpMethod.POST,
requestEntity, String.class); requestEntity, String.class);
// TODO @lesan日志打印可以更全哈例如说请求参数对应的 task id哪个 listener log.info("[notify][监听器:{},事件类型:{},请求头:{},请求体:{},响应结果:{}]",
log.info("[notify][的响应结果({})]", responseEntity); DELEGATE_EXPRESSION,
delegateTask.getEventName(),
headers,
body,
responseEntity);
// 4. 是否需要后续操作TODO 芋艿待定 // 4. 是否需要后续操作TODO 芋艿待定
} }
@ -99,14 +106,16 @@ public class BpmUserTaskListener implements TaskListener {
}); });
} }
// TODO @lesan改成 jdk8 写法哈主要考虑好兼容 private BpmSimpleModelNodeVO.ListenerHandler getListenerHandlerByEvent(String eventName, List<FlowableListener> node) {
private BpmSimpleModelNodeVO.ListenerHandler getListenerHandlerByEvent(String eventName, BpmSimpleModelNodeVO node) { FlowableListener flowableListener = node.stream()
return switch (eventName) { .filter(item -> item.getEvent().equals(eventName))
case TaskListener.EVENTNAME_CREATE -> node.getTaskCreateListener(); .findFirst().orElse(null);
case TaskListener.EVENTNAME_ASSIGNMENT -> node.getTaskAssignListener(); Assert.notNull(flowableListener, "监听器({})不能为空", flowableListener);
case TaskListener.EVENTNAME_COMPLETE -> node.getTaskCompleteListener(); FieldExtension fieldExtension = flowableListener.getFieldExtensions().stream()
default -> null; // TODO @lesan这个抛出异常可控一点 .filter(item -> item.getFieldName().equals("listenerConfig"))
}; .findFirst().orElse(null);
Assert.notNull(fieldExtension, "监听器扩展字段({})不能为空", fieldExtension);
return JsonUtils.parseObject(fieldExtension.getStringValue(), BpmSimpleModelNodeVO.ListenerHandler.class);
} }
} }