反序列化问题。

This commit is contained in:
dengqichen 2024-12-13 18:25:44 +08:00
parent 539cd7a9d8
commit ee3978ae34
7 changed files with 358 additions and 447 deletions

View File

@ -12,113 +12,113 @@ import java.util.Map;
@Data
public class BaseTaskNodeConfig extends BaseNodeConfig {
/**
* 任务优先级0-100
*/
@SchemaProperty(
title = "任务优先级",
description = "工作流节点的任务优先级",
minimum = 0,
maximum = 100
)
private Integer priority;
/**
* 超时时间
*/
@SchemaProperty(
title = "超时时间",
description = "任务执行的最大时间(秒)",
minimum = 1,
maximum = 3600,
defaultValue = "300"
)
private Integer timeoutDuration;
/**
* 超时处理策略
*/
@SchemaProperty(
title = "超时处理策略",
description = "任务超时后的处理策略",
enumValues = {"FAIL", "CONTINUE", "RETRY"},
enumNames = {"失败", "继续", "重试"},
defaultValue = "FAIL"
)
private String timeoutStrategy;
/**
* 重试次数
*/
@SchemaProperty(
title = "重试次数",
description = "任务失败后的重试次数",
minimum = 0,
maximum = 10,
defaultValue = "0"
)
private Integer retryTimes;
/**
* 重试间隔
*/
@SchemaProperty(
title = "重试间隔",
description = "两次重试之间的等待时间(秒)",
minimum = 1,
maximum = 3600,
defaultValue = "60"
)
private Integer retryInterval;
/**
* 重试策略
*/
@SchemaProperty(
title = "重试策略",
description = "任务重试的策略",
enumValues = {"FIXED", "EXPONENTIAL"},
enumNames = {"固定间隔", "指数退避"},
defaultValue = "FIXED"
)
private String retryStrategy;
/**
* 是否异步
*/
@SchemaProperty(
title = "是否异步",
description = "节点是否以异步方式执行",
defaultValue = "false"
)
private Boolean async;
/**
* 是否独占
*/
@SchemaProperty(
title = "是否独占",
description = "节点是否以独占方式执行",
defaultValue = "true"
)
private Boolean exclusive;
/**
* 自定义属性
*/
@SchemaProperty(
title = "自定义属性",
description = "节点的自定义属性配置"
)
private Map<String, Object> customProperties;
/**
* 文档说明
*/
@SchemaProperty(
title = "文档说明",
description = "节点的详细文档说明"
)
private String documentation;
// /**
// * 任务优先级0-100
// */
// @SchemaProperty(
// title = "任务优先级",
// description = "工作流节点的任务优先级",
// minimum = 0,
// maximum = 100
// )
// private Integer priority;
//
// /**
// * 超时时间
// */
// @SchemaProperty(
// title = "超时时间",
// description = "任务执行的最大时间(秒)",
// minimum = 1,
// maximum = 3600,
// defaultValue = "300"
// )
// private Integer timeoutDuration;
//
// /**
// * 超时处理策略
// */
// @SchemaProperty(
// title = "超时处理策略",
// description = "任务超时后的处理策略",
// enumValues = {"FAIL", "CONTINUE", "RETRY"},
// enumNames = {"失败", "继续", "重试"},
// defaultValue = "FAIL"
// )
// private String timeoutStrategy;
//
// /**
// * 重试次数
// */
// @SchemaProperty(
// title = "重试次数",
// description = "任务失败后的重试次数",
// minimum = 0,
// maximum = 10,
// defaultValue = "0"
// )
// private Integer retryTimes;
//
// /**
// * 重试间隔
// */
// @SchemaProperty(
// title = "重试间隔",
// description = "两次重试之间的等待时间(秒)",
// minimum = 1,
// maximum = 3600,
// defaultValue = "60"
// )
// private Integer retryInterval;
//
// /**
// * 重试策略
// */
// @SchemaProperty(
// title = "重试策略",
// description = "任务重试的策略",
// enumValues = {"FIXED", "EXPONENTIAL"},
// enumNames = {"固定间隔", "指数退避"},
// defaultValue = "FIXED"
// )
// private String retryStrategy;
//
//
// /**
// * 是否异步
// */
// @SchemaProperty(
// title = "是否异步",
// description = "节点是否以异步方式执行",
// defaultValue = "false"
// )
// private Boolean async;
//
// /**
// * 是否独占
// */
// @SchemaProperty(
// title = "是否独占",
// description = "节点是否以独占方式执行",
// defaultValue = "true"
// )
// private Boolean exclusive;
//
// /**
// * 自定义属性
// */
// @SchemaProperty(
// title = "自定义属性",
// description = "节点的自定义属性配置"
// )
// private Map<String, Object> customProperties;
//
// /**
// * 文档说明
// */
// @SchemaProperty(
// title = "文档说明",
// description = "节点的详细文档说明"
// )
// private String documentation;
}

View File

@ -3,6 +3,7 @@ package com.qqchen.deploy.backend.workflow.dto.nodeConfig;
import com.qqchen.deploy.backend.workflow.annotation.SchemaProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
import java.util.Map;
@ -12,6 +13,16 @@ import java.util.Map;
@Data
@EqualsAndHashCode(callSuper = true)
public class ScriptNodeConfig extends BaseTaskNodeConfig {
@SchemaProperty(
title = "执行委派者",
description = "执行委派者",
required = true,
defaultValue = "${shellTaskDelegate}"
)
private String delegate;
/**
* 脚本内容
*/
@ -22,7 +33,7 @@ public class ScriptNodeConfig extends BaseTaskNodeConfig {
required = true
)
private String script;
/**
* 脚本语言
*/
@ -35,7 +46,7 @@ public class ScriptNodeConfig extends BaseTaskNodeConfig {
defaultValue = "shell"
)
private String language;
/**
* 解释器路径
*/
@ -45,7 +56,7 @@ public class ScriptNodeConfig extends BaseTaskNodeConfig {
required = true
)
private String interpreter;
/**
* 工作目录
*/
@ -55,7 +66,7 @@ public class ScriptNodeConfig extends BaseTaskNodeConfig {
defaultValue = "/tmp"
)
private String workingDirectory;
/**
* 环境变量
*/
@ -64,7 +75,7 @@ public class ScriptNodeConfig extends BaseTaskNodeConfig {
description = "脚本执行时的环境变量"
)
private Map<String, String> environment;
/**
* 成功退出码
*/
@ -74,7 +85,7 @@ public class ScriptNodeConfig extends BaseTaskNodeConfig {
defaultValue = "0"
)
private Integer successExitCode;
/**
* 支持的脚本语言列表
*/
@ -83,5 +94,5 @@ public class ScriptNodeConfig extends BaseTaskNodeConfig {
enumValues = {"shell", "python", "javascript", "groovy"}
)
private List<String> supportedLanguages;
}

View File

@ -5,7 +5,6 @@ import com.qqchen.deploy.backend.workflow.dto.graph.WorkflowNodeGraph;
import lombok.Getter;
import java.util.Arrays;
import java.util.List;
/**
* 工作流节点类型枚举
@ -24,18 +23,8 @@ public enum NodeTypeEnums {
START_EVENT(
"START_EVENT", // 节点类型编码
"开始节点", // 节点显示名称
NodeCategoryEnums.EVENT,
"工作流的起点", // 节点简要描述
"标记流程的开始位置,可以定义流程启动条件和初始化流程变量", // 节点详细描述
Arrays.asList( // 节点功能列表
"标记流程的开始位置",
"定义流程启动条件",
"初始化流程变量"
),
Arrays.asList( // 使用场景列表
"用户手动启动流程",
"定时触发流程",
"外部系统调用启动"
),
new WorkflowNodeGraph() // UI配置
.setShape("circle")
.setSize(40, 40)
@ -53,274 +42,180 @@ public enum NodeTypeEnums {
END_EVENT(
"END_EVENT",
"结束节点",
NodeCategoryEnums.EVENT,
"工作流的终点",
"标记流程的结束位置,可以定义流程结束时的清理操作和设置返回值",
Arrays.asList(
"标记流程的结束位置",
"定义结束时清理操作",
"设置流程结果和返回值"
),
Arrays.asList(
"流程正常结束",
"流程异常终止",
"需要返回处理结果"
),
new WorkflowNodeGraph()
.setShape("circle")
.setSize(40, 40)
.setStyle("#fff1f0", "#ff4d4f", "stop")
.configPorts(Arrays.asList("in"))
),
/**
* 用户任务节点
* 需要人工处理的任务节点
* 特点:
* - 需要用户交互
* - 可以分配给特定用户或角色
* - 支持审批填写表单等操作
*/
USER_TASK(
"USER_TASK",
"用户任务",
"人工处理任务",
"需要人工处理的任务节点,支持任务分配、表单填写、处理期限等功能",
Arrays.asList(
"分配任务给指定用户或角色",
"支持任务表单的填写",
"设置处理期限和提醒",
"支持任务的转办、委托、退回"
),
Arrays.asList(
"审批流程",
"表单填写",
"人工审核",
"数据确认"
),
new WorkflowNodeGraph()
.setShape("rect")
.setSize(120, 60)
.setStyle("#ffffff", "#1890ff", "user")
.configPorts(Arrays.asList("in", "out"))
),
/**
* 服务任务节点
* 自动执行的系统服务任务
* 特点:
* - 自动执行无需人工干预
* - 可以调用外部服务或系统API
* - 支持异步执行
*/
SERVICE_TASK(
"SERVICE_TASK",
"服务任务",
"系统服务调用",
"自动执行的系统服务任务,支持同步/异步调用外部服务和系统API",
Arrays.asList(
"调用系统服务或外部接口",
"执行自动化操作",
"支持异步执行和结果回调",
"数据转换和处理"
),
Arrays.asList(
"调用外部系统API",
"发送通知消息",
"数据同步处理",
"自动化操作"
),
new WorkflowNodeGraph()
.setShape("rectangle")
.setSize(120, 60)
.setStyle("#ffffff", "#1890ff", "api")
.configPorts(Arrays.asList("in", "out"))
),
/**
* 脚本任务节点
* 执行自定义脚本的任务节点
* 特点:
* - 支持多种脚本语言如ShellPython等
* - 可以执行自定义业务逻辑
* - 适合复杂的数据处理和计算
*/
SCRIPT_TASK(
"SCRIPT_TASK",
"脚本任务",
"脚本执行任务",
"执行自定义脚本的任务节点,支持多种脚本语言和复杂的业务逻辑",
Arrays.asList(
"执行自定义脚本代码",
"支持多种脚本语言",
"访问流程变量",
"支持复杂的业务逻辑"
),
Arrays.asList(
"数据处理和转换",
"条件判断",
"自定义业务规则",
"系统集成"
),
"结束节点",
NodeCategoryEnums.TASK,
"工作流的终点",
new WorkflowNodeGraph()
.setShape("rectangle")
.setSize(120, 60)
.setStyle("#ffffff", "#1890ff", "code")
.configPorts(Arrays.asList("in", "out"))
),
/**
* 排他网关
* 基于条件的分支控制
* 特点:
* - 只会选择一个分支执行
* - 需要设置分支条件
* - 适合互斥的业务场景
*/
EXCLUSIVE_GATEWAY(
"EXCLUSIVE_GATEWAY",
"排他网关",
"条件分支控制",
"基于条件的分支控制,只会选择一个分支执行",
Arrays.asList(
"根据条件选择一个分支执行",
"支持复杂的条件表达式",
"可以设置默认分支"
),
Arrays.asList(
"条件判断",
"分支选择",
"业务规则路由"
),
new WorkflowNodeGraph()
.setShape("diamond")
.setSize(50, 50)
.setStyle("#fff7e6", "#faad14", "fork")
.configPorts(Arrays.asList("in", "out"))
),
/**
* 并行网关
* 并行执行多个分支
* 特点:
* - 所有分支同时执行
* - 等待所有分支完成才继续
* - 适合并行处理的业务场景
*/
PARALLEL_GATEWAY(
"PARALLEL_GATEWAY",
"并行网关",
"并行分支控制",
"将流程分成多个并行分支同时执行,等待所有分支完成后合并",
Arrays.asList(
"将流程分成多个并行分支",
"等待所有分支完成后合并",
"支持复杂的并行处理"
),
Arrays.asList(
"并行审批",
"多任务同时处理",
"并行数据处理"
),
new WorkflowNodeGraph()
.setShape("diamond")
.setSize(50, 50)
.setStyle("#fff7e6", "#faad14", "branches")
.configPorts(Arrays.asList("in", "out"))
),
/**
* 子流程节点
* 嵌套的子流程
* 特点:
* - 可以包含完整的子流程
* - 支持流程的模块化和复用
* - 可以独立部署和版本控制
*/
SUBPROCESS(
"SUB_PROCESS",
"子流程",
"嵌入式子流程",
"在当前流程中嵌入子流程,支持流程的模块化和复用",
Arrays.asList(
"在当前流程中嵌入子流程",
"重用流程片段",
"支持事务处理",
"独立的变量范围"
),
Arrays.asList(
"流程复用",
"模块化处理",
"事务管理",
"错误处理"
),
new WorkflowNodeGraph()
.setShape("rectangle")
.setSize(120, 60)
.setStyle("#ffffff", "#1890ff", "apartment")
.configPorts(Arrays.asList("in", "out"))
),
/**
* 调用活动节点
* 调用外部定义的流程
* 特点:
* - 可以调用其他已定义的流程
* - 支持流程的复用
* - 可以传递参数和接收返回值
*/
CALL_ACTIVITY(
"CALL_ACTIVITY",
"调用活动",
"外部流程调用",
"调用外部定义的流程,支持跨系统流程调用和参数传递",
Arrays.asList(
"调用外部定义的流程",
"支持跨系统流程调用",
"传递和接收参数",
"支持异步调用"
),
Arrays.asList(
"跨系统流程集成",
"公共流程复用",
"分布式流程处理",
"大型流程解耦"
),
new WorkflowNodeGraph()
.setShape("rectangle")
.setSize(120, 60)
.setStyle("#ffffff", "#1890ff", "api")
.configPorts(Arrays.asList("in", "out"))
.setShape("circle")
.setSize(40, 40)
.setStyle("#fff1f0", "#ff4d4f", "stop")
.configPorts(Arrays.asList("in"))
);
//
// /**
// * 用户任务节点
// * 需要人工处理的任务节点
// * 特点:
// * - 需要用户交互
// * - 可以分配给特定用户或角色
// * - 支持审批填写表单等操作
// */
// USER_TASK(
// "USER_TASK",
// "用户任务",
// "人工处理任务",
// new WorkflowNodeGraph()
// .setShape("rect")
// .setSize(120, 60)
// .setStyle("#ffffff", "#1890ff", "user")
// .configPorts(Arrays.asList("in", "out"))
// ),
//
// /**
// * 服务任务节点
// * 自动执行的系统服务任务
// * 特点:
// * - 自动执行无需人工干预
// * - 可以调用外部服务或系统API
// * - 支持异步执行
// */
// SERVICE_TASK(
// "SERVICE_TASK",
// "服务任务",
// "系统服务调用",
// new WorkflowNodeGraph()
// .setShape("rectangle")
// .setSize(120, 60)
// .setStyle("#ffffff", "#1890ff", "api")
// .configPorts(Arrays.asList("in", "out"))
// ),
//
// /**
// * 脚本任务节点
// * 执行自定义脚本的任务节点
// * 特点:
// * - 支持多种脚本语言如ShellPython等
// * - 可以执行自定义业务逻辑
// * - 适合复杂的数据处理和计算
// */
// SCRIPT_TASK(
// "SCRIPT_TASK",
// "脚本任务",
// "脚本执行任务",
// new WorkflowNodeGraph()
// .setShape("rectangle")
// .setSize(120, 60)
// .setStyle("#ffffff", "#1890ff", "code")
// .configPorts(Arrays.asList("in", "out"))
// ),
//
// /**
// * 排他网关
// * 基于条件的分支控制
// * 特点:
// * - 只会选择一个分支执行
// * - 需要设置分支条件
// * - 适合互斥的业务场景
// */
// EXCLUSIVE_GATEWAY(
// "EXCLUSIVE_GATEWAY",
// "排他网关",
// "条件分支控制",
// new WorkflowNodeGraph()
// .setShape("diamond")
// .setSize(50, 50)
// .setStyle("#fff7e6", "#faad14", "fork")
// .configPorts(Arrays.asList("in", "out"))
// ),
//
// /**
// * 并行网关
// * 并行执行多个分支
// * 特点:
// * - 所有分支同时执行
// * - 等待所有分支完成才继续
// * - 适合并行处理的业务场景
// */
// PARALLEL_GATEWAY(
// "PARALLEL_GATEWAY",
// "并行网关",
// "并行分支控制",
// new WorkflowNodeGraph()
// .setShape("diamond")
// .setSize(50, 50)
// .setStyle("#fff7e6", "#faad14", "branches")
// .configPorts(Arrays.asList("in", "out"))
// ),
//
// /**
// * 子流程节点
// * 嵌套的子流程
// * 特点:
// * - 可以包含完整的子流程
// * - 支持流程的模块化和复用
// * - 可以独立部署和版本控制
// */
// SUBPROCESS(
// "SUB_PROCESS",
// "子流程",
// "嵌入式子流程",
// new WorkflowNodeGraph()
// .setShape("rectangle")
// .setSize(120, 60)
// .setStyle("#ffffff", "#1890ff", "apartment")
// .configPorts(Arrays.asList("in", "out"))
// ),
//
// /**
// * 调用活动节点
// * 调用外部定义的流程
// * 特点:
// * - 可以调用其他已定义的流程
// * - 支持流程的复用
// * - 可以传递参数和接收返回值
// */
// CALL_ACTIVITY(
// "CALL_ACTIVITY",
// "调用活动",
// "调用外部定义的流程,支持跨系统流程调用和参数传递",
// new WorkflowNodeGraph()
// .setShape("rectangle")
// .setSize(120, 60)
// .setStyle("#ffffff", "#1890ff", "api")
// .configPorts(Arrays.asList("in", "out"))
// );
@JsonValue
private final String code; // 节点类型编码
private final String name; // 节点显示名称
private final String shortDesc; // 节点简要描述
private final NodeCategoryEnums category; //分类
private final String description; // 节点详细描述
private final List<String> features; // 节点功能列表
private final List<String> scenarios; // 使用场景列表
private final WorkflowNodeGraph uiConfig; // UI配置
NodeTypeEnums(
String code,
String name,
String shortDesc,
NodeCategoryEnums category,
String description,
List<String> features,
List<String> scenarios,
WorkflowNodeGraph uiConfig) {
this.code = code;
this.name = name;
this.shortDesc = shortDesc;
this.category = category;
this.description = description;
this.features = features;
this.scenarios = scenarios;
this.uiConfig = uiConfig;
}

View File

@ -7,6 +7,8 @@ import com.qqchen.deploy.backend.workflow.dto.graph.WorkflowDefinitionGraph;
import org.hibernate.HibernateException;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.usertype.UserType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.Serializable;
import java.sql.PreparedStatement;
@ -18,6 +20,7 @@ import java.sql.Types;
* 自定义 Hibernate 类型用于处理 WorkflowGraph 的序列化和反序列化
*/
public class WorkflowGraphType implements UserType<WorkflowDefinitionGraph> {
private static final Logger log = LoggerFactory.getLogger(WorkflowGraphType.class);
private final ObjectMapper objectMapper;
public WorkflowGraphType() {
@ -62,7 +65,9 @@ public class WorkflowGraphType implements UserType<WorkflowDefinitionGraph> {
try {
return objectMapper.readValue(value, WorkflowDefinitionGraph.class);
} catch (JsonProcessingException e) {
throw new HibernateException("Failed to convert String to WorkflowGraph: " + value, e);
// 记录错误日志但不抛出异常返回 null 使得单条记录的错误不影响整体查询
log.error("Failed to convert String to WorkflowGraph: " + value, e);
return null;
}
}

View File

@ -100,20 +100,20 @@ public class BpmnConverter {
return createStartEvent(node);
case END_EVENT:
return createEndEvent(node);
case SERVICE_TASK:
return createServiceTask(node);
case USER_TASK:
return createUserTask(node);
case SCRIPT_TASK:
return createScriptTask(node);
case EXCLUSIVE_GATEWAY:
return createExclusiveGateway(node);
case PARALLEL_GATEWAY:
return createParallelGateway(node);
case SUBPROCESS:
return createSubProcess(node);
case CALL_ACTIVITY:
return createCallActivity(node);
// case SERVICE_TASK:
// return createServiceTask(node);
// case USER_TASK:
// return createUserTask(node);
// case SCRIPT_TASK:
// return createScriptTask(node);
// case EXCLUSIVE_GATEWAY:
// return createExclusiveGateway(node);
// case PARALLEL_GATEWAY:
// return createParallelGateway(node);
// case SUBPROCESS:
// return createSubProcess(node);
// case CALL_ACTIVITY:
// return createCallActivity(node);
default:
return null;
}

View File

@ -34,14 +34,14 @@ public class SchemaGenerator {
case SCRIPT_TASK:
return ScriptNodeConfig.class;
// 其他节点类型的配置类
case USER_TASK:
case SERVICE_TASK:
case EXCLUSIVE_GATEWAY:
case PARALLEL_GATEWAY:
case SUBPROCESS:
case CALL_ACTIVITY:
// case USER_TASK:
// case SERVICE_TASK:
// case EXCLUSIVE_GATEWAY:
// case PARALLEL_GATEWAY:
// case SUBPROCESS:
// case CALL_ACTIVITY:
// TODO: 为其他节点类型添加对应的配置类
return BaseNodeConfig.class;
// return BaseNodeConfig.class;
default:
return BaseNodeConfig.class;
}
@ -74,16 +74,16 @@ public class SchemaGenerator {
// 设置基本信息
node.put("code", nodeType.getCode());
node.put("name", nodeType.getName());
node.put("description", nodeType.getShortDesc());
// node.put("description", nodeType.getShortDesc());
// 添加详细信息
ObjectNode details = mapper.createObjectNode();
details.put("description", nodeType.getDescription());
ArrayNode features = mapper.createArrayNode();
nodeType.getFeatures().forEach(features::add);
// nodeType.getFeatures().forEach(features::add);
details.set("features", features);
ArrayNode scenarios = mapper.createArrayNode();
nodeType.getScenarios().forEach(scenarios::add);
// nodeType.getScenarios().forEach(scenarios::add);
details.set("scenarios", scenarios);
node.set("details", details);

View File

@ -112,27 +112,27 @@ public class WorkflowDefinitionGraph {
serviceConfig.put("url", "http://api.example.com/service");
serviceConfig.put("method", "POST");
WorkflowDefinitionNode serviceNode = createNode(
"serviceTask1",
NodeTypeEnums.SERVICE_TASK,
"调用服务",
300, 100,
serviceConfig
);
nodes.add(serviceNode);
// WorkflowDefinitionNode serviceNode = createNode(
// "serviceTask1",
// NodeTypeEnums.SERVICE_TASK,
// "调用服务",
// 300, 100,
// serviceConfig
// );
// nodes.add(serviceNode);
// 用户任务节点
Map<String, Object> userConfig = createNodeConfig("用户任务", "人工审批");
userConfig.put("assignee", "admin");
WorkflowDefinitionNode userNode = createNode(
"userTask1",
NodeTypeEnums.USER_TASK,
"人工审批",
500, 100,
userConfig
);
nodes.add(userNode);
// WorkflowDefinitionNode userNode = createNode(
// "userTask1",
// NodeTypeEnums.USER_TASK,
// "人工审批",
// 500, 100,
// userConfig
// );
// nodes.add(userNode);
// 脚本任务节点
Map<String, Object> scriptConfig = createNodeConfig("脚本任务", "执行脚本");
@ -193,60 +193,60 @@ public class WorkflowDefinitionGraph {
serviceConfig.put("url", "http://api.example.com/data");
serviceConfig.put("method", "GET");
WorkflowDefinitionNode serviceNode = createNode(
"serviceTask1",
NodeTypeEnums.SERVICE_TASK,
"获取数据",
250, 150,
serviceConfig
);
nodes.add(serviceNode);
// WorkflowDefinitionNode serviceNode = createNode(
// "serviceTask1",
// NodeTypeEnums.SERVICE_TASK,
// "获取数据",
// 250, 150,
// serviceConfig
// );
// nodes.add(serviceNode);
// 排他网关
WorkflowDefinitionNode exclusiveGateway = createNode(
"exclusiveGateway1",
NodeTypeEnums.EXCLUSIVE_GATEWAY,
"数据路由",
400, 150,
createNodeConfig("排他网关", "根据数据量选择处理方式")
);
nodes.add(exclusiveGateway);
// WorkflowDefinitionNode exclusiveGateway = createNode(
// "exclusiveGateway1",
// NodeTypeEnums.EXCLUSIVE_GATEWAY,
// "数据路由",
// 400, 150,
// createNodeConfig("排他网关", "根据数据量选择处理方式")
// );
// nodes.add(exclusiveGateway);
// 用户任务A大数据量
Map<String, Object> userConfigA = createNodeConfig("用户任务A", "人工处理");
userConfigA.put("assignee", "expert");
WorkflowDefinitionNode userNodeA = createNode(
"userTask1",
NodeTypeEnums.USER_TASK,
"人工处理",
550, 50,
userConfigA
);
nodes.add(userNodeA);
// WorkflowDefinitionNode userNodeA = createNode(
// "userTask1",
// NodeTypeEnums.USER_TASK,
// "人工处理",
// 550, 50,
// userConfigA
// );
// nodes.add(userNodeA);
// 用户任务B小数据量
Map<String, Object> userConfigB = createNodeConfig("用户任务B", "快速处理");
userConfigB.put("assignee", "operator");
WorkflowDefinitionNode userNodeB = createNode(
"userTask2",
NodeTypeEnums.USER_TASK,
"快速处理",
550, 250,
userConfigB
);
nodes.add(userNodeB);
// WorkflowDefinitionNode userNodeB = createNode(
// "userTask2",
// NodeTypeEnums.USER_TASK,
// "快速处理",
// 550, 250,
// userConfigB
// );
// nodes.add(userNodeB);
// 并行网关合并
WorkflowDefinitionNode parallelGateway = createNode(
"parallelGateway1",
NodeTypeEnums.PARALLEL_GATEWAY,
"并行处理",
700, 150,
createNodeConfig("并行网关", "并行处理数据")
);
nodes.add(parallelGateway);
// WorkflowDefinitionNode parallelGateway = createNode(
// "parallelGateway1",
// NodeTypeEnums.PARALLEL_GATEWAY,
// "并行处理",
// 700, 150,
// createNodeConfig("并行网关", "并行处理数据")
// );
// nodes.add(parallelGateway);
// 脚本任务A
Map<String, Object> scriptConfigA = createNodeConfig("脚本任务A", "数据分析");