From 42fde0d2d278b5c95c55adad7359e01720c50aad Mon Sep 17 00:00:00 2001 From: asp_ly Date: Sun, 15 Dec 2024 18:10:01 +0800 Subject: [PATCH] 1 --- .../api/WorkflowDefinitionApiController.java | 16 - .../api/WorkflowInstanceApiController.java | 63 ++ .../enums/WorkflowInstanceStatusEnums.java | 5 - .../workflow/query/WorkflowInstanceQuery.java | 15 + .../IWorkflowInstanceRepository.java | 3 +- .../service/IWorkflowDefinitionService.java | 10 - .../service/IWorkflowInstanceService.java | 7 +- .../impl/WorkflowDefinitionServiceImpl.java | 18 - .../impl/WorkflowInstanceServiceImpl.java | 40 +- .../db/migration/V1.0.0__init_schema.sql | 199 ++---- .../db/migration/V1.0.1__init_data.sql | 610 ++++-------------- 11 files changed, 314 insertions(+), 672 deletions(-) create mode 100644 backend/src/main/java/com/qqchen/deploy/backend/workflow/api/WorkflowInstanceApiController.java create mode 100644 backend/src/main/java/com/qqchen/deploy/backend/workflow/query/WorkflowInstanceQuery.java diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/WorkflowDefinitionApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/WorkflowDefinitionApiController.java index 49fe4b41..6152664a 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/WorkflowDefinitionApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/WorkflowDefinitionApiController.java @@ -67,22 +67,6 @@ public class WorkflowDefinitionApiController extends BaseController startWorkflow( - @Parameter(description = "流程标识", required = true) @RequestParam String processKey, - @Parameter(description = "业务标识", required = true) @RequestParam String businessKey - ) { - Map variables = new HashMap<>(); - try { - // 同步创建实例,立即返回实例ID - return Response.success(workflowDefinitionService.startWorkflow(processKey, businessKey, variables)); - } catch (Exception e) { - log.error("Failed to start workflow", e); - return Response.error(ResponseCode.WORKFLOW_EXECUTION_ERROR); - } - } - @Operation(summary = "挂起工作流实例") @PostMapping("/{processInstanceId}/suspend") public Response suspendWorkflow( diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/WorkflowInstanceApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/WorkflowInstanceApiController.java new file mode 100644 index 00000000..64719354 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/WorkflowInstanceApiController.java @@ -0,0 +1,63 @@ +package com.qqchen.deploy.backend.workflow.api; + +import com.qqchen.deploy.backend.framework.api.Response; +import com.qqchen.deploy.backend.framework.controller.BaseController; +import com.qqchen.deploy.backend.framework.enums.ResponseCode; +import com.qqchen.deploy.backend.workflow.dto.WorkflowDefinitionDTO; +import com.qqchen.deploy.backend.workflow.dto.WorkflowExecutionDTO; +import com.qqchen.deploy.backend.workflow.dto.WorkflowInstanceDTO; +import com.qqchen.deploy.backend.workflow.entity.WorkflowDefinition; +import com.qqchen.deploy.backend.workflow.entity.WorkflowInstance; +import com.qqchen.deploy.backend.workflow.query.WorkflowDefinitionQuery; +import com.qqchen.deploy.backend.workflow.query.WorkflowInstanceQuery; +import com.qqchen.deploy.backend.workflow.service.IWorkflowDefinitionService; +import com.qqchen.deploy.backend.workflow.service.IWorkflowInstanceService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.history.HistoricActivityInstance; +import org.flowable.engine.history.HistoricProcessInstance; +import org.flowable.variable.api.history.HistoricVariableInstance; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 工作流定义控制器 + */ +@Slf4j +@RestController +@RequestMapping("/api/v1/workflow/instance") +@Tag(name = "工作流实例管理", description = "工作流定义实例相关接口") +public class WorkflowInstanceApiController extends BaseController { + + @Resource + private IWorkflowInstanceService workflowInstanceService; + + @Operation(summary = "启动工作流") + @PostMapping("/start") + public Response startWorkflow( + @RequestParam String processKey, + @RequestParam String businessKey) { + return Response.success(workflowInstanceService.startWorkflow(processKey, businessKey)); + } + + @Override + protected void exportData(HttpServletResponse response, List data) { + + } +} diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/enums/WorkflowInstanceStatusEnums.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/enums/WorkflowInstanceStatusEnums.java index 064e9f94..4dfccac6 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/enums/WorkflowInstanceStatusEnums.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/enums/WorkflowInstanceStatusEnums.java @@ -10,11 +10,6 @@ import lombok.Getter; @Getter public enum WorkflowInstanceStatusEnums { - /** - * 未开始:节点尚未开始执行 - */ - NOT_STARTED("NOT_STARTED", "未开始"), - /** * 已创建:流程实例已创建但还未开始运行 */ diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/query/WorkflowInstanceQuery.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/query/WorkflowInstanceQuery.java new file mode 100644 index 00000000..a5102e00 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/query/WorkflowInstanceQuery.java @@ -0,0 +1,15 @@ +package com.qqchen.deploy.backend.workflow.query; + +import com.qqchen.deploy.backend.framework.query.BaseQuery; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 工作流定义查询对象 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class WorkflowInstanceQuery extends BaseQuery { + +} + diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/repository/IWorkflowInstanceRepository.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/repository/IWorkflowInstanceRepository.java index 15259810..ab9ba52e 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/repository/IWorkflowInstanceRepository.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/repository/IWorkflowInstanceRepository.java @@ -1,5 +1,6 @@ package com.qqchen.deploy.backend.workflow.repository; +import com.qqchen.deploy.backend.framework.repository.IBaseRepository; import com.qqchen.deploy.backend.workflow.entity.WorkflowInstance; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -8,7 +9,7 @@ import java.util.List; import java.util.Optional; @Repository -public interface IWorkflowInstanceRepository extends JpaRepository { +public interface IWorkflowInstanceRepository extends IBaseRepository { /** * 根据Flowable流程实例ID查询工作流实例 diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/service/IWorkflowDefinitionService.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/service/IWorkflowDefinitionService.java index 323bc439..ca1e9930 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/service/IWorkflowDefinitionService.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/service/IWorkflowDefinitionService.java @@ -28,16 +28,6 @@ public interface IWorkflowDefinitionService extends IBaseService variables); - /** * 挂起工作流实例 * diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/service/IWorkflowInstanceService.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/service/IWorkflowInstanceService.java index 7f5b4b87..556f7658 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/service/IWorkflowInstanceService.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/service/IWorkflowInstanceService.java @@ -1,6 +1,9 @@ package com.qqchen.deploy.backend.workflow.service; +import com.qqchen.deploy.backend.framework.service.IBaseService; +import com.qqchen.deploy.backend.workflow.dto.WorkflowDefinitionDTO; import com.qqchen.deploy.backend.workflow.dto.WorkflowInstanceDTO; +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 org.flowable.engine.runtime.ProcessInstance; @@ -8,7 +11,7 @@ import org.flowable.engine.runtime.ProcessInstance; import java.util.List; import java.util.Map; -public interface IWorkflowInstanceService { +public interface IWorkflowInstanceService extends IBaseService { /** * 创建工作流实例并关联Flowable实例 @@ -50,4 +53,6 @@ public interface IWorkflowInstanceService { * @param variables 完成时的变量 */ void completeInstance(String processInstanceId, Map variables); + + WorkflowInstanceDTO startWorkflow(String processKey, String businessKey); } 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 af008be5..4be237d8 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 @@ -102,24 +102,6 @@ public class WorkflowDefinitionServiceImpl extends BaseServiceImpl variables) { - try { - // 2. 创建工作流实例记录 - WorkflowDefinition workflowDefinition = workflowDefinitionRepository.findByKey(processKey).orElseThrow(() -> new RuntimeException("Workflow definition process key not found: " + processKey)); - // 1. 创建并异步启动流程实例 - ProcessInstance processInstance = runtimeService.createProcessInstanceBuilder() - .processDefinitionKey(processKey) - .businessKey(businessKey) - .variables(variables) - .startAsync(); // 异步启动,会自动执行 shell 任务 - return workflowInstanceService.createWorkflowInstance(workflowDefinition.getId(), businessKey, processInstance); - } catch (Exception e) { - log.error("Failed to create workflow: {}", processKey, e); - throw new RuntimeException("Failed to create workflow", e); - } - } @Override public void suspendWorkflow(String processInstanceId) { diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/service/impl/WorkflowInstanceServiceImpl.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/service/impl/WorkflowInstanceServiceImpl.java index 2867a33c..cfa67cb9 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/service/impl/WorkflowInstanceServiceImpl.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/service/impl/WorkflowInstanceServiceImpl.java @@ -2,11 +2,16 @@ package com.qqchen.deploy.backend.workflow.service.impl; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import com.qqchen.deploy.backend.framework.service.impl.BaseServiceImpl; import com.qqchen.deploy.backend.workflow.converter.WorkflowInstanceConverter; +import com.qqchen.deploy.backend.workflow.dto.WorkflowDefinitionDTO; import com.qqchen.deploy.backend.workflow.dto.WorkflowInstanceDTO; +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.repository.IWorkflowDefinitionRepository; import com.qqchen.deploy.backend.workflow.repository.IWorkflowInstanceRepository; +import com.qqchen.deploy.backend.workflow.service.IWorkflowDefinitionService; import com.qqchen.deploy.backend.workflow.service.IWorkflowInstanceService; import jakarta.annotation.Resource; import lombok.RequiredArgsConstructor; @@ -24,22 +29,27 @@ import java.util.stream.Collectors; @Slf4j @Service -@RequiredArgsConstructor -public class WorkflowInstanceServiceImpl implements IWorkflowInstanceService { +public class WorkflowInstanceServiceImpl extends BaseServiceImpl implements IWorkflowInstanceService { - private final IWorkflowInstanceRepository workflowInstanceRepository; + @Resource + private IWorkflowDefinitionRepository workflowDefinitionRepository; - private final RuntimeService runtimeService; + @Resource + private IWorkflowInstanceRepository workflowInstanceRepository; - private final HistoryService historyService; + @Resource + private RuntimeService runtimeService; - private final ObjectMapper objectMapper; + @Resource + private HistoryService historyService; + + @Resource + private ObjectMapper objectMapper; @Resource private WorkflowInstanceConverter workflowInstanceConverter; @Override - @Transactional public WorkflowInstanceDTO createWorkflowInstance(Long workflowDefinitionId, String businessKey, ProcessInstance processInstance) { WorkflowInstance workflowInstance = new WorkflowInstance(); workflowInstance.setProcessInstanceId(processInstance.getId()); @@ -139,6 +149,22 @@ public class WorkflowInstanceServiceImpl implements IWorkflowInstanceService { workflowInstanceRepository.save(instance); } + @Override + @Transactional + public WorkflowInstanceDTO startWorkflow(String processKey, String businessKey) { + try { + WorkflowDefinition workflowDefinition = workflowDefinitionRepository.findByKey(processKey).orElseThrow(() -> new RuntimeException("Workflow definition process key not found: " + processKey)); + ProcessInstance processInstance = runtimeService.createProcessInstanceBuilder() + .processDefinitionKey(processKey) + .businessKey(businessKey) + .startAsync(); // 异步启动,会自动执行 shell 任务 + return createWorkflowInstance(workflowDefinition.getId(), businessKey, processInstance); + } catch (Exception e) { + log.error("Failed to create workflow: {}", processKey, e); + throw new RuntimeException("Failed to create workflow", e); + } + } + // private WorkflowInstanceDTO.ActivityInstance convertToActivityInstance(HistoricActivityInstance hai) { // WorkflowInstanceDTO.ActivityInstance ai = new WorkflowInstanceDTO.ActivityInstance(); // ai.setId(hai.getId()); diff --git a/backend/src/main/resources/db/migration/V1.0.0__init_schema.sql b/backend/src/main/resources/db/migration/V1.0.0__init_schema.sql index 768c2645..7fa6fa8a 100644 --- a/backend/src/main/resources/db/migration/V1.0.0__init_schema.sql +++ b/backend/src/main/resources/db/migration/V1.0.0__init_schema.sql @@ -3,65 +3,26 @@ -- -------------------------------------------------------------------------------------- -- 租户表 -CREATE TABLE IF NOT EXISTS sys_tenant -( - id - BIGINT - AUTO_INCREMENT - PRIMARY - KEY - COMMENT - '主键ID', - create_by - VARCHAR -( - 255 -) NULL COMMENT '创建人', - create_time DATETIME -( - 6 -) NULL COMMENT '创建时间', - deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', - update_by VARCHAR -( - 255 -) NULL COMMENT '更新人', - update_time DATETIME -( - 6 -) NULL COMMENT '更新时间', - version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', +CREATE TABLE sys_tenant ( + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + create_by VARCHAR(255) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', + update_by VARCHAR(255) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', + + code VARCHAR(50) NOT NULL COMMENT '租户编码', + name VARCHAR(100) NOT NULL COMMENT '租户名称', + address VARCHAR(255) NULL COMMENT '租户地址', + contact_name VARCHAR(50) NULL COMMENT '联系人姓名', + contact_phone VARCHAR(20) NULL COMMENT '联系人电话', + email VARCHAR(100) NULL COMMENT '联系人邮箱', + enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用(0:禁用,1:启用)', + + CONSTRAINT UK_tenant_code UNIQUE (code) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='租户表'; - code VARCHAR -( - 50 -) NOT NULL COMMENT '租户编码', - NAME VARCHAR -( - 100 -) NOT NULL COMMENT '租户名称', - address VARCHAR -( - 255 -) NULL COMMENT '租户地址', - contact_name VARCHAR -( - 50 -) NULL COMMENT '联系人姓名', - contact_phone VARCHAR -( - 20 -) NULL COMMENT '联系人电话', - email VARCHAR -( - 100 -) NULL COMMENT '联系人邮箱', - enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用(0:禁用,1:启用)', - CONSTRAINT UK_tenant_code UNIQUE -( - code -) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE =utf8mb4_unicode_ci COMMENT='租户表'; -- 部门表 CREATE TABLE sys_department @@ -87,69 +48,26 @@ CREATE TABLE sys_department ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='部门表'; -- 用户表 -CREATE TABLE IF NOT EXISTS sys_user -( - id - BIGINT - AUTO_INCREMENT - PRIMARY - KEY - COMMENT - '主键ID', - create_by - VARCHAR -( - 255 -) NULL COMMENT '创建人', - create_time DATETIME -( - 6 -) NULL COMMENT '创建时间', - deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', - update_by VARCHAR -( - 255 -) NULL COMMENT '更新人', - update_time DATETIME -( - 6 -) NULL COMMENT '更新时间', - version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', +CREATE TABLE sys_user ( + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + create_by VARCHAR(255) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', + update_by VARCHAR(255) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', - username VARCHAR -( - 50 -) NOT NULL COMMENT '用户名', - password VARCHAR -( - 255 -) NOT NULL COMMENT '密码', - nickname VARCHAR -( - 50 -) NULL COMMENT '昵称', - email VARCHAR -( - 100 -) NULL COMMENT '邮箱', - phone VARCHAR -( - 20 -) NULL COMMENT '手机号', - department_id BIGINT NULL COMMENT '所属部门ID', - enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用(0:禁用,1:启用)', - CONSTRAINT UK_user_username UNIQUE -( - username -), - CONSTRAINT FK_user_department FOREIGN KEY -( - department_id -) REFERENCES sys_department -( - id -) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE =utf8mb4_unicode_ci COMMENT='用户表'; + username VARCHAR(50) NOT NULL COMMENT '用户名', + password VARCHAR(255) NOT NULL COMMENT '密码', + nickname VARCHAR(50) NULL COMMENT '昵称', + email VARCHAR(100) NULL COMMENT '邮箱', + phone VARCHAR(20) NULL COMMENT '手机号', + department_id BIGINT NULL COMMENT '所属部门ID', + enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用(0:禁用,1:启用)', + + CONSTRAINT UK_user_username UNIQUE (username), + CONSTRAINT FK_user_department FOREIGN KEY (department_id) REFERENCES sys_department(id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表'; -- 系统参数表 CREATE TABLE sys_param @@ -518,6 +436,27 @@ CREATE TABLE workflow_definition DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT ='工作流定义表'; +-- 创建工作流节点定义表 +CREATE TABLE workflow_node_definition +( + id BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID', + type VARCHAR(50) NOT NULL COMMENT '节点类型编码', + name VARCHAR(100) NOT NULL COMMENT '节点名称', + description VARCHAR(500) COMMENT '节点描述', + category VARCHAR(50) NOT NULL COMMENT '节点分类', + graph_config JSON NOT NULL COMMENT 'X6图形配置JSON', + order_num INT NOT NULL DEFAULT 0 COMMENT '排序号', + enabled BOOLEAN NOT NULL DEFAULT TRUE COMMENT '是否启用', + create_time DATETIME NOT NULL COMMENT '创建时间', + create_by VARCHAR(50) NOT NULL COMMENT '创建人', + update_time DATETIME NOT NULL COMMENT '更新时间', + update_by VARCHAR(50) NOT NULL COMMENT '更新人', + version INT NOT NULL DEFAULT 1 COMMENT '版本号', + deleted BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否删除', + PRIMARY KEY (id), + UNIQUE KEY uk_type (TYPE) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='工作流节点定义表'; + -- 工作流实例表 CREATE TABLE workflow_instance ( @@ -586,23 +525,3 @@ CREATE TABLE workflow_log CONSTRAINT FK_workflow_log_node_instance FOREIGN KEY (node_instance_id) REFERENCES workflow_node_instance (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='工作流日志表'; --- 创建工作流节点定义表 -CREATE TABLE workflow_node_definition -( - id BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID', - type VARCHAR(50) NOT NULL COMMENT '节点类型编码', - name VARCHAR(100) NOT NULL COMMENT '节点名称', - description VARCHAR(500) COMMENT '节点描述', - category VARCHAR(50) NOT NULL COMMENT '节点分类', - graph_config TEXT NOT NULL COMMENT 'X6图形配置JSON', - order_num INT NOT NULL DEFAULT 0 COMMENT '排序号', - enabled BOOLEAN NOT NULL DEFAULT TRUE COMMENT '是否启用', - create_time DATETIME NOT NULL COMMENT '创建时间', - create_by VARCHAR(50) NOT NULL COMMENT '创建人', - update_time DATETIME NOT NULL COMMENT '更新时间', - update_by VARCHAR(50) NOT NULL COMMENT '更新人', - version INT NOT NULL DEFAULT 1 COMMENT '版本号', - deleted BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否删除', - PRIMARY KEY (id), - UNIQUE KEY uk_type (TYPE) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='工作流节点定义表'; \ No newline at end of file diff --git a/backend/src/main/resources/db/migration/V1.0.1__init_data.sql b/backend/src/main/resources/db/migration/V1.0.1__init_data.sql index 39a0a554..62f1a4ee 100644 --- a/backend/src/main/resources/db/migration/V1.0.1__init_data.sql +++ b/backend/src/main/resources/db/migration/V1.0.1__init_data.sql @@ -670,489 +670,151 @@ VALUES } }', 1); --- 任务节点 --- INSERT INTO workflow_node_definition (id, create_time, create_by, update_time, update_by, type, name, description, category, graph_config, enabled) --- VALUES --- (3, NOW(), --- 'system', --- NOW(), --- 'system', 'USER_TASK', '用户任务', '人工处理任务', 'TASK', '{ --- "code": "USER_TASK", --- "name": "用户任务", --- "description": "人工处理任务", --- "details": { --- "description": "需要人工处理的任务节点,支持任务分配、表单填写、处理期限等功能", --- "features": ["分配任务给指定用户或角色", "支持任务表单的填写", "设置处理期限和提醒", "支持任务的转办、委托、退回"], --- "scenarios": ["审批流程", "表单填写", "人工审核", "数据确认"] --- }, --- "configSchema": { --- "type": "object", --- "properties": { --- "code": {"type": "string", "title": "节点Code", "description": "工作流节点的Code"}, --- "name": {"type": "string", "title": "节点名称", "description": "工作流节点的显示名称"}, --- "description": {"type": "string", "title": "节点描述", "description": "工作流节点的详细描述"} --- }, --- "required": ["code", "name"] --- }, --- "uiSchema": { --- "shape": "rect", --- "size": {"width": 120, "height": 60}, --- "style": { --- "fill": "#ffffff", --- "stroke": "#1890ff", --- "strokeWidth": 2, --- "icon": "user", --- "iconColor": "#1890ff" --- }, --- "ports": { --- "groups": { --- "in": { --- "position": "left", --- "attrs": { --- "circle": { --- "r": 4, --- "fill": "#ffffff", --- "stroke": "#1890ff" --- } --- } --- }, --- "out": { --- "position": "right", --- "attrs": { --- "circle": { --- "r": 4, --- "fill": "#ffffff", --- "stroke": "#1890ff" --- } --- } --- } --- } --- } --- } --- }', 1); --- INSERT INTO workflow_node_definition (id, create_time, create_by, update_time, update_by, type, name, description, category, graph_config, enabled) --- VALUES --- (4, NOW(), --- 'system', --- NOW(), --- 'system', 'SERVICE_TASK', '服务任务', '系统服务调用', 'TASK', '{ --- "code": "SERVICE_TASK", --- "name": "服务任务", --- "description": "系统服务调用", --- "details": { --- "description": "自动执行的系统服务任务,支持同步/异步调用外部服务和系统API", --- "features": ["调用系统服务或外部接口", "执行自动化操作", "支持异步执行和结果回调", "数据转换和处理"], --- "scenarios": ["调用外部系统API", "发送通知消息", "数据同步处理", "自动化操作"] --- }, --- "configSchema": { --- "type": "object", --- "properties": { --- "code": {"type": "string", "title": "节点Code", "description": "工作流节点的Code"}, --- "name": {"type": "string", "title": "节点名称", "description": "工作流节点的显示名称"}, --- "description": {"type": "string", "title": "节点描述", "description": "工作流节点的详细描述"} --- }, --- "required": ["code", "name"] --- }, --- "uiSchema": { --- "shape": "rect", --- "size": {"width": 120, "height": 60}, --- "style": { --- "fill": "#ffffff", --- "stroke": "#1890ff", --- "strokeWidth": 2, --- "icon": "api", --- "iconColor": "#1890ff" --- }, --- "ports": { --- "groups": { --- "in": { --- "position": "left", --- "attrs": { --- "circle": { --- "r": 4, --- "fill": "#ffffff", --- "stroke": "#1890ff" --- } --- } --- }, --- "out": { --- "position": "right", --- "attrs": { --- "circle": { --- "r": 4, --- "fill": "#ffffff", --- "stroke": "#1890ff" --- } --- } --- } --- } --- } --- } --- }', 1); INSERT INTO workflow_node_definition (id, create_time, create_by, update_time, update_by, type, name, description, category, graph_config, enabled) VALUES (5, NOW(), 'system', NOW(), 'system', 'SCRIPT_TASK', '脚本任务', '脚本执行任务', 'TASK', '{ - "code" : "SCRIPT_TASK", - "name" : "脚本任务", - "details" : { - "description" : "脚本执行任务", - "features" : [ ], - "scenarios" : [ ] - }, - "configSchema" : { - "type" : "object", - "properties" : { - "code" : { - "type" : "string", - "title" : "节点Code", - "description" : "工作流节点的Code" - }, - "name" : { - "type" : "string", - "title" : "节点名称", - "description" : "工作流节点的显示名称" - }, - "description" : { - "type" : "string", - "title" : "节点描述", - "description" : "工作流节点的详细描述" - }, - "script" : { - "type" : "string", - "title" : "脚本内容", - "description" : "需要执行的脚本内容,例如:\n#!/bin/bash\necho \"开始执行脚本\"\nls -la\necho \"脚本执行完成\"", - "format" : "textarea" - }, - "language" : { - "type" : "string", - "title" : "脚本语言", - "description" : "脚本语言类型", - "default" : "shell", - "enum" : [ "shell", "python", "javascript", "groovy" ], - "enumNames" : [ "Shell脚本 (已支持)", "Python脚本 (开发中)", "JavaScript脚本 (开发中)", "Groovy脚本 (开发中)" ] - }, - "interpreter" : { - "type" : "string", - "title" : "解释器路径", - "description" : "脚本解释器的路径,例如:/bin/bash, /usr/bin/python3" - }, - "workingDirectory" : { - "type" : "string", - "title" : "工作目录", - "description" : "脚本执行的工作目录", - "default" : "/tmp" - }, - "environment" : { - "type" : "object", - "title" : "环境变量", - "description" : "脚本执行时的环境变量", - "additionalProperties" : { - "type" : "string" - } - }, - "successExitCode" : { - "type" : "integer", - "title" : "成功退出码", - "description" : "脚本执行成功时的退出码", - "default" : 0 - }, - "supportedLanguages" : { - "type" : "array", - "title" : "支持的脚本语言", - "enum" : [ "shell", "python", "javascript", "groovy" ], - "items" : { - "type" : "string" - } - }, - "delegate" : { - "type" : "string", - "title" : "执行委派者", - "description" : "执行委派者", - "default" : "$${shellTaskDelegate}" - } + "code": "SCRIPT_TASK", + "name": "脚本任务", + "details": { + "description": "脚本执行任务", + "features": [], + "scenarios": [] }, - "required" : [ "code", "name", "script", "language", "interpreter", "delegate" ] - }, - "uiSchema" : { - "shape" : "rect", - "size" : { - "width" : 120, - "height" : 60 - }, - "style" : { - "fill" : "#ffffff", - "stroke" : "#1890ff", - "strokeWidth" : 2, - "icon" : "code", - "iconColor" : "#1890ff" - }, - "ports" : { - "groups" : { - "in" : { - "position" : "left", - "attrs" : { - "circle" : { - "r" : 4, - "fill" : "#ffffff", - "stroke" : "#1890ff" + "configSchema": { + "type": "object", + "properties": { + "code": { + "type": "string", + "title": "节点Code", + "description": "工作流节点的Code" + }, + "name": { + "type": "string", + "title": "节点名称", + "description": "工作流节点的显示名称" + }, + "description": { + "type": "string", + "title": "节点描述", + "description": "工作流节点的详细描述" + }, + "script": { + "type": "string", + "title": "脚本内容", + "description": "需要执行的脚本内容,例如:\\n#!/bin/bash\\necho \\\"开始执行脚本\\\"\\nls -la\\necho \\\"脚本执行完成\\\"", + "format": "textarea" + }, + "language": { + "type": "string", + "title": "脚本语言", + "description": "脚本语言类型", + "default": "shell", + "enum": [ + "shell", + "python", + "javascript", + "groovy" + ], + "enumNames": [ + "Shell脚本 (已支持)", + "Python脚本 (开发中)", + "JavaScript脚本 (开发中)", + "Groovy脚本 (开发中)" + ] + }, + "interpreter": { + "type": "string", + "title": "解释器路径", + "description": "脚本解释器的路径,例如:/bin/bash, /usr/bin/python3" + }, + "workingDirectory": { + "type": "string", + "title": "工作目录", + "description": "脚本执行的工作目录", + "default": "/tmp" + }, + "environment": { + "type": "object", + "title": "环境变量", + "description": "脚本执行时的环境变量", + "additionalProperties": { + "type": "string" + } + }, + "successExitCode": { + "type": "integer", + "title": "成功退出码", + "description": "脚本执行成功时的退出码", + "default": 0 + }, + "supportedLanguages": { + "type": "array", + "title": "支持的脚本语言", + "enum": [ + "shell", + "python", + "javascript", + "groovy" + ], + "items": { + "type": "string" + } + }, + "delegate": { + "type": "string", + "title": "执行委派者", + "description": "执行委派者", + "default": "${shellTaskDelegate}" } - } }, - "out" : { - "position" : "right", - "attrs" : { - "circle" : { - "r" : 4, - "fill" : "#ffffff", - "stroke" : "#1890ff" + "required": [ + "code", + "name", + "script", + "language", + "interpreter", + "delegate" + ] + }, + "uiSchema": { + "shape": "rect", + "size": { + "width": 120, + "height": 60 + }, + "style": { + "fill": "#ffffff", + "stroke": "#1890ff", + "strokeWidth": 2, + "icon": "code", + "iconColor": "#1890ff" + }, + "ports": { + "groups": { + "in": { + "position": "left", + "attrs": { + "circle": { + "r": 4, + "fill": "#ffffff", + "stroke": "#1890ff" + } + } + }, + "out": { + "position": "right", + "attrs": { + "circle": { + "r": 4, + "fill": "#ffffff", + "stroke": "#1890ff" + } + } + } } - } } - } } - } -}', 1); --- --- -- 网关节点 --- INSERT INTO workflow_node_definition (id, create_time, create_by, update_time, update_by, type, name, description, category, graph_config, enabled) --- VALUES --- (6, NOW(), --- 'system', --- NOW(), --- 'system', 'EXCLUSIVE_GATEWAY', '排他网关', '条件分支控制', 'GATEWAY', '{ --- "code": "EXCLUSIVE_GATEWAY", --- "name": "排他网关", --- "description": "条件分支控制", --- "details": { --- "description": "基于条件的分支控制,只会选择一个分支执行", --- "features": ["根据条件选择一个分支执行", "支持复杂的条件表达式", "可以设置默认分支"], --- "scenarios": ["条件判断", "分支选择", "业务规则路由"] --- }, --- "configSchema": { --- "type": "object", --- "properties": { --- "code": {"type": "string", "title": "节点Code", "description": "工作流节点的Code"}, --- "name": {"type": "string", "title": "节点名称", "description": "工作流节点的显示名称"}, --- "description": {"type": "string", "title": "节点描述", "description": "工作流节点的详细描述"} --- }, --- "required": ["code", "name"] --- }, --- "uiSchema": { --- "shape": "diamond", --- "size": {"width": 50, "height": 50}, --- "style": { --- "fill": "#fff7e6", --- "stroke": "#faad14", --- "strokeWidth": 2, --- "icon": "fork", --- "iconColor": "#faad14" --- }, --- "ports": { --- "groups": { --- "in": { --- "position": "left", --- "attrs": { --- "circle": { --- "r": 4, --- "fill": "#ffffff", --- "stroke": "#1890ff" --- } --- } --- }, --- "out": { --- "position": "right", --- "attrs": { --- "circle": { --- "r": 4, --- "fill": "#ffffff", --- "stroke": "#1890ff" --- } --- } --- } --- } --- } --- } --- }', 1); --- INSERT INTO workflow_node_definition (id, create_time, create_by, update_time, update_by, type, name, description, category, graph_config, enabled) --- VALUES --- (7, NOW(), --- 'system', --- NOW(), --- 'system', 'PARALLEL_GATEWAY', '并行网关', '并行分支控制', 'GATEWAY', '{ --- "code": "PARALLEL_GATEWAY", --- "name": "并行网关", --- "description": "并行分支控制", --- "details": { --- "description": "将流程分成多个并行分支同时执行,等待所有分支完成后合并", --- "features": ["将流程分成多个并行分支", "等待所有分支完成后合并", "支持复杂的并行处理"], --- "scenarios": ["并行审批", "多任务同时处理", "并行数据处理"] --- }, --- "configSchema": { --- "type": "object", --- "properties": { --- "code": {"type": "string", "title": "节点Code", "description": "工作流节点的Code"}, --- "name": {"type": "string", "title": "节点名称", "description": "工作流节点的显示名称"}, --- "description": {"type": "string", "title": "节点描述", "description": "工作流节点的详细描述"} --- }, --- "required": ["code", "name"] --- }, --- "uiSchema": { --- "shape": "diamond", --- "size": {"width": 50, "height": 50}, --- "style": { --- "fill": "#fff7e6", --- "stroke": "#faad14", --- "strokeWidth": 2, --- "icon": "branches", --- "iconColor": "#faad14" --- }, --- "ports": { --- "groups": { --- "in": { --- "position": "left", --- "attrs": { --- "circle": { --- "r": 4, --- "fill": "#ffffff", --- "stroke": "#1890ff" --- } --- } --- }, --- "out": { --- "position": "right", --- "attrs": { --- "circle": { --- "r": 4, --- "fill": "#ffffff", --- "stroke": "#1890ff" --- } --- } --- } --- } --- } --- } --- }', 1); --- --- -- 容器节点 --- INSERT INTO workflow_node_definition (id, create_time, create_by, update_time, update_by, type, name, description, category, graph_config, enabled) --- VALUES --- (8, NOW(), --- 'system', --- NOW(), --- 'system', 'SUB_PROCESS', '子流程', '嵌入式子流程', 'CONTAINER', '{ --- "code": "SUB_PROCESS", --- "name": "子流程", --- "description": "嵌入式子流程", --- "details": { --- "description": "在当前流程中嵌入子流程,支持流程的模块化和复用", --- "features": ["在当前流程中嵌入子流程", "重用流程片段", "支持事务处理", "独立的变量范围"], --- "scenarios": ["流程复用", "模块化处理", "事务管理", "错误处理"] --- }, --- "configSchema": { --- "type": "object", --- "properties": { --- "code": {"type": "string", "title": "节点Code", "description": "工作流节点的Code"}, --- "name": {"type": "string", "title": "节点名称", "description": "工作流节点的显示名称"}, --- "description": {"type": "string", "title": "节点描述", "description": "工作流节点的详细描述"} --- }, --- "required": ["code", "name"] --- }, --- "uiSchema": { --- "shape": "rect", --- "size": {"width": 120, "height": 60}, --- "style": { --- "fill": "#ffffff", --- "stroke": "#1890ff", --- "strokeWidth": 2, --- "icon": "apartment", --- "iconColor": "#1890ff" --- }, --- "ports": { --- "groups": { --- "in": { --- "position": "left", --- "attrs": { --- "circle": { --- "r": 4, --- "fill": "#ffffff", --- "stroke": "#1890ff" --- } --- } --- }, --- "out": { --- "position": "right", --- "attrs": { --- "circle": { --- "r": 4, --- "fill": "#ffffff", --- "stroke": "#1890ff" --- } --- } --- } --- } --- } --- } --- }', 1); --- -- 容器节点 --- INSERT INTO workflow_node_definition (id, create_time, create_by, update_time, update_by, type, name, description, category, graph_config, enabled) --- VALUES --- (9, NOW(), --- 'system', --- NOW(), --- 'system', 'CALL_ACTIVITY', '调用活动', '外部流程调用', 'CONTAINER', '{ --- "code": "CALL_ACTIVITY", --- "name": "调用活动", --- "description": "外部流程调用", --- "details": { --- "description": "调用外部定义的流程,支持跨系统流程调用和参数传递", --- "features": ["调用外部定义的流程", "支持跨系统流程调用", "传递和接收参数", "支持异步调用"], --- "scenarios": ["跨系统流程集成", "公共流程复用", "分布式流程处理", "大型流程解耦"] --- }, --- "configSchema": { --- "type": "object", --- "properties": { --- "code": {"type": "string", "title": "节点Code", "description": "工作流节点的Code"}, --- "name": {"type": "string", "title": "节点名称", "description": "工作流节点的显示名称"}, --- "description": {"type": "string", "title": "节点描述", "description": "工作流节点的详细描述"} --- }, --- "required": ["code", "name"] --- }, --- "uiSchema": { --- "shape": "rect", --- "size": {"width": 120, "height": 60}, --- "style": { --- "fill": "#ffffff", --- "stroke": "#1890ff", --- "strokeWidth": 2, --- "icon": "api", --- "iconColor": "#1890ff" --- }, --- "ports": { --- "groups": { --- "in": { --- "position": "left", --- "attrs": { --- "circle": { --- "r": 4, --- "fill": "#ffffff", --- "stroke": "#1890ff" --- } --- } --- }, --- "out": { --- "position": "right", --- "attrs": { --- "circle": { --- "r": 4, --- "fill": "#ffffff", --- "stroke": "#1890ff" --- } --- } --- } --- } --- } --- } --- }', 1); +}', 1); \ No newline at end of file