From c50e0dee8c76d6eea04b0121f1cd69dbf9037300 Mon Sep 17 00:00:00 2001 From: zhanglc Date: Tue, 18 Nov 2025 11:40:58 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8DHTTP=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E4=B8=AD=E8=AF=B7=E6=B1=82=E5=A4=B4=E4=B8=8D=E8=83=BD=E4=BD=BF?= =?UTF-8?q?=E7=94=A8EL=E8=A1=A8=E8=BE=BE=E5=BC=8F=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../task/task-components/ServiceTask.vue | 51 ++++++++++++++----- 1 file changed, 38 insertions(+), 13 deletions(-) diff --git a/src/components/bpmnProcessDesigner/package/penal/task/task-components/ServiceTask.vue b/src/components/bpmnProcessDesigner/package/penal/task/task-components/ServiceTask.vue index eda9168e3..3c8e37e36 100644 --- a/src/components/bpmnProcessDesigner/package/penal/task/task-components/ServiceTask.vue +++ b/src/components/bpmnProcessDesigner/package/penal/task/task-components/ServiceTask.vue @@ -139,22 +139,32 @@ const httpInitializing = ref(false) const bpmnInstances = () => (window as any)?.bpmnInstances +// 判断字符串是否包含表达式 +const isExpression = (value: string): boolean => { + if (!value) return false + // 检测 ${...} 或 #{...} 格式的表达式 + return /\${[^}]+}/.test(value) || /#{[^}]+}/.test(value) +} + const collectHttpExtensionInfo = () => { const businessObject = bpmnElement.value?.businessObject const extensionElements = businessObject?.extensionElements const httpFields = new Map() + const httpFieldTypes = new Map() const otherExtensions: any[] = [] extensionElements?.values?.forEach((item: any) => { if (item?.$type === flowableFieldType && HTTP_FIELD_NAMES.includes(item.name)) { const value = item.string ?? item.stringValue ?? item.expression ?? '' + const fieldType = item.expression ? 'expression' : 'string' httpFields.set(item.name, value) + httpFieldTypes.set(item.name, fieldType) } else { otherExtensions.push(item) } }) - return { httpFields, otherExtensions } + return { httpFields, httpFieldTypes, otherExtensions } } const resetHttpDefaults = () => { @@ -168,7 +178,7 @@ const resetHttpDefaults = () => { const resetHttpForm = () => { httpInitializing.value = true const { httpFields } = collectHttpExtensionInfo() - const nextForm: Record = { ...DEFAULT_HTTP_FORM } + const nextForm = { ...DEFAULT_HTTP_FORM } HTTP_FIELD_NAMES.forEach((name) => { const stored = httpFields.get(name) @@ -228,7 +238,11 @@ const updateHttpExtensions = (force = false) => { return } - const { httpFields: existingFields, otherExtensions } = collectHttpExtensionInfo() + const { + httpFields: existingFields, + httpFieldTypes: existingTypes, + otherExtensions + } = collectHttpExtensionInfo() const desiredEntries: [string, string][] = [] HTTP_FIELD_NAMES.forEach((name) => { @@ -246,21 +260,32 @@ const updateHttpExtensions = (force = false) => { desiredEntries.push([name, persisted]) }) - if ( - !force && - desiredEntries.length === existingFields.size && - desiredEntries.every(([name, value]) => existingFields.get(name) === value) - ) { - return + // 检查是否有变化:不仅比较值,还要比较字段类型(string vs expression) + if (!force && desiredEntries.length === existingFields.size) { + let noChange = true + for (const [name, value] of desiredEntries) { + const existingValue = existingFields.get(name) + const existingType = existingTypes.get(name) + const currentType = isExpression(value) ? 'expression' : 'string' + if (existingValue !== value || existingType !== currentType) { + noChange = false + break + } + } + if (noChange) { + return + } } const moddle = bpmnInstances().moddle - const httpFieldElements = desiredEntries.map(([name, value]) => - moddle.create(flowableFieldType, { + const httpFieldElements = desiredEntries.map(([name, value]) => { + // 根据值是否包含表达式来决定使用 string 还是 expression 属性 + const isExpr = isExpression(value) + return moddle.create(flowableFieldType, { name, - string: value + ...(isExpr ? { expression: value } : { string: value }) }) - ) + }) updateElementExtensions(bpmnElement.value, [...otherExtensions, ...httpFieldElements]) }