You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

utils.tsx 2.5 kB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import { PipelineGlobalParam, PipelineNodeModelParameter } from '@/types';
  2. import { parseJsonText } from '@/utils';
  3. import { Graph, INode } from '@antv/g6';
  4. import { type MenuProps } from 'antd';
  5. // 找到节点所以的上游节点
  6. export const findAllParentNodes = (graph: Graph, node: INode) => {
  7. const parentNodes: INode[] = [];
  8. let index = -1;
  9. let targetNode = node;
  10. while (targetNode) {
  11. const neighbors: INode[] = graph.getNeighbors(targetNode, 'source');
  12. for (const sourceNode of neighbors) {
  13. // 避免重复,也避免循环
  14. const idx = parentNodes.findIndex((item) => sourceNode.getID() === item.getID());
  15. if (idx === -1 && sourceNode.getID() !== node.getID()) {
  16. parentNodes.push(sourceNode);
  17. }
  18. }
  19. targetNode = parentNodes[++index];
  20. }
  21. return parentNodes;
  22. };
  23. // 判断并找到全局参数第一个重复项,有重复项时,全局参数不允许保存
  24. export function findFirstDuplicate(params: PipelineGlobalParam[]): string | null {
  25. const seen = new Set();
  26. for (const item of params) {
  27. if (seen.has(item.param_name)) {
  28. return item.param_name;
  29. }
  30. seen.add(item.param_name);
  31. }
  32. return null;
  33. }
  34. // 创建参数下拉菜单
  35. export function createMenuItems(
  36. params: PipelineGlobalParam[],
  37. parentNodes: INode[],
  38. ): MenuProps['items'] {
  39. const nodes: MenuProps['items'] = parentNodes.map((item) => {
  40. const model = item.getModel();
  41. const out_parameters = model.out_parameters as string | undefined | null;
  42. const out_parametersObj = parseJsonText(out_parameters);
  43. const outParametersList = Object.keys(out_parametersObj ?? {});
  44. return {
  45. key: model.id as string,
  46. label: model.label as string,
  47. children: outParametersList.map((key: string) => ({
  48. key: key as string,
  49. label: out_parametersObj[key].label,
  50. })),
  51. };
  52. });
  53. return [
  54. {
  55. key: 'global',
  56. label: '全局参数',
  57. children: params.map((item) => ({
  58. key: item.param_name,
  59. label: item.param_name,
  60. })),
  61. },
  62. ...nodes,
  63. ];
  64. }
  65. export function getInParameterComponent(
  66. parameter: PipelineNodeModelParameter,
  67. ): React.ReactNode | null {
  68. if (parameter.value) {
  69. }
  70. return null;
  71. }
  72. export function canInput(parameter: PipelineNodeModelParameter) {
  73. const { type, item_type } = parameter;
  74. return !(
  75. type === 'ref' &&
  76. (item_type === 'dataset' || item_type === 'model' || item_type === 'image')
  77. );
  78. }