import { PipelineGlobalParam, PipelineNodeModelParameter } from '@/types'; import { parseJsonText } from '@/utils'; import { Graph, INode } from '@antv/g6'; import { type MenuProps } from 'antd'; // 找到节点所以的上游节点 export const findAllParentNodes = (graph: Graph, node: INode) => { const parentNodes: INode[] = []; let index = -1; let targetNode = node; while (targetNode) { const neighbors: INode[] = graph.getNeighbors(targetNode, 'source'); for (const sourceNode of neighbors) { // 避免重复,也避免循环 const idx = parentNodes.findIndex((item) => sourceNode.getID() === item.getID()); if (idx === -1 && sourceNode.getID() !== node.getID()) { parentNodes.push(sourceNode); } } targetNode = parentNodes[++index]; } return parentNodes; }; // 判断并找到全局参数第一个重复项,有重复项时,全局参数不允许保存 export function findFirstDuplicate(params: PipelineGlobalParam[]): string | null { const seen = new Set(); for (const item of params) { if (seen.has(item.param_name)) { return item.param_name; } seen.add(item.param_name); } return null; } // 创建参数下拉菜单 export function createMenuItems( params: PipelineGlobalParam[], parentNodes: INode[], ): MenuProps['items'] { const nodes: MenuProps['items'] = parentNodes.map((item) => { const model = item.getModel(); const out_parameters = model.out_parameters as string | undefined | null; const out_parametersObj = parseJsonText(out_parameters); const outParametersList = Object.keys(out_parametersObj ?? {}); return { key: model.id as string, label: model.label as string, children: outParametersList.map((key: string) => ({ key: key as string, label: out_parametersObj[key].label, })), }; }); return [ { key: 'global', label: '全局参数', children: params.map((item) => ({ key: item.param_name, label: item.param_name, })), }, ...nodes, ]; } export function getInParameterComponent( parameter: PipelineNodeModelParameter, ): React.ReactNode | null { if (parameter.value) { } return null; } export function canInput(parameter: PipelineNodeModelParameter) { const { type, item_type } = parameter; return !( type === 'ref' && (item_type === 'dataset' || item_type === 'model' || item_type === 'image') ); }