ProcessDesign.vue 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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(
  44. () => props.modelValue,
  45. (newVal) => {
  46. if (newVal?.bpmnXml) {
  47. xmlString.value = newVal.bpmnXml
  48. }
  49. },
  50. { immediate: true, deep: true }
  51. )
  52. /** 处理设计器保存成功 */
  53. const handleDesignSuccess = (bpmnXml?: string) => {
  54. if (bpmnXml) {
  55. xmlString.value = bpmnXml
  56. modelData.value = {
  57. ...modelData.value,
  58. bpmnXml
  59. }
  60. emit('success', bpmnXml)
  61. }
  62. }
  63. /** 表单校验 */
  64. const validate = async () => {
  65. // 获取最新的XML数据
  66. const currentXml = xmlString.value || modelData.value?.bpmnXml
  67. // 如果是修改场景且有XML数据(无论是新的还是原有的)
  68. if (modelData.value.id && currentXml) {
  69. return true
  70. }
  71. // 新增场景必须有XML数据
  72. if (!currentXml) {
  73. throw new Error('请设计流程')
  74. }
  75. return true
  76. }
  77. /** 是否显示设计器 */
  78. const showDesigner = computed(() => {
  79. return Boolean(modelData.value?.key && modelData.value?.name)
  80. })
  81. /** 获取当前XML字符串 */
  82. const getXmlString = () => {
  83. return xmlString.value || modelData.value?.bpmnXml || ''
  84. }
  85. defineExpose({
  86. validate,
  87. getXmlString
  88. })
  89. </script>