ProcessDesign.vue 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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. @success="handleDesignSuccess"
  11. />
  12. </template>
  13. <!-- Simple设计器 -->
  14. <template v-else>
  15. <SimpleModelDesign
  16. v-if="showDesigner"
  17. :model-id="modelData.id"
  18. :model-key="modelData.key"
  19. :model-name="modelData.name"
  20. :value="modelData.bpmnXml"
  21. @success="handleDesignSuccess"
  22. />
  23. </template>
  24. </template>
  25. <script lang="ts" setup>
  26. import { BpmModelType } from '@/utils/constants'
  27. import BpmModelEditor from '../editor/index.vue'
  28. import SimpleModelDesign from '../../simple/SimpleModelDesign.vue'
  29. const props = defineProps({
  30. modelValue: {
  31. type: Object,
  32. required: true
  33. }
  34. })
  35. const emit = defineEmits(['update:modelValue', 'success'])
  36. const xmlString = ref<string>()
  37. // 创建本地数据副本
  38. const modelData = computed({
  39. get: () => props.modelValue,
  40. set: (val) => emit('update:modelValue', val)
  41. })
  42. // 监听modelValue变化,确保XML数据同步
  43. watch(() => props.modelValue, (newVal) => {
  44. if (newVal.bpmnXml) {
  45. xmlString.value = newVal.bpmnXml
  46. }
  47. }, { immediate: true, deep: true })
  48. /** 处理设计器保存成功 */
  49. const handleDesignSuccess = (bpmnXml?: string) => {
  50. if (bpmnXml) {
  51. xmlString.value = bpmnXml
  52. emit('update:modelValue', {
  53. ...modelData.value,
  54. bpmnXml
  55. })
  56. emit('success', bpmnXml)
  57. }
  58. }
  59. /** 表单校验 */
  60. const validate = async () => {
  61. if (!xmlString.value) {
  62. throw new Error('请设计流程')
  63. }
  64. return true
  65. }
  66. /** 是否显示设计器 */
  67. const showDesigner = computed(() => {
  68. return Boolean(modelData.value.key && modelData.value.name)
  69. })
  70. defineExpose({
  71. validate,
  72. getXmlString: () => xmlString.value
  73. })
  74. </script>