ProcessDesign.vue 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  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 getProcessData = async () => {
  47. try {
  48. if (modelData.value.type === BpmModelType.BPMN) {
  49. // BPMN设计器
  50. if (bpmnEditorRef.value) {
  51. const { xml } = await bpmnEditorRef.value.saveXML()
  52. if (xml) {
  53. return xml
  54. }
  55. }
  56. } else {
  57. // Simple设计器
  58. if (simpleEditorRef.value) {
  59. const flowData = await simpleEditorRef.value.getCurrentFlowData()
  60. if (flowData) {
  61. return flowData // 直接返回流程数据对象,不需要转换为字符串
  62. }
  63. }
  64. }
  65. return undefined
  66. } catch (error) {
  67. console.error('获取流程数据失败:', error)
  68. return undefined
  69. }
  70. }
  71. /** 表单校验 */
  72. const validate = async () => {
  73. try {
  74. // 根据流程类型获取对应的编辑器引用
  75. const editorRef =
  76. modelData.value.type === BpmModelType.BPMN ? bpmnEditorRef.value : simpleEditorRef.value
  77. if (!editorRef) {
  78. throw new Error('流程设计器未初始化')
  79. }
  80. // 获取最新的流程数据
  81. const processData = await getProcessData()
  82. if (!processData) {
  83. throw new Error('请设计流程')
  84. }
  85. return true
  86. } catch (error) {
  87. throw error
  88. }
  89. }
  90. /** 处理设计器保存成功 */
  91. const handleDesignSuccess = (data?: any) => {
  92. if (data) {
  93. if (modelData.value.type === BpmModelType.BPMN) {
  94. modelData.value = {
  95. ...modelData.value,
  96. bpmnXml: data,
  97. simpleModel: null
  98. }
  99. } else {
  100. modelData.value = {
  101. ...modelData.value,
  102. bpmnXml: null,
  103. simpleModel: data
  104. }
  105. }
  106. emit('success', data)
  107. }
  108. }
  109. /** 是否显示设计器 */
  110. const showDesigner = computed(() => {
  111. return Boolean(modelData.value?.key && modelData.value?.name)
  112. })
  113. defineExpose({
  114. validate,
  115. getProcessData
  116. })
  117. </script>