ProcessDesign.vue 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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. @success="handleDesignSuccess"
  10. />
  11. </template>
  12. <!-- Simple设计器 -->
  13. <template v-else>
  14. <SimpleModelDesign
  15. v-if="showDesigner"
  16. :model-id="modelData.id"
  17. :model-key="modelData.key"
  18. :model-name="modelData.name"
  19. :start-user-ids="modelData.startUserIds"
  20. :start-dept-ids="modelData.startDeptIds"
  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. // 创建本地数据副本
  30. const modelData = defineModel<any>()
  31. const processData = inject('processData') as Ref
  32. /** 表单校验 */
  33. const validate = async () => {
  34. try {
  35. // 获取最新的流程数据
  36. if (!processData.value) {
  37. throw new Error('请设计流程')
  38. }
  39. return true
  40. } catch (error) {
  41. throw error
  42. }
  43. }
  44. /** 处理设计器保存成功 */
  45. const handleDesignSuccess = async (data?: any) => {
  46. if (data) {
  47. // 创建新的对象以触发响应式更新
  48. const newModelData = {
  49. ...modelData.value,
  50. bpmnXml: modelData.value.type === BpmModelType.BPMN ? data : null,
  51. simpleModel: modelData.value.type === BpmModelType.BPMN ? null : data
  52. }
  53. // 使用emit更新父组件的数据
  54. await nextTick()
  55. //更新表单的模型数据部分
  56. modelData.value = newModelData
  57. }
  58. }
  59. /** 是否显示设计器 */
  60. const showDesigner = computed(() => {
  61. return Boolean(modelData.value?.key && modelData.value?.name)
  62. })
  63. defineExpose({
  64. validate
  65. })
  66. </script>