【代码评审】BPM:Simple 设计器 - userTask 监听器

This commit is contained in:
YunaiV 2025-01-07 12:52:50 +08:00
parent fdc6f6ed65
commit b5f6545d5a
4 changed files with 25 additions and 5 deletions

View File

@ -6,6 +6,7 @@ import lombok.Getter;
import java.util.Arrays; import java.util.Arrays;
// TODO @芋艿枚举值的类名在考虑下
/** /**
* BPM 任务监听器键值对类型 * BPM 任务监听器键值对类型
* *

View File

@ -96,15 +96,19 @@ public class BpmSimpleModelNodeVO {
*/ */
private AssignEmptyHandler assignEmptyHandler; private AssignEmptyHandler assignEmptyHandler;
// TODO @lesan建议改成 taskCreateListener;
/** /**
* 创建任务监听器 * 创建任务监听器
*/ */
private ListenerHandler createTaskListener; private ListenerHandler createTaskListener;
@Schema(description = "任务监听器") @Schema(description = "任务监听器")
@Valid
@Data @Data
public static class ListenerHandler { public static class ListenerHandler {
// TODO @lesan参数校验需要加下
@Schema(description = "是否开启任务监听器", example = "false") @Schema(description = "是否开启任务监听器", example = "false")
private Boolean enable; private Boolean enable;
@ -117,6 +121,8 @@ public class BpmSimpleModelNodeVO {
@Schema(description = "请求体", example = "[]") @Schema(description = "请求体", example = "[]")
private List<ListenerMap> body; private List<ListenerMap> body;
// TODO @芋艿这里后续要不要复用
@Schema(description = "任务监听器键值对") @Schema(description = "任务监听器键值对")
@Data @Data
public static class ListenerMap { public static class ListenerMap {
@ -125,11 +131,14 @@ public class BpmSimpleModelNodeVO {
private String key; private String key;
@Schema(description = "值类型", example = "1") @Schema(description = "值类型", example = "1")
@InEnum(BpmListenerMapType.class)
private Integer type; private Integer type;
@Schema(description = "", example = "xxx") @Schema(description = "", example = "xxx")
private String value; private String value;
} }
} }
@Schema(description = "审批节点拒绝处理策略") @Schema(description = "审批节点拒绝处理策略")

View File

@ -431,11 +431,14 @@ 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);
// TODO @lesan可以加个 addExtensionElementJson() 方法
// TODO @lesan是不是不用带 "create" + EXTENSION_SUFFIX 这种直接给个 "config" 就完事了
addExtensionElement(userTask, "create" + EXTENSION_SUFFIX, addExtensionElement(userTask, "create" + EXTENSION_SUFFIX,
// TODO @lesan默认使用项目里的 JsonUtils 方法
JSONUtil.toJsonStr(node.getCreateTaskListener())); JSONUtil.toJsonStr(node.getCreateTaskListener()));
flowableListeners.add(flowableListener); flowableListeners.add(flowableListener);
} }
if (!flowableListeners.isEmpty()) { if (CollUtil.isNotEmpty(flowableListeners)) {
userTask.setTaskListeners(flowableListeners); userTask.setTaskListeners(flowableListeners);
} }
return userTask; return userTask;

View File

@ -46,20 +46,24 @@ public class BpmUserTaskListener implements TaskListener {
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 userTaskElement = BpmnModelUtils.getFlowElementById(bpmnModel, delegateTask.getTaskDefinitionKey()); FlowElement userTaskElement = BpmnModelUtils.getFlowElementById(bpmnModel, delegateTask.getTaskDefinitionKey());
// TODO @lesan可以写到 FlowableUtils 简化解析逻辑
BpmSimpleModelNodeVO.ListenerHandler listenerHandler = JSONUtil.toBean( BpmSimpleModelNodeVO.ListenerHandler listenerHandler = JSONUtil.toBean(
parseExtensionElement(userTaskElement, delegateTask.getEventName() + EXTENSION_SUFFIX), parseExtensionElement(userTaskElement, delegateTask.getEventName() + EXTENSION_SUFFIX),
BpmSimpleModelNodeVO.ListenerHandler.class); BpmSimpleModelNodeVO.ListenerHandler.class);
Map<String, Object> processVariables = processInstance.getProcessVariables();
// 2. 获取请求头和请求体 // 2. 获取请求头和请求体
HashMap<String, String> headers = new HashMap<>(); Map<String, Object> processVariables = processInstance.getProcessVariables();
HashMap<String, Object> body = new HashMap<>(); Map<String, String> headers = new HashMap<>();
Map<String, Object> body = new HashMap<>();
listenerHandler.getHeader().forEach(item -> { listenerHandler.getHeader().forEach(item -> {
// TODO @lesan可以写个统一的方法解析参数然后非空put headers 或者 body
if (item.getType().equals(BpmListenerMapType.FIXED_VALUE.getType())) { if (item.getType().equals(BpmListenerMapType.FIXED_VALUE.getType())) {
headers.put(item.getKey(), item.getValue()); headers.put(item.getKey(), item.getValue());
} else if (item.getType().equals(BpmListenerMapType.FROM_FORM.getType())) { } else if (item.getType().equals(BpmListenerMapType.FROM_FORM.getType())) {
headers.put(item.getKey(), processVariables.getOrDefault(item.getValue(), "").toString()); headers.put(item.getKey(), processVariables.getOrDefault(item.getValue(), "").toString());
} }
}); });
// TODO @lesanheader 里面需要添加下 tenant-id
listenerHandler.getBody().forEach(item -> { listenerHandler.getBody().forEach(item -> {
if (item.getType().equals(BpmListenerMapType.FIXED_VALUE.getType())) { if (item.getType().equals(BpmListenerMapType.FIXED_VALUE.getType())) {
body.put(item.getKey(), item.getValue()); body.put(item.getKey(), item.getValue());
@ -67,10 +71,13 @@ public class BpmUserTaskListener implements TaskListener {
body.put(item.getKey(), processVariables.getOrDefault(item.getValue(), "")); body.put(item.getKey(), processVariables.getOrDefault(item.getValue(), ""));
} }
}); });
// 3. 异步发起请求 // 3. 异步发起请求
// TODO @lesan最好打印下日志
HttpRequest.post(listenerHandler.getPath()) HttpRequest.post(listenerHandler.getPath())
.addHeaders(headers).form(body).executeAsync(); .addHeaders(headers).form(body).executeAsync();
// 4. 是否需要后续操作
// 4. 是否需要后续操作TODO 芋艿待定
} }
} }