index.vue 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. <template>
  2. <ContentWrap>
  3. <!-- 流程设计器,负责绘制流程等 -->
  4. <MyProcessDesigner
  5. key="designer"
  6. v-model="xmlString"
  7. :value="xmlString"
  8. v-bind="controlForm"
  9. keyboard
  10. ref="processDesigner"
  11. @init-finished="initModeler"
  12. :additionalModel="controlForm.additionalModel"
  13. :model="model"
  14. @save="save"
  15. :process-id="modelKey"
  16. :process-name="modelName"
  17. />
  18. <!-- 流程属性器,负责编辑每个流程节点的属性 -->
  19. <MyProcessPenal
  20. v-if="modeler"
  21. key="penal"
  22. :bpmnModeler="modeler"
  23. :prefix="controlForm.prefix"
  24. class="process-panel"
  25. :model="model"
  26. />
  27. </ContentWrap>
  28. </template>
  29. <script lang="ts" setup>
  30. import { MyProcessDesigner, MyProcessPenal } from '@/components/bpmnProcessDesigner/package'
  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 * as ModelApi from '@/api/bpm/model'
  36. defineOptions({ name: 'BpmModelEditor' })
  37. const props = defineProps<{
  38. modelId?: string
  39. modelKey: string
  40. modelName: string
  41. value?: string
  42. }>()
  43. const emit = defineEmits(['success', 'init-finished'])
  44. const message = useMessage() // 国际化
  45. // 表单信息
  46. const formFields = ref<string[]>([])
  47. const formType = ref(20)
  48. provide('formFields', formFields)
  49. provide('formType', formType)
  50. // 注入流程数据
  51. const xmlString = inject('processData') as Ref
  52. // 注入模型数据
  53. const modelData = inject('modelData') as Ref
  54. const modeler = shallowRef() // BPMN Modeler
  55. const processDesigner = ref()
  56. const controlForm = ref({
  57. simulation: true,
  58. labelEditing: false,
  59. labelVisible: false,
  60. prefix: 'flowable',
  61. headerButtonSize: 'mini',
  62. additionalModel: [CustomContentPadProvider, CustomPaletteProvider]
  63. })
  64. const model = ref<ModelApi.ModelVO>() // 流程模型的信息
  65. /** 初始化 modeler */
  66. // TODO @zws:需要初始化,不然首次创建后,无法发布!相当于说,key、name 要去赋值下
  67. const initModeler = async (item) => {
  68. //先初始化模型数据
  69. model.value = modelData.value
  70. modeler.value = item
  71. }
  72. /** 添加/修改模型 */
  73. const save = async (bpmnXml: string) => {
  74. try {
  75. xmlString.value = bpmnXml
  76. emit('success', bpmnXml)
  77. } catch (error) {
  78. console.error('保存失败:', error)
  79. message.error('保存失败')
  80. }
  81. }
  82. // 在组件卸载时清理
  83. onBeforeUnmount(() => {
  84. modeler.value = null
  85. // 清理全局实例
  86. const w = window as any
  87. if (w.bpmnInstances) {
  88. w.bpmnInstances = null
  89. }
  90. })
  91. </script>
  92. <style lang="scss">
  93. .process-panel__container {
  94. position: absolute;
  95. top: 172px;
  96. right: 70px;
  97. }
  98. </style>