ProcessDesign.vue 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. <template>
  2. <!-- BPMN设计器 -->
  3. <template v-if="modelData.type === BpmModelType.BPMN">
  4. <BpmModelEditor
  5. v-if="showDesigner"
  6. :model-id="modelData.id"
  7. :model-key="modelData.key"
  8. :model-name="modelData.name"
  9. :value="modelData.bpmnXml"
  10. ref="bpmnEditorRef"
  11. @success="handleDesignSuccess"
  12. />
  13. </template>
  14. <!-- Simple设计器 -->
  15. <template v-else>
  16. <SimpleModelDesign
  17. v-if="showDesigner"
  18. :model-id="modelData.id"
  19. :model-key="modelData.key"
  20. :model-name="modelData.name"
  21. :value="modelData.bpmnXml"
  22. ref="simpleEditorRef"
  23. @success="handleDesignSuccess"
  24. />
  25. </template>
  26. </template>
  27. <script lang="ts" setup>
  28. import { BpmModelType } from '@/utils/constants'
  29. import BpmModelEditor from '../editor/index.vue'
  30. import SimpleModelDesign from '../../simple/SimpleModelDesign.vue'
  31. const props = defineProps({
  32. modelValue: {
  33. type: Object,
  34. required: true
  35. }
  36. })
  37. const emit = defineEmits(['update:modelValue', 'success'])
  38. const bpmnEditorRef = ref()
  39. const simpleEditorRef = ref()
  40. // 创建本地数据副本
  41. const modelData = computed({
  42. get: () => props.modelValue,
  43. set: (val) => emit('update:modelValue', val)
  44. })
  45. /** 表单校验 */
  46. const validate = async () => {
  47. try {
  48. // 根据流程类型获取对应的编辑器引用
  49. const editorRef =
  50. modelData.value.type === BpmModelType.BPMN ? bpmnEditorRef.value : simpleEditorRef.value
  51. if (!editorRef) {
  52. throw new Error('流程设计器未初始化')
  53. }
  54. // 获取最新的XML数据
  55. const bpmnXml = await getXmlString()
  56. console.warn(bpmnXml, 'bpmnXml')
  57. if (!bpmnXml) {
  58. throw new Error('请设计流程')
  59. }
  60. return true
  61. } catch (error) {
  62. throw error
  63. }
  64. }
  65. /** 获取当前XML字符串 */
  66. const getXmlString = async () => {
  67. try {
  68. if (modelData.value.type === BpmModelType.BPMN) {
  69. // BPMN设计器
  70. if (bpmnEditorRef.value) {
  71. const { xml } = await bpmnEditorRef.value.saveXML()
  72. if (xml) {
  73. // 更新本地数据
  74. modelData.value = {
  75. ...modelData.value,
  76. bpmnXml: xml
  77. }
  78. }
  79. return xml
  80. }
  81. } else {
  82. // Simple设计器
  83. if (simpleEditorRef.value) {
  84. const flowData = await simpleEditorRef.value.getCurrentFlowData()
  85. if (flowData) {
  86. const jsonData = JSON.stringify(flowData)
  87. // 更新本地数据
  88. modelData.value = {
  89. ...modelData.value,
  90. bpmnXml: jsonData
  91. }
  92. return jsonData
  93. }
  94. }
  95. }
  96. return undefined
  97. } catch (error) {
  98. console.error('获取流程数据失败:', error)
  99. return undefined
  100. }
  101. }
  102. /** 处理设计器保存成功 */
  103. const handleDesignSuccess = (bpmnXml?: string) => {
  104. if (bpmnXml) {
  105. modelData.value = {
  106. ...modelData.value,
  107. bpmnXml
  108. }
  109. emit('success', bpmnXml)
  110. }
  111. }
  112. /** 是否显示设计器 */
  113. const showDesigner = computed(() => {
  114. return Boolean(modelData.value?.key && modelData.value?.name)
  115. })
  116. defineExpose({
  117. validate,
  118. getXmlString
  119. })
  120. </script>