diff --git a/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/listeners/ElementListeners.vue b/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/listeners/ElementListeners.vue index e2b88ffdb..8e68131e9 100644 --- a/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/listeners/ElementListeners.vue +++ b/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/listeners/ElementListeners.vue @@ -52,7 +52,6 @@ const editingListenerIndex = ref(-1); // 监听器所在下标,-1 为新增 const editingListenerFieldIndex = ref(-1); // 字段所在下标,-1 为新增 const listenerTypeObject = ref(listenerType); const fieldTypeObject = ref(fieldType); -const bpmnElement = ref(); const otherExtensionList = ref(); const bpmnElementListeners = ref(); const listenerFormRef = ref(); @@ -60,13 +59,19 @@ const listenerFieldFormRef = ref(); const bpmnInstances = () => (window as any)?.bpmnInstances; const resetListenersList = () => { - bpmnElement.value = bpmnInstances().bpmnElement; + const instances = bpmnInstances(); + if (!instances || !instances.bpmnElement) return; + + // 直接使用原始BPMN元素,避免Vue响应式代理问题 + const bpmnElement = instances.bpmnElement; + const businessObject = bpmnElement.businessObject; + otherExtensionList.value = - bpmnElement.value.businessObject?.extensionElements?.values?.filter( + businessObject?.extensionElements?.values?.filter( (ex: any) => ex.$type !== `${prefix}:ExecutionListener`, ) ?? []; // 保留非监听器类型的扩展属性,避免移除监听器时清空其他配置(如审批人等)。相关案例:https://gitee.com/yudaocode/yudao-ui-admin-vue3/issues/ICMSYC bpmnElementListeners.value = - bpmnElement.value.businessObject?.extensionElements?.values?.filter( + businessObject?.extensionElements?.values?.filter( (ex: any) => ex.$type === `${prefix}:ExecutionListener`, ) ?? []; elementListenersList.value = bpmnElementListeners.value.map((listener: any) => @@ -162,9 +167,12 @@ const removeListener = (index: number) => { okText: '确 认', cancelText: '取 消', onOk() { + const instances = bpmnInstances(); + if (!instances || !instances.bpmnElement) return; + bpmnElementListeners.value.splice(index, 1); elementListenersList.value.splice(index, 1); - updateElementExtensions(bpmnElement.value, [ + updateElementExtensions(instances.bpmnElement, [ ...otherExtensionList.value, ...bpmnElementListeners.value, ]); @@ -179,11 +187,17 @@ const saveListenerConfig = async () => { // debugger const validateStatus = await listenerFormRef.value.validate(); if (!validateStatus) return; // 验证不通过直接返回 + + const instances = bpmnInstances(); + if (!instances || !instances.bpmnElement) return; + + const bpmnElement = instances.bpmnElement; const listenerObject = createListenerObject( listenerForm.value, false, prefix, ); + if (editingListenerIndex.value === -1) { bpmnElementListeners.value.push(listenerObject); elementListenersList.value.push(listenerForm.value); @@ -201,10 +215,10 @@ const saveListenerConfig = async () => { } // 保存其他配置 otherExtensionList.value = - bpmnElement.value.businessObject?.extensionElements?.values?.filter( + bpmnElement.businessObject?.extensionElements?.values?.filter( (ex: any) => ex.$type !== `${prefix}:ExecutionListener`, ) ?? []; - updateElementExtensions(bpmnElement.value, [ + updateElementExtensions(bpmnElement, [ ...otherExtensionList.value, ...bpmnElementListeners.value, ]); @@ -219,6 +233,10 @@ const openProcessListenerDialog = async () => { processListenerDialogRef.value.open('execution'); }; const selectProcessListener = (listener: any) => { + const instances = bpmnInstances(); + if (!instances || !instances.bpmnElement) return; + + const bpmnElement = instances.bpmnElement; const listenerForm = initListenerForm2(listener); const listenerObject = createListenerObject(listenerForm, false, prefix); bpmnElementListeners.value.push(listenerObject); @@ -226,10 +244,10 @@ const selectProcessListener = (listener: any) => { // 保存其他配置 otherExtensionList.value = - bpmnElement.value.businessObject?.extensionElements?.values?.filter( + bpmnElement.businessObject?.extensionElements?.values?.filter( (ex: any) => ex.$type !== `${prefix}:ExecutionListener`, ) ?? []; - updateElementExtensions(bpmnElement.value, [ + updateElementExtensions(bpmnElement, [ ...otherExtensionList.value, ...bpmnElementListeners.value, ]); diff --git a/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/listeners/UserTaskListeners.vue b/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/listeners/UserTaskListeners.vue index f0b48f642..2788ef29c 100644 --- a/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/listeners/UserTaskListeners.vue +++ b/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/listeners/UserTaskListeners.vue @@ -48,7 +48,6 @@ const fieldsListOfListener = ref([]); const editingListenerIndex = ref(-1); const editingListenerFieldIndex = ref(-1); const listenerFieldForm = ref({}); -const bpmnElement = ref(); const bpmnElementListeners = ref([]); const otherExtensionList = ref([]); const listenerFormRef = ref({}); @@ -57,13 +56,19 @@ const listenerFieldFormRef = ref({}); const bpmnInstances = () => (window as any)?.bpmnInstances; const resetListenersList = () => { - bpmnElement.value = bpmnInstances()?.bpmnElement; + const instances = bpmnInstances(); + if (!instances || !instances.bpmnElement) return; + + // 直接使用原始BPMN元素,避免Vue响应式代理问题 + const bpmnElement = instances.bpmnElement; + const businessObject = bpmnElement.businessObject; + otherExtensionList.value = - bpmnElement.value.businessObject?.extensionElements?.values?.filter( + businessObject?.extensionElements?.values?.filter( (ex: any) => ex.$type !== `${prefix}:TaskListener`, ) ?? []; bpmnElementListeners.value = - bpmnElement.value.businessObject?.extensionElements?.values?.filter( + businessObject?.extensionElements?.values?.filter( (ex: any) => ex.$type === `${prefix}:TaskListener`, ) ?? []; elementListenersList.value = bpmnElementListeners.value.map((listener) => @@ -99,9 +104,12 @@ const removeListener = (_: any, index: number) => { title: '提示', content: '确认移除该监听器吗?', }).then(() => { + const instances = bpmnInstances(); + if (!instances || !instances.bpmnElement) return; + bpmnElementListeners.value.splice(index, 1); elementListenersList.value.splice(index, 1); - updateElementExtensions(bpmnElement.value, [ + updateElementExtensions(instances.bpmnElement, [ ...otherExtensionList.value, ...bpmnElementListeners.value, ]); @@ -114,7 +122,13 @@ async function saveListenerConfig() { } catch { return; } + + const instances = bpmnInstances(); + if (!instances || !instances.bpmnElement) return; + + const bpmnElement = instances.bpmnElement; const listenerObject = createListenerObject(listenerForm.value, true, prefix); + if (editingListenerIndex.value === -1) { bpmnElementListeners.value.push(listenerObject); elementListenersList.value.push(listenerForm.value); @@ -131,10 +145,10 @@ async function saveListenerConfig() { ); } otherExtensionList.value = - bpmnElement.value.businessObject?.extensionElements?.values?.filter( + bpmnElement.businessObject?.extensionElements?.values?.filter( (ex: any) => ex.$type !== `${prefix}:TaskListener`, ) ?? []; - updateElementExtensions(bpmnElement.value, [ + updateElementExtensions(bpmnElement, [ ...otherExtensionList.value, ...bpmnElementListeners.value, ]); @@ -229,17 +243,21 @@ const openProcessListenerDialog = async () => { processListenerDialogRef.value.open('task'); }; const selectProcessListener = (listener: any) => { + const instances = bpmnInstances(); + if (!instances || !instances.bpmnElement) return; + + const bpmnElement = instances.bpmnElement; const listenerForm = initListenerForm2(listener); const listenerObject = createListenerObject(listenerForm, true, prefix); bpmnElementListeners.value.push(listenerObject); elementListenersList.value.push(listenerForm); otherExtensionList.value = - bpmnElement.value.businessObject?.extensionElements?.values?.filter( + bpmnElement.businessObject?.extensionElements?.values?.filter( (ex: any) => ex.$type !== `${prefix}:TaskListener`, ) ?? []; updateElementExtensions( - bpmnElement.value, + bpmnElement, otherExtensionList.value?.concat(bpmnElementListeners.value), ); }; diff --git a/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/properties/ElementProperties.vue b/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/properties/ElementProperties.vue index 26a4267f6..cc96afa68 100644 --- a/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/properties/ElementProperties.vue +++ b/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/properties/ElementProperties.vue @@ -1,5 +1,5 @@