From 9312c3a2b32cdb480d0bac8e329b3a69a512441e Mon Sep 17 00:00:00 2001 From: dengqichen Date: Tue, 10 Dec 2024 14:22:11 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=8E=89=E6=89=80=E6=9C=89?= =?UTF-8?q?=E6=B2=A1=E7=94=A8=E7=9A=84=E5=B7=A5=E4=BD=9C=E6=B5=81=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E7=9A=84=E7=B1=BB=EF=BC=8C=E9=87=8D=E6=96=B0=E5=BC=80?= =?UTF-8?q?=E5=8F=91=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/WorkflowDefinitionServiceImpl.java | 171 ++++++++---------- .../backend/workflow/util/BpmnConverter.java | 3 + 2 files changed, 75 insertions(+), 99 deletions(-) diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/service/impl/WorkflowDefinitionServiceImpl.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/service/impl/WorkflowDefinitionServiceImpl.java index ff9df6b4..0199c1cd 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/service/impl/WorkflowDefinitionServiceImpl.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/service/impl/WorkflowDefinitionServiceImpl.java @@ -13,8 +13,10 @@ import lombok.extern.slf4j.Slf4j; import org.flowable.bpmn.model.SequenceFlow; import org.flowable.bpmn.model.StartEvent; import org.flowable.engine.HistoryService; +import org.flowable.engine.ManagementService; import org.flowable.engine.RepositoryService; import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; import org.flowable.engine.history.HistoricActivityInstance; import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.repository.Deployment; @@ -23,22 +25,22 @@ import org.flowable.engine.runtime.Execution; import org.flowable.engine.runtime.ProcessInstance; import org.flowable.bpmn.model.Process; import org.flowable.bpmn.model.FlowElement; -import org.flowable.bpmn.model.Task; -import org.flowable.bpmn.model.Event; import org.flowable.bpmn.model.ServiceTask; +import org.flowable.job.api.Job; +import org.flowable.task.api.Task; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; -import java.util.Collection; -import java.util.Date; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Objects; +import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; -import org.flowable.variable.api.history.HistoricVariableInstance; /** * 工作流定义服务实现 @@ -54,6 +56,12 @@ public class WorkflowDefinitionServiceImpl extends BaseServiceImpl historicActivities = historyService.createHistoricActivityInstanceQuery() + + // 3. 获取所有节点(不包括连线) + List nodes = process.getFlowElements().stream() + .filter(element -> !(element instanceof SequenceFlow)) + .collect(Collectors.toList()); + + // 4. 获取正在执行的节点 + Set runningNodes = runtimeService.createExecutionQuery() + .processInstanceId(processInstanceId) + .list() + .stream() + .map(Execution::getActivityId) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + + // 5. 获取历史节点 + Map historicNodes = historyService.createHistoricActivityInstanceQuery() .processInstanceId(processInstanceId) .orderByHistoricActivityInstanceStartTime() .asc() - .list(); - - log.info("=== 历史活动实例信息 ==="); - for (HistoricActivityInstance activity : historicActivities) { - log.info("节点ID: {}, 名称: {}, 类型: {}, 开始时间: {}, 结束时间: {}, 执行ID: {}", - activity.getActivityId(), - activity.getActivityName(), - activity.getActivityType(), - activity.getStartTime(), - activity.getEndTime(), - activity.getExecutionId()); - } - - // 4. 获取当前正在执行的活动节点 - List activeActivityIds = new ArrayList<>(); - if (runningInstance != null) { - List executions = runtimeService.createExecutionQuery() - .processInstanceId(processInstanceId) - .list(); - - for (Execution execution : executions) { - if (execution.getActivityId() != null) { - activeActivityIds.add(execution.getActivityId()); - } - } - log.info("当前活动节点IDs: {}", activeActivityIds); - } - - // 5. 构建历史活动实例映射 - Map historicActivityMap = historicActivities.stream() + .list() + .stream() + .filter(activity -> !(activity.getActivityType().equals("sequenceFlow"))) .collect(Collectors.toMap( HistoricActivityInstance::getActivityId, activity -> activity, @@ -221,31 +211,52 @@ public class WorkflowDefinitionServiceImpl extends BaseServiceImpl stages = new ArrayList<>(); - List flowElements = process.getFlowElements().stream() - .filter(element -> !(element instanceof SequenceFlow)) - .collect(Collectors.toList()); + boolean hasFailedNode = false; - log.info("=== 开始构建节点状态 ==="); - for (FlowElement element : flowElements) { + for (FlowElement element : nodes) { WorkflowExecutionDTO.StageDTO stage = new WorkflowExecutionDTO.StageDTO(); stage.setId(element.getId()); stage.setName(element.getName()); stage.setType(element.getClass().getSimpleName()); - HistoricActivityInstance historicActivity = historicActivityMap.get(element.getId()); - - // 确定节点状态 - determineStageStatus(stage, element, historicActivity, activeActivityIds); - - log.info("节点[{}] - 名称: {}, 类型: {}, 状态: {}, 开始时间: {}, 结束时间: {}", - stage.getId(), - stage.getName(), - stage.getType(), - stage.getStatus(), - stage.getStartTime(), - stage.getEndTime()); + // 如果已经有节点失败,后续节点都是未开始 + if (hasFailedNode) { + stage.setStatus(WorkflowInstanceStatus.NOT_STARTED); + stages.add(stage); + continue; + } + + // 判断节点状态 + if (runningNodes.contains(element.getId())) { + // 正在执行的节点 + stage.setStatus(WorkflowInstanceStatus.RUNNING); + } else { + // 查找历史记录 + HistoricActivityInstance historicActivity = historicNodes.get(element.getId()); + if (historicActivity != null) { + stage.setStartTime(historicActivity.getStartTime()); + stage.setEndTime(historicActivity.getEndTime()); + + if (historicActivity.getEndTime() != null) { + if (historicActivity.getDeleteReason() != null) { + // 节点失败 + stage.setStatus(WorkflowInstanceStatus.FAILED); + hasFailedNode = true; + } else { + // 节点完成 + stage.setStatus(WorkflowInstanceStatus.COMPLETED); + } + } else { + // 有开始时间但没有结束时间,说明正在运行 + stage.setStatus(WorkflowInstanceStatus.RUNNING); + } + } else { + // 没有历史记录,未开始 + stage.setStatus(WorkflowInstanceStatus.NOT_STARTED); + } + } stages.add(stage); } @@ -258,42 +269,4 @@ public class WorkflowDefinitionServiceImpl extends BaseServiceImpl activeActivityIds - ) { - if (historicActivity == null) { - // 节点未执行过 - stage.setStatus(WorkflowInstanceStatus.NOT_STARTED); - stage.setStartTime(null); - stage.setEndTime(null); - return; - } - - // 设置时间 - stage.setStartTime(historicActivity.getStartTime()); - stage.setEndTime(historicActivity.getEndTime()); - - // 确定状态 - if (historicActivity.getEndTime() != null) { - // 节点已结束 - stage.setStatus(historicActivity.getDeleteReason() == null ? - WorkflowInstanceStatus.COMPLETED : WorkflowInstanceStatus.FAILED); - } else if (element instanceof StartEvent) { - // 开始节点特殊处理:有开始时间就视为完成 - stage.setStatus(WorkflowInstanceStatus.COMPLETED); - } else if (activeActivityIds.contains(element.getId())) { - // 节点正在执行 - stage.setStatus(WorkflowInstanceStatus.RUNNING); - } else { - // 其他情况:节点已开始但未完成,且不在当前活动节点列表中 - stage.setStatus(WorkflowInstanceStatus.NOT_STARTED); - } - } - } diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/util/BpmnConverter.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/util/BpmnConverter.java index 2a9d7a95..9629c9d9 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/util/BpmnConverter.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/util/BpmnConverter.java @@ -79,6 +79,9 @@ public class BpmnConverter { serviceTask.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); serviceTask.setImplementation("${shellTaskDelegate}"); + // 设置为异步执行 + serviceTask.setAsynchronous(true); + JsonNode fields = serviceTaskConfig.path("fields"); if (fields != null) { fields.fields().forEachRemaining(entry -> {