From f658f120e6eccd0739e0b112eff97be26b1aac54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=AD=90=E9=BB=98?= <925456043@qq.com> Date: Tue, 21 Jul 2026 18:53:28 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=B7=A5=E4=BD=9C?= =?UTF-8?q?=E6=B5=81=E5=BC=80=E5=A7=8B=E8=A1=A8=E5=8D=95=E6=96=87=E6=A1=88?= =?UTF-8?q?=E6=B8=85=E7=A9=BA=E5=9B=9E=E9=80=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 保留标题和说明的显式空值 - 同步运行页与后端解析逻辑 --- .../WorkflowRunningParameterResolver.java | 21 +++++++++++++++++-- .../ai/workflow/components/WorkflowForm.vue | 11 ++++++---- .../src/utils/workflowNodeFields.test.ts | 4 ++-- .../src/utils/workflowNodeFields.ts | 5 +++-- .../ai/workflow/components/WorkflowForm.vue | 11 ++++++---- 5 files changed, 38 insertions(+), 14 deletions(-) diff --git a/easyflow-modules/easyflow-module-ai/src/main/java/tech/easyflow/ai/easyagentsflow/service/WorkflowRunningParameterResolver.java b/easyflow-modules/easyflow-module-ai/src/main/java/tech/easyflow/ai/easyagentsflow/service/WorkflowRunningParameterResolver.java index 9e04401c..2fae99c7 100644 --- a/easyflow-modules/easyflow-module-ai/src/main/java/tech/easyflow/ai/easyagentsflow/service/WorkflowRunningParameterResolver.java +++ b/easyflow-modules/easyflow-module-ai/src/main/java/tech/easyflow/ai/easyagentsflow/service/WorkflowRunningParameterResolver.java @@ -118,12 +118,29 @@ public class WorkflowRunningParameterResolver { private Map resolveStartFormMeta(JSONObject startNodeData) { JSONObject rawMeta = startNodeData == null ? null : startNodeData.getJSONObject("startFormMeta"); Map meta = new LinkedHashMap<>(); - meta.put("title", trimToDefault(rawMeta == null ? null : rawMeta.getString("title"), DEFAULT_START_FORM_TITLE)); - meta.put("description", trimToDefault(rawMeta == null ? null : rawMeta.getString("description"), DEFAULT_START_FORM_DESCRIPTION)); + // Missing values use defaults; an explicit empty string means the user cleared the field. + meta.put("title", resolveOptionalStartFormText(rawMeta, "title", DEFAULT_START_FORM_TITLE)); + meta.put("description", resolveOptionalStartFormText(rawMeta, "description", DEFAULT_START_FORM_DESCRIPTION)); meta.put("submitText", trimToDefault(rawMeta == null ? null : rawMeta.getString("submitText"), DEFAULT_START_FORM_SUBMIT_TEXT)); return meta; } + /** + * 解析允许用户主动清空的开始表单文案。 + * + * @param meta 开始节点表单元数据 + * @param key 文案字段名 + * @param fallback 字段缺失时的默认文案 + * @return 配置文案;字段缺失时返回默认文案,显式空字符串保持为空 + */ + private String resolveOptionalStartFormText(JSONObject meta, String key, String fallback) { + if (meta == null || !meta.containsKey(key)) { + return fallback; + } + String value = meta.getString(key); + return value == null ? "" : value.trim(); + } + private List> resolveStartFormSchema(JSONObject startNodeData, List parameters) { JSONArray rawSchema = startNodeData == null ? null : startNodeData.getJSONArray("startFormSchema"); List> schema = new ArrayList<>(); diff --git a/easyflow-ui-admin/app/src/views/ai/workflow/components/WorkflowForm.vue b/easyflow-ui-admin/app/src/views/ai/workflow/components/WorkflowForm.vue index e9e50fc9..cd8c4b45 100644 --- a/easyflow-ui-admin/app/src/views/ai/workflow/components/WorkflowForm.vue +++ b/easyflow-ui-admin/app/src/views/ai/workflow/components/WorkflowForm.vue @@ -38,11 +38,14 @@ const submitLoading = ref(false); const startFormMeta = computed(() => { const meta = props.workflowParams?.startFormMeta || {}; return { - title: String(meta.title || '').trim() || props.workflowParams?.title || '', + title: + meta.title == null + ? props.workflowParams?.title || '' + : String(meta.title).trim(), description: - String(meta.description || '').trim() || - props.workflowParams?.description || - '', + meta.description == null + ? props.workflowParams?.description || '' + : String(meta.description).trim(), submitText: String(meta.submitText || '').trim() || $t('button.run'), }; }); diff --git a/easyflow-ui-admin/packages/tinyflow-ui/src/utils/workflowNodeFields.test.ts b/easyflow-ui-admin/packages/tinyflow-ui/src/utils/workflowNodeFields.test.ts index a3890f1c..632bc877 100644 --- a/easyflow-ui-admin/packages/tinyflow-ui/src/utils/workflowNodeFields.test.ts +++ b/easyflow-ui-admin/packages/tinyflow-ui/src/utils/workflowNodeFields.test.ts @@ -855,8 +855,8 @@ describe('workflow node fields', () => { systemReserved: true, }); expect(normalized.startFormMeta).toMatchObject({ - title: '开始问答', - description: '请先补充必要信息,再开始执行工作流。', + title: '', + description: '', submitText: '开始', }); expect(normalized.parameters[0]).toMatchObject({ diff --git a/easyflow-ui-admin/packages/tinyflow-ui/src/utils/workflowNodeFields.ts b/easyflow-ui-admin/packages/tinyflow-ui/src/utils/workflowNodeFields.ts index 726bc659..04ebc147 100644 --- a/easyflow-ui-admin/packages/tinyflow-ui/src/utils/workflowNodeFields.ts +++ b/easyflow-ui-admin/packages/tinyflow-ui/src/utils/workflowNodeFields.ts @@ -439,8 +439,9 @@ function createDefaultStartFormMeta(): StartFormMeta { export function normalizeStartFormMeta(meta?: Partial | null): StartFormMeta { const fallback = createDefaultStartFormMeta(); return { - title: trimString(meta?.title) || fallback.title, - description: trimString(meta?.description) || fallback.description, + // Missing values use defaults; an explicit empty string means the user cleared the field. + title: meta?.title == null ? fallback.title : trimString(meta.title), + description: meta?.description == null ? fallback.description : trimString(meta.description), submitText: trimString(meta?.submitText) || fallback.submitText, }; } diff --git a/easyflow-ui-usercenter/app/src/views/ai/workflow/components/WorkflowForm.vue b/easyflow-ui-usercenter/app/src/views/ai/workflow/components/WorkflowForm.vue index 9ff34674..7d712cb4 100644 --- a/easyflow-ui-usercenter/app/src/views/ai/workflow/components/WorkflowForm.vue +++ b/easyflow-ui-usercenter/app/src/views/ai/workflow/components/WorkflowForm.vue @@ -37,11 +37,14 @@ const submitLoading = ref(false); const startFormMeta = computed(() => { const meta = props.workflowParams?.startFormMeta || {}; return { - title: String(meta.title || '').trim() || props.workflowParams?.title || '', + title: + meta.title == null + ? props.workflowParams?.title || '' + : String(meta.title).trim(), description: - String(meta.description || '').trim() || - props.workflowParams?.description || - '', + meta.description == null + ? props.workflowParams?.description || '' + : String(meta.description).trim(), submitText: String(meta.submitText || '').trim() || $t('button.run'), }; });