getNodeDetailByProcessDefinitionKey(@RequestParam String processDefinitionKey) {
+ return processService.getNodeDetailByProcessDefinitionKey(processDefinitionKey);
+ }
+
+ /**
+ * 完成人工节点任务
+ *
+ * @param req
+ * @return
+ */
+ @PostMapping("/completeManualTasks")
+ public void completeManualTasks(@RequestBody CompleteTaskReq req) {
+ processService.completeManualTasks(req);
+ }
+
+ /**
+ * 异步任务回调接口,用于唤醒等待的流程实例
+ *
+ * @param request 包含异步任务ID和执行结果的请求对象
+ */
+ @PostMapping("/asyncCallback")
+ public void asyncCallback(@RequestBody AsyncCallbackRequest request) {
+ // 发送信号唤醒流程实例中等待的节点
+ universalDelegate.signalByTaskId(request);
+ }
+}
\ No newline at end of file
diff --git a/flowable/src/main/java/com/sdm/flowable/dao/AsyncTaskRecordMapper.java b/flowable/src/main/java/com/sdm/flowable/dao/AsyncTaskRecordMapper.java
new file mode 100644
index 00000000..b62774e6
--- /dev/null
+++ b/flowable/src/main/java/com/sdm/flowable/dao/AsyncTaskRecordMapper.java
@@ -0,0 +1,16 @@
+package com.sdm.flowable.dao;
+
+import com.sdm.flowable.entity.AsyncTaskRecord;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ *
+ * 异步任务执行记录表 Mapper 接口
+ *
+ *
+ * @author author
+ * @since 2025-11-26
+ */
+public interface AsyncTaskRecordMapper extends BaseMapper {
+
+}
diff --git a/flowable/src/main/java/com/sdm/flowable/dao/ProcessNodeParamMapper.java b/flowable/src/main/java/com/sdm/flowable/dao/ProcessNodeParamMapper.java
new file mode 100644
index 00000000..fd4c1285
--- /dev/null
+++ b/flowable/src/main/java/com/sdm/flowable/dao/ProcessNodeParamMapper.java
@@ -0,0 +1,16 @@
+package com.sdm.flowable.dao;
+
+import com.sdm.flowable.entity.ProcessNodeParam;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ *
+ * 流程节点输入参数表 Mapper 接口
+ *
+ *
+ * @author author
+ * @since 2025-11-25
+ */
+public interface ProcessNodeParamMapper extends BaseMapper {
+
+}
diff --git a/flowable/src/main/java/com/sdm/flowable/delegate/UniversalDelegate.java b/flowable/src/main/java/com/sdm/flowable/delegate/UniversalDelegate.java
new file mode 100644
index 00000000..aa64405f
--- /dev/null
+++ b/flowable/src/main/java/com/sdm/flowable/delegate/UniversalDelegate.java
@@ -0,0 +1,94 @@
+package com.sdm.flowable.delegate;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.sdm.flowable.config.executeConfig.BaseExecuteConfig;
+import com.sdm.flowable.constants.FlowableConfig;
+import com.sdm.flowable.delegate.handler.ExecutionHandler;
+import com.sdm.flowable.dto.req.AsyncCallbackRequest;
+import com.sdm.flowable.service.IAsyncTaskRecordService;
+import com.sdm.flowable.service.IProcessNodeParamService;
+import lombok.extern.slf4j.Slf4j;
+import org.flowable.engine.delegate.DelegateExecution;
+import org.flowable.engine.delegate.JavaDelegate;
+import org.flowable.engine.RuntimeService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * 通用执行器,用于处理不同类型的节点(如 userTask, serviceTask)的执行逻辑。
+ */
+@Component("universalDelegate")
+@Slf4j
+public class UniversalDelegate implements JavaDelegate {
+ @Autowired
+ private ObjectMapper objectMapper;
+
+ @Autowired
+ private IProcessNodeParamService paramService;
+
+ @Autowired
+ private IAsyncTaskRecordService asyncTaskRecordService;
+
+ @Autowired
+ private Map handlerMap; // 执行器映射
+
+ @Override
+ public void execute(DelegateExecution execution) {
+ try {
+ // 1. 获取当前节点信息
+ String procInstId = execution.getProcessInstanceId();
+ String nodeId = execution.getCurrentActivityId();
+ String nodeName = execution.getCurrentFlowElement().getName();
+
+ // 2. 读取输入参数
+ Map params = paramService.getParam(procInstId, nodeId);
+
+ log.info("==== 节点执行日志 ====\n流程实例ID:{}\n节点ID:{}\n节点名称:{}\n输入参数:{}\n====================",
+ procInstId, nodeId, nodeName, params);
+
+ // 检查是否有扩展元素配置
+ if (execution.getCurrentFlowElement().getExtensionElements() != null &&
+ execution.getCurrentFlowElement().getExtensionElements().get(FlowableConfig.EXECUTECONFIG) != null) {
+
+ String extensionElement = execution
+ .getCurrentFlowElement()
+ .getExtensionElements()
+ .get(FlowableConfig.EXECUTECONFIG).get(0).getElementText();
+
+ BaseExecuteConfig config =
+ objectMapper.readValue(extensionElement, BaseExecuteConfig.class);
+
+ String executeType = config.getExecuteType();
+ ExecutionHandler handler = handlerMap.get(executeType);
+ if (handler == null) {
+ throw new RuntimeException("不支持的执行方式:" + executeType);
+ }
+
+ // 执行具体的任务处理逻辑
+ handler.execute(execution, params, config);
+ } else {
+ // 对于没有配置 executeConfig 的节点(如 userTask),直接完成任务
+ log.info("节点 {} 没有执行配置,直接完成任务", nodeName);
+ }
+ } catch (JsonProcessingException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * 外部系统回调接口,用于唤醒等待的流程实例
+ * @param processInstanceId 流程实例ID
+ * @param nodeId 节点ID
+ * @param resultData 结果数据
+ */
+ /**
+ * HPC 回调接口,用于唤醒等待的流程
+ */
+ public void signalByTaskId(AsyncCallbackRequest request) {
+ asyncTaskRecordService.completeAsyncTask(request);
+ }
+
+}
\ No newline at end of file
diff --git a/flowable/src/main/java/com/sdm/flowable/delegate/handler/CloudAppHandler.java b/flowable/src/main/java/com/sdm/flowable/delegate/handler/CloudAppHandler.java
new file mode 100644
index 00000000..6c65a54f
--- /dev/null
+++ b/flowable/src/main/java/com/sdm/flowable/delegate/handler/CloudAppHandler.java
@@ -0,0 +1,16 @@
+package com.sdm.flowable.delegate.handler;
+
+import com.sdm.flowable.config.executeConfig.BaseExecuteConfig;
+import org.flowable.engine.delegate.DelegateExecution;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+// 云应用处理器(executeType=cloudApp)
+@Component("cloudApp")
+public class CloudAppHandler implements ExecutionHandler {
+ @Override
+ public void execute(DelegateExecution execution, Map params, BaseExecuteConfig config) {
+ // 实现云应用处理逻辑...
+ }
+}
diff --git a/flowable/src/main/java/com/sdm/flowable/delegate/handler/DataProcessHandler.java b/flowable/src/main/java/com/sdm/flowable/delegate/handler/DataProcessHandler.java
new file mode 100644
index 00000000..e2f76ced
--- /dev/null
+++ b/flowable/src/main/java/com/sdm/flowable/delegate/handler/DataProcessHandler.java
@@ -0,0 +1,16 @@
+package com.sdm.flowable.delegate.handler;
+
+import com.sdm.flowable.config.executeConfig.BaseExecuteConfig;
+import org.flowable.engine.delegate.DelegateExecution;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+// 数据处理执行器(executeType=data_process)
+@Component("dataProcess")
+public class DataProcessHandler implements ExecutionHandler {
+ @Override
+ public void execute(DelegateExecution execution, Map params, BaseExecuteConfig config) {
+ // 实现数据处理逻辑...
+ }
+}
\ No newline at end of file
diff --git a/flowable/src/main/java/com/sdm/flowable/delegate/handler/ExecutionHandler.java b/flowable/src/main/java/com/sdm/flowable/delegate/handler/ExecutionHandler.java
new file mode 100644
index 00000000..726246b1
--- /dev/null
+++ b/flowable/src/main/java/com/sdm/flowable/delegate/handler/ExecutionHandler.java
@@ -0,0 +1,10 @@
+package com.sdm.flowable.delegate.handler;
+
+import com.sdm.flowable.config.executeConfig.BaseExecuteConfig;
+import org.flowable.engine.delegate.DelegateExecution;
+
+import java.util.Map;
+
+public interface ExecutionHandler {
+ void execute(DelegateExecution execution, Map params, BaseExecuteConfig config);
+}
diff --git a/flowable/src/main/java/com/sdm/flowable/delegate/handler/HpcHandler.java b/flowable/src/main/java/com/sdm/flowable/delegate/handler/HpcHandler.java
new file mode 100644
index 00000000..99a643ed
--- /dev/null
+++ b/flowable/src/main/java/com/sdm/flowable/delegate/handler/HpcHandler.java
@@ -0,0 +1,36 @@
+package com.sdm.flowable.delegate.handler;
+
+import com.sdm.flowable.config.executeConfig.BaseExecuteConfig;
+import com.sdm.flowable.service.IAsyncTaskRecordService;
+import lombok.extern.slf4j.Slf4j;
+import org.flowable.engine.delegate.DelegateExecution;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.Map;
+
+// HPC(executeType=HPC)
+@Slf4j
+@Component("HPC")
+public class HpcHandler implements ExecutionHandler {
+ @Autowired
+ private IAsyncTaskRecordService asyncTaskRecordService;
+
+ @Override
+ public void execute(DelegateExecution execution, Map params, BaseExecuteConfig config) {
+ // 实现HPC处理逻辑...
+ // 1. 调用 HPC 平台提交任务
+ // String hpcTaskId = submitHpcTask(params);
+ String hpcTaskId = "";
+ // 2. 存数据库(提交状态 + 外部任务ID)
+ asyncTaskRecordService.registerAsyncTask(
+ execution,
+ config.getCallbackNodeId(), // ReceiveTask ID
+ "HPC", // handlerType
+ new HashMap<>()
+ );
+
+ log.info("HPC 任务 {} 已提交", hpcTaskId);
+ }
+}
\ No newline at end of file
diff --git a/flowable/src/main/java/com/sdm/flowable/delegate/handler/HttpHandler.java b/flowable/src/main/java/com/sdm/flowable/delegate/handler/HttpHandler.java
new file mode 100644
index 00000000..93f21121
--- /dev/null
+++ b/flowable/src/main/java/com/sdm/flowable/delegate/handler/HttpHandler.java
@@ -0,0 +1,17 @@
+package com.sdm.flowable.delegate.handler;
+
+import com.sdm.flowable.config.executeConfig.BaseExecuteConfig;
+import org.flowable.engine.delegate.DelegateExecution;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+// HTTP请求执行器(executeType=HTTP)
+@Component("http")
+public class HttpHandler implements ExecutionHandler {
+
+ @Override
+ public void execute(DelegateExecution execution, Map params, BaseExecuteConfig config) {
+ // 实现HTTP请求逻辑...
+ }
+}
\ No newline at end of file
diff --git a/flowable/src/main/java/com/sdm/flowable/delegate/handler/LocalAppHandler.java b/flowable/src/main/java/com/sdm/flowable/delegate/handler/LocalAppHandler.java
new file mode 100644
index 00000000..ae74d7ff
--- /dev/null
+++ b/flowable/src/main/java/com/sdm/flowable/delegate/handler/LocalAppHandler.java
@@ -0,0 +1,16 @@
+package com.sdm.flowable.delegate.handler;
+
+import com.sdm.flowable.config.executeConfig.BaseExecuteConfig;
+import org.flowable.engine.delegate.DelegateExecution;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+// 本地应用处理器(executeType=localApp)
+@Component("localApp")
+public class LocalAppHandler implements ExecutionHandler {
+ @Override
+ public void execute(DelegateExecution execution, Map params, BaseExecuteConfig config) {
+ // 实现本地应用处理逻辑...
+ }
+}
\ No newline at end of file
diff --git a/flowable/src/main/java/com/sdm/flowable/dto/ExtensionElementsDTO.java b/flowable/src/main/java/com/sdm/flowable/dto/ExtensionElementsDTO.java
new file mode 100644
index 00000000..95e416f9
--- /dev/null
+++ b/flowable/src/main/java/com/sdm/flowable/dto/ExtensionElementsDTO.java
@@ -0,0 +1,15 @@
+package com.sdm.flowable.dto;
+
+import com.sdm.flowable.config.executeConfig.BaseExecuteConfig;
+import lombok.Data;
+
+/**
+ * 扩展配置DTO(serviceTask等需要执行配置的节点使用)
+ */
+@Data
+public class ExtensionElementsDTO {
+ /**
+ * 执行配置(核心字段,对应executeConfig)
+ */
+ private BaseExecuteConfig executeConfig;
+}
\ No newline at end of file
diff --git a/flowable/src/main/java/com/sdm/flowable/dto/FlowElementDTO.java b/flowable/src/main/java/com/sdm/flowable/dto/FlowElementDTO.java
new file mode 100644
index 00000000..ec4722dd
--- /dev/null
+++ b/flowable/src/main/java/com/sdm/flowable/dto/FlowElementDTO.java
@@ -0,0 +1,34 @@
+package com.sdm.flowable.dto;
+
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import java.util.List;
+
+/**
+ * 流元素DTO(统一接收节点和连线,通过type区分)
+ */
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true) // 忽略不同类型的多余字段(关键)
+public class FlowElementDTO {
+ // ------------------------------ 所有流元素通用字段 ------------------------------
+ /** 元素唯一ID(流程内不重复) */
+ private String id;
+ /** 元素类型:startEvent/serviceTask/userTask/endEvent/sequenceFlow */
+ private String type;
+ /** 元素显示名称 */
+ private String name;
+
+ // ------------------------------ 节点专属字段(startEvent/serviceTask/userTask/endEvent) ------------------------------
+ /** 入连线ID集合(仅节点有) */
+ private List incomingFlows;
+ /** 出连线ID集合(仅节点有) */
+ private List outgoingFlows;
+ /** 扩展配置(serviceTask等需要执行配置的节点使用) */
+ private ExtensionElementsDTO extensionElements;
+
+ // ------------------------------ 连线专属字段(sequenceFlow) ------------------------------
+ /** 源节点ID(仅连线有) */
+ private String sourceRef;
+ /** 目标节点ID(仅连线有) */
+ private String targetRef;
+}
\ No newline at end of file
diff --git a/flowable/src/main/java/com/sdm/flowable/dto/ProcessDTO.java b/flowable/src/main/java/com/sdm/flowable/dto/ProcessDTO.java
new file mode 100644
index 00000000..93760dc0
--- /dev/null
+++ b/flowable/src/main/java/com/sdm/flowable/dto/ProcessDTO.java
@@ -0,0 +1,14 @@
+package com.sdm.flowable.dto;
+
+import lombok.Data;
+
+/**
+ * 流程基础信息DTO(对应JSON中的process字段)
+ */
+@Data
+public class ProcessDTO {
+ /** 流程唯一ID(必填) */
+ private String id;
+ /** 流程名称(必填) */
+ private String name;
+}
diff --git a/flowable/src/main/java/com/sdm/flowable/dto/ProcessDefinitionDTO.java b/flowable/src/main/java/com/sdm/flowable/dto/ProcessDefinitionDTO.java
new file mode 100644
index 00000000..5fb36c2b
--- /dev/null
+++ b/flowable/src/main/java/com/sdm/flowable/dto/ProcessDefinitionDTO.java
@@ -0,0 +1,15 @@
+package com.sdm.flowable.dto;
+
+import lombok.Data;
+import java.util.List;
+
+/**
+ * 流程定义顶层DTO(对应整个JSON)
+ */
+@Data
+public class ProcessDefinitionDTO {
+ /** 流程核心信息 */
+ private ProcessDTO process;
+ /** 所有节点+连线集合 */
+ private List flowElements;
+}
\ No newline at end of file
diff --git a/flowable/src/main/java/com/sdm/flowable/dto/req/AsyncCallbackRequest.java b/flowable/src/main/java/com/sdm/flowable/dto/req/AsyncCallbackRequest.java
new file mode 100644
index 00000000..e36d553a
--- /dev/null
+++ b/flowable/src/main/java/com/sdm/flowable/dto/req/AsyncCallbackRequest.java
@@ -0,0 +1,24 @@
+package com.sdm.flowable.dto.req;
+
+import com.alibaba.fastjson2.JSONObject;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 异步任务回调请求参数
+ */
+@Data
+public class AsyncCallbackRequest implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 异步任务ID
+ */
+ private String asyncTaskId;
+
+ /**
+ * 任务执行结果数据
+ */
+ private String resultJson;
+}
\ No newline at end of file
diff --git a/flowable/src/main/java/com/sdm/flowable/dto/req/CompleteTaskReq.java b/flowable/src/main/java/com/sdm/flowable/dto/req/CompleteTaskReq.java
new file mode 100644
index 00000000..be29de1b
--- /dev/null
+++ b/flowable/src/main/java/com/sdm/flowable/dto/req/CompleteTaskReq.java
@@ -0,0 +1,13 @@
+package com.sdm.flowable.dto.req;
+
+import lombok.Data;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Data
+public class CompleteTaskReq {
+ private String processInstanceId;
+ private String taskDefinitionKey;
+ private Map variables = new HashMap<>();
+}
\ No newline at end of file
diff --git a/flowable/src/main/java/com/sdm/flowable/dto/req/DeployFlowableJsonReq.java b/flowable/src/main/java/com/sdm/flowable/dto/req/DeployFlowableJsonReq.java
new file mode 100644
index 00000000..5cefdf52
--- /dev/null
+++ b/flowable/src/main/java/com/sdm/flowable/dto/req/DeployFlowableJsonReq.java
@@ -0,0 +1,8 @@
+package com.sdm.flowable.dto.req;
+
+import lombok.Data;
+
+@Data
+public class DeployFlowableJsonReq {
+ String flowableJson;
+}
diff --git a/flowable/src/main/java/com/sdm/flowable/dto/resp/ProcessInstanceResp.java b/flowable/src/main/java/com/sdm/flowable/dto/resp/ProcessInstanceResp.java
new file mode 100644
index 00000000..13d291a7
--- /dev/null
+++ b/flowable/src/main/java/com/sdm/flowable/dto/resp/ProcessInstanceResp.java
@@ -0,0 +1,18 @@
+package com.sdm.flowable.dto.resp;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class ProcessInstanceResp {
+ private String id; // 流程实例ID
+ private String processDefinitionId; // 流程定义ID
+ private String processDefinitionKey; // 流程定义Key
+ private String processDefinitionName;// 流程定义名称
+ private int processDefinitionVersion; // 流程定义版本
+ private String businessKey; // 业务Key
+ private String startUserId; // 启动用户
+ private Date startTime; // 启动时间
+ private boolean suspended; // 是否挂起
+}
diff --git a/flowable/src/main/java/com/sdm/flowable/entity/AsyncTaskRecord.java b/flowable/src/main/java/com/sdm/flowable/entity/AsyncTaskRecord.java
new file mode 100644
index 00000000..21bcaf8d
--- /dev/null
+++ b/flowable/src/main/java/com/sdm/flowable/entity/AsyncTaskRecord.java
@@ -0,0 +1,66 @@
+package com.sdm.flowable.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ *
+ * 异步任务执行记录表
+ *
+ *
+ * @author author
+ * @since 2025-11-26
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("async_task_record")
+@ApiModel(value="AsyncTaskRecord对象", description="异步任务执行记录表")
+public class AsyncTaskRecord implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty(value = "主键ID,自增")
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+
+ @ApiModelProperty(value = "异步任务唯一标识,全局唯一,用于定位单个异步任务")
+ private String asyncTaskId;
+
+ @ApiModelProperty(value = "流程实例ID,关联工作流引擎的流程实例(如Camunda的processInstanceId)")
+ private String processInstanceId;
+
+ @ApiModelProperty(value = "流程执行ID,关联工作流引擎的执行实例(如Camunda的executionId)")
+ private String executionId;
+
+ @ApiModelProperty(value = "接收任务ID,关联工作流中接收任务节点的ID(用于异步回调触发流程继续)")
+ private String receiveTaskId;
+
+ @ApiModelProperty(value = "业务处理器类型,标识任务对应的业务处理逻辑,例如:HPC(高性能计算)/OCR(图文识别)/AI(智能分析)")
+ private String handlerType;
+
+ @ApiModelProperty(value = "任务请求参数,JSON格式字符串,存储触发异步任务时的入参信息")
+ private String requestJson;
+
+ @ApiModelProperty(value = "任务执行结果,JSON格式字符串,存储异步任务完成后的返回数据(成功/失败均记录)")
+ private String resultJson;
+
+ @ApiModelProperty(value = "任务状态:INIT(初始化)/RUNNING(执行中)/SUCCESS(执行成功)/FAIL(执行失败)")
+ private String status;
+
+ @ApiModelProperty(value = "任务创建时间,默认当前时间")
+ private LocalDateTime createTime;
+
+ @ApiModelProperty(value = "任务更新时间,数据变更时自动更新为当前时间")
+ private LocalDateTime updateTime;
+
+
+}
diff --git a/flowable/src/main/java/com/sdm/flowable/entity/ProcessNodeParam.java b/flowable/src/main/java/com/sdm/flowable/entity/ProcessNodeParam.java
new file mode 100644
index 00000000..011dbaa6
--- /dev/null
+++ b/flowable/src/main/java/com/sdm/flowable/entity/ProcessNodeParam.java
@@ -0,0 +1,54 @@
+package com.sdm.flowable.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ *
+ * 流程节点输入参数表
+ *
+ *
+ * @author author
+ * @since 2025-11-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("process_node_param")
+@ApiModel(value="ProcessNodeParam对象", description="流程节点输入参数表")
+public class ProcessNodeParam implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+
+ @ApiModelProperty(value = "流程定义ID")
+ @TableField("processDefinitionId")
+ private String processDefinitionId;
+
+ @ApiModelProperty(value = "节点ID")
+ @TableField("nodeId")
+ private String nodeId;
+
+ @ApiModelProperty(value = "输入参数JSON")
+ @TableField("paramJson")
+ private String paramJson;
+
+ @TableField("createTime")
+ private LocalDateTime createTime;
+
+ @TableField("updateTime")
+ private LocalDateTime updateTime;
+
+
+}
diff --git a/flowable/src/main/java/com/sdm/flowable/enums/FlowElementTypeEnums.java b/flowable/src/main/java/com/sdm/flowable/enums/FlowElementTypeEnums.java
new file mode 100644
index 00000000..0f71d9a0
--- /dev/null
+++ b/flowable/src/main/java/com/sdm/flowable/enums/FlowElementTypeEnums.java
@@ -0,0 +1,28 @@
+package com.sdm.flowable.enums;
+
+public enum FlowElementTypeEnums {
+ STARTEVENT("startEvent"),
+ ENDEVENT("endEvent"),
+ USERTASK("userTask"),
+ SERVICETASK("serviceTask"),
+ EXCLUSIVEGATEWAY("exclusiveGateway"),
+ PARALLELGATEWAY("parallelGateway"),
+ SEQUENCEFLOW("sequenceFlow");
+ private final String type;
+
+ FlowElementTypeEnums(String startEvent) {
+ this.type = startEvent;
+ }
+ public String getType() {
+ return type;
+ }
+
+ public static FlowElementTypeEnums fromString(String type) {
+ for (FlowElementTypeEnums flowElementType : FlowElementTypeEnums.values()) {
+ if (flowElementType.type.equals(type)) {
+ return flowElementType;
+ }
+ }
+ throw new IllegalArgumentException("Unknown type: " + type);
+ }
+}
diff --git a/flowable/src/main/java/com/sdm/flowable/process/ProcessService.java b/flowable/src/main/java/com/sdm/flowable/process/ProcessService.java
new file mode 100644
index 00000000..fb0b9e4a
--- /dev/null
+++ b/flowable/src/main/java/com/sdm/flowable/process/ProcessService.java
@@ -0,0 +1,509 @@
+package com.sdm.flowable.process;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.sdm.flowable.dto.ProcessDefinitionDTO;
+import com.sdm.flowable.util.Dto2BpmnConverter;
+import com.sdm.flowable.constants.FlowableConfig;
+import com.sdm.flowable.dto.req.CompleteTaskReq;
+import org.flowable.bpmn.model.*;
+import org.flowable.bpmn.model.Process;
+import org.flowable.engine.HistoryService;
+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;
+import org.flowable.engine.repository.ProcessDefinition;
+import org.flowable.engine.repository.ProcessDefinitionQuery;
+import org.flowable.engine.runtime.ProcessInstance;
+import org.flowable.task.api.Task;
+import org.flowable.validation.ProcessValidator;
+import org.flowable.validation.ProcessValidatorFactory;
+import org.flowable.validation.ValidationError;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+
+@Service
+public class ProcessService {
+ @Autowired
+ private RepositoryService repositoryService;
+
+ @Autowired
+ private RuntimeService runtimeService;
+
+ @Autowired
+ private HistoryService historyService;
+
+ @Autowired
+ private TaskService taskService;
+
+ @Autowired
+ private Dto2BpmnConverter dto2BpmnConverter;
+
+ // 部署流程(前端传入Flowable标准JSON)
+ public Deployment deploy(ProcessDefinitionDTO processDTO) throws Exception {
+ BpmnModel bpmnModel = dto2BpmnConverter.convert(processDTO);
+ // 检查BPMN模型是否有效
+ if (bpmnModel.getProcesses().isEmpty()) {
+ throw new RuntimeException("无效的BPMN模型:未找到任何流程定义");
+ }
+
+ // 验证BPMN模型
+ ProcessValidator validator = new ProcessValidatorFactory().createDefaultProcessValidator();
+ List validationErrors = validator.validate(bpmnModel);
+ if (!validationErrors.isEmpty()) {
+ StringBuilder errorMsg = new StringBuilder("BPMN模型验证失败:");
+ for (ValidationError error : validationErrors) {
+ errorMsg.append("\n - ").append(error.toString());
+ }
+ throw new RuntimeException(errorMsg.toString());
+ }
+
+ return repositoryService.createDeployment()
+ .addBpmnModel("industrial_process.bpmn", bpmnModel)
+ .name("工业并行部署流程")
+ .deploy();
+ }
+
+ public List