modelEditor.vue 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. <template>
  2. <div class="app-container">
  3. <!-- 流程设计器,负责绘制流程等 -->
  4. <!-- <myProcessDesigner -->
  5. <my-process-designer
  6. :key="`designer-${reloadIndex}`"
  7. v-if="xmlString !== undefined"
  8. v-model="xmlString"
  9. :value="xmlString"
  10. v-bind="controlForm"
  11. keyboard
  12. ref="processDesigner"
  13. @init-finished="initModeler"
  14. :additionalModel="controlForm.additionalModel"
  15. @save="save"
  16. />
  17. <!-- 流程属性器,负责编辑每个流程节点的属性 -->
  18. <!-- <MyProcessPalette -->
  19. <my-properties-panel
  20. :key="`penal-${reloadIndex}`"
  21. :bpmnModeler="modeler"
  22. :prefix="controlForm.prefix"
  23. class="process-panel"
  24. :model="model"
  25. />
  26. </div>
  27. </template>
  28. <script setup lang="ts">
  29. import { ref, onMounted } from 'vue'
  30. // import { translations } from '@/components/bpmnProcessDesigner/src/translations'
  31. // 自定义元素选中时的弹出菜单(修改 默认任务 为 用户任务)
  32. import CustomContentPadProvider from '@/components/bpmnProcessDesigner/package/designer/plugins/content-pad'
  33. // 自定义左侧菜单(修改 默认任务 为 用户任务)
  34. import CustomPaletteProvider from '@/components/bpmnProcessDesigner/package/designer/plugins/palette'
  35. // import xmlObj2json from "./utils/xml2json";
  36. // import myProcessDesigner from '@/components/bpmnProcessDesigner/package/designer/ProcessDesigner.vue'
  37. // import MyProcessPalette from '@/components/bpmnProcessDesigner/package/palette/ProcessPalette.vue'
  38. import { createModelApi, getModelApi, updateModelApi } from '@/api/bpm/model'
  39. import { useRouter } from 'vue-router'
  40. import { ElMessage } from 'element-plus'
  41. const router = useRouter()
  42. // 自定义侧边栏
  43. // import MyProcessPanel from "../package/process-panel/ProcessPanel";
  44. const xmlString = ref(undefined) // BPMN XML
  45. const modeler = ref(null)
  46. const reloadIndex = ref(0)
  47. // const controlDrawerVisible = ref(false)
  48. // const translationsSelf = translations
  49. const controlForm = ref({
  50. simulation: true,
  51. labelEditing: false,
  52. labelVisible: false,
  53. prefix: 'flowable',
  54. headerButtonSize: 'mini',
  55. additionalModel: [CustomContentPadProvider, CustomPaletteProvider]
  56. })
  57. // const addis = ref({
  58. // CustomContentPadProvider,
  59. // CustomPaletteProvider
  60. // })
  61. // 流程模型的信息
  62. const model = ref({})
  63. onMounted(() => {
  64. // 如果 modelId 非空,说明是修改流程模型
  65. const modelId = router.currentRoute.value.query && router.currentRoute.value.query.modelId
  66. console.log(modelId, 'modelId')
  67. if (modelId) {
  68. // let data = '4b4909d8-97e7-11ec-8e20-862bc1a4a054'
  69. getModelApi(modelId).then((data) => {
  70. console.log(data, 'response')
  71. xmlString.value = data.bpmnXml
  72. model.value = {
  73. ...data,
  74. bpmnXml: undefined // 清空 bpmnXml 属性
  75. }
  76. // this.controlForm.processId = data.key
  77. // xmlString.value =
  78. // '<?xml version="1.0" encoding="UTF-8"?>\n<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="diagram_Process_1645980650311" targetNamespace="http://activiti.org/bpmn"><bpmn2:process id="flowable_01" name="flowable测试" isExecutable="true"><bpmn2:startEvent id="Event_1iruxim"><bpmn2:outgoing>Flow_0804gmo</bpmn2:outgoing></bpmn2:startEvent><bpmn2:userTask id="task01" name="task01"><bpmn2:incoming>Flow_0804gmo</bpmn2:incoming><bpmn2:outgoing>Flow_0cx479x</bpmn2:outgoing></bpmn2:userTask><bpmn2:sequenceFlow id="Flow_0804gmo" sourceRef="Event_1iruxim" targetRef="task01" /><bpmn2:endEvent id="Event_1mdsccz"><bpmn2:incoming>Flow_0cx479x</bpmn2:incoming></bpmn2:endEvent><bpmn2:sequenceFlow id="Flow_0cx479x" sourceRef="task01" targetRef="Event_1mdsccz" /></bpmn2:process><bpmndi:BPMNDiagram id="BPMNDiagram_1"><bpmndi:BPMNPlane id="flowable_01_di" bpmnElement="flowable_01"><bpmndi:BPMNEdge id="Flow_0cx479x_di" bpmnElement="Flow_0cx479x"><di:waypoint x="440" y="350" /><di:waypoint x="492" y="350" /></bpmndi:BPMNEdge><bpmndi:BPMNEdge id="Flow_0804gmo_di" bpmnElement="Flow_0804gmo"><di:waypoint x="288" y="350" /><di:waypoint x="340" y="350" /></bpmndi:BPMNEdge><bpmndi:BPMNShape id="Event_1iruxim_di" bpmnElement="Event_1iruxim"><dc:Bounds x="252" y="332" width="36" height="36" /></bpmndi:BPMNShape><bpmndi:BPMNShape id="task01_di" bpmnElement="task01"><dc:Bounds x="340" y="310" width="100" height="80" /></bpmndi:BPMNShape><bpmndi:BPMNShape id="Event_1mdsccz_di" bpmnElement="Event_1mdsccz"><dc:Bounds x="492" y="332" width="36" height="36" /></bpmndi:BPMNShape></bpmndi:BPMNPlane></bpmndi:BPMNDiagram></bpmn2:definitions>'
  79. // model.value = {
  80. // key: 'flowable_01',
  81. // name: 'flowable测试',
  82. // description: 'ooxx',
  83. // category: '1',
  84. // formType: 10,
  85. // formId: 11,
  86. // formCustomCreatePath: null,
  87. // formCustomViewPath: null,
  88. // id: '4b4909d8-97e7-11ec-8e20-862bc1a4a054',
  89. // createTime: 1645978019795,
  90. // bpmnXml: undefined // 清空 bpmnXml 属性
  91. // }
  92. // console.log(modeler.value, 'modeler11111111')
  93. })
  94. }
  95. })
  96. const initModeler = (item) => {
  97. setTimeout(() => {
  98. modeler.value = item
  99. console.log(item, 'initModeler方法modeler')
  100. console.log(modeler.value, 'initModeler方法modeler')
  101. // controlForm.value.prefix = '2222'
  102. }, 10)
  103. }
  104. const save = (bpmnXml) => {
  105. const data = {
  106. ...model.value,
  107. bpmnXml: bpmnXml // this.bpmnXml 只是初始化流程图,后续修改无法通过它获得
  108. }
  109. console.log(data, 'data')
  110. // 修改的提交
  111. if (data.id) {
  112. updateModelApi(data).then((response) => {
  113. console.log(response, 'response')
  114. // this.$modal.msgSuccess("修改成功")
  115. ElMessage.success('修改成功')
  116. // 跳转回去
  117. close()
  118. })
  119. return
  120. }
  121. // 添加的提交
  122. createModelApi(data).then((response) => {
  123. console.log(response, 'response1')
  124. // this.$modal.msgSuccess("保存成功")
  125. ElMessage.success('保存成功')
  126. // 跳转回去
  127. close()
  128. })
  129. }
  130. /** 关闭按钮 */
  131. const close = () => {
  132. // this.$tab.closeOpenPage({ path: "/bpm/manager/model" })
  133. router.push({ path: '/bpm/manager/model' })
  134. }
  135. </script>
  136. <style lang="scss">
  137. //body {
  138. // overflow: hidden;
  139. // margin: 0;
  140. // box-sizing: border-box;
  141. //}
  142. //.app {
  143. // width: 100%;
  144. // height: 100%;
  145. // box-sizing: border-box;
  146. // display: inline-grid;
  147. // grid-template-columns: 100px auto max-content;
  148. //}
  149. .demo-control-bar {
  150. position: fixed;
  151. right: 8px;
  152. bottom: 8px;
  153. z-index: 1;
  154. .open-control-dialog {
  155. width: 48px;
  156. height: 48px;
  157. display: flex;
  158. align-items: center;
  159. justify-content: center;
  160. border-radius: 4px;
  161. font-size: 32px;
  162. background: rgba(64, 158, 255, 1);
  163. color: #ffffff;
  164. cursor: pointer;
  165. }
  166. }
  167. // TODO 芋艿:去掉多余的 faq
  168. //.info-tip {
  169. // position: fixed;
  170. // top: 40px;
  171. // right: 500px;
  172. // z-index: 10;
  173. // color: #999999;
  174. //}
  175. .control-form {
  176. .el-radio {
  177. width: 100%;
  178. line-height: 32px;
  179. }
  180. }
  181. .element-overlays {
  182. box-sizing: border-box;
  183. padding: 8px;
  184. background: rgba(0, 0, 0, 0.6);
  185. border-radius: 4px;
  186. color: #fafafa;
  187. }
  188. .my-process-designer {
  189. height: calc(100vh - 84px);
  190. }
  191. .process-panel__container {
  192. position: absolute;
  193. right: 0;
  194. top: 55px;
  195. height: calc(100vh - 84px);
  196. }
  197. </style>