diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/config/FlowableConfig.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/config/FlowableConfig.java index eb6f1f39..ac290730 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/config/FlowableConfig.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/config/FlowableConfig.java @@ -1,29 +1,37 @@ package com.qqchen.deploy.backend.workflow.config; +import com.qqchen.deploy.backend.workflow.listener.FlowableJobEventListener; +import jakarta.annotation.Resource; import org.flowable.spring.SpringProcessEngineConfiguration; import org.flowable.spring.boot.EngineConfigurationConfigurer; import org.springframework.context.annotation.Configuration; +import java.util.Arrays; + /** * Flowable配置类 */ @Configuration public class FlowableConfig implements EngineConfigurationConfigurer { - + + + @Resource + private FlowableJobEventListener flowableJobEventListener; + @Override public void configure(SpringProcessEngineConfiguration engineConfiguration) { engineConfiguration.setActivityFontName("宋体"); engineConfiguration.setLabelFontName("宋体"); engineConfiguration.setAnnotationFontName("宋体"); engineConfiguration.setDatabaseSchemaUpdate("true"); - + // 配置异步执行器 engineConfiguration.setAsyncExecutorActivate(true); // 设置重试次数为0,禁用重试 // engineConfiguration.setAsyncExecutorNumberOfRetries(0); // 设置失败等待时间为最小值 // engineConfiguration.setAsyncFailedJobWaitTime(1); - + // // 配置异步执行器参数 // engineConfiguration.setAsyncExecutorDefaultAsyncJobAcquireWaitTime(1000); // engineConfiguration.setAsyncExecutorDefaultTimerJobAcquireWaitTime(1000); @@ -36,5 +44,8 @@ public class FlowableConfig implements EngineConfigurationConfigurer {}, processInstanceId: {}", eventType, status, entity.getProcessInstanceId()); + workflowInstanceService.updateInstanceStatus(entity.getProcessInstanceId(), status); + return; + } + + if (isActivityInstanceEvent(eventType.name())) { + FlowableEngineEntityEvent entity = (FlowableEngineEntityEvent) event; + log.info("Activity level event received: {}, processInstanceId: {}", eventType, entity.getProcessInstanceId()); + WorkflowNodeInstanceStatusEnums status = convertActivityEventToStatus(eventType.name()); + if (status != null) { + workflowNodeInstanceService.updateNodeStatus( + entity.getProcessInstanceId(), + entity.getExecutionId(), + status + ); + } + } + } + + @Override + public boolean isFailOnException() { + return false; + } + + @Override + public boolean isFireOnTransactionLifecycleEvent() { + return false; + } + + @Override + public String getOnTransaction() { + return ""; + } + + private boolean isProcessLevelEvent(String eventType) { + return eventType.startsWith("PROCESS_"); + } + + private boolean isActivityInstanceEvent(String eventType) { + return eventType.startsWith("ACTIVITY_"); + } + + /** + * 将Flowable流程级别事件类型转换为工作流实例状态 + * 只处理流程实例级别的事件,不处理活动节点级别的事件 + * + * @param eventType Flowable事件类型 + * @return 工作流实例状态枚举,如果不是流程级别事件则返回null + */ + private WorkflowInstanceStatusEnums convertProcessLevelEventToStatus(String eventType) { + switch (eventType) { + // 创建相关 + case "PROCESS_CREATED": + return WorkflowInstanceStatusEnums.CREATED; + + // 运行相关 + case "PROCESS_STARTED": + return WorkflowInstanceStatusEnums.RUNNING; + + // 暂停相关 + case "PROCESS_SUSPENDED": + return WorkflowInstanceStatusEnums.SUSPENDED; + + // 恢复相关 + case "PROCESS_RESUMED": + return WorkflowInstanceStatusEnums.RUNNING; + + // 完成相关 + case "PROCESS_COMPLETED": + return WorkflowInstanceStatusEnums.COMPLETED; + + // 终止相关 + case "PROCESS_CANCELLED": + return WorkflowInstanceStatusEnums.TERMINATED; + + // 失败相关 + case "PROCESS_COMPLETED_WITH_ERROR_END_EVENT": + return WorkflowInstanceStatusEnums.FAILED; + + default: + // 不是流程级别的事件,返回null + return null; + } + } + + /** + * 将Flowable活动节点事件类型转换为工作流节点实例状态 + * + * @param eventType Flowable事件类型 + * @return 工作流节点实例状态枚举,如果不是节点级别事件则返回null + */ + private WorkflowNodeInstanceStatusEnums convertActivityEventToStatus(String eventType) { + switch (eventType) { + case "ACTIVITY_STARTED": + return WorkflowNodeInstanceStatusEnums.RUNNING; + + case "ACTIVITY_COMPLETED": + return WorkflowNodeInstanceStatusEnums.COMPLETED; + + case "ACTIVITY_CANCELLED": + return WorkflowNodeInstanceStatusEnums.TERMINATED; + + case "ACTIVITY_ERROR_RECEIVED": + return WorkflowNodeInstanceStatusEnums.FAILED; + + default: + return null; + } + } +} diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/listener/WorkflowEventListener.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/listener/WorkflowEventListener.java new file mode 100644 index 00000000..61383817 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/listener/WorkflowEventListener.java @@ -0,0 +1,2 @@ +package com.qqchen.deploy.backend.workflow.listener; + 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 4be237d8..4b985de8 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 @@ -10,6 +10,7 @@ import com.qqchen.deploy.backend.workflow.dto.graph.WorkflowDefinitionGraph; import com.qqchen.deploy.backend.workflow.entity.WorkflowDefinition; import com.qqchen.deploy.backend.workflow.entity.WorkflowInstance; import com.qqchen.deploy.backend.workflow.enums.WorkflowInstanceStatusEnums; +import com.qqchen.deploy.backend.workflow.enums.WorkflowNodeInstanceStatusEnums; import com.qqchen.deploy.backend.workflow.enums.WorkflowStatusEnums; import com.qqchen.deploy.backend.workflow.repository.IWorkflowDefinitionRepository; import com.qqchen.deploy.backend.workflow.repository.IWorkflowInstanceRepository; @@ -189,10 +190,10 @@ public class WorkflowDefinitionServiceImpl extends BaseServiceImpl new RuntimeException("Workflow instance not found: " + processInstanceId)); instance.setStatus(status); - if (status == WorkflowInstanceStatusEnums.COMPLETED || status == WorkflowInstanceStatusEnums.FAILED) { - instance.setEndTime(LocalDateTime.now()); - } - return workflowInstanceRepository.save(instance); }