增加生成后端服务代码。

This commit is contained in:
dengqichen 2025-10-30 21:29:13 +08:00
parent 70f54594a4
commit 2c43e9f678
3 changed files with 52 additions and 6 deletions

View File

@ -28,17 +28,22 @@ public enum WorkflowInstanceStatusEnums {
SUSPENDED("SUSPENDED", "已暂停"),
/**
* 已完成流程实例正常完成
* 已完成流程实例正常完成所有节点均成功
*/
COMPLETED("COMPLETED", "已完成"),
/**
* 部分成功流程实例完成但存在失败的节点
*/
COMPLETED_WITH_ERRORS("COMPLETED_WITH_ERRORS", "部分成功"),
/**
* 已终止流程实例被手动终止
*/
TERMINATED("TERMINATED", "已终止"),
/**
* 执行失败流程实例执行过程中发生错误
* 执行失败流程实例执行过程中发生错误或被中断
*/
FAILED("FAILED", "执行失败");
@ -76,7 +81,7 @@ public enum WorkflowInstanceStatusEnums {
* 判断是否为终态不可再变化的状态
*/
public boolean isFinalState() {
return this == COMPLETED || this == TERMINATED || this == FAILED;
return this == COMPLETED || this == COMPLETED_WITH_ERRORS || this == TERMINATED || this == FAILED;
}
/**

View File

@ -1,8 +1,11 @@
package com.qqchen.deploy.backend.workflow.event.handler;
import cn.hutool.core.date.DateUtil;
import com.qqchen.deploy.backend.workflow.entity.WorkflowNodeInstance;
import com.qqchen.deploy.backend.workflow.enums.WorkflowInstanceStatusEnums;
import com.qqchen.deploy.backend.workflow.enums.WorkflowNodeInstanceStatusEnums;
import com.qqchen.deploy.backend.workflow.dto.event.WorkflowInstanceStatusChangeEvent;
import com.qqchen.deploy.backend.workflow.repository.IWorkflowNodeInstanceRepository;
import lombok.extern.slf4j.Slf4j;
import org.flowable.common.engine.api.delegate.event.FlowableEvent;
import org.flowable.engine.ProcessEngine;
@ -13,6 +16,7 @@ import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;
import jakarta.annotation.Resource;
import java.util.List;
@Slf4j
@Component
@ -25,6 +29,9 @@ public class ProcessEventHandler implements IFlowableEventHandler {
@Lazy
private ProcessEngine processEngine;
@Resource
private IWorkflowNodeInstanceRepository workflowNodeInstanceRepository;
@Override
public boolean canHandle(String eventType) {
return eventType.startsWith("PROCESS_");
@ -34,15 +41,24 @@ public class ProcessEventHandler implements IFlowableEventHandler {
public void handle(FlowableEvent event) {
String eventType = event.getType().name();
FlowableProcessEngineEvent processEvent = (FlowableProcessEngineEvent) event;
WorkflowInstanceStatusEnums status = convertToWorkflowStatus(eventType);
// 对于 PROCESS_COMPLETED 事件需要检查节点状态来决定最终状态
WorkflowInstanceStatusEnums status;
if ("PROCESS_COMPLETED".equals(eventType)) {
status = determineCompletionStatus(processEvent.getProcessInstanceId());
} else {
status = convertToWorkflowStatus(eventType);
}
if (status != null) {
HistoricProcessInstance historicProcessInstance = processEngine.getHistoryService()
.createHistoricProcessInstanceQuery()
.processInstanceId(processEvent.getProcessInstanceId())
.singleResult();
log.info("工作流实例状态变更: processInstanceId={}, eventType={}, status={}",
processEvent.getProcessInstanceId(), eventType, status);
publisher.publishEvent(WorkflowInstanceStatusChangeEvent.builder()
.processInstanceId(processEvent.getProcessInstanceId())
.status(status)
@ -53,6 +69,30 @@ public class ProcessEventHandler implements IFlowableEventHandler {
}
}
/**
* 判断流程完成时的最终状态
*
* @param processInstanceId 流程实例ID
* @return 如果所有节点成功返回 COMPLETED如果有节点失败返回 COMPLETED_WITH_ERRORS
*/
private WorkflowInstanceStatusEnums determineCompletionStatus(String processInstanceId) {
// 查询该流程的所有节点实例
List<WorkflowNodeInstance> nodeInstances = workflowNodeInstanceRepository.findByProcessInstanceId(processInstanceId);
// 检查是否有失败的节点排除开始和结束节点
boolean hasFailedNode = nodeInstances.stream()
.filter(node -> !"StartEvent".equals(node.getNodeType()) && !"EndEvent".equals(node.getNodeType()))
.anyMatch(node -> WorkflowNodeInstanceStatusEnums.FAILED.equals(node.getStatus()));
if (hasFailedNode) {
log.warn("工作流实例 {} 完成,但存在失败的节点", processInstanceId);
return WorkflowInstanceStatusEnums.COMPLETED_WITH_ERRORS;
} else {
log.info("工作流实例 {} 完成,所有节点均成功", processInstanceId);
return WorkflowInstanceStatusEnums.COMPLETED;
}
}
private WorkflowInstanceStatusEnums convertToWorkflowStatus(String eventType) {
return switch (eventType) {
case "PROCESS_CREATED" -> WorkflowInstanceStatusEnums.CREATED;

View File

@ -610,8 +610,9 @@ CREATE TABLE workflow_instance
workflow_definition_id BIGINT NOT NULL COMMENT '工作流定义ID',
business_key VARCHAR(64) NULL COMMENT '业务标识',
form_data_id BIGINT NULL COMMENT '启动表单数据ID外键关联form_data',
status VARCHAR(100) NOT NULL COMMENT '实例状态',
status ENUM('NOT_STARTED','CREATED','RUNNING','SUSPENDED','COMPLETED','COMPLETED_WITH_ERRORS','TERMINATED','FAILED') NOT NULL COMMENT '实例状态',
variables TEXT NULL COMMENT '流程变量(JSON)',
form_data JSON NULL COMMENT '表单数据(JSON)',
graph_snapshot JSON NULL COMMENT '流程图数据快照(启动时保存,用于画布还原)',
start_time DATETIME(6) NULL COMMENT '开始时间',
end_time DATETIME(6) NULL COMMENT '结束时间',