From 73e588ac607e6c4bdf4e927a92f305c462ad7579 Mon Sep 17 00:00:00 2001 From: lihao05 Date: Fri, 24 Oct 2025 10:13:01 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0sql=E6=96=87=E4=BB=B6?= =?UTF-8?q?=20=E6=B7=BB=E5=8A=A0=E5=B7=A5=E4=BD=9C=E6=B5=81=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/service/WorkflowService.java | 50 ++++- .../controller/WorkflowController.java | 38 ++++ script/sql/update/2025-09-30-流程编排.sql | 203 +++++++++--------- 3 files changed, 192 insertions(+), 99 deletions(-) diff --git a/ruoyi-modules-api/ruoyi-workflow-api/src/main/java/org/ruoyi/workflow/service/WorkflowService.java b/ruoyi-modules-api/ruoyi-workflow-api/src/main/java/org/ruoyi/workflow/service/WorkflowService.java index 4d682d96..439ffba4 100644 --- a/ruoyi-modules-api/ruoyi-workflow-api/src/main/java/org/ruoyi/workflow/service/WorkflowService.java +++ b/ruoyi-modules-api/ruoyi-workflow-api/src/main/java/org/ruoyi/workflow/service/WorkflowService.java @@ -93,6 +93,37 @@ public class WorkflowService extends ServiceImpl { return changeWorkflowToDTO(workflow2); } + /** + * 获取当前用户可访问的工作流详情 + * + * @param uuid 工作流唯一标识 + * @return 工作流详情 + */ + public WorkflowResp getDetail(String uuid) { + Workflow workflow = PrivilegeUtil.checkAndGetByUuid(uuid, this.query(), ErrorEnum.A_WF_NOT_FOUND); + return changeWorkflowToDTO(workflow); + } + + /** + * 获取公开工作流详情 + * + * @param uuid 工作流唯一标识 + * @return 工作流详情 + */ + public WorkflowResp getPublicDetail(String uuid) { + Workflow workflow = ChainWrappers.lambdaQueryChain(baseMapper) + .eq(Workflow::getUuid, uuid) + .eq(Workflow::getIsDeleted, false) + .eq(Workflow::getIsPublic, true) + .eq(Workflow::getIsEnable, true) + .last("limit 1") + .one(); + if (null == workflow) { + throw new BaseException(ErrorEnum.A_WF_NOT_FOUND.getInfo()); + } + return changeWorkflowToDTO(workflow); + } + public Workflow getByUuid(String uuid) { return ChainWrappers.lambdaQueryChain(baseMapper) .eq(Workflow::getUuid, uuid) @@ -149,7 +180,24 @@ public class WorkflowService extends ServiceImpl { userIds.add(source.getUserId()); return target; }); - // fillUserInfos(userIds, result.getRecords()); + return result; + } + + + public Page search(String keyword, Integer currentPage, Integer pageSize) { + Page page = ChainWrappers.lambdaQueryChain(baseMapper) + .eq(Workflow::getIsDeleted, false) + .eq(Workflow::getIsEnable, true) + .like(StringUtils.isNotBlank(keyword), Workflow::getTitle, keyword) + .orderByDesc(Workflow::getUpdateTime) + .page(new Page<>(currentPage, pageSize)); + Page result = new Page<>(); + List userIds = new ArrayList<>(); + MPPageUtil.convertToPage(page, result, WorkflowResp.class, (source, target) -> { + fillNodesAndEdges(target); + userIds.add(source.getUserId()); + return target; + }); return result; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/ruoyi/workflow/controller/WorkflowController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/ruoyi/workflow/controller/WorkflowController.java index 02fd3c96..40060763 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/ruoyi/workflow/controller/WorkflowController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/ruoyi/workflow/controller/WorkflowController.java @@ -83,6 +83,17 @@ public class WorkflowController { return R.ok(workflowService.search(keyword, isPublic, null, currentPage, pageSize)); } + /** + * 获取当前用户可访问的工作流详情 + * + * @param uuid 工作流唯一标识 + * @return 工作流详情 + */ + @GetMapping("/{uuid}") + public R getDetail(@PathVariable String uuid) { + return R.ok(workflowService.getDetail(uuid)); + } + /** * 搜索公开工作流 * @@ -98,6 +109,33 @@ public class WorkflowController { return R.ok(workflowService.searchPublic(keyword, currentPage, pageSize)); } + + /** + * 搜索公开工作流 + * + * @param keyword 搜索关键词 + * @param currentPage 当前页数 + * @param pageSize 每页数量 + * @return 工作流列表 + */ + @GetMapping("/search") + public R> search(@RequestParam(defaultValue = "") String keyword, + @NotNull @Min(1) Integer currentPage, + @NotNull @Min(10) Integer pageSize) { + return R.ok(workflowService.search(keyword, currentPage, pageSize)); + } + + /** + * 获取公开工作流详情 + * + * @param uuid 工作流唯一标识 + * @return 工作流详情 + */ + @GetMapping("/public/{uuid}") + public R getPublicDetail(@PathVariable String uuid) { + return R.ok(workflowService.getPublicDetail(uuid)); + } + @GetMapping("/public/operators") public R>> searchPublic() { List> result = new ArrayList<>(); diff --git a/script/sql/update/2025-09-30-流程编排.sql b/script/sql/update/2025-09-30-流程编排.sql index 747d73e3..538770af 100644 --- a/script/sql/update/2025-09-30-流程编排.sql +++ b/script/sql/update/2025-09-30-流程编排.sql @@ -1,115 +1,114 @@ -CREATE TABLE t_workflow +CREATE TABLE `t_workflow` ( - id BIGINT AUTO_INCREMENT PRIMARY KEY, - uuid VARCHAR(32) NOT NULL DEFAULT '', - title VARCHAR(100) NOT NULL DEFAULT '', - remark TEXT NOT NULL DEFAULT '', - user_id BIGINT NOT NULL DEFAULT 0, - is_public TINYINT(1) NOT NULL DEFAULT 0, - is_enable TINYINT(1) NOT NULL DEFAULT 1, - create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - is_deleted TINYINT(1) NOT NULL DEFAULT 0 -) ENGINE = InnoDB - DEFAULT CHARSET = utf8mb4 - COMMENT ='工作流定义(用户定义的工作流)| Workflow Definition'; + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', + `uuid` varchar(32) NOT NULL DEFAULT 'uuid', + `title` varchar(100) NOT NULL DEFAULT '标题', + `user_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '用户ID', + `is_public` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否公开', + `is_enable` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否启用', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `remark` text COMMENT '备注', + `is_deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT '逻辑删除 默认0不删除', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=119 DEFAULT CHARSET=utf8mb4 COMMENT='工作流定义(用户定义的工作流)| Workflow Definition'; -CREATE TABLE t_workflow_node + +CREATE TABLE `t_workflow_node` ( - id BIGINT AUTO_INCREMENT PRIMARY KEY, - uuid VARCHAR(32) NOT NULL DEFAULT '', - workflow_id BIGINT NOT NULL DEFAULT 0, - workflow_component_id BIGINT NOT NULL DEFAULT 0, - user_id BIGINT NOT NULL DEFAULT 0, - title VARCHAR(100) NOT NULL DEFAULT '', - remark VARCHAR(500) NOT NULL DEFAULT '', - input_config JSON NOT NULL DEFAULT ('{}'), - node_config JSON NOT NULL DEFAULT ('{}'), - position_x DOUBLE NOT NULL DEFAULT 0, - position_y DOUBLE NOT NULL DEFAULT 0, - create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - is_deleted TINYINT(1) NOT NULL DEFAULT 0, - INDEX idx_workflow_node_workflow_id (workflow_id) -) ENGINE = InnoDB - DEFAULT CHARSET = utf8mb4 - COMMENT ='工作流定义的节点 | Node of Workflow Definition'; + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', + `uuid` varchar(32) NOT NULL DEFAULT '' COMMENT '节点唯一标识', + `workflow_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '所属工作流定义 id', + `workflow_component_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '引用的组件 id', + `user_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '创建人', + `title` varchar(100) NOT NULL DEFAULT '' COMMENT '节点标题', + `remark` varchar(500) NOT NULL DEFAULT '' COMMENT '节点备注', + `input_config` json NOT NULL COMMENT '输入参数模板,例:{"params":[{"name":"user_define_param01","type":"string"}]}', + `node_config` json DEFAULT NULL COMMENT '节点执行配置,例:{"params":[{"prompt":"Summarize the following content:{user_define_param01}"}]}', + `position_x` double NOT NULL DEFAULT '0' COMMENT '画布 x 坐标', + `position_y` double NOT NULL DEFAULT '0' COMMENT '画布 y 坐标', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `is_deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT '逻辑删除:0 正常,1 已删', + PRIMARY KEY (`id`), + KEY `idx_workflow_node_workflow_id` (`workflow_id`) +) ENGINE=InnoDB AUTO_INCREMENT=269 DEFAULT CHARSET=utf8mb4 COMMENT='工作流定义的节点 | Node of Workflow Definition'; -CREATE TABLE t_workflow_edge + +CREATE TABLE `t_workflow_runtime_node` ( - id BIGINT AUTO_INCREMENT PRIMARY KEY, - uuid VARCHAR(32) NOT NULL DEFAULT '', - workflow_id BIGINT NOT NULL DEFAULT 0, - source_node_uuid VARCHAR(32) NOT NULL DEFAULT '', - source_handle VARCHAR(32) NOT NULL DEFAULT '', - target_node_uuid VARCHAR(32) NOT NULL DEFAULT '', - create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - is_deleted TINYINT(1) NOT NULL DEFAULT 0, - INDEX idx_workflow_edge_workflow_id (workflow_id) -) ENGINE = InnoDB - DEFAULT CHARSET = utf8mb4; + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', + `uuid` varchar(32) NOT NULL DEFAULT '' COMMENT '节点运行实例唯一标识', + `user_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '创建人', + `workflow_runtime_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '所属运行实例 id', + `node_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '对应工作流定义里的节点 id', + `input` json DEFAULT NULL COMMENT '节点本次输入数据', + `output` json DEFAULT NULL COMMENT '节点本次输出数据', + `status` smallint(6) NOT NULL DEFAULT '1' COMMENT '节点执行状态:1 进行中,2 失败,3 成功', + `status_remark` varchar(250) NOT NULL DEFAULT '' COMMENT '状态补充说明,如失败堆栈', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `is_deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT '逻辑删除:0 正常,1 已删', + PRIMARY KEY (`id`), + KEY `idx_runtime_node_runtime_id` (`workflow_runtime_id`), + KEY `idx_runtime_node_node_id` (`node_id`) +) ENGINE=InnoDB AUTO_INCREMENT=805 DEFAULT CHARSET=utf8mb4 COMMENT='工作流实例(运行时)- 节点 | Workflow Runtime Node'; -CREATE TABLE t_workflow_runtime + +CREATE TABLE `t_workflow_edge` ( - id BIGINT AUTO_INCREMENT PRIMARY KEY, - uuid VARCHAR(32) NOT NULL DEFAULT '', - user_id BIGINT NOT NULL DEFAULT 0, - workflow_id BIGINT NOT NULL DEFAULT 0, - input JSON NOT NULL DEFAULT ('{}'), - output JSON NOT NULL DEFAULT ('{}'), - status SMALLINT NOT NULL DEFAULT 1 COMMENT '执行状态,1:就绪,2:执行中,3:成功,4:失败', - status_remark VARCHAR(250) NOT NULL DEFAULT '' COMMENT '状态备注', - create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - is_deleted TINYINT(1) NOT NULL DEFAULT 0, - INDEX idx_workflow_runtime_workflow_id (workflow_id), - INDEX idx_workflow_runtime_user_id (user_id) -) ENGINE = InnoDB - DEFAULT CHARSET = utf8mb4 - COMMENT ='工作流实例(运行时)| Workflow Runtime'; + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', + `uuid` varchar(32) NOT NULL DEFAULT '' COMMENT '边唯一标识', + `workflow_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '所属工作流定义 id', + `source_node_uuid` varchar(32) NOT NULL DEFAULT '' COMMENT '起始节点 uuid', + `source_handle` varchar(32) NOT NULL DEFAULT '' COMMENT '起始锚点标识', + `target_node_uuid` varchar(32) NOT NULL DEFAULT '' COMMENT '目标节点 uuid', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `is_deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT '逻辑删除:0 正常,1 已删', + PRIMARY KEY (`id`), + KEY `idx_workflow_edge_workflow_id` (`workflow_id`) +) ENGINE=InnoDB AUTO_INCREMENT=199 DEFAULT CHARSET=utf8mb4 COMMENT='工作流定义的边 | Edge of Workflow Definition'; -CREATE TABLE t_workflow_runtime_node + +CREATE TABLE `t_workflow_component` ( - id BIGINT AUTO_INCREMENT PRIMARY KEY, - uuid VARCHAR(32) NOT NULL DEFAULT '', - user_id BIGINT NOT NULL DEFAULT 0, - workflow_runtime_id BIGINT NOT NULL DEFAULT 0, - node_id BIGINT NOT NULL DEFAULT 0, - input JSON NOT NULL DEFAULT ('{}'), - output JSON NOT NULL DEFAULT ('{}'), - status SMALLINT NOT NULL DEFAULT 1 COMMENT '执行状态,1:进行中,2:失败,3:成功', - status_remark VARCHAR(250) NOT NULL DEFAULT '' COMMENT '状态备注', - create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - is_deleted TINYINT(1) NOT NULL DEFAULT 0, - INDEX idx_runtime_node_runtime_id (workflow_runtime_id), - INDEX idx_runtime_node_node_id (node_id) -) ENGINE = InnoDB - DEFAULT CHARSET = utf8mb4 - COMMENT ='工作流实例(运行时)- 节点 | Workflow Runtime Node'; + `id` bigint(20) NOT NULL AUTO_INCREMENT, + `uuid` varchar(32) NOT NULL DEFAULT '', + `name` varchar(32) NOT NULL DEFAULT '', + `title` varchar(100) NOT NULL DEFAULT '', + `remark` text NOT NULL, + `display_order` int(11) NOT NULL DEFAULT '0', + `is_enable` tinyint(1) NOT NULL DEFAULT '0', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `is_deleted` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `idx_display_order` (`display_order`) +) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4 COMMENT='工作流组件库 | Workflow Component'; -CREATE TABLE t_workflow_component +CREATE TABLE `t_workflow_runtime` ( - id BIGINT AUTO_INCREMENT PRIMARY KEY, - uuid VARCHAR(32) DEFAULT '' NOT NULL, - name VARCHAR(32) DEFAULT '' NOT NULL, - title VARCHAR(100) DEFAULT '' NOT NULL, - remark TEXT NOT NULL, - display_order INT DEFAULT 0 NOT NULL, - is_enable TINYINT(1) DEFAULT 0 NOT NULL, - create_time DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, - update_time DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, - is_deleted TINYINT(1) DEFAULT 0 NOT NULL, - INDEX idx_display_order (display_order) -) ENGINE = InnoDB - DEFAULT CHARSET = utf8mb4 - COMMENT '工作流组件库 | Workflow Component'; + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', + `uuid` varchar(32) NOT NULL DEFAULT '' COMMENT '运行实例唯一标识', + `user_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '启动人', + `workflow_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '对应工作流定义 id', + `input` json DEFAULT NULL COMMENT '运行输入,例:{"userInput01":"text01","userInput02":true,"userInput03":10,"userInput04":["selectedA","selectedB"],"userInput05":["https://a.com/a.xlsx","https://a.com/b.png"]}', + `output` json DEFAULT NULL COMMENT '运行输出,成功或失败的结果', + `status` smallint(6) NOT NULL DEFAULT '1' COMMENT '执行状态:1 就绪,2 执行中,3 成功,4 失败', + `status_remark` varchar(250) NOT NULL DEFAULT '' COMMENT '状态补充说明,如失败原因', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `is_deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT '逻辑删除:0 正常,1 已删', + PRIMARY KEY (`id`), + KEY `idx_workflow_runtime_workflow_id` (`workflow_id`), + KEY `idx_workflow_runtime_user_id` (`user_id`) +) ENGINE=InnoDB AUTO_INCREMENT=297 DEFAULT CHARSET=utf8mb4 COMMENT='工作流实例(运行时)| Workflow Runtime'; -- workflow @@ -157,6 +156,14 @@ values (replace(uuid(), '-', ''), 'HttpRequest', 'Http请求', '通过Http协议发送请求,可将其他组件的输出作为参数,也可设置常量作为参数。', 10, false); -INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query_param, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1976160997656043521, '流程管理', 0, 1, 'flow', '', null, 1, 0, 'M', '0', '0', null, 'ph:user-fill', null, null, '2025-10-09 13:41:12', 1, '2025-10-20 20:59:25', ''); -INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query_param, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (1976161221409579010, '工作流编排', 1976160997656043521, 0, 'workflow', 'workflow/index', null, 1, 0, 'C', '0', '0', null, 'ph:user-fill', null, null, '2025-10-09 13:42:05', 1, '2025-10-20 20:59:16', ''); +INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query_param, is_frame, is_cache, + menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, + update_time, remark) +VALUES (1976160997656043521, '流程管理', 0, 1, 'flow', '', null, 1, 0, 'M', '0', '0', null, 'ph:user-fill', null, null, + '2025-10-09 13:41:12', 1, '2025-10-20 20:59:25', ''); +INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query_param, is_frame, is_cache, + menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, + update_time, remark) +VALUES (1976161221409579010, '工作流编排', 1976160997656043521, 0, 'workflow', 'workflow/index', null, 1, 0, 'C', '0', + '0', null, 'ph:user-fill', null, null, '2025-10-09 13:42:05', 1, '2025-10-20 20:59:16', '');