SimpleModelDesign.vue 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  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?: string
  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. console.log('initOrUpdateValue', props.value)
  34. if (props.value) {
  35. currentValue.value = props.value
  36. // 如果设计器已经初始化,立即加载数据
  37. if (isInitialized.value && designerRef.value) {
  38. try {
  39. await designerRef.value.loadProcessData(props.value)
  40. await nextTick()
  41. if (designerRef.value.refresh) {
  42. await designerRef.value.refresh()
  43. }
  44. } catch (error) {
  45. console.error('加载流程数据失败:', error)
  46. }
  47. }
  48. }
  49. }
  50. // 监听属性变化
  51. watch(
  52. [() => props.modelKey, () => props.modelName, () => props.value],
  53. async ([newKey, newName, newValue], [oldKey, oldName, oldValue]) => {
  54. if (designerRef.value && isInitialized.value) {
  55. try {
  56. if (newKey && newName && (newKey !== oldKey || newName !== oldName)) {
  57. await designerRef.value.updateModel(newKey, newName)
  58. }
  59. if (newValue && newValue !== oldValue) {
  60. currentValue.value = newValue
  61. await designerRef.value.loadProcessData(newValue)
  62. await nextTick()
  63. if (designerRef.value.refresh) {
  64. await designerRef.value.refresh()
  65. }
  66. }
  67. } catch (error) {
  68. console.error('更新流程数据失败:', error)
  69. }
  70. }
  71. },
  72. { deep: true, immediate: true }
  73. )
  74. // 初始化完成回调
  75. const handleInit = async () => {
  76. try {
  77. isInitialized.value = true
  78. emit('init-finished')
  79. // 等待下一个tick,确保设计器已经准备好
  80. await nextTick()
  81. // 初始化完成后,设置初始值
  82. if (props.modelKey && props.modelName) {
  83. await designerRef.value.updateModel(props.modelKey, props.modelName)
  84. }
  85. if (props.value) {
  86. currentValue.value = props.value
  87. await designerRef.value.loadProcessData(props.value)
  88. // 再次刷新确保数据正确加载
  89. await nextTick()
  90. if (designerRef.value.refresh) {
  91. await designerRef.value.refresh()
  92. }
  93. }
  94. } catch (error) {
  95. console.error('初始化流程数据失败:', error)
  96. }
  97. }
  98. // 修改成功回调
  99. const handleSuccess = (data?: any) => {
  100. console.warn('handleSuccess', data)
  101. if (data && data !== currentValue.value) {
  102. currentValue.value = data
  103. emit('success', data)
  104. }
  105. }
  106. /** 获取当前流程数据 */
  107. const getCurrentFlowData = async () => {
  108. try {
  109. if (designerRef.value) {
  110. const data = await designerRef.value.getCurrentFlowData()
  111. if (data) {
  112. currentValue.value = data
  113. }
  114. return data
  115. }
  116. return currentValue.value || undefined
  117. } catch (error) {
  118. console.error('获取流程数据失败:', error)
  119. return currentValue.value || undefined
  120. }
  121. }
  122. // 组件创建时初始化数据
  123. onMounted(() => {
  124. initOrUpdateValue()
  125. })
  126. // 组件卸载前保存数据
  127. onBeforeUnmount(async () => {
  128. try {
  129. const data = await getCurrentFlowData()
  130. if (data) {
  131. emit('success', data)
  132. }
  133. } catch (error) {
  134. console.error('保存数据失败:', error)
  135. }
  136. })
  137. defineExpose({
  138. getCurrentFlowData,
  139. refresh: () => designerRef.value?.refresh?.()
  140. })
  141. </script>
  142. <style lang="scss" scoped></style>