ProcessDesign.vue 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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. emit('update:modelValue', {
  57. ...modelData.value,
  58. bpmnXml
  59. })
  60. emit('success', bpmnXml)
  61. }
  62. }
  63. /** 表单校验 */
  64. const validate = async () => {
  65. // 修改场景下,如果已有 modelData.bpmnXml 则不需要重新校验
  66. if (modelData.value.id && modelData.value.bpmnXml) {
  67. return true
  68. }
  69. // 新增场景或无 bpmnXml 时才校验
  70. if (!xmlString.value) {
  71. throw new Error('请设计流程')
  72. }
  73. return true
  74. }
  75. /** 是否显示设计器 */
  76. const showDesigner = computed(() => {
  77. return Boolean(modelData.value?.key && modelData.value?.name)
  78. })
  79. /** 获取当前XML字符串 */
  80. const getXmlString = () => {
  81. // 优先返回最新的 xmlString
  82. return xmlString.value || modelData.value?.bpmnXml
  83. }
  84. defineExpose({
  85. validate,
  86. getXmlString
  87. })
  88. </script>