From d2da078b40578cf72901442c7a2b878dfc34cae5 Mon Sep 17 00:00:00 2001
From: wujingjing <gersonwu@qq.com>
Date: 星期五, 13 十二月 2024 12:10:00 +0800
Subject: [PATCH] feat(flow): 新增执行功能节点并优化流程画布

---
 src/components/vue-flow/VueFlowHelper.ts |  221 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 220 insertions(+), 1 deletions(-)

diff --git a/src/components/vue-flow/VueFlowHelper.ts b/src/components/vue-flow/VueFlowHelper.ts
index e76fd7e..d63c9f2 100644
--- a/src/components/vue-flow/VueFlowHelper.ts
+++ b/src/components/vue-flow/VueFlowHelper.ts
@@ -1,17 +1,236 @@
-import { NodeType, nodeTypeMap } from './vueFlowEnum';
+import { HandleType, useNode, useVueFlow } from '@vue-flow/core';
+import { v4 as uuid } from 'uuid';
+import { VueFlowConstant } from './VueFlowConstant';
+import { CompareOperation, ConditionOperator, NodeType, VarType, nodeTypeMap } from './vueFlowEnum';
+import { get } from 'lodash';
 
 export class VueFlowHelper {
+	static genId() {
+		return uuid().slice(0, 8);
+	}
+
+	static genGeometryId() {
+		return uuid().slice(0, 12);
+	}
+
 	static getDefaultData = (type: NodeType) => {
 		let data: any = {
 			title: nodeTypeMap[type],
 		};
 		switch (type) {
 			case NodeType.Start:
+				data[VueFlowConstant.GROUP_PARAMS_KEY] = [
+					{
+						[VueFlowConstant.PARAMS_KEY]: [
+							{
+								key: 'var_list',
+								label: '',
+								type: 'var_list',
+								value: [],
+							},
+						],
+					},
+				];
 				break;
+			case NodeType.Condition:
+				data[VueFlowConstant.GROUP_PARAMS_KEY] = [
+					{
+						[VueFlowConstant.PARAMS_KEY]: [
+							{
+								key: 'condition',
+								label: '',
+								type: 'condition',
+								value: [ConditionHelper.getDefaultConditionGroup(), ConditionHelper.getDefaultConditionGroup(true)],
+							},
+						],
+					},
+				];
+				break;
+			case NodeType.LLM:
+				data[VueFlowConstant.GROUP_PARAMS_KEY] = [
+					{
+						name: '妯″瀷璁剧疆',
+
+						[VueFlowConstant.PARAMS_KEY]: [
+							{
+								key: 'llm_model',
+								label: '妯″瀷',
+								type: 'llm_model',
+								value: '',
+								required: true,
+								placeholder: '璇烽�夋嫨妯″瀷',
+							},
+							{ key: 'temperature', label: '娓╁害', type: 'slide', scope: [0, 2], step: 0.1, value: 0.6 },
+						],
+					},
+					{
+						name: '鎻愮ず璇�',
+						[VueFlowConstant.PARAMS_KEY]: [{ key: 'prompt', label: '鎻愮ず璇�', type: 'textarea', value: '' }],
+					},
+				];
+				break;
+
+			case NodeType.Agent:
+				data[VueFlowConstant.GROUP_PARAMS_KEY] = [
+					{
+						[VueFlowConstant.PARAMS_KEY]: [
+							{
+								key: 'agent',
+								label: '浠g悊',
+								type: 'agent_select',
+								value: '',
+								// value_label:'',
+								required: true,
+								placeholder: '浠g悊',
+							},
+						],
+					},
+				];
+				break;
+
+			case NodeType.Func:
+				data[VueFlowConstant.GROUP_PARAMS_KEY] = [
+					{
+						[VueFlowConstant.PARAMS_KEY]: [
+							{
+								key: 'func_name',
+								label: '鍑芥暟鍚嶇О',
+								type: 'func_name_select',
+								value: '',
+								// value_label:'',
+								required: true,
+								placeholder: '鍑芥暟鍚嶇О',
+							},
+						],
+					},
+				];
+				break;
+			case NodeType.Output:
+				data[VueFlowConstant.GROUP_PARAMS_KEY] = [
+					{
+						[VueFlowConstant.PARAMS_KEY]: [
+							{
+								key: 'output_msg',
+								label: '娑堟伅鍐呭',
+								type: 'var_textarea_file',
+								required: true,
+								placeholder:
+									'杈撳叆闇�瑕佸彂閫佺粰鐢ㄦ埛鐨勬秷鎭紝渚嬪鈥滄帴涓嬫潵鎴戝皢鎵ц XX 鎿嶄綔锛岃鎮ㄧ‘璁も�濓紝鈥滀互涓嬫槸鎴戠殑鍒濈増鑽夌锛屾偍鍙互鍦ㄥ叾鍩虹涓婅繘琛屼慨鏀光��',
+								value: { msg: '', files: [] },
+							},
+							{
+								key: 'output_result',
+								label: '浜や簰绫诲瀷',
+								global: 'value.type=input',
+								type: 'output_form',
+								required: true,
+								value: { type: 'none', value: '' },
+								options: [],
+							},
+						],
+					},
+				];
 
 			default:
 				break;
 		}
 		return data;
 	};
+
+	static getHandleId = (node: any, handleType: HandleType, order?: number) => {
+		const orderSuffix = order == undefined ? '' : `__${order + ''}`;
+		return `${node.id}__handle-${handleType}${orderSuffix}`;
+	};
+
+	static getFieldValue = (data, key, index = 0) => {
+		let varList = [];
+		const group = data?.[VueFlowConstant.GROUP_PARAMS_KEY];
+		if (group && group.length > 0) {
+			if (index !== null) {
+				const val = group?.[index]?.[VueFlowConstant.PARAMS_KEY]?.find((item) => item.key === key)?.value;
+				if (val) {
+					varList.push(val);
+				}
+			} else {
+				for (const item of group) {
+					if (item[VueFlowConstant.PARAMS_KEY].key === key) {
+						varList.push(item[VueFlowConstant.PARAMS_KEY].value);
+					}
+				}
+			}
+		}
+		if (varList.length === 0) {
+			return null;
+		} else if (varList.length === 1) {
+			return varList[0];
+		} else {
+			return varList;
+		}
+	};
+
+	static getGroupParam = (data, index = 0) => {
+		const group = data?.[VueFlowConstant.GROUP_PARAMS_KEY]?.[index];
+		return group;
+	};
+
+	static getParams = (group, key) => {
+		return group?.[VueFlowConstant.PARAMS_KEY]?.find((item) => item.key === key);
+	};
+}
+
+export class StartNodeHelper {
+	// static getDefaultData = () => {
+	// 	return {
+	// 		title: nodeTypeMap[NodeType.Start],
+	// 	};
+	// };
+
+	static getVarList = (data) => {
+		const varList = data[VueFlowConstant.GROUP_PARAMS_KEY][0][VueFlowConstant.PARAMS_KEY].find(
+			(item) => item.key === 'condition'
+		).value;
+		return varList;
+	};
+}
+
+export class ConditionHelper {
+	static getConditionItem = (
+		left?: {
+			var: string;
+			label: string;
+			value: string;
+		},
+		right?: {
+			type: VarType;
+			value: string;
+			label: string;
+		},
+		operation?: CompareOperation
+	) => {
+		return {
+			id: VueFlowHelper.genId(),
+			left_var: left?.var ?? '',
+			left_label: left?.label ?? '',
+			left_value: left?.var ?? '',
+			comparison_operation: operation ?? '',
+			// right_value_type: right?.type ?? VarType.Input,
+			// 鍥哄畾閫夋嫨 input
+			right_value_type: VarType.Input,
+
+			right_value: right?.value ?? '',
+			right_label: right?.label ?? '',
+		};
+	};
+
+	static getDefaultConditionGroup = (isElse = false) => {
+		return isElse
+			? {
+					id: VueFlowHelper.genId(),
+			  }
+			: {
+					id: VueFlowHelper.genId(),
+					operator: ConditionOperator.And,
+					conditions: [ConditionHelper.getConditionItem()],
+			  };
+	};
 }

--
Gitblit v1.9.3