This commit is contained in:
asp_ly 2024-12-15 18:10:01 +08:00
parent ccac93e4a8
commit 42fde0d2d2
11 changed files with 314 additions and 672 deletions

View File

@ -67,22 +67,6 @@ public class WorkflowDefinitionApiController extends BaseController<WorkflowDefi
// return Response.success(workflowDefinitionService.deployWorkflow(dto));
// }
@Operation(summary = "启动工作流实例")
@PostMapping("/start")
public Response<WorkflowInstanceDTO> startWorkflow(
@Parameter(description = "流程标识", required = true) @RequestParam String processKey,
@Parameter(description = "业务标识", required = true) @RequestParam String businessKey
) {
Map<String, Object> 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<Void> suspendWorkflow(

View File

@ -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<WorkflowInstance, WorkflowInstanceDTO, Long, WorkflowInstanceQuery> {
@Resource
private IWorkflowInstanceService workflowInstanceService;
@Operation(summary = "启动工作流")
@PostMapping("/start")
public Response<WorkflowInstanceDTO> startWorkflow(
@RequestParam String processKey,
@RequestParam String businessKey) {
return Response.success(workflowInstanceService.startWorkflow(processKey, businessKey));
}
@Override
protected void exportData(HttpServletResponse response, List<WorkflowInstanceDTO> data) {
}
}

View File

@ -10,11 +10,6 @@ import lombok.Getter;
@Getter
public enum WorkflowInstanceStatusEnums {
/**
* 未开始节点尚未开始执行
*/
NOT_STARTED("NOT_STARTED", "未开始"),
/**
* 已创建流程实例已创建但还未开始运行
*/

View File

@ -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 {
}

View File

@ -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<WorkflowInstance, Long> {
public interface IWorkflowInstanceRepository extends IBaseRepository<WorkflowInstance, Long> {
/**
* 根据Flowable流程实例ID查询工作流实例

View File

@ -28,16 +28,6 @@ public interface IWorkflowDefinitionService extends IBaseService<WorkflowDefinit
*/
Deployment deployWorkflow(WorkflowDefinition workflowDefinition);
/**
* 启动工作流实例
*
* @param processKey 流程标识
* @param businessKey 业务标识
* @param variables 流程变量
* @return 流程实例
*/
WorkflowInstanceDTO startWorkflow(String processKey, String businessKey, Map<String, Object> variables);
/**
* 挂起工作流实例
*

View File

@ -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<WorkflowInstance, WorkflowInstanceDTO, Long> {
/**
* 创建工作流实例并关联Flowable实例
@ -50,4 +53,6 @@ public interface IWorkflowInstanceService {
* @param variables 完成时的变量
*/
void completeInstance(String processInstanceId, Map<String, Object> variables);
WorkflowInstanceDTO startWorkflow(String processKey, String businessKey);
}

View File

@ -102,24 +102,6 @@ public class WorkflowDefinitionServiceImpl extends BaseServiceImpl<WorkflowDefin
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public WorkflowInstanceDTO startWorkflow(String processKey, String businessKey, Map<String, Object> 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) {

View File

@ -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<WorkflowInstance, WorkflowInstanceDTO, Long> 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());

View File

@ -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 '创建时间',
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 '更新时间',
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 '联系人邮箱',
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='租户表';
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 '创建时间',
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 '更新时间',
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 '手机号',
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='用户表';
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='工作流节点定义表';

View File

@ -670,244 +670,147 @@ 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" : [ ]
"code": "SCRIPT_TASK",
"name": "脚本任务",
"details": {
"description": "脚本执行任务",
"features": [],
"scenarios": []
},
"configSchema" : {
"type" : "object",
"properties" : {
"code" : {
"type" : "string",
"title" : "节点Code",
"description" : "工作流节点的Code"
"configSchema": {
"type": "object",
"properties": {
"code": {
"type": "string",
"title": "节点Code",
"description": "工作流节点的Code"
},
"name" : {
"type" : "string",
"title" : "节点名称",
"description" : "工作流节点的显示名称"
"name": {
"type": "string",
"title": "节点名称",
"description": "工作流节点的显示名称"
},
"description" : {
"type" : "string",
"title" : "节点描述",
"description" : "工作流节点的详细描述"
"description": {
"type": "string",
"title": "节点描述",
"description": "工作流节点的详细描述"
},
"script" : {
"type" : "string",
"title" : "脚本内容",
"description" : "需要执行的脚本内容,例如:\n#!/bin/bash\necho \"\"\nls -la\necho \"\"",
"format" : "textarea"
"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脚本 (开发中)" ]
"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"
"interpreter": {
"type": "string",
"title": "解释器路径",
"description": "脚本解释器的路径,例如:/bin/bash, /usr/bin/python3"
},
"workingDirectory" : {
"type" : "string",
"title" : "工作目录",
"description" : "脚本执行的工作目录",
"default" : "/tmp"
"workingDirectory": {
"type": "string",
"title": "工作目录",
"description": "脚本执行的工作目录",
"default": "/tmp"
},
"environment" : {
"type" : "object",
"title" : "环境变量",
"description" : "脚本执行时的环境变量",
"additionalProperties" : {
"type" : "string"
"environment": {
"type": "object",
"title": "环境变量",
"description": "脚本执行时的环境变量",
"additionalProperties": {
"type": "string"
}
},
"successExitCode" : {
"type" : "integer",
"title" : "成功退出码",
"description" : "脚本执行成功时的退出码",
"default" : 0
"successExitCode": {
"type": "integer",
"title": "成功退出码",
"description": "脚本执行成功时的退出码",
"default": 0
},
"supportedLanguages" : {
"type" : "array",
"title" : "支持的脚本语言",
"enum" : [ "shell", "python", "javascript", "groovy" ],
"items" : {
"type" : "string"
"supportedLanguages": {
"type": "array",
"title": "支持的脚本语言",
"enum": [
"shell",
"python",
"javascript",
"groovy"
],
"items": {
"type": "string"
}
},
"delegate" : {
"type" : "string",
"title" : "执行委派者",
"description" : "执行委派者",
"default" : "$${shellTaskDelegate}"
"delegate": {
"type": "string",
"title": "执行委派者",
"description": "执行委派者",
"default": "${shellTaskDelegate}"
}
},
"required" : [ "code", "name", "script", "language", "interpreter", "delegate" ]
"required": [
"code",
"name",
"script",
"language",
"interpreter",
"delegate"
]
},
"uiSchema" : {
"shape" : "rect",
"size" : {
"width" : 120,
"height" : 60
"uiSchema": {
"shape": "rect",
"size": {
"width": 120,
"height": 60
},
"style" : {
"fill" : "#ffffff",
"stroke" : "#1890ff",
"strokeWidth" : 2,
"icon" : "code",
"iconColor" : "#1890ff"
"style": {
"fill": "#ffffff",
"stroke": "#1890ff",
"strokeWidth": 2,
"icon": "code",
"iconColor": "#1890ff"
},
"ports" : {
"groups" : {
"in" : {
"position" : "left",
"attrs" : {
"circle" : {
"r" : 4,
"fill" : "#ffffff",
"stroke" : "#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"
"out": {
"position": "right",
"attrs": {
"circle": {
"r": 4,
"fill": "#ffffff",
"stroke": "#1890ff"
}
}
}
@ -915,244 +818,3 @@ VALUES
}
}
}', 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);