SimpleModelDesign.vue 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. <template>
  2. <ContentWrap :bodyStyle="{ padding: '20px 16px' }">
  3. <SimpleProcessDesigner
  4. :model-id="modelId"
  5. :model-key="modelKey"
  6. :model-name="modelName"
  7. :value="currentValue"
  8. @success="handleSuccess"
  9. @init-finished="handleInit"
  10. :start-user-ids="startUserIds"
  11. ref="designerRef"
  12. />
  13. </ContentWrap>
  14. </template>
  15. <script setup lang="ts">
  16. import { SimpleProcessDesigner } from '@/components/SimpleProcessDesignerV2/src/'
  17. defineOptions({
  18. name: 'SimpleModelDesign'
  19. })
  20. const props = defineProps<{
  21. modelId?: string
  22. modelKey?: string
  23. modelName?: string
  24. value?: any
  25. startUserIds?: number[]
  26. }>()
  27. const emit = defineEmits(['success', 'init-finished'])
  28. const designerRef = ref()
  29. const isInitialized = ref(false)
  30. const currentValue = ref('')
  31. // 初始化或更新当前值
  32. const initOrUpdateValue = async () => {
  33. if (props.value) {
  34. currentValue.value = props.value
  35. // 如果设计器已经初始化,立即加载数据
  36. if (isInitialized.value && designerRef.value) {
  37. try {
  38. await designerRef.value.loadProcessData(props.value)
  39. await nextTick()
  40. if (designerRef.value.refresh) {
  41. await designerRef.value.refresh()
  42. }
  43. } catch (error) {
  44. console.error('加载流程数据失败:', error)
  45. }
  46. }
  47. }
  48. }
  49. // 监听属性变化
  50. watch(
  51. [() => props.modelKey, () => props.modelName, () => props.value],
  52. async ([newKey, newName, newValue], [oldKey, oldName, oldValue]) => {
  53. if (designerRef.value && isInitialized.value) {
  54. try {
  55. if (newKey && newName && (newKey !== oldKey || newName !== oldName)) {
  56. await designerRef.value.updateModel(newKey, newName)
  57. }
  58. if (newValue && newValue !== oldValue) {
  59. currentValue.value = newValue
  60. await designerRef.value.loadProcessData(newValue)
  61. await nextTick()
  62. if (designerRef.value.refresh) {
  63. await designerRef.value.refresh()
  64. }
  65. }
  66. } catch (error) {
  67. console.error('更新流程数据失败:', error)
  68. }
  69. }
  70. },
  71. { deep: true, immediate: true }
  72. )
  73. // 初始化完成回调
  74. const handleInit = async () => {
  75. try {
  76. isInitialized.value = true
  77. emit('init-finished')
  78. // 等待下一个tick,确保设计器已经准备好
  79. await nextTick()
  80. // 初始化完成后,设置初始值
  81. if (props.modelKey && props.modelName) {
  82. await designerRef.value.updateModel(props.modelKey, props.modelName)
  83. }
  84. if (props.value) {
  85. currentValue.value = props.value
  86. await designerRef.value.loadProcessData(props.value)
  87. // 再次刷新确保数据正确加载
  88. await nextTick()
  89. if (designerRef.value.refresh) {
  90. await designerRef.value.refresh()
  91. }
  92. }
  93. } catch (error) {
  94. console.error('初始化流程数据失败:', error)
  95. }
  96. }
  97. // 修改成功回调
  98. const handleSuccess = (data?: any) => {
  99. console.warn('handleSuccess', data)
  100. if (data && data !== currentValue.value) {
  101. currentValue.value = data
  102. emit('success', data)
  103. }
  104. }
  105. /** 获取当前流程数据 */
  106. const getCurrentFlowData = async () => {
  107. try {
  108. if (designerRef.value) {
  109. const data = await designerRef.value.getCurrentFlowData()
  110. if (data) {
  111. currentValue.value = data
  112. }
  113. return data
  114. }
  115. return currentValue.value || undefined
  116. } catch (error) {
  117. console.error('获取流程数据失败:', error)
  118. return currentValue.value || undefined
  119. }
  120. }
  121. // 组件创建时初始化数据
  122. onMounted(() => {
  123. initOrUpdateValue()
  124. })
  125. // 组件卸载前保存数据
  126. onBeforeUnmount(async () => {
  127. try {
  128. const data = await getCurrentFlowData()
  129. if (data) {
  130. emit('success', data)
  131. }
  132. } catch (error) {
  133. console.error('保存数据失败:', error)
  134. }
  135. })
  136. defineExpose({
  137. getCurrentFlowData,
  138. refresh: () => designerRef.value?.refresh?.()
  139. })
  140. </script>
  141. <style lang="scss" scoped></style>