From 70fc5ae4cb33fdb8b517905ee155de7f419a77a7 Mon Sep 17 00:00:00 2001
From: gulongcheng <474084054@qq.com>
Date: Sat, 24 Jan 2026 10:18:55 +0800
Subject: [PATCH] =?UTF-8?q?fix:=E4=BF=AE=E6=AD=A3=E6=9C=AC=E5=9C=B0?=
=?UTF-8?q?=E5=BA=94=E7=94=A8=E8=8A=82=E7=82=B9=E5=87=80=E5=AE=A4=E7=AD=96?=
=?UTF-8?q?=E7=95=A5=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.idea/MarsCodeWorkspaceAppSettings.xml | 1 +
.../UserTaskDirectoryPreparationListener.java | 14 ++++++--
.../sdm/flowable/util/Dto2BpmnConverter.java | 33 +++++++++++++++----
3 files changed, 39 insertions(+), 9 deletions(-)
diff --git a/.idea/MarsCodeWorkspaceAppSettings.xml b/.idea/MarsCodeWorkspaceAppSettings.xml
index e2a065b7..f6fcc10b 100644
--- a/.idea/MarsCodeWorkspaceAppSettings.xml
+++ b/.idea/MarsCodeWorkspaceAppSettings.xml
@@ -1,6 +1,7 @@
+
\ No newline at end of file
diff --git a/flowable/src/main/java/com/sdm/flowable/listener/UserTaskDirectoryPreparationListener.java b/flowable/src/main/java/com/sdm/flowable/listener/UserTaskDirectoryPreparationListener.java
index a9caf495..a3742679 100644
--- a/flowable/src/main/java/com/sdm/flowable/listener/UserTaskDirectoryPreparationListener.java
+++ b/flowable/src/main/java/com/sdm/flowable/listener/UserTaskDirectoryPreparationListener.java
@@ -33,9 +33,17 @@ public class UserTaskDirectoryPreparationListener implements ExecutionListener {
String nodeId = execution.getCurrentActivityId();
String processDefinitionId = execution.getProcessDefinitionId();
+ // 【新增逻辑】处理本地应用注册节点的 ID 映射
+ // 如果监听器运行在 Register 节点(例如 "Task_1_register"),我们需要还原为原始 ID ("Task_1")
+ String originalNodeId = FlowNodeIdUtils.parseOriginalNodeId(nodeId);
+ if (!nodeId.equals(originalNodeId)) {
+ log.info("检测到辅助节点,ID 还原: {} -> {}", nodeId, originalNodeId);
+ nodeId = originalNodeId;
+ }
+
//创建本地文件夹,用于后续节点计算直接从本地读取,不需要再从minio中获取数据
- JSONObject params =processNodeParamService.getParam(processDefinitionId,nodeId,runId);
- log.info("userTaskDirectoryPreparationListener, 启动流程 runId:{},nodeId:{},实例id: {},参数 params:{}", runId,nodeId,execution.getProcessInstanceId(),params);
+ JSONObject params = processNodeParamService.getParam(processDefinitionId, nodeId, runId);
+ log.info("userTaskDirectoryPreparationListener, 启动流程 runId:{},nodeId:{},实例id: {},参数 params:{}", runId, nodeId, execution.getProcessInstanceId(), params);
Long currentNodeOutputDirId = params.getLong("outputDirId");
if(ObjectUtils.isEmpty(currentNodeOutputDirId)){
throw new RuntimeException("当前节点未配置输出文件夹");
@@ -49,4 +57,4 @@ public class UserTaskDirectoryPreparationListener implements ExecutionListener {
String objectKey = fileBaseInfoResp.getData().getObjectKey();
FlowNodeIdUtils.prepareLocalDir(objectKey);
}
-}
+}
\ No newline at end of file
diff --git a/flowable/src/main/java/com/sdm/flowable/util/Dto2BpmnConverter.java b/flowable/src/main/java/com/sdm/flowable/util/Dto2BpmnConverter.java
index 4e5860f9..642356fe 100644
--- a/flowable/src/main/java/com/sdm/flowable/util/Dto2BpmnConverter.java
+++ b/flowable/src/main/java/com/sdm/flowable/util/Dto2BpmnConverter.java
@@ -553,6 +553,11 @@ public class Dto2BpmnConverter {
disableAsyncRetry(registerTask);
registerTask.setImplementation("${localAppRegisterDelegate}");
registerTask.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION);
+
+ // 【新增逻辑】为 Register 节点添加目录准备监听器
+ // 这样在进入组合节点的第一步时,就会执行文件夹清空/准备
+ addDirectoryPreparationListener(registerTask);
+
process.addFlowElement(registerTask);
// 2. Wait Node (ReceiveTask)
@@ -601,6 +606,23 @@ public class Dto2BpmnConverter {
process.addFlowElement(userTask);
}
+ /**
+ * 为节点添加目录准备监听器
+ * @param flowElement 需要添加监听器的节点
+ */
+ private void addDirectoryPreparationListener(FlowElement flowElement) {
+ FlowableListener dirPrepareListener = new FlowableListener();
+ dirPrepareListener.setEvent("start");
+ dirPrepareListener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION);
+ dirPrepareListener.setImplementation("${userTaskDirectoryPreparationListener}");
+
+ if (flowElement instanceof UserTask) {
+ ((UserTask) flowElement).getExecutionListeners().add(dirPrepareListener);
+ } else if (flowElement instanceof ServiceTask) {
+ ((ServiceTask) flowElement).getExecutionListeners().add(dirPrepareListener);
+ }
+ }
+
// 抽取通用的 UserTask 扩展属性设置
private void addUserTaskExtensions(UserTask userTask, FlowElementDTO nodeDto) throws JsonProcessingException {
@@ -620,12 +642,11 @@ public class Dto2BpmnConverter {
// 设置用户任务的属性,使其可以被任何人处理
// 不设置 assignee 或 candidateUsers,这样任何人都可以处理任务
- // 可选:绑定 TaskListener,在任务完成时触发逻辑
- FlowableListener dirPrepareListener = new FlowableListener();
- dirPrepareListener.setEvent("start");
- dirPrepareListener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION);
- dirPrepareListener.setImplementation("${userTaskDirectoryPreparationListener}");
- userTask.getExecutionListeners().add(dirPrepareListener);
+ // 【修改逻辑】仅当不是本地应用节点时,才在 UserTask 上添加目录准备监听器
+ // 因为本地应用节点已经前移到 Register 节点处理了
+ if (!FlowNodeIdUtils.isLocalAppNode(nodeDto)) {
+ addDirectoryPreparationListener(userTask);
+ }
}
private void createServiceTask(Process process, FlowElementDTO nodeDto, Map asyncTaskMap) throws JsonProcessingException {