From 37535ab838b1d8d1a4b61db41afb3b77d2101311 Mon Sep 17 00:00:00 2001
From: wujingjing <gersonwu@qq.com>
Date: 星期四, 20 三月 2025 17:03:36 +0800
Subject: [PATCH] 添加 RPA 节点

---
 src/components/vue-flow/ui/nodes/N8nNode.vue |   93 ++++++++++++++++++++++++++++++----------------
 1 files changed, 60 insertions(+), 33 deletions(-)

diff --git a/src/components/vue-flow/ui/nodes/N8nNode.vue b/src/components/vue-flow/ui/nodes/N8nNode.vue
index ba247b9..9eac73f 100644
--- a/src/components/vue-flow/ui/nodes/N8nNode.vue
+++ b/src/components/vue-flow/ui/nodes/N8nNode.vue
@@ -13,7 +13,7 @@
 				<!-- codeInput.params[0].value -->
 				<el-form-item prop="group_params.0.params.0.value.value" labelWidth="0">
 					<el-select
-						class="!w-[220px] flex-0"
+						class="!w-full flex-0"
 						filterable
 						:disabled="isViewMode"
 						placeholder="宸ヤ綔娴�"
@@ -24,29 +24,38 @@
 					</el-select>
 				</el-form-item>
 			</FieldLayout>
-			<FieldLayout :title="flowInput.name" v-if="Object.keys(flowInput.params[0].value.value).length > 0">
+			<FieldLayout :title="flowInput.name" v-if="flowInput.params[0].value.length > 0">
 				<!-- codeInput.params[0].value -->
 
-				<FieldLayout level="2" :title="item" v-for="(item, index) in Object.keys(flowInput.params[0].value.value)" :key="index">
-					<el-form-item :prop="`group_params.1.params.0.value.value.${item}`" labelWidth="0">
-						<el-input
-							filterable
-							class="w-[120px] flex-0"
-							v-model="flowInput.params[0].value.value[item]"
-							:readonly="isViewMode"
-							placeholder="鍙傛暟鍚�"
-						></el-input>
+				<FieldLayout level="2" :title="item.key" v-for="(item, index) in flowInput.params[0].value" :key="index">
+					<template #right>
+						<el-radio-group
+							v-model="item.type"
+							:disabled="isViewMode"
+							@change="handleTypeChange(item)"
+							size="small"
+							class="input-type-radio"
+						>
+							<el-radio-button label="input">杈撳叆</el-radio-button>
+							<el-radio-button label="macro">瀹�</el-radio-button>
+						</el-radio-group>
+					</template>
+					<el-form-item v-if="item.type === 'input'" :prop="`group_params.1.params.0.value.${index}.value`" labelWidth="0">
+						<el-input filterable class="w-full flex-0" v-model="item.value" :readonly="isViewMode" placeholder="鍊�"></el-input>
+					</el-form-item>
+					<el-form-item v-if="item.type === 'macro'" :prop="`group_params.1.params.0.value.${index}.value`" labelWidth="0">
+						<el-input filterable class="w-full flex-0" v-model="item.label" :readonly="isViewMode" placeholder="瀹�"></el-input>
 					</el-form-item>
 				</FieldLayout>
 			</FieldLayout>
 			<FieldLayout :title="flowOutput.name">
 				<!-- codeOutput.params[0].value -->
-				<el-form-item prop="group_params.2.params.0.value.value" labelWidth="0">
+				<el-form-item prop="group_params.2.params.0.value.label" labelWidth="0">
 					<el-input
 						filterable
-						class="w-[120px] flex-0"
-						v-model="flowOutput.params[0].value.value"
-						placeholder="鍙傛暟鍚�"
+						class="w-full flex-0"
+						v-model="flowOutput.params[0].value.label"
+						placeholder="瀹�"
 						:readonly="isViewMode"
 					></el-input>
 				</el-form-item>
@@ -61,14 +70,14 @@
 import { Handle, Position, useNode } from '@vue-flow/core';
 import { onMounted, ref } from 'vue';
 import { VueFlowHelper } from '../../VueFlowHelper';
-import { NodeType, ParameterType } from '../../vueFlowEnum';
-import CodeEditor from '/@/components/input/codeEditor/index.vue';
+import { NodeType } from '../../vueFlowEnum';
 // import CodeEditDialog from './components/CodeEditDlg.vue';
+import item from 'element-plus/es/components/space/src/item';
 import FieldLayout from './components/FieldLayout.vue';
 import NodeBasicLayout from './components/NodeBasicLayout.vue';
 import type { LLMNodeData, LLMNodeEvents } from './index';
 import { validateForm } from './utils';
-import { textTypeMap } from '/@/components/input/codeEditor/types';
+
 const props = defineProps<
 	NodeProps<LLMNodeData, LLMNodeEvents> & {
 		isViewMode?: boolean;
@@ -81,13 +90,10 @@
 };
 
 const workflowValueChange = (value: string) => {
-	console.log('馃殌 ~ workflowValueChange ~ workflow:', value);
 	const flow = getFlowByID(value);
-	console.log('馃殌 ~ workflowValueChange ~ flow:', flow);
 	const nodes = flow.nodes;
 	const webhookNode = nodes.find((item) => item.type === 'n8n-nodes-base.webhook');
-	console.log('馃殌 ~ workflowValueChange ~ webhookNode:', webhookNode);
-	flowInput.value.params[0].value.value = {};
+	flowInput.value.params[0].value = [];
 	if (!webhookNode) {
 		return;
 	}
@@ -97,18 +103,15 @@
 	if (path) {
 		// Parse path parameters from path string
 		const pathParams = path.match(/\/:([^\/]+)/g)?.map((p) => p.substring(2)) || [];
-		console.log('馃殌 ~ pathParams:', pathParams);
+		flowInput.value.params[0].value = pathParams.map((item) => {
+			return {
+				key: item,
+				type: 'macro',
+				label: '',
+				value: '',
+			};
+		});
 		// Update input parameters with path params
-		if (pathParams.length > 0) {
-			const inputValue = flowInput.value.params[0].value.value || {};
-			pathParams.forEach((param) => {
-				if (!inputValue[param]) {
-					inputValue[param] = '';
-				}
-			});
-			flowInput.value.params[0].value.value = inputValue;
-		}
-		console.log('馃殌 ~ flowInput.value.params[0].value.value:', flowInput.value.params[0].value.value);
 	}
 };
 const emit = defineEmits<{
@@ -135,4 +138,28 @@
 		validateForm: validateForm(formRef) as any,
 	});
 });
+
+const handleTypeChange = (item: any) => {
+	// 娓呯┖涔嬪墠鐨勮緭鍏ュ��
+	if (item.type === 'macro') {
+		item.value = ''; // 鍒囨崲鍒板彉閲忔ā寮忔椂娓呯┖杈撳叆鍊�
+	} else {
+		item.label = ''; // 鍒囨崲鍒拌緭鍏ユā寮忔椂娓呯┖鍙橀噺鍊�
+	}
+};
 </script>
+
+<style scoped>
+.input-type-radio {
+	margin: 0 8px;
+}
+
+:deep(.el-radio-button__inner) {
+	padding: 2px 8px;
+}
+
+:deep(.el-radio-button__original-radio:checked + .el-radio-button__inner) {
+	background-color: var(--el-color-primary);
+	border-color: var(--el-color-primary);
+}
+</style>

--
Gitblit v1.9.3