diff --git a/src/components/SimpleProcessDesignerV2/src/SimpleProcessModel.vue b/src/components/SimpleProcessDesignerV2/src/SimpleProcessModel.vue index 3a18227a..bfcaa21e 100644 --- a/src/components/SimpleProcessDesignerV2/src/SimpleProcessModel.vue +++ b/src/components/SimpleProcessDesignerV2/src/SimpleProcessModel.vue @@ -8,15 +8,6 @@ {{ scaleValue }}% - 保存模型
@@ -42,7 +33,8 @@ import ProcessNodeTree from './ProcessNodeTree.vue' import { SimpleFlowNode, NodeType, NODE_DEFAULT_TEXT } from './consts' import { useWatchNode } from './node' -import { Select, ZoomOut, ZoomIn, ScaleToOriginal } from '@element-plus/icons-vue' +import { ZoomOut, ZoomIn, ScaleToOriginal } from '@element-plus/icons-vue' + defineOptions({ name: 'SimpleProcessModel' }) @@ -58,6 +50,7 @@ const props = defineProps({ default: true } }) + const emits = defineEmits<{ 'save': [node: SimpleFlowNode | undefined] }>() @@ -68,6 +61,7 @@ provide('readonly', props.readonly) let scaleValue = ref(100) const MAX_SCALE_VALUE = 200 const MIN_SCALE_VALUE = 50 + // 放大 const zoomIn = () => { if (scaleValue.value == MAX_SCALE_VALUE) { @@ -75,6 +69,7 @@ const zoomIn = () => { } scaleValue.value += 10 } + // 缩小 const zoomOut = () => { if (scaleValue.value == MIN_SCALE_VALUE) { @@ -82,21 +77,14 @@ const zoomOut = () => { } scaleValue.value -= 10 } + const processReZoom = () => { scaleValue.value = 100 } const errorDialogVisible = ref(false) let errorNodes: SimpleFlowNode[] = [] -const saveSimpleFlowModel = async () => { - errorNodes = [] - validateNode(processNodeTree.value, errorNodes) - if (errorNodes.length > 0) { - errorDialogVisible.value = true - return - } - emits('save', processNodeTree.value) -} + // 校验节点设置。 暂时以 showText 为空 未节点错误配置 const validateNode = (node: SimpleFlowNode | undefined, errorNodes: SimpleFlowNode[]) => { if (node) { @@ -135,6 +123,21 @@ const validateNode = (node: SimpleFlowNode | undefined, errorNodes: SimpleFlowNo } } } + +/** 获取当前流程数据 */ +const getCurrentFlowData = () => { + errorNodes = [] + validateNode(processNodeTree.value, errorNodes) + if (errorNodes.length > 0) { + errorDialogVisible.value = true + return undefined + } + return processNodeTree.value +} + +defineExpose({ + getCurrentFlowData +}) diff --git a/src/components/bpmnProcessDesigner/package/designer/ProcessDesigner.vue b/src/components/bpmnProcessDesigner/package/designer/ProcessDesigner.vue index ebe85106..e9427292 100644 --- a/src/components/bpmnProcessDesigner/package/designer/ProcessDesigner.vue +++ b/src/components/bpmnProcessDesigner/package/designer/ProcessDesigner.vue @@ -160,13 +160,6 @@ - { w.bpmnInstances = null } }) + +/** 获取XML字符串 */ +const saveXML = async () => { + if (!modeler.value) { + return { xml: undefined } + } + try { + return await modeler.value.saveXML({ format: true }) + } catch (error) { + console.error('获取XML失败:', error) + return { xml: undefined } + } +} + +/** 获取SVG字符串 */ +const saveSVG = async () => { + if (!modeler.value) { + return { svg: undefined } + } + try { + return await modeler.value.saveSVG() + } catch (error) { + console.error('获取SVG失败:', error) + return { svg: undefined } + } +} + +/** 刷新视图 */ +const refresh = () => { + if (processDesigner.value?.refresh) { + processDesigner.value.refresh() + } +} + +// 暴露必要的属性和方法给父组件 +defineExpose({ + modeler, + isModelerReady, + saveXML, + saveSVG, + refresh +}) diff --git a/src/views/bpm/model/form/ProcessDesign.vue b/src/views/bpm/model/form/ProcessDesign.vue index 2e8f94c9..11384370 100644 --- a/src/views/bpm/model/form/ProcessDesign.vue +++ b/src/views/bpm/model/form/ProcessDesign.vue @@ -7,6 +7,7 @@ :model-key="modelData.key" :model-name="modelData.name" :value="modelData.bpmnXml" + ref="bpmnEditorRef" @success="handleDesignSuccess" /> @@ -19,6 +20,7 @@ :model-key="modelData.key" :model-name="modelData.name" :value="modelData.bpmnXml" + ref="simpleEditorRef" @success="handleDesignSuccess" /> @@ -38,7 +40,8 @@ const props = defineProps({ const emit = defineEmits(['update:modelValue', 'success']) -const xmlString = ref() +const bpmnEditorRef = ref() +const simpleEditorRef = ref() // 创建本地数据副本 const modelData = computed({ @@ -46,21 +49,56 @@ const modelData = computed({ set: (val) => emit('update:modelValue', val) }) -// 监听modelValue变化,确保XML数据同步 -watch( - () => props.modelValue, - (newVal) => { - if (newVal?.bpmnXml) { - xmlString.value = newVal.bpmnXml +/** 表单校验 */ +const validate = async () => { + try { + // 根据流程类型获取对应的编辑器引用 + const editorRef = + modelData.value.type === BpmModelType.BPMN ? bpmnEditorRef.value : simpleEditorRef.value + if (!editorRef) { + throw new Error('流程设计器未初始化') } - }, - { immediate: true, deep: true } -) + + // 获取最新的XML数据 + const bpmnXml = await getXmlString() + console.warn(bpmnXml, 'bpmnXml') + if (!bpmnXml) { + throw new Error('请设计流程') + } + + return true + } catch (error) { + throw error + } +} + +/** 获取当前XML字符串 */ +const getXmlString = async () => { + try { + if (modelData.value.type === BpmModelType.BPMN) { + console.warn('bpmnEditorRef.value', bpmnEditorRef.value) + // BPMN设计器 + if (bpmnEditorRef.value) { + const { xml } = await bpmnEditorRef.value.saveXML() + return xml + } + } else { + // Simple设计器 + if (simpleEditorRef.value) { + const flowData = simpleEditorRef.value.getCurrentFlowData() + return flowData ? JSON.stringify(flowData) : undefined + } + } + return undefined + } catch (error) { + console.error('获取流程数据失败:', error) + return undefined + } +} /** 处理设计器保存成功 */ const handleDesignSuccess = (bpmnXml?: string) => { if (bpmnXml) { - xmlString.value = bpmnXml modelData.value = { ...modelData.value, bpmnXml @@ -69,34 +107,11 @@ const handleDesignSuccess = (bpmnXml?: string) => { } } -/** 表单校验 */ -const validate = async () => { - // 获取最新的XML数据 - const currentXml = xmlString.value || modelData.value?.bpmnXml - - // 如果是修改场景且有XML数据(无论是新的还是原有的) - if (modelData.value.id && currentXml) { - return true - } - - // 新增场景必须有XML数据 - if (!currentXml) { - throw new Error('请设计流程') - } - - return true -} - /** 是否显示设计器 */ const showDesigner = computed(() => { return Boolean(modelData.value?.key && modelData.value?.name) }) -/** 获取当前XML字符串 */ -const getXmlString = () => { - return xmlString.value || modelData.value?.bpmnXml || '' -} - defineExpose({ validate, getXmlString diff --git a/src/views/bpm/model/form/index.vue b/src/views/bpm/model/form/index.vue index b0aef58c..0b55e483 100644 --- a/src/views/bpm/model/form/index.vue +++ b/src/views/bpm/model/form/index.vue @@ -7,7 +7,7 @@ >
- + {{ formData.name || '创建流程' }} @@ -322,6 +322,14 @@ const handleDesignSuccess = (bpmnXml?: string) => { } } +/** 返回列表页 */ +const handleBack = () => { + // 先删除当前页签 + delView(unref(router.currentRoute)) + // 跳转到列表页 + router.push({ name: 'BpmModel' }) +} + /** 初始化 */ onMounted(async () => { await initData()