From a1d7e81859f554f3a53680cc35f0f49bf1f77098 Mon Sep 17 00:00:00 2001
From: wwf <1971391498@qq.com>
Date: 星期四, 14 五月 2026 14:37:02 +0800
Subject: [PATCH] 导入项目

---
 src/components/bpmnProcessDesigner/package/designer/ProcessDesigner.vue |  655 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 655 insertions(+), 0 deletions(-)

diff --git a/src/components/bpmnProcessDesigner/package/designer/ProcessDesigner.vue b/src/components/bpmnProcessDesigner/package/designer/ProcessDesigner.vue
new file mode 100644
index 0000000..00e887c
--- /dev/null
+++ b/src/components/bpmnProcessDesigner/package/designer/ProcessDesigner.vue
@@ -0,0 +1,655 @@
+<template>
+  <div class="my-process-designer">
+    <div class="my-process-designer__header" style="z-index: 999; display: table-row-group">
+      <slot name="control-header"></slot>
+      <template v-if="!$slots['control-header']">
+        <ElButtonGroup key="file-control">
+          <XButton preIcon="ep:folder-opened" title="鎵撳紑鏂囦欢" @click="refFile.click()" />
+          <el-tooltip effect="light" placement="bottom">
+            <template #content>
+              <div style="color: #409eff">
+                <!-- <el-button link @click="downloadProcessAsXml()">涓嬭浇涓篨ML鏂囦欢</el-button> -->
+                <XTextButton title="涓嬭浇涓篨ML鏂囦欢" @click="downloadProcessAsXml()" />
+                <br />
+
+                <!-- <el-button link @click="downloadProcessAsSvg()">涓嬭浇涓篠VG鏂囦欢</el-button> -->
+                <XTextButton title="涓嬭浇涓篠VG鏂囦欢" @click="downloadProcessAsSvg()" />
+                <br />
+
+                <!-- <el-button link @click="downloadProcessAsBpmn()">涓嬭浇涓築PMN鏂囦欢</el-button> -->
+                <XTextButton title="涓嬭浇涓築PMN鏂囦欢" @click="downloadProcessAsBpmn()" />
+              </div>
+            </template>
+            <XButton title="涓嬭浇鏂囦欢" preIcon="ep:download" />
+          </el-tooltip>
+          <el-tooltip effect="light">
+            <XButton preIcon="ep:view" title="娴忚" />
+            <template #content>
+              <!-- <el-button link @click="previewProcessXML">棰勮XML</el-button> -->
+              <XTextButton title="棰勮XML" @click="previewProcessXML" />
+              <br />
+              <!-- <el-button link @click="previewProcessJson">棰勮JSON</el-button> -->
+              <XTextButton title="棰勮JSON" @click="previewProcessJson" />
+            </template>
+          </el-tooltip>
+          <el-tooltip
+            v-if="props.simulation"
+            effect="light"
+            :content="simulationStatus ? '閫�鍑烘ā鎷�' : '寮�鍚ā鎷�'"
+          >
+            <XButton preIcon="ep:cpu" title="妯℃嫙" @click="processSimulation" />
+          </el-tooltip>
+        </ElButtonGroup>
+        <ElButtonGroup key="align-control">
+          <el-tooltip effect="light" content="鍚戝乏瀵归綈">
+            <!-- <el-button
+              class="align align-left"
+              icon="el-icon-s-data"
+              @click="elementsAlign('left')"
+            /> -->
+            <XButton
+              preIcon="fa:align-left"
+              class="align align-bottom"
+              @click="elementsAlign('left')"
+            />
+          </el-tooltip>
+          <el-tooltip effect="light" content="鍚戝彸瀵归綈">
+            <!-- <el-button
+              class="align align-right"
+              icon="el-icon-s-data"
+              @click="elementsAlign('right')"
+            /> -->
+            <XButton
+              preIcon="fa:align-left"
+              class="align align-top"
+              @click="elementsAlign('right')"
+            />
+          </el-tooltip>
+          <el-tooltip effect="light" content="鍚戜笂瀵归綈">
+            <!-- <el-button
+              class="align align-top"
+              icon="el-icon-s-data"
+              @click="elementsAlign('top')"
+            /> -->
+            <XButton
+              preIcon="fa:align-left"
+              class="align align-left"
+              @click="elementsAlign('top')"
+            />
+          </el-tooltip>
+          <el-tooltip effect="light" content="鍚戜笅瀵归綈">
+            <!-- <el-button
+              class="align align-bottom"
+              icon="el-icon-s-data"
+              @click="elementsAlign('bottom')"
+            /> -->
+            <XButton
+              preIcon="fa:align-left"
+              class="align align-right"
+              @click="elementsAlign('bottom')"
+            />
+          </el-tooltip>
+          <el-tooltip effect="light" content="姘村钩灞呬腑">
+            <!-- <el-button
+              class="align align-center"
+              icon="el-icon-s-data"
+              @click="elementsAlign('center')"
+            /> -->
+            <!-- class="align align-center" -->
+            <XButton
+              preIcon="fa:align-left"
+              class="align align-center"
+              @click="elementsAlign('center')"
+            />
+          </el-tooltip>
+          <el-tooltip effect="light" content="鍨傜洿灞呬腑">
+            <!-- <el-button
+              class="align align-middle"
+              icon="el-icon-s-data"
+              @click="elementsAlign('middle')"
+            /> -->
+            <XButton
+              preIcon="fa:align-left"
+              class="align align-middle"
+              @click="elementsAlign('middle')"
+            />
+          </el-tooltip>
+        </ElButtonGroup>
+        <ElButtonGroup key="scale-control">
+          <el-tooltip effect="light" content="缂╁皬瑙嗗浘">
+            <!-- <el-button
+              :disabled="defaultZoom < 0.2"
+              icon="el-icon-zoom-out"
+              @click="processZoomOut()"
+            /> -->
+            <XButton
+              preIcon="ep:zoom-out"
+              @click="processZoomOut()"
+              :disabled="defaultZoom < 0.2"
+            />
+          </el-tooltip>
+          <el-button>{{ Math.floor(defaultZoom * 10 * 10) + '%' }}</el-button>
+          <el-tooltip effect="light" content="鏀惧ぇ瑙嗗浘">
+            <!-- <el-button
+              :disabled="defaultZoom > 4"
+              icon="el-icon-zoom-in"
+              @click="processZoomIn()"
+            /> -->
+            <XButton preIcon="ep:zoom-in" @click="processZoomIn()" :disabled="defaultZoom > 4" />
+          </el-tooltip>
+          <el-tooltip effect="light" content="閲嶇疆瑙嗗浘骞跺眳涓�">
+            <!-- <el-button icon="el-icon-c-scale-to-original" @click="processReZoom()" /> -->
+            <XButton preIcon="ep:scale-to-original" @click="processReZoom()" />
+          </el-tooltip>
+        </ElButtonGroup>
+        <ElButtonGroup key="stack-control">
+          <el-tooltip effect="light" content="鎾ら攢">
+            <!-- <el-button :disabled="!revocable" icon="el-icon-refresh-left" @click="processUndo()" /> -->
+            <XButton preIcon="ep:refresh-left" @click="processUndo()" :disabled="!revocable" />
+          </el-tooltip>
+          <el-tooltip effect="light" content="鎭㈠">
+            <!-- <el-button
+              :disabled="!recoverable"
+              icon="el-icon-refresh-right"
+              @click="processRedo()"
+            /> -->
+            <XButton preIcon="ep:refresh-right" @click="processRedo()" :disabled="!recoverable" />
+          </el-tooltip>
+          <el-tooltip effect="light" content="閲嶆柊缁樺埗">
+            <!-- <el-button icon="el-icon-refresh" @click="processRestart" /> -->
+            <XButton preIcon="ep:refresh" @click="processRestart()" />
+          </el-tooltip>
+        </ElButtonGroup>
+      </template>
+      <!-- 鐢ㄤ簬鎵撳紑鏈湴鏂囦欢-->
+      <input
+        type="file"
+        id="files"
+        ref="refFile"
+        style="display: none"
+        accept=".xml, .bpmn"
+        @change="importLocalFile"
+      />
+    </div>
+    <div class="my-process-designer__container">
+      <div
+        class="my-process-designer__canvas"
+        ref="bpmnCanvas"
+        id="bpmnCanvas"
+        style="width: 1680px; height: 800px"
+      ></div>
+      <!-- <div id="js-properties-panel" class="panel"></div> -->
+      <!-- <div class="my-process-designer__canvas" ref="bpmn-canvas"></div> -->
+    </div>
+    <Dialog
+      title="棰勮"
+      v-model="previewModelVisible"
+      width="80%"
+      :scroll="true"
+      max-height="600px"
+    >
+      <div>
+        <pre><code v-dompurify-html="highlightedCode(previewResult)" class="hljs"></code></pre>
+      </div>
+    </Dialog>
+  </div>
+</template>
+
+<script lang="ts" setup>
+// import 'bpmn-js/dist/assets/diagram-js.css' // 宸﹁竟宸ュ叿鏍忎互鍙婄紪杈戣妭鐐圭殑鏍峰紡
+// import 'bpmn-js/dist/assets/bpmn-font/css/bpmn.css'
+// import 'bpmn-js/dist/assets/bpmn-font/css/bpmn-codes.css'
+// import 'bpmn-js/dist/assets/bpmn-font/css/bpmn-embedded.css'
+// import 'bpmn-js-properties-panel/dist/assets/bpmn-js-properties-panel.css' // 鍙充晶妗嗘牱寮�
+import { ElMessage, ElMessageBox } from 'element-plus'
+import BpmnModeler from 'bpmn-js/lib/Modeler'
+import DefaultEmptyXML from './plugins/defaultEmpty'
+// 缈昏瘧鏂规硶
+import customTranslate from './plugins/translate/customTranslate'
+import translationsCN from './plugins/translate/zh'
+// 妯℃嫙娴佽浆娴佺▼
+import tokenSimulation from 'bpmn-js-token-simulation'
+// 鏍囩瑙f瀽鏋勫缓鍣�
+// import bpmnPropertiesProvider from "bpmn-js-properties-panel/lib/provider/bpmn";
+// import propertiesPanelModule from 'bpmn-js-properties-panel'
+// import propertiesProviderModule from 'bpmn-js-properties-panel/lib/provider/camunda'
+// 鏍囩瑙f瀽 Moddle
+import camundaModdleDescriptor from './plugins/descriptor/camundaDescriptor.json'
+import activitiModdleDescriptor from './plugins/descriptor/activitiDescriptor.json'
+import flowableModdleDescriptor from './plugins/descriptor/flowableDescriptor.json'
+// 鏍囩瑙f瀽 Extension
+import camundaModdleExtension from './plugins/extension-moddle/camunda'
+import activitiModdleExtension from './plugins/extension-moddle/activiti'
+import flowableModdleExtension from './plugins/extension-moddle/flowable'
+// 寮曞叆json杞崲涓庨珮浜�
+// import xml2js from 'xml-js'
+// import xml2js from 'fast-xml-parser'
+import { XmlNode, XmlNodeType, parseXmlString } from 'steady-xml'
+// 浠g爜楂樹寒鎻掍欢
+// import hljs from 'highlight.js/lib/highlight'
+// import 'highlight.js/styles/github-gist.css'
+// hljs.registerLanguage('xml', 'highlight.js/lib/languages/xml')
+// hljs.registerLanguage('json', 'highlight.js/lib/languages/json')
+// const eventName = reactive({
+//   name: ''
+// })
+import hljs from 'highlight.js' // 瀵煎叆浠g爜楂樹寒鏂囦欢
+import 'highlight.js/styles/github.css' // 瀵煎叆浠g爜楂樹寒鏍峰紡
+
+defineOptions({ name: 'MyProcessDesigner' })
+
+const bpmnCanvas = ref()
+const refFile = ref()
+const emit = defineEmits([
+  'destroy',
+  'init-finished',
+  'save',
+  'commandStack-changed',
+  'input',
+  'change',
+  'canvas-viewbox-changed',
+  // eventName.name
+  'element-click'
+])
+
+const props = defineProps({
+  value: String, // xml 瀛楃涓�
+  // valueWatch: true, // xml 瀛楃涓茬殑 watch 鐘舵��
+  processId: String, // 娴佺▼ key 鏍囪瘑
+  processName: String, // 娴佺▼ name 鍚嶅瓧
+  formId: Number, // 娴佺▼ form 琛ㄥ崟缂栧彿
+  translations: {
+    // 鑷畾涔夌殑缈昏瘧鏂囦欢
+    type: Object,
+    default: () => {}
+  },
+  additionalModel: [Object, Array], // 鑷畾涔塵odel
+  moddleExtension: {
+    // 鑷畾涔塵oddle
+    type: Object,
+    default: () => {}
+  },
+  onlyCustomizeAddi: {
+    type: Boolean,
+    default: false
+  },
+  onlyCustomizeModdle: {
+    type: Boolean,
+    default: false
+  },
+  simulation: {
+    type: Boolean,
+    default: true
+  },
+  keyboard: {
+    type: Boolean,
+    default: true
+  },
+  prefix: {
+    type: String,
+    default: 'camunda'
+  },
+  events: {
+    type: Array,
+    default: () => ['element.click']
+  },
+  headerButtonSize: {
+    type: String,
+    default: 'small',
+    validator: (value: string) => ['default', 'medium', 'small', 'mini'].indexOf(value) !== -1
+  },
+  headerButtonType: {
+    type: String,
+    default: 'primary',
+    validator: (value: string) =>
+      ['default', 'primary', 'success', 'warning', 'danger', 'info'].indexOf(value) !== -1
+  }
+})
+
+/**
+ * 浠g爜楂樹寒
+ */
+const highlightedCode = (code: string) => {
+  // 楂樹寒
+  if (previewType.value === 'json') {
+    code = JSON.stringify(code, null, 2)
+  }
+  const result = hljs.highlight(code, { language: previewType.value, ignoreIllegals: true })
+  return result.value || '&nbsp;'
+}
+
+provide('configGlobal', props)
+let bpmnModeler: any = null
+const defaultZoom = ref(1)
+const previewModelVisible = ref(false)
+const simulationStatus = ref(false)
+const previewResult = ref('')
+const previewType = ref('xml')
+const recoverable = ref(false)
+const revocable = ref(false)
+const additionalModules = computed(() => {
+  console.log(props.additionalModel, 'additionalModel')
+  const Modules: any[] = []
+  // 浠呬繚鐣欑敤鎴疯嚜瀹氫箟鎵╁睍妯″潡
+  if (props.onlyCustomizeAddi) {
+    if (Object.prototype.toString.call(props.additionalModel) == '[object Array]') {
+      return props.additionalModel || []
+    }
+    return [props.additionalModel]
+  }
+
+  // 鎻掑叆鐢ㄦ埛鑷畾涔夋墿灞曟ā鍧�
+  if (Object.prototype.toString.call(props.additionalModel) == '[object Array]') {
+    Modules.push(...(props.additionalModel as any[]))
+  } else {
+    props.additionalModel && Modules.push(props.additionalModel)
+  }
+
+  // 缈昏瘧妯″潡
+  const TranslateModule = {
+    translate: ['value', customTranslate(props.translations || translationsCN)]
+  }
+  Modules.push(TranslateModule)
+
+  // 妯℃嫙娴佽浆妯″潡
+  if (props.simulation) {
+    Modules.push(tokenSimulation)
+  }
+
+  // 鏍规嵁闇�瑕佺殑娴佺▼绫诲瀷璁剧疆鎵╁睍鍏冪礌鏋勫缓妯″潡
+  // if (this.prefix === "bpmn") {
+  //   Modules.push(bpmnModdleExtension);
+  // }
+  console.log(props.prefix, 'props.prefix ')
+  if (props.prefix === 'camunda') {
+    Modules.push(camundaModdleExtension)
+  }
+  if (props.prefix === 'flowable') {
+    Modules.push(flowableModdleExtension)
+  }
+  if (props.prefix === 'activiti') {
+    Modules.push(activitiModdleExtension)
+  }
+
+  return Modules
+})
+const moddleExtensions = computed(() => {
+  console.log(props.onlyCustomizeModdle, 'props.onlyCustomizeModdle')
+  console.log(props.moddleExtension, 'props.moddleExtension')
+  console.log(props.prefix, 'props.prefix')
+  const Extensions: any = {}
+  // 浠呬娇鐢ㄧ敤鎴疯嚜瀹氫箟妯″潡
+  if (props.onlyCustomizeModdle) {
+    return props.moddleExtension || null
+  }
+
+  // 鎻掑叆鐢ㄦ埛鑷畾涔夋ā鍧�
+  if (props.moddleExtension) {
+    for (let key in props.moddleExtension) {
+      Extensions[key] = props.moddleExtension[key]
+    }
+  }
+
+  // 鏍规嵁闇�瑕佺殑 "娴佺▼绫诲瀷" 璁剧疆 瀵瑰簲鐨勮В鏋愭枃浠�
+  if (props.prefix === 'activiti') {
+    Extensions.activiti = activitiModdleDescriptor
+  }
+  if (props.prefix === 'flowable') {
+    Extensions.flowable = flowableModdleDescriptor
+  }
+  if (props.prefix === 'camunda') {
+    Extensions.camunda = camundaModdleDescriptor
+  }
+  return Extensions
+})
+console.log(additionalModules, 'additionalModules()')
+console.log(moddleExtensions, 'moddleExtensions()')
+const initBpmnModeler = () => {
+  if (bpmnModeler) return
+  let data = document.getElementById('bpmnCanvas')
+  console.log(data, 'data')
+  console.log(props.keyboard, 'props.keyboard')
+  console.log(additionalModules, 'additionalModules()')
+  console.log(moddleExtensions, 'moddleExtensions()')
+
+  bpmnModeler = new BpmnModeler({
+    // container: this.$refs['bpmn-canvas'],
+    // container: getCurrentInstance(),
+    // container: needClass,
+    // container: bpmnCanvas.value,
+    container: data,
+    // width: '100%',
+    // 娣诲姞鎺у埗鏉�
+    // propertiesPanel: {
+    // parent: '#js-properties-panel'
+    // },
+    keyboard: props.keyboard ? { bindTo: document } : null,
+    // additionalModules: additionalModules.value,
+    additionalModules: additionalModules.value,
+    moddleExtensions: moddleExtensions.value
+
+    // additionalModules: [
+    // additionalModules.value
+    // propertiesPanelModule,
+    // propertiesProviderModule
+    // propertiesProviderModule
+    // ],
+    // moddleExtensions: { camunda: moddleExtensions.value }
+  })
+
+  // bpmnModeler.createDiagram()
+
+  // console.log(bpmnModeler, 'bpmnModeler111111')
+  emit('init-finished', bpmnModeler)
+  initModelListeners()
+}
+
+const initModelListeners = () => {
+  const EventBus = bpmnModeler.get('eventBus')
+  console.log(EventBus, 'EventBus')
+  // 娉ㄥ唽闇�瑕佺殑鐩戝惉浜嬩欢, 灏�. 鏇挎崲涓� - , 閬垮厤瑙f瀽寮傚父
+  props.events.forEach((event: any) => {
+    EventBus.on(event, function (eventObj) {
+      let eventName = event.replace(/\./g, '-')
+      // eventName.name = eventName
+      let element = eventObj ? eventObj.element : null
+      console.log(eventName, 'eventName')
+      console.log(element, 'element')
+      emit('element-click', element, eventObj)
+      // emit(eventName, element, eventObj)
+    })
+  })
+  // 鐩戝惉鍥惧舰鏀瑰彉杩斿洖xml
+  EventBus.on('commandStack.changed', async (event) => {
+    try {
+      recoverable.value = bpmnModeler.get('commandStack').canRedo()
+      revocable.value = bpmnModeler.get('commandStack').canUndo()
+      let { xml } = await bpmnModeler.saveXML({ format: true })
+      emit('commandStack-changed', event)
+      emit('input', xml)
+      emit('change', xml)
+      emit('save', xml)
+    } catch (e: any) {
+      console.error(`[Process Designer Warn]: ${e.message || e}`)
+    }
+  })
+  // 鐩戝惉瑙嗗浘缂╂斁鍙樺寲
+  bpmnModeler.on('canvas.viewbox.changed', ({ viewbox }) => {
+    emit('canvas-viewbox-changed', { viewbox })
+    const { scale } = viewbox
+    defaultZoom.value = Math.floor(scale * 100) / 100
+  })
+}
+/* 鍒涘缓鏂扮殑娴佺▼鍥� */
+const createNewDiagram = async (xml) => {
+  console.log(xml, 'xml')
+  // 灏嗗瓧绗︿覆杞崲鎴愬浘鏄剧ず鍑烘潵
+  let newId = props.processId || `Process_${new Date().getTime()}`
+  let newName = props.processName || `涓氬姟娴佺▼_${new Date().getTime()}`
+  let xmlString = xml || DefaultEmptyXML(newId, newName, props.prefix)
+  try {
+    // console.log(xmlString, 'xmlString')
+    // console.log(this.bpmnModeler.importXML);
+    let { warnings } = await bpmnModeler.importXML(xmlString)
+    console.log(warnings, 'warnings')
+    if (warnings && warnings.length) {
+      warnings.forEach((warn) => console.warn(warn))
+    }
+  } catch (e: any) {
+    console.error(`[Process Designer Warn]: ${e.message || e}`)
+  }
+}
+
+// 涓嬭浇娴佺▼鍥惧埌鏈湴
+const downloadProcess = async (type) => {
+  try {
+    // 鎸夐渶瑕佺被鍨嬪垱寤烘枃浠跺苟涓嬭浇
+    if (type === 'xml' || type === 'bpmn') {
+      const { err, xml } = await bpmnModeler.saveXML()
+      // 璇诲彇寮傚父鏃舵姏鍑哄紓甯�
+      if (err) {
+        console.error(`[Process Designer Warn ]: ${err.message || err}`)
+      }
+      let { href, filename } = setEncoded(type.toUpperCase(), xml)
+      downloadFunc(href, filename)
+    } else {
+      const { err, svg } = await bpmnModeler.saveSVG()
+      // 璇诲彇寮傚父鏃舵姏鍑哄紓甯�
+      if (err) {
+        return console.error(err)
+      }
+      let { href, filename } = setEncoded('SVG', svg)
+      downloadFunc(href, filename)
+    }
+  } catch (e: any) {
+    console.error(`[Process Designer Warn ]: ${e.message || e}`)
+  }
+  // 鏂囦欢涓嬭浇鏂规硶
+  function downloadFunc(href, filename) {
+    if (href && filename) {
+      let a = document.createElement('a')
+      a.download = filename //鎸囧畾涓嬭浇鐨勬枃浠跺悕
+      a.href = href //  URL瀵硅薄
+      a.click() // 妯℃嫙鐐瑰嚮
+      URL.revokeObjectURL(a.href) // 閲婃斁URL 瀵硅薄
+    }
+  }
+}
+
+// 鏍规嵁鎵�闇�绫诲瀷杩涜杞爜骞惰繑鍥炰笅杞藉湴鍧�
+const setEncoded = (type, data) => {
+  const filename = 'diagram'
+  const encodedData = encodeURIComponent(data)
+  return {
+    filename: `${filename}.${type}`,
+    href: `data:application/${
+      type === 'svg' ? 'text/xml' : 'bpmn20-xml'
+    };charset=UTF-8,${encodedData}`,
+    data: data
+  }
+}
+
+// 鍔犺浇鏈湴鏂囦欢
+const importLocalFile = () => {
+  const file = refFile.value.files[0]
+  const reader = new FileReader()
+  reader.readAsText(file)
+  reader.onload = function () {
+    let xmlStr = this.result
+    createNewDiagram(xmlStr)
+    emit('save', xmlStr)
+  }
+}
+/* ------------------------------------------------ refs methods ------------------------------------------------------ */
+const downloadProcessAsXml = () => {
+  downloadProcess('xml')
+}
+const downloadProcessAsBpmn = () => {
+  downloadProcess('bpmn')
+}
+const downloadProcessAsSvg = () => {
+  downloadProcess('svg')
+}
+const processSimulation = () => {
+  simulationStatus.value = !simulationStatus.value
+  console.log(bpmnModeler.get('toggleMode', 'strict'), "bpmnModeler.get('toggleMode')")
+  props.simulation && bpmnModeler.get('toggleMode', 'strict').toggleMode()
+}
+const processRedo = () => {
+  bpmnModeler.get('commandStack').redo()
+}
+const processUndo = () => {
+  bpmnModeler.get('commandStack').undo()
+}
+const processZoomIn = (zoomStep = 0.1) => {
+  let newZoom = Math.floor(defaultZoom.value * 100 + zoomStep * 100) / 100
+  if (newZoom > 4) {
+    throw new Error('[Process Designer Warn ]: The zoom ratio cannot be greater than 4')
+  }
+  defaultZoom.value = newZoom
+  bpmnModeler.get('canvas').zoom(defaultZoom.value)
+}
+const processZoomOut = (zoomStep = 0.1) => {
+  let newZoom = Math.floor(defaultZoom.value * 100 - zoomStep * 100) / 100
+  if (newZoom < 0.2) {
+    throw new Error('[Process Designer Warn ]: The zoom ratio cannot be less than 0.2')
+  }
+  defaultZoom.value = newZoom
+  bpmnModeler.get('canvas').zoom(defaultZoom.value)
+}
+const processReZoom = () => {
+  defaultZoom.value = 1
+  bpmnModeler.get('canvas').zoom('fit-viewport', 'auto')
+}
+const processRestart = () => {
+  recoverable.value = false
+  revocable.value = false
+  createNewDiagram(null)
+}
+const elementsAlign = (align) => {
+  const Align = bpmnModeler.get('alignElements')
+  const Selection = bpmnModeler.get('selection')
+  const SelectedElements = Selection.get()
+  if (!SelectedElements || SelectedElements.length <= 1) {
+    ElMessage.warning('璇锋寜浣� Shift 閿�夋嫨澶氫釜鍏冪礌瀵归綈')
+    // alert('璇锋寜浣� Ctrl 閿�夋嫨澶氫釜鍏冪礌瀵归綈
+    return
+  }
+  ElMessageBox.confirm('鑷姩瀵归綈鍙兘閫犳垚鍥惧舰鍙樺舰锛屾槸鍚︾户缁紵', '璀﹀憡', {
+    confirmButtonText: '纭畾',
+    cancelButtonText: '鍙栨秷',
+    type: 'warning'
+  }).then(() => {
+    Align.trigger(SelectedElements, align)
+  })
+}
+/*-----------------------------    鏂规硶缁撴潫     ---------------------------------*/
+const previewProcessXML = () => {
+  console.log(bpmnModeler.saveXML, 'bpmnModeler')
+  bpmnModeler.saveXML({ format: true }).then(({ xml }) => {
+    // console.log(xml, 'xml111111')
+    previewResult.value = xml
+    previewType.value = 'xml'
+    previewModelVisible.value = true
+  })
+}
+const previewProcessJson = () => {
+  bpmnModeler.saveXML({ format: true }).then(({ xml }) => {
+    const rootNodes = new XmlNode(XmlNodeType.Root, parseXmlString(xml))
+    previewResult.value = rootNodes.parent?.toJSON() as unknown as string
+    previewType.value = 'json'
+    previewModelVisible.value = true
+  })
+}
+
+/* ------------------------------------------------ 鑺嬮亾婧愮爜 methods ------------------------------------------------------ */
+onMounted(() => {
+  initBpmnModeler()
+  createNewDiagram(props.value)
+})
+onBeforeUnmount(() => {
+  if (bpmnModeler) bpmnModeler.destroy()
+  emit('destroy', bpmnModeler)
+  bpmnModeler = null
+})
+</script>

--
Gitblit v1.8.0