feat(flow): 添加流程编辑器通用工具函数
- 新增获取handle类型的函数getHandleType- 实现数据类型验证函数validateDataType - 添加根据节点类型获取组件的函数getNodeComponent - 支持BASIC、SWITCH、IMAGE、CODE、REST等多种节点类型- 处理api和data两种handle类型的数据匹配验证 - 提供默认节点组件LocalNode作为兜底选项master
parent
cf8d56ac9f
commit
e0c489b4de
@ -0,0 +1,103 @@
|
||||
import { defaultNodeTypes } from '@/components/FlowEditor/node/types/defaultType';
|
||||
import BasicNode from '@/components/FlowEditor/node/basicNode/BasicNode';
|
||||
import SwitchNode from '@/components/FlowEditor/node/switchNode/SwitchNode';
|
||||
import ImageNode from '@/components/FlowEditor/node/imageNode/ImageNode';
|
||||
import CodeNode from '@/components/FlowEditor/node/codeNode/CodeNode';
|
||||
import RestNode from '@/components/FlowEditor/node/restNode/RestNode';
|
||||
import LocalNode from '@/components/FlowEditor/node/localNode/LocalNode';
|
||||
|
||||
// 获取handle类型 (api或data)
|
||||
const getHandleType = (handleId: string, nodeParams: any) => {
|
||||
// 检查是否为api类型的handle
|
||||
const apiOuts = nodeParams.apiOuts || [];
|
||||
const apiIns = nodeParams.apiIns || [];
|
||||
|
||||
if (apiOuts.some((api: any) => (api.name || api.id) === handleId) ||
|
||||
apiIns.some((api: any) => (api.name || api.id) === handleId) || (handleId.includes('loop'))) {
|
||||
return 'api';
|
||||
}
|
||||
|
||||
// 检查是否为data类型的handle
|
||||
const dataOuts = nodeParams.dataOuts || [];
|
||||
const dataIns = nodeParams.dataIns || [];
|
||||
|
||||
if (dataOuts.some((data: any) => (data.name || data.id) === handleId) ||
|
||||
dataIns.some((data: any) => (data.name || data.id) === handleId)) {
|
||||
return 'data';
|
||||
}
|
||||
|
||||
// 默认为data类型
|
||||
return 'data';
|
||||
};
|
||||
|
||||
// 验证数据类型是否匹配
|
||||
const validateDataType = (sourceNode: defaultNodeTypes, targetNode: defaultNodeTypes, sourceHandleId: string, targetHandleId: string) => {
|
||||
const sourceParams = sourceNode.data?.parameters || {};
|
||||
const targetParams = targetNode.data?.parameters || {};
|
||||
|
||||
// 获取源节点的输出参数
|
||||
let sourceDataType = '';
|
||||
const sourceApiOuts = sourceParams.apiOuts || [];
|
||||
const sourceDataOuts = sourceParams.dataOuts || [];
|
||||
|
||||
// 查找源handle的数据类型
|
||||
const sourceApi = sourceApiOuts.find((api: any) => api.name === sourceHandleId);
|
||||
const sourceData = sourceDataOuts.find((data: any) => data.name === sourceHandleId);
|
||||
|
||||
if (sourceApi) {
|
||||
sourceDataType = sourceApi.dataType || '';
|
||||
}
|
||||
else if (sourceData) {
|
||||
sourceDataType = sourceData.dataType || '';
|
||||
}
|
||||
|
||||
// 获取目标节点的输入参数
|
||||
let targetDataType = '';
|
||||
const targetApiIns = targetParams.apiIns || [];
|
||||
const targetDataIns = targetParams.dataIns || [];
|
||||
|
||||
// 查找目标handle的数据类型
|
||||
const targetApi = targetApiIns.find((api: any) => api.name === targetHandleId);
|
||||
const targetData = targetDataIns.find((data: any) => data.name === targetHandleId);
|
||||
|
||||
if (targetApi) {
|
||||
targetDataType = targetApi.dataType || '';
|
||||
}
|
||||
else if (targetData) {
|
||||
targetDataType = targetData.dataType || '';
|
||||
}
|
||||
|
||||
// 如果任一数据类型为空,则允许连接
|
||||
if (!sourceDataType || !targetDataType) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// 比较数据类型是否匹配
|
||||
return sourceDataType === targetDataType;
|
||||
};
|
||||
|
||||
|
||||
// 根据节点类型获取对应的节点组件
|
||||
const getNodeComponent = (nodeType: string) => {
|
||||
switch (nodeType) {
|
||||
case 'BASIC':
|
||||
return BasicNode;
|
||||
case 'SWITCH':
|
||||
return SwitchNode;
|
||||
case 'IMAGE':
|
||||
return ImageNode;
|
||||
case 'CODE':
|
||||
return CodeNode;
|
||||
case 'REST':
|
||||
return RestNode;
|
||||
default:
|
||||
return LocalNode;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
export {
|
||||
getHandleType,
|
||||
validateDataType,
|
||||
getNodeComponent
|
||||
};
|
||||
Loading…
Reference in New Issue