From 479675030570cdadde5ee263ed1fb5581d84e846 Mon Sep 17 00:00:00 2001 From: 2910410219 <2910410219@qq.com> Date: Mon, 10 Aug 2026 14:05:46 +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=E8=B0=83=E6=95=B4=E6=A8=A1=E5=9E=8B=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E6=8E=A5=E5=8F=A3=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/settings/workflow/index.ts | 4 +- .../workflow/component/FormFieldsEditor.vue | 133 ++++++++ .../workflow/component/ModelSelector.vue | 7 +- .../workflow/component/NodeConfigPanel.vue | 304 ++++++++++++++---- src/views/settings/workflow/index.vue | 188 +++++++++-- 5 files changed, 546 insertions(+), 90 deletions(-) create mode 100644 src/views/settings/workflow/component/FormFieldsEditor.vue diff --git a/src/api/settings/workflow/index.ts b/src/api/settings/workflow/index.ts index 3718518..c4f93b2 100644 --- a/src/api/settings/workflow/index.ts +++ b/src/api/settings/workflow/index.ts @@ -49,14 +49,14 @@ export interface WorkflowModelItem { modelName: string; modelType: number | string; baseUrl?: string; - enabled?: number; + enabled?: number | boolean; isOwner?: number; [key: string]: any; } export function getWorkflowModelList(params?: { pageNum: number; pageSize: number; modelName?: string }) { return request({ - url: '/model-gateway/model/listModel', + url: '/model-gateway/model/manage/listModelManage', method: 'get', params, }) as Promise<{ code: number; message: string; data: { list: WorkflowModelItem[]; total: number } }>; diff --git a/src/views/settings/workflow/component/FormFieldsEditor.vue b/src/views/settings/workflow/component/FormFieldsEditor.vue new file mode 100644 index 0000000..ed098a9 --- /dev/null +++ b/src/views/settings/workflow/component/FormFieldsEditor.vue @@ -0,0 +1,133 @@ + + + + + diff --git a/src/views/settings/workflow/component/ModelSelector.vue b/src/views/settings/workflow/component/ModelSelector.vue index 46cb190..025e9a1 100644 --- a/src/views/settings/workflow/component/ModelSelector.vue +++ b/src/views/settings/workflow/component/ModelSelector.vue @@ -31,8 +31,8 @@

{{ model.modelName }}

{{ model.baseUrl }}

- - {{ model.enabled === 1 ? '已启用' : '已禁用' }} + + {{ isModelEnabled(model) ? '已启用' : '已禁用' }}
@@ -133,6 +133,9 @@ const getModelTypeName = (type: number | string) => { return typeMap[Number(type)] || '未知类型'; }; +// 兼容 enabled 数字(1/0) 与布尔(true/false) 两种返回 +const isModelEnabled = (model: WorkflowModelItem) => model.enabled === 1 || model.enabled === true; + const fetchModelList = async () => { loading.value = true; try { diff --git a/src/views/settings/workflow/component/NodeConfigPanel.vue b/src/views/settings/workflow/component/NodeConfigPanel.vue index 1b09aee..3693307 100644 --- a/src/views/settings/workflow/component/NodeConfigPanel.vue +++ b/src/views/settings/workflow/component/NodeConfigPanel.vue @@ -45,63 +45,143 @@ /> + + + + + - + + + @@ -122,6 +202,7 @@ import { ref, computed } from 'vue'; import type { Node } from '@vue-flow/core'; import KeyValueEditor from './KeyValueEditor.vue'; +import FormFieldsEditor, { type FormField } from './FormFieldsEditor.vue'; import { JsonEditor } from '/@/components/json-schema-editor'; interface NodeData { @@ -132,6 +213,7 @@ interface NodeData { modelConfig?: any; skillName?: string; patchLayout?: boolean; + isSaveFile?: boolean; } interface NodeConfig { @@ -156,6 +238,9 @@ const isVideoModelSelected = computed(() => { // 开始节点不展示节点描述 const isStartNode = computed(() => props.selectedNode?.data?.nodeCode === '__start__'); +// form 节点自定义字段(formConfigOption) +const customFormFields = computed(() => (props.selectedNode?.data?.formConfig as FormField[]) || []); + const emit = defineEmits<{ (e: 'update:selectedNode', node: Node): void; (e: 'openModelSelector'): void; @@ -168,17 +253,23 @@ const emit = defineEmits<{ // Schema 编辑器弹窗 const schemaEditorVisible = ref(false); const schemaEditorField = ref(''); +const schemaEditorExpandField = ref(''); // 空表示顶层字段,非空表示 responseType 的嵌套 expand 字段 const schemaEditorData = ref({}); -function openSchemaEditor(fieldName: string) { +function openSchemaEditor(fieldName: string, expandField = '') { schemaEditorField.value = fieldName; - const val = getFieldValue(fieldName); + schemaEditorExpandField.value = expandField; + const val = expandField ? getExpandValue(fieldName, expandField) : getFieldValue(fieldName); schemaEditorData.value = val && typeof val === 'object' ? { ...val } : {}; schemaEditorVisible.value = true; } function confirmSchemaEditor() { - updateFieldValue(schemaEditorField.value, schemaEditorData.value); + if (schemaEditorExpandField.value) { + updateExpandValue(schemaEditorField.value, schemaEditorExpandField.value, schemaEditorData.value); + } else { + updateFieldValue(schemaEditorField.value, schemaEditorData.value); + } schemaEditorVisible.value = false; } @@ -206,6 +297,31 @@ const updateNodeDesc = (newDesc: string) => { emit('update:selectedNode', updatedNode); }; +const updateIsSaveFile = (value: boolean) => { + if (!props.selectedNode?.data) return; + const updatedNode = { + ...props.selectedNode, + data: { + ...props.selectedNode.data, + isSaveFile: value, + }, + }; + emit('update:selectedNode', updatedNode); +}; + +// 自定义表单字段(formConfigOption)变更:写回 node.data.formConfig +const updateCustomFields = (fields: FormField[]) => { + if (!props.selectedNode?.data) return; + const updatedNode = { + ...props.selectedNode, + data: { + ...props.selectedNode.data, + formConfig: fields, + }, + }; + 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); @@ -240,6 +356,82 @@ const updateFieldValue = (fieldName: string, value: any) => { }; emit('update:selectedNode', updatedNode); }; + +// 取 formConfig 中的某个字段条目 +const getFormConfigEntry = (fieldName: string) => { + if (!props.selectedNode?.data?.formConfig) return undefined; + return props.selectedNode.data.formConfig.find((f: any) => f.field === fieldName); +}; + +// 当前选中下拉选项的嵌套 config 定义(来自节点库 presetOption) +const getSelectedOptionConfig = (fieldDef: any) => { + if (fieldDef?.type !== 'select' || !Array.isArray(fieldDef.options)) return []; + const value = getFieldValue(fieldDef.field); + const opt = fieldDef.options.find((o: any) => o.value === value); + return opt?.config || []; +}; + +// 读嵌套 expand 字段值 +const getExpandValue = (hostField: string, subField: string) => { + const entry = getFormConfigEntry(hostField); + const sub = entry?.expand?.find((e: any) => e.field === subField); + return sub?.value ?? ''; +}; + +// 写嵌套 expand 字段值(单次 emit) +const updateExpandValue = (hostField: string, subField: string, value: any) => { + if (!props.selectedNode?.data) return; + const formConfig = props.selectedNode.data.formConfig || []; + const entryIndex = formConfig.findIndex((f: any) => f.field === hostField); + if (entryIndex < 0) return; + + const entry = formConfig[entryIndex]; + const expand = entry.expand || []; + const subIndex = expand.findIndex((e: any) => e.field === subField); + const newExpand = [...expand]; + if (subIndex >= 0) { + newExpand[subIndex] = { ...newExpand[subIndex], value }; + } else { + newExpand.push({ field: subField, value }); + } + + const updatedFormConfig = [...formConfig]; + updatedFormConfig[entryIndex] = { ...entry, expand: newExpand }; + + const updatedNode = { + ...props.selectedNode, + data: { ...props.selectedNode.data, formConfig: updatedFormConfig }, + }; + emit('update:selectedNode', updatedNode); +}; + +// select 变更统一入口:更新 value 并按选中选项的 config 重建 expand(保留已有字段值) +const updateSelectFieldValue = (fieldDef: any, value: any) => { + if (!props.selectedNode?.data) return; + const formConfig = props.selectedNode.data.formConfig || []; + const entryIndex = formConfig.findIndex((f: any) => f.field === fieldDef.field); + const opt = (fieldDef.options || []).find((o: any) => o.value === value); + const configDefs = opt?.config || []; + const oldExpand = entryIndex >= 0 ? formConfig[entryIndex]?.expand || [] : []; + const newExpand = configDefs.map((cd: any) => { + const old = oldExpand.find((e: any) => e.field === cd.field); + return { ...cd, value: old?.value !== undefined ? old.value : (cd.default ?? '') }; + }); + + let updatedFormConfig; + if (entryIndex >= 0) { + updatedFormConfig = [...formConfig]; + updatedFormConfig[entryIndex] = { ...updatedFormConfig[entryIndex], value, expand: newExpand }; + } else { + updatedFormConfig = [...formConfig, { ...fieldDef, value, expand: newExpand }]; + } + + const updatedNode = { + ...props.selectedNode, + data: { ...props.selectedNode.data, formConfig: updatedFormConfig }, + }; + emit('update:selectedNode', updatedNode); +};