From cb8effc769ba4d1745d58b72d8fc76b4ba5b07e5 Mon Sep 17 00:00:00 2001 From: 2910410219 <2910410219@qq.com> Date: Thu, 6 Aug 2026 09:31:34 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B7=A5=E4=BD=9C=E6=B5=81=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E7=9B=B8=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/component/ModelSelector.vue | 6 ++++- .../workflow/component/NodeConfigPanel.vue | 25 ++++++++++++++++++- .../workflow/component/SkillSelector.vue | 7 +++++- src/views/settings/workflow/index.vue | 20 +++++++++------ 4 files changed, 48 insertions(+), 10 deletions(-) diff --git a/src/views/settings/workflow/component/ModelSelector.vue b/src/views/settings/workflow/component/ModelSelector.vue index c113024..46cb190 100644 --- a/src/views/settings/workflow/component/ModelSelector.vue +++ b/src/views/settings/workflow/component/ModelSelector.vue @@ -45,7 +45,6 @@ v-model:current-page="pagination.pageNum" v-model:page-size="pagination.pageSize" :total="pagination.total" - :page-sizes="[10, 20, 50]" layout="total, prev, pager, next" small @current-change="handlePageChange" @@ -145,6 +144,11 @@ const fetchModelList = async () => { const res = await getWorkflowModelList(params); modelList.value = res.data?.list || []; pagination.total = res.data?.total || 0; + // 预选项仅为部分信息(切换节点后无 id)时,按名称匹配当前页以高亮 + if (selectedModel.value && !selectedModel.value.id && selectedModel.value.modelName) { + const matched = modelList.value.find((m) => m.modelName === selectedModel.value!.modelName); + if (matched) selectedModel.value = matched; + } } catch { modelList.value = []; pagination.total = 0; diff --git a/src/views/settings/workflow/component/NodeConfigPanel.vue b/src/views/settings/workflow/component/NodeConfigPanel.vue index 48fb489..1b09aee 100644 --- a/src/views/settings/workflow/component/NodeConfigPanel.vue +++ b/src/views/settings/workflow/component/NodeConfigPanel.vue @@ -6,6 +6,13 @@ + + + {{ selectedNode.data?.nodeCode }} @@ -74,7 +81,7 @@ :placeholder="field.required ? '必填' : '选填'" class="w100" > - + { return t >= 600 && t <= 605; }); +// 开始节点不展示节点描述 +const isStartNode = computed(() => props.selectedNode?.data?.nodeCode === '__start__'); + const emit = defineEmits<{ (e: 'update:selectedNode', node: Node): void; (e: 'openModelSelector'): void; @@ -183,6 +194,18 @@ const updateNodeLabel = (newLabel: string) => { emit('update:selectedNode', updatedNode); }; +const updateNodeDesc = (newDesc: string) => { + if (!props.selectedNode?.data) return; + const updatedNode = { + ...props.selectedNode, + data: { + ...props.selectedNode.data, + desc: newDesc, + }, + }; + emit('update:selectedNode', updatedNode); +}; + const getFieldValue = (fieldName: string) => { if (!props.selectedNode?.data?.formConfig) return ''; const field = props.selectedNode.data.formConfig.find((f: any) => f.field === fieldName); diff --git a/src/views/settings/workflow/component/SkillSelector.vue b/src/views/settings/workflow/component/SkillSelector.vue index b5e855f..18a1d23 100644 --- a/src/views/settings/workflow/component/SkillSelector.vue +++ b/src/views/settings/workflow/component/SkillSelector.vue @@ -34,7 +34,6 @@ v-model:current-page="pagination.pageNum" v-model:page-size="pagination.pageSize" :total="pagination.total" - :page-sizes="[10, 20, 50]" layout="total, prev, pager, next" small @current-change="handlePageChange" @@ -82,6 +81,7 @@ watch( visible.value = val; if (val) { selectedSkill.value = props.defaultSkill || null; + pagination.pageNum = 1; fetchSkillList(); } } @@ -100,6 +100,11 @@ const fetchSkillList = async () => { const res = await getWorkflowSkillList(params); skillList.value = res.data?.list || []; pagination.total = res.data?.total || 0; + // 预选项仅为部分信息(切换节点后无 id)时,按名称匹配当前页以高亮 + if (selectedSkill.value && !selectedSkill.value.id && selectedSkill.value.name) { + const matched = skillList.value.find((s) => s.name === selectedSkill.value!.name); + if (matched) selectedSkill.value = matched; + } } catch { skillList.value = []; pagination.total = 0; diff --git a/src/views/settings/workflow/index.vue b/src/views/settings/workflow/index.vue index 503e430..df2e783 100644 --- a/src/views/settings/workflow/index.vue +++ b/src/views/settings/workflow/index.vue @@ -30,7 +30,7 @@
([]); const nodeLibraryCollapsed = ref(false); -const filteredNodeLibraryGroups = computed(() => { - return nodeLibraryGroups.value; -}); - // 节点配置映射:nodeCode -> 节点配置 const nodeConfigMap = computed(() => { const map = new Map< @@ -243,6 +240,11 @@ const onConnect = (connection: Connection) => { const onNodeClick = (event: { node: Node }) => { selectedNode.value = event.node; + // 同步选择器预选项,避免展示上一个节点的模型/技能 + const mc = event.node.data?.modelConfig; + selectedModelData.value = mc?.modelName ? { modelName: mc.modelName, modelType: mc.modelType } : null; + const sk = event.node.data?.skillName; + selectedSkillData.value = sk ? { name: sk } : null; }; const updateSelectedNode = (updatedNode: Node) => { @@ -444,6 +446,7 @@ const getNodeLibrary = async () => { nodeLibraryGroups.value = res.data?.groups || []; } catch { nodeLibraryGroups.value = []; + ElMessage.error('节点库加载失败'); } }; @@ -469,7 +472,7 @@ const addNodeFromLibrary = (nodeCode: string, nodeName: string) => { id: `node-${++nodeId}`, type: 'default', position: { x: spawnX, y: spawnY }, - data: { label: nodeName, nodeCode, patchLayout: false }, + data: { label: nodeName, nodeCode, desc: '', patchLayout: false }, style: { background: '#fff', border: '2px solid #3b82f6', borderRadius: '8px', padding: '10px 20px' }, }, ]); @@ -547,6 +550,7 @@ const loadWorkflowFromDsl = (dsl: any) => { data: { label: n.name || '', nodeCode: n.nodeCode, + desc: n.desc || '', formConfig: n.formConfig || null, modelConfig: n.modelConfig || null, skillName: n.skillName || null, @@ -605,14 +609,16 @@ const confirmSaveWorkflow = async () => { return; } + const startNode = nodes.value.find((n) => isStartNode(n)); const workflowDsl = { version: '1.0.0', - startNodeId: nodes.value[0]?.id || '', + startNodeId: startNode?.id || '', nodes: nodes.value.map((n) => ({ id: n.id, nodeCode: n.data?.nodeCode || 'unknown', name: n.data?.label || '', type: n.type || 'default', + desc: n.data?.desc || null, skillName: n.data?.skillName || null, patchLayout: n.data?.patchLayout || false, config: {