From 4acb01c3b061156d0ad5889f27fa1009619387ef Mon Sep 17 00:00:00 2001 From: YunaiV Date: Wed, 8 Jan 2025 09:40:38 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E8=AF=84?= =?UTF-8?q?=E5=AE=A1=E3=80=91BPM=EF=BC=9ASimple=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=20-=20userTask=20=E7=9B=91=E5=90=AC=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../flowable/core/util/SimpleModelUtils.java | 12 ++++++++---- .../service/task/listener/BpmUserTaskListener.java | 14 +++++++++++--- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java index f33e73199c..952cd6c26a 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java @@ -439,28 +439,32 @@ public class SimpleModelUtils { } // 设置监听器 addUserTaskListener(node, userTask); - // 设置Simple设计器节点配置 + // 设置 Simple 设计器节点配置 + // TODO @lesan:只设置到 flowableListener 里面,整个 node 太大了!因为很多都保存过啦。 addSimpleConfigInfo(userTask, node); return userTask; } private void addUserTaskListener(BpmSimpleModelNodeVO node, UserTask userTask) { List flowableListeners = new ArrayList<>(3); - if (node.getTaskCreateListener().getEnable()) { + if (node.getTaskCreateListener() != null + && Boolean.TRUE.equals(node.getTaskCreateListener().getEnable())) { FlowableListener flowableListener = new FlowableListener(); flowableListener.setEvent(TaskListener.EVENTNAME_CREATE); flowableListener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); flowableListener.setImplementation(DELEGATE_EXPRESSION); flowableListeners.add(flowableListener); } - if (node.getTaskAssignListener().getEnable()) { + if (node.getTaskAssignListener() != null + && Boolean.TRUE.equals(node.getTaskAssignListener().getEnable())) { FlowableListener flowableListener = new FlowableListener(); flowableListener.setEvent(TaskListener.EVENTNAME_ASSIGNMENT); flowableListener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); flowableListener.setImplementation(DELEGATE_EXPRESSION); flowableListeners.add(flowableListener); } - if (node.getTaskCompleteListener().getEnable()) { + if (node.getTaskCompleteListener() != null + && Boolean.TRUE.equals(node.getTaskCompleteListener().getEnable())) { FlowableListener flowableListener = new FlowableListener(); flowableListener.setEvent(TaskListener.EVENTNAME_COMPLETE); flowableListener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java index 1d543d25d7..1680b26691 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.bpm.service.task.listener; import cn.hutool.core.collection.CollUtil; +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.BpmListenerMapType; import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils; @@ -24,6 +25,7 @@ import org.springframework.web.client.RestTemplate; import java.util.List; import java.util.Map; +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; /** @@ -62,18 +64,23 @@ public class BpmUserTaskListener implements TaskListener { parseListenerMap(listenerHandler.getHeader(), processVariables, headers); parseListenerMap(listenerHandler.getBody(), processVariables, body); // 2.1 请求头默认参数 - headers.add("tenant-id", delegateTask.getTenantId()); + if (StrUtil.isNotEmpty(delegateTask.getTenantId())) { + headers.add(HEADER_TENANT_ID, delegateTask.getTenantId()); + } // 2.2 请求体默认参数 + // TODO @芋艿:哪些默认参数,后续再调研下; body.add("processInstanceId", delegateTask.getProcessInstanceId()); body.add("assignee", delegateTask.getAssignee()); body.add("taskDefinitionKey", delegateTask.getTaskDefinitionKey()); body.add("taskId", delegateTask.getId()); // 3. 异步发起请求 + // TODO @芋艿:确认要同步,还是异步 HttpEntity> requestEntity = new HttpEntity<>(body, headers); ResponseEntity responseEntity = restTemplate.exchange(listenerHandler.getPath(), HttpMethod.POST, requestEntity, String.class); - log.info("[BpmUserTaskListener][的响应结果({})]", responseEntity); + // TODO @lesan:日志打印,可以更全哈,例如说,请求参数、对应的 task id,哪个 listener + log.info("[notify][的响应结果({})]", responseEntity); // 4. 是否需要后续操作?TODO 芋艿:待定! } @@ -92,12 +99,13 @@ public class BpmUserTaskListener implements TaskListener { }); } + // TODO @lesan:改成 jdk8 写法哈。主要考虑好兼容! private BpmSimpleModelNodeVO.ListenerHandler getListenerHandlerByEvent(String eventName, BpmSimpleModelNodeVO node) { return switch (eventName) { case TaskListener.EVENTNAME_CREATE -> node.getTaskCreateListener(); case TaskListener.EVENTNAME_ASSIGNMENT -> node.getTaskAssignListener(); case TaskListener.EVENTNAME_COMPLETE -> node.getTaskCompleteListener(); - default -> null; + default -> null; // TODO @lesan:这个抛出异常,可控一点 }; } From 4b09bff64b3aad5ddd945df8b6dc3c1cf1fd9010 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Wed, 8 Jan 2025 09:55:50 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E8=AF=84?= =?UTF-8?q?=E5=AE=A1=E3=80=91BPM=EF=BC=9ASimple=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=20-=20=E8=B7=AF=E7=94=B1=E8=8A=82=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../enums/definition/BpmListenerMapType.java | 2 +- .../vo/model/simple/BpmSimpleModelNodeVO.java | 70 ++++++++++--------- 2 files changed, 38 insertions(+), 34 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmListenerMapType.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmListenerMapType.java index e07675d578..0396fbcce9 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmListenerMapType.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmListenerMapType.java @@ -6,7 +6,7 @@ import lombok.Getter; import java.util.Arrays; -// TODO @芋艿:枚举值的类名,在考虑下 +// TODO @lesan:BpmListenerParamTypeEnum /** * BPM 任务监听器键值对类型 * diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java index f4778cdff8..b5057713ef 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java @@ -36,24 +36,6 @@ public class BpmSimpleModelNodeVO { @Schema(description = "子节点") private BpmSimpleModelNodeVO childNode; // 补充说明:在该模型下,子节点有且仅有一个,不会有多个 - @Schema(description = "条件节点") - private List conditionNodes; // 补充说明:有且仅有条件、并行、包容等分支会使用 - - // TODO @jason:conditionType、conditionExpression、defaultFlow、conditionGroups 搞成一个 condition 属性,会好点么? - @Schema(description = "条件类型", example = "1") - @InEnum(BpmSimpleModeConditionType.class) - private Integer conditionType; // 仅用于条件节点 BpmSimpleModelNodeType.CONDITION_NODE - - @Schema(description = "条件表达式", example = "${day>3}") - private String conditionExpression; // 仅用于条件节点 BpmSimpleModelNodeType.CONDITION_NODE - - @Schema(description = "是否默认条件", example = "true") - private Boolean defaultFlow; // 仅用于条件节点 BpmSimpleModelNodeType.CONDITION_NODE - /** - * 条件组 - */ - private ConditionGroups conditionGroups; // 仅用于条件节点 BpmSimpleModelNodeType.CONDITION_NODE - @Schema(description = "候选人策略", example = "30") @InEnum(BpmTaskCandidateStrategyEnum.class) private Integer candidateStrategy; // 用于审批,抄送节点 @@ -110,6 +92,37 @@ public class BpmSimpleModelNodeVO { */ private ListenerHandler taskCompleteListener; + @Schema(description = "延迟器设置", example = "{}") + private DelaySetting delaySetting; + + @Schema(description = "条件节点") + private List conditionNodes; // 补充说明:有且仅有条件、并行、包容分支会使用 + + // TODO @jason:conditionType、conditionExpression、defaultFlow、conditionGroups 搞成一个 condition 属性,会好点么? + @Schema(description = "条件类型", example = "1") + @InEnum(BpmSimpleModeConditionType.class) + private Integer conditionType; // 仅用于条件节点 BpmSimpleModelNodeType.CONDITION_NODE + + @Schema(description = "条件表达式", example = "${day>3}") + private String conditionExpression; // 仅用于条件节点 BpmSimpleModelNodeType.CONDITION_NODE + + @Schema(description = "是否默认条件", example = "true") + private Boolean defaultFlow; // 仅用于条件节点 BpmSimpleModelNodeType.CONDITION_NODE + /** + * 条件组 + */ + private ConditionGroups conditionGroups; // 仅用于条件节点 BpmSimpleModelNodeType.CONDITION_NODE + + // TODO @lesan:route 改成 router 会不会好点。因为触发器、延迟器,都带了类似 r + + // TODO @lesan:routeGroups + @Schema(description = "路由分支组", example = "[]") + private List routeGroup; + + // TODO @lesan:貌似没用??? + @Schema(description = "默认分支 ID", example = "Flow_xxx") + private String defaultFlowId; // 仅用于路由分支节点 BpmSimpleModelNodeType.ROUTE_BRANCH_NODE + @Schema(description = "任务监听器") @Valid @Data @@ -130,17 +143,18 @@ public class BpmSimpleModelNodeVO { // TODO @芋艿:这里后续要不要复用; + // TODO @lesan:ListenerParam 更合适哈。首先它是参数配置,然后形式是键值对 @Schema(description = "任务监听器键值对") @Data public static class ListenerMap { - @Schema(description = "键", example = "xxx") - private String key; - @Schema(description = "值类型", example = "1") @InEnum(BpmListenerMapType.class) private Integer type; + @Schema(description = "键", example = "xxx") + private String key; + @Schema(description = "值", example = "xxx") private String value; @@ -261,9 +275,6 @@ public class BpmSimpleModelNodeVO { } - @Schema(description = "延迟器设置", example = "{}") - private DelaySetting delaySetting; - @Schema(description = "延迟器") @Data @Valid @@ -280,23 +291,16 @@ public class BpmSimpleModelNodeVO { } - // TODO @lesan:routeGroups - @Schema(description = "路由分支组", example = "[]") - private List routeGroup; - - @Schema(description = "默认分支id", example = "Flow_xxx") - private String defaultFlowId; // 仅用于路由分支节点 BpmSimpleModelNodeType.ROUTE_BRANCH_NODE - @Schema(description = "路由分支") @Data @Valid public static class RouteCondition { - @Schema(description = "节点 Id", example = "Activity_xxx") + @Schema(description = "节点 Id", example = "Activity_xxx") // 跳转到该节点 @NotEmpty(message = "节点 Id 不能为空") private String nodeId; - // TODO @lesan:type、expression、groups;(可以晚点改,在和 conditionType、conditionExpression、defaultFlow、conditionGroups 讨论!) + // TODO @lesan:type、expression、groups; @Schema(description = "条件类型", example = "1") @InEnum(BpmSimpleModeConditionType.class) @NotNull(message = "条件类型不能为空")