123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 |
- <template>
- <!-- BPMN设计器 -->
- <template v-if="modelData.type === BpmModelType.BPMN">
- <BpmModelEditor
- v-if="showDesigner"
- :model-id="modelData.id"
- :model-key="modelData.key"
- :model-name="modelData.name"
- :value="currentBpmnXml"
- ref="bpmnEditorRef"
- @success="handleDesignSuccess"
- @init-finished="handleEditorInit"
- />
- </template>
- <!-- Simple设计器 -->
- <template v-else>
- <SimpleModelDesign
- v-if="showDesigner"
- :model-id="modelData.id"
- :model-key="modelData.key"
- :model-name="modelData.name"
- :value="currentSimpleModel"
- ref="simpleEditorRef"
- @success="handleDesignSuccess"
- @init-finished="handleEditorInit"
- />
- </template>
- </template>
- <script lang="ts" setup>
- import { BpmModelType } from '@/utils/constants'
- import BpmModelEditor from '../editor/index.vue'
- import SimpleModelDesign from '../../simple/SimpleModelDesign.vue'
- const props = defineProps({
- modelValue: {
- type: Object,
- required: true
- }
- })
- const emit = defineEmits(['update:modelValue', 'success'])
- const bpmnEditorRef = ref()
- const simpleEditorRef = ref()
- const isEditorInitialized = ref(false)
- // 创建本地数据副本
- const modelData = computed({
- get: () => props.modelValue,
- set: (val) => emit('update:modelValue', val)
- })
- // 保存当前的流程XML或数据
- const currentBpmnXml = ref('')
- const currentSimpleModel = ref('')
- // 初始化或更新当前的XML数据
- const initOrUpdateXmlData = () => {
- if (modelData.value) {
- if (modelData.value.type === BpmModelType.BPMN) {
- currentBpmnXml.value = modelData.value.bpmnXml || ''
- } else {
- currentSimpleModel.value = modelData.value.simpleModel || ''
- }
- }
- }
- // 监听modelValue的变化,更新数据
- watch(
- () => props.modelValue,
- (newVal) => {
- if (newVal) {
- if (newVal.type === BpmModelType.BPMN) {
- if (newVal.bpmnXml && newVal.bpmnXml !== currentBpmnXml.value) {
- currentBpmnXml.value = newVal.bpmnXml
- // 如果编辑器已经初始化,刷新视图
- if (isEditorInitialized.value && bpmnEditorRef.value?.refresh) {
- nextTick(() => {
- bpmnEditorRef.value.refresh()
- })
- }
- }
- } else {
- if (newVal.simpleModel && newVal.simpleModel !== currentSimpleModel.value) {
- currentSimpleModel.value = newVal.simpleModel
- // 如果编辑器已经初始化,刷新视图
- if (isEditorInitialized.value && simpleEditorRef.value?.refresh) {
- nextTick(() => {
- simpleEditorRef.value.refresh()
- })
- }
- }
- }
- }
- },
- { immediate: true, deep: true }
- )
- /** 编辑器初始化完成的回调 */
- const handleEditorInit = async () => {
- isEditorInitialized.value = true
- // 等待下一个tick,确保编辑器已经准备好
- await nextTick()
- // 初始化完成后,设置初始值
- if (modelData.value.type === BpmModelType.BPMN) {
- if (modelData.value.bpmnXml) {
- currentBpmnXml.value = modelData.value.bpmnXml
- if (bpmnEditorRef.value?.refresh) {
- await nextTick()
- bpmnEditorRef.value.refresh()
- }
- }
- } else {
- if (modelData.value.simpleModel) {
- currentSimpleModel.value = modelData.value.simpleModel
- if (simpleEditorRef.value?.refresh) {
- await nextTick()
- simpleEditorRef.value.refresh()
- }
- }
- }
- }
- /** 获取当前流程数据 */
- const getProcessData = async () => {
- try {
- if (modelData.value.type === BpmModelType.BPMN) {
- if (!bpmnEditorRef.value || !isEditorInitialized.value) {
- return currentBpmnXml.value || undefined
- }
- const { xml } = await bpmnEditorRef.value.saveXML()
- if (xml) {
- currentBpmnXml.value = xml
- return xml
- }
- } else {
- if (!simpleEditorRef.value || !isEditorInitialized.value) {
- return currentSimpleModel.value || undefined
- }
- const flowData = await simpleEditorRef.value.getCurrentFlowData()
- if (flowData) {
- currentSimpleModel.value = flowData
- return flowData
- }
- }
- return modelData.value.type === BpmModelType.BPMN
- ? currentBpmnXml.value
- : currentSimpleModel.value
- } catch (error) {
- console.error('获取流程数据失败:', error)
- return modelData.value.type === BpmModelType.BPMN
- ? currentBpmnXml.value
- : currentSimpleModel.value
- }
- }
- /** 表单校验 */
- const validate = async () => {
- try {
- // 获取最新的流程数据
- const processData = await getProcessData()
- if (!processData) {
- throw new Error('请设计流程')
- }
- return true
- } catch (error) {
- throw error
- }
- }
- /** 处理设计器保存成功 */
- const handleDesignSuccess = async (data?: any) => {
- if (data) {
- if (modelData.value.type === BpmModelType.BPMN) {
- currentBpmnXml.value = data
- } else {
- currentSimpleModel.value = data
- }
- // 创建新的对象以触发响应式更新
- const newModelData = {
- ...modelData.value,
- bpmnXml: modelData.value.type === BpmModelType.BPMN ? data : null,
- simpleModel: modelData.value.type === BpmModelType.BPMN ? null : data
- }
- // 使用emit更新父组件的数据
- await nextTick()
- emit('update:modelValue', newModelData)
- emit('success', data)
- }
- }
- /** 是否显示设计器 */
- const showDesigner = computed(() => {
- return Boolean(modelData.value?.key && modelData.value?.name)
- })
- // 组件创建时初始化数据
- onMounted(() => {
- initOrUpdateXmlData()
- })
- // 组件卸载前保存数据
- onBeforeUnmount(async () => {
- try {
- // 获取并保存最新的流程数据
- const data = await getProcessData()
- if (data) {
- // 创建新的对象以触发响应式更新
- const newModelData = {
- ...modelData.value,
- bpmnXml: modelData.value.type === BpmModelType.BPMN ? data : null,
- simpleModel: modelData.value.type === BpmModelType.BPMN ? null : data
- }
- // 使用emit更新父组件的数据
- await nextTick()
- emit('update:modelValue', newModelData)
- }
- } catch (error) {
- console.error('保存数据失败:', error)
- }
- })
- defineExpose({
- validate,
- getProcessData
- })
- </script>
|