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 @@
/>
+
+
+
+
+
节点参数
-
-
-
-
-
-
-
-
- updateFieldValue(field.field, v)"
- />
- 配置
-
-
+
+
+
+
+
+
+
+
+
+ updateFieldValue(field.field, v)"
+ />
+ 配置
+
+
+
+
+
+
+ updateExpandValue(field.field, sub.field, v)"
+ :placeholder="sub.required ? '必填' : '选填'"
+ />
+ updateExpandValue(field.field, sub.field, v)"
+ class="w100"
+ />
+ updateExpandValue(field.field, sub.field, v)"
+ />
+ updateExpandValue(field.field, sub.field, v)"
+ :placeholder="sub.required ? '必填' : '选填'"
+ class="w100"
+ >
+
+
+ updateExpandValue(field.field, sub.field, v)"
+ />
+ 配置
+ updateExpandValue(field.field, sub.field, v)"
+ :placeholder="sub.required ? '必填' : '选填'"
+ />
+
+
+
-
+
+
+ 自定义字段
+
+
+
@@ -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);
+};