modelEditor.vue 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. <template>
  2. <div class="app-container">
  3. <!-- 流程设计器,负责绘制流程等 -->
  4. <my-process-designer :key="`designer-${reloadIndex}`" v-model="xmlString" v-bind="controlForm"
  5. keyboard ref="processDesigner" @init-finished="initModeler"
  6. @save="save"/>
  7. <!-- 流程属性器,负责编辑每个流程节点的属性 -->
  8. <my-properties-panel :key="`penal-${reloadIndex}`" :bpmn-modeler="modeler" :prefix="controlForm.prefix" class="process-panel"
  9. :model="model" />
  10. </div>
  11. </template>
  12. <script>
  13. import translations from "@/components/bpmnProcessDesigner/src/translations";
  14. // 自定义元素选中时的弹出菜单(修改 默认任务 为 用户任务)
  15. import CustomContentPadProvider from "@/components/bpmnProcessDesigner/package/designer/plugins/content-pad";
  16. // 自定义左侧菜单(修改 默认任务 为 用户任务)
  17. import CustomPaletteProvider from "@/components/bpmnProcessDesigner/package/designer/plugins/palette";
  18. // import xmlObj2json from "./utils/xml2json";
  19. import MyProcessPalette from "@/components/bpmnProcessDesigner/package/palette/ProcessPalette";
  20. import {createModel, getModel, updateModel} from "@/api/bpm/model";
  21. // 自定义侧边栏
  22. // import MyProcessPanel from "../package/process-panel/ProcessPanel";
  23. export default {
  24. name: "App",
  25. components: { MyProcessPalette },
  26. data() {
  27. return {
  28. xmlString: "", // BPMN XML
  29. modeler: null,
  30. reloadIndex: 0,
  31. controlDrawerVisible: false,
  32. translationsSelf: translations,
  33. controlForm: {
  34. simulation: true,
  35. labelEditing: false,
  36. labelVisible: false,
  37. prefix: "flowable",
  38. headerButtonSize: "mini",
  39. additionalModel: [CustomContentPadProvider, CustomPaletteProvider]
  40. },
  41. addis: {
  42. CustomContentPadProvider,
  43. CustomPaletteProvider
  44. },
  45. // 流程模型的信息
  46. model: {},
  47. };
  48. },
  49. created() {
  50. // 如果 modelId 非空,说明是修改流程模型
  51. const modelId = this.$route.query && this.$route.query.modelId
  52. if (modelId) {
  53. getModel(modelId).then(response => {
  54. this.xmlString = response.data.bpmnXml
  55. this.model = {
  56. ...response.data,
  57. bpmnXml: undefined, // 清空 bpmnXml 属性
  58. }
  59. // this.controlForm.processId = response.data.key
  60. })
  61. }
  62. },
  63. methods: {
  64. initModeler(modeler) {
  65. setTimeout(() => {
  66. this.modeler = modeler;
  67. console.log(modeler);
  68. }, 10);
  69. },
  70. reloadProcessDesigner(deep) {
  71. this.controlForm.additionalModel = [];
  72. for (let key in this.addis) {
  73. if (this.addis[key]) {
  74. this.controlForm.additionalModel.push(this.addis[key]);
  75. }
  76. }
  77. deep && (this.xmlString = undefined);
  78. this.reloadIndex += 1;
  79. this.modeler = null; // 避免 panel 异常
  80. // if (deep) {
  81. // this.xmlString = undefined;
  82. // this.$refs.processDesigner.processRestart();
  83. // }
  84. },
  85. save(bpmnXml) {
  86. const data = {
  87. ...this.model,
  88. bpmnXml: bpmnXml, // this.bpmnXml 只是初始化流程图,后续修改无法通过它获得
  89. }
  90. // 修改的提交
  91. if (data.id) {
  92. updateModel(data).then(response => {
  93. this.$modal.msgSuccess("修改成功")
  94. // 跳转回去
  95. this.close()
  96. })
  97. return
  98. }
  99. // 添加的提交
  100. createModel(data).then(response => {
  101. this.$modal.msgSuccess("保存成功")
  102. // 跳转回去
  103. this.close()
  104. })
  105. },
  106. /** 关闭按钮 */
  107. close() {
  108. this.$tab.closeOpenPage({ path: "/bpm/manager/model" });
  109. },
  110. }
  111. };
  112. </script>
  113. <style lang="scss">
  114. //body {
  115. // overflow: hidden;
  116. // margin: 0;
  117. // box-sizing: border-box;
  118. //}
  119. //.app {
  120. // width: 100%;
  121. // height: 100%;
  122. // box-sizing: border-box;
  123. // display: inline-grid;
  124. // grid-template-columns: 100px auto max-content;
  125. //}
  126. .demo-control-bar {
  127. position: fixed;
  128. right: 8px;
  129. bottom: 8px;
  130. z-index: 1;
  131. .open-control-dialog {
  132. width: 48px;
  133. height: 48px;
  134. display: flex;
  135. align-items: center;
  136. justify-content: center;
  137. border-radius: 4px;
  138. font-size: 32px;
  139. background: rgba(64, 158, 255, 1);
  140. color: #ffffff;
  141. cursor: pointer;
  142. }
  143. }
  144. // TODO 芋艿:去掉多余的 faq
  145. //.info-tip {
  146. // position: fixed;
  147. // top: 40px;
  148. // right: 500px;
  149. // z-index: 10;
  150. // color: #999999;
  151. //}
  152. .control-form {
  153. .el-radio {
  154. width: 100%;
  155. line-height: 32px;
  156. }
  157. }
  158. .element-overlays {
  159. box-sizing: border-box;
  160. padding: 8px;
  161. background: rgba(0, 0, 0, 0.6);
  162. border-radius: 4px;
  163. color: #fafafa;
  164. }
  165. .my-process-designer {
  166. height: calc(100vh - 84px);
  167. }
  168. .process-panel__container {
  169. position: absolute;
  170. right: 0;
  171. top: 55px;
  172. height: calc(100vh - 84px);
  173. }
  174. </style>