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 {