diff --git a/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/designer/ProcessDesigner.vue b/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/designer/ProcessDesigner.vue index add772d32..d827fec43 100644 --- a/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/designer/ProcessDesigner.vue +++ b/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/designer/ProcessDesigner.vue @@ -245,6 +245,9 @@ const moddleExtensions = computed(() => { const initBpmnModeler = () => { if (bpmnModeler) return; const data: any = document.querySelector('#bpmnCanvas'); + if (!data) { + return; + } // console.log(data, 'data'); // console.log(props.keyboard, 'props.keyboard'); // console.log(additionalModules, 'additionalModules()'); @@ -261,7 +264,7 @@ const initBpmnModeler = () => { // propertiesPanel: { // parent: '#js-properties-panel' // }, - keyboard: props.keyboard ? { bindTo: document } : null, + keyboard: props.keyboard ? { bind: true } : null, // additionalModules: additionalModules.value, additionalModules: additionalModules.value as any[], moddleExtensions: moddleExtensions.value, diff --git a/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/designer/ProcessViewer.vue b/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/designer/ProcessViewer.vue index 7236cfd05..6696087ae 100644 --- a/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/designer/ProcessViewer.vue +++ b/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/designer/ProcessViewer.vue @@ -39,10 +39,29 @@ const dialogTitle = ref(undefined); // 弹窗标题 const selectActivityType = ref(undefined); // 选中 Task 的活动编号 const selectTasks = ref([]); // 选中的任务数组 +type BpmnCanvas = { + _svg?: SVGSVGElement; + addMarker: (element: any, marker: string) => void; + removeMarker: (element: any, marker: string) => void; + zoom: ( + newScale?: 'fit-viewport' | number, + center?: 'auto' | { x: number; y: number }, + ) => number; +}; +type ElementRegistry = { + filter: (callback: (element: any) => boolean) => any[]; + get: (id: string) => any; +}; + +const getCanvas = () => + bpmnViewer.value?.get('canvas') as BpmnCanvas | undefined; +const getElementRegistry = () => + bpmnViewer.value?.get('elementRegistry') as ElementRegistry | undefined; + /** Zoom:恢复 */ const processReZoom = () => { defaultZoom.value = 1; - bpmnViewer.value?.get('canvas').zoom('fit-viewport', 'auto'); + getCanvas()?.zoom('fit-viewport', 'auto'); }; let resizeObserver: null | ResizeObserver = null; @@ -89,7 +108,7 @@ const processZoomIn = (zoomStep = 0.1) => { ); } defaultZoom.value = newZoom; - bpmnViewer.value?.get('canvas').zoom(defaultZoom.value); + getCanvas()?.zoom(defaultZoom.value); }; /** Zoom:缩小 */ @@ -101,7 +120,7 @@ const processZoomOut = (zoomStep = 0.1) => { ); } defaultZoom.value = newZoom; - bpmnViewer.value?.get('canvas').zoom(defaultZoom.value); + getCanvas()?.zoom(defaultZoom.value); }; /** 流程图预览清空 */ @@ -122,9 +141,9 @@ const addCustomDefs = () => { if (!bpmnViewer.value) { return; } - const canvas = bpmnViewer.value?.get('canvas'); + const canvas = getCanvas(); const svg = canvas?._svg; - svg.append(customDefs.value); + svg?.append(customDefs.value); }; /** 节点选中 */ @@ -220,8 +239,11 @@ const setProcessStatus = (view: any) => { finishedSequenceFlowActivityIds, rejectedTaskActivityIds, } = view; - const canvas: any = bpmnViewer.value.get('canvas'); - const elementRegistry: any = bpmnViewer.value.get('elementRegistry'); + const canvas = getCanvas(); + const elementRegistry = getElementRegistry(); + if (!canvas || !elementRegistry) { + return; + } // 已完成节点 if (Array.isArray(finishedSequenceFlowActivityIds)) { @@ -229,7 +251,7 @@ const setProcessStatus = (view: any) => { if (item !== null) { canvas.addMarker(item, 'success'); const element = elementRegistry.get(item); - const conditionExpression = element.businessObject.conditionExpression; + const conditionExpression = element?.businessObject.conditionExpression; if (conditionExpression) { canvas.addMarker(item, 'condition-expression'); } diff --git a/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/multi-instance/ElementMultiInstance.vue b/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/multi-instance/ElementMultiInstance.vue index 2883834d3..8b344fee5 100644 --- a/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/multi-instance/ElementMultiInstance.vue +++ b/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/multi-instance/ElementMultiInstance.vue @@ -61,8 +61,8 @@ interface LoopInstanceForm { } const loopInstanceForm = ref({}); -const bpmnElement = ref(null); -const multiLoopInstance = ref(null); +const bpmnElement = ref(null); +const multiLoopInstance = ref(null); declare global { interface Window { bpmnInstances?: () => any; @@ -276,7 +276,7 @@ const approveMethod = ref(); const approveRatio = ref(100); const otherExtensions = ref([]); const getElementLoopNew = (): void => { - if (props.type === 'UserTask') { + if (props.type === 'UserTask' && bpmnElement.value) { const loopCharacteristics = bpmnElement.value.businessObject?.loopCharacteristics; const extensionElements = @@ -320,6 +320,9 @@ const onApproveRatioChange = (): void => { updateLoopCharacteristics(); }; const updateLoopCharacteristics = (): void => { + if (!bpmnElement.value) { + return; + } // 根据ApproveMethod生成multiInstanceLoopCharacteristics节点 if (approveMethod.value === ApproveMethodType.RANDOM_SELECT_ONE_APPROVE) { bpmnInstances().modeling.updateProperties(toRaw(bpmnElement.value), { @@ -367,9 +370,11 @@ const updateLoopCharacteristics = (): void => { body: `\${ nrOfCompletedInstances >= nrOfInstances }`, }); } - bpmnInstances().modeling.updateProperties(toRaw(bpmnElement.value), { - loopCharacteristics: toRaw(multiLoopInstance.value), - }); + if (multiLoopInstance.value) { + bpmnInstances().modeling.updateProperties(toRaw(bpmnElement.value), { + loopCharacteristics: toRaw(multiLoopInstance.value), + }); + } } // 添加ApproveMethod到ExtensionElements diff --git a/apps/web-antdv-next/src/views/bpm/components/bpmn-process-designer/package/designer/ProcessDesigner.vue b/apps/web-antdv-next/src/views/bpm/components/bpmn-process-designer/package/designer/ProcessDesigner.vue index b3d3babc3..d1029383c 100644 --- a/apps/web-antdv-next/src/views/bpm/components/bpmn-process-designer/package/designer/ProcessDesigner.vue +++ b/apps/web-antdv-next/src/views/bpm/components/bpmn-process-designer/package/designer/ProcessDesigner.vue @@ -245,6 +245,9 @@ const moddleExtensions = computed(() => { const initBpmnModeler = () => { if (bpmnModeler) return; const data: any = document.querySelector('#bpmnCanvas'); + if (!data) { + return; + } // console.log(data, 'data'); // console.log(props.keyboard, 'props.keyboard'); // console.log(additionalModules, 'additionalModules()'); @@ -261,7 +264,7 @@ const initBpmnModeler = () => { // propertiesPanel: { // parent: '#js-properties-panel' // }, - keyboard: props.keyboard ? { bindTo: document } : null, + keyboard: props.keyboard ? { bind: true } : null, // additionalModules: additionalModules.value, additionalModules: additionalModules.value as any[], moddleExtensions: moddleExtensions.value, diff --git a/apps/web-antdv-next/src/views/bpm/components/bpmn-process-designer/package/designer/ProcessViewer.vue b/apps/web-antdv-next/src/views/bpm/components/bpmn-process-designer/package/designer/ProcessViewer.vue index 70f5f1427..107b48cbb 100644 --- a/apps/web-antdv-next/src/views/bpm/components/bpmn-process-designer/package/designer/ProcessViewer.vue +++ b/apps/web-antdv-next/src/views/bpm/components/bpmn-process-designer/package/designer/ProcessViewer.vue @@ -48,6 +48,25 @@ const dialogVisible = ref(false); // 弹窗可见性 const dialogTitle = ref(undefined); // 弹窗标题 const selectActivityType = ref(undefined); // 选中 Task 的活动编号 const selectTasks = ref([]); // 选中的任务数组 +type BpmnCanvas = { + _svg?: SVGSVGElement; + addMarker: (element: any, marker: string) => void; + removeMarker: (element: any, marker: string) => void; + zoom: ( + newScale?: 'fit-viewport' | number, + center?: 'auto' | { x: number; y: number }, + ) => number; +}; +type ElementRegistry = { + filter: (callback: (element: any) => boolean) => any[]; + get: (id: string) => any; +}; + +const getCanvas = () => + bpmnViewer.value?.get('canvas') as BpmnCanvas | undefined; +const getElementRegistry = () => + bpmnViewer.value?.get('elementRegistry') as ElementRegistry | undefined; + const approvalColumns = computed(() => { const userColumn: TableColumnType = selectActivityType.value === 'bpmn:UserTask' @@ -126,7 +145,7 @@ const approvalColumns = computed(() => { /** Zoom:恢复 */ const processReZoom = () => { defaultZoom.value = 1; - bpmnViewer.value?.get('canvas').zoom('fit-viewport', 'auto'); + getCanvas()?.zoom('fit-viewport', 'auto'); }; let resizeObserver: null | ResizeObserver = null; @@ -173,7 +192,7 @@ const processZoomIn = (zoomStep = 0.1) => { ); } defaultZoom.value = newZoom; - bpmnViewer.value?.get('canvas').zoom(defaultZoom.value); + getCanvas()?.zoom(defaultZoom.value); }; /** Zoom:缩小 */ @@ -185,7 +204,7 @@ const processZoomOut = (zoomStep = 0.1) => { ); } defaultZoom.value = newZoom; - bpmnViewer.value?.get('canvas').zoom(defaultZoom.value); + getCanvas()?.zoom(defaultZoom.value); }; /** 流程图预览清空 */ @@ -206,9 +225,9 @@ const addCustomDefs = () => { if (!bpmnViewer.value) { return; } - const canvas = bpmnViewer.value?.get('canvas'); + const canvas = getCanvas(); const svg = canvas?._svg; - svg.append(customDefs.value); + svg?.append(customDefs.value); }; /** 节点选中 */ @@ -304,8 +323,11 @@ const setProcessStatus = (view: any) => { finishedSequenceFlowActivityIds, rejectedTaskActivityIds, } = view; - const canvas: any = bpmnViewer.value.get('canvas'); - const elementRegistry: any = bpmnViewer.value.get('elementRegistry'); + const canvas = getCanvas(); + const elementRegistry = getElementRegistry(); + if (!canvas || !elementRegistry) { + return; + } // 已完成节点 if (Array.isArray(finishedSequenceFlowActivityIds)) { @@ -313,7 +335,7 @@ const setProcessStatus = (view: any) => { if (item !== null) { canvas.addMarker(item, 'success'); const element = elementRegistry.get(item); - const conditionExpression = element.businessObject.conditionExpression; + const conditionExpression = element?.businessObject.conditionExpression; if (conditionExpression) { canvas.addMarker(item, 'condition-expression'); } diff --git a/apps/web-antdv-next/src/views/bpm/components/bpmn-process-designer/package/penal/custom-config/components/BoundaryEventTimer.vue b/apps/web-antdv-next/src/views/bpm/components/bpmn-process-designer/package/penal/custom-config/components/BoundaryEventTimer.vue index 06c3f9f97..368dd5799 100644 --- a/apps/web-antdv-next/src/views/bpm/components/bpmn-process-designer/package/penal/custom-config/components/BoundaryEventTimer.vue +++ b/apps/web-antdv-next/src/views/bpm/components/bpmn-process-designer/package/penal/custom-config/components/BoundaryEventTimer.vue @@ -218,7 +218,7 @@ watch(