Skip to content

Commit e50cd22

Browse files
committed
feat: 删除设计流程中两个流程设计器的保存模型按钮,并在点击保存/提交按钮时直接获取内部组件xml逻辑
1 parent 40c2cb7 commit e50cd22

File tree

5 files changed

+123
-62
lines changed

5 files changed

+123
-62
lines changed

src/components/SimpleProcessDesignerV2/src/SimpleProcessModel.vue

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,6 @@
88
<el-button size="default" class="w-80px"> {{ scaleValue }}% </el-button>
99
<el-button size="default" :plain="true" :icon="ZoomIn" @click="zoomIn()" />
1010
</el-button-group>
11-
<el-button
12-
v-if="!readonly"
13-
size="default"
14-
class="ml-4px"
15-
type="primary"
16-
:icon="Select"
17-
@click="saveSimpleFlowModel"
18-
>保存模型</el-button
19-
>
2011
</el-row>
2112
</div>
2213
<div class="simple-process-model" :style="`transform: scale(${scaleValue / 100});`">
@@ -42,7 +33,8 @@
4233
import ProcessNodeTree from './ProcessNodeTree.vue'
4334
import { SimpleFlowNode, NodeType, NODE_DEFAULT_TEXT } from './consts'
4435
import { useWatchNode } from './node'
45-
import { Select, ZoomOut, ZoomIn, ScaleToOriginal } from '@element-plus/icons-vue'
36+
import { ZoomOut, ZoomIn, ScaleToOriginal } from '@element-plus/icons-vue'
37+
4638
defineOptions({
4739
name: 'SimpleProcessModel'
4840
})
@@ -58,6 +50,7 @@ const props = defineProps({
5850
default: true
5951
}
6052
})
53+
6154
const emits = defineEmits<{
6255
'save': [node: SimpleFlowNode | undefined]
6356
}>()
@@ -68,35 +61,30 @@ provide('readonly', props.readonly)
6861
let scaleValue = ref(100)
6962
const MAX_SCALE_VALUE = 200
7063
const MIN_SCALE_VALUE = 50
64+
7165
// 放大
7266
const zoomIn = () => {
7367
if (scaleValue.value == MAX_SCALE_VALUE) {
7468
return
7569
}
7670
scaleValue.value += 10
7771
}
72+
7873
// 缩小
7974
const zoomOut = () => {
8075
if (scaleValue.value == MIN_SCALE_VALUE) {
8176
return
8277
}
8378
scaleValue.value -= 10
8479
}
80+
8581
const processReZoom = () => {
8682
scaleValue.value = 100
8783
}
8884
8985
const errorDialogVisible = ref(false)
9086
let errorNodes: SimpleFlowNode[] = []
91-
const saveSimpleFlowModel = async () => {
92-
errorNodes = []
93-
validateNode(processNodeTree.value, errorNodes)
94-
if (errorNodes.length > 0) {
95-
errorDialogVisible.value = true
96-
return
97-
}
98-
emits('save', processNodeTree.value)
99-
}
87+
10088
// 校验节点设置。 暂时以 showText 为空 未节点错误配置
10189
const validateNode = (node: SimpleFlowNode | undefined, errorNodes: SimpleFlowNode[]) => {
10290
if (node) {
@@ -135,6 +123,21 @@ const validateNode = (node: SimpleFlowNode | undefined, errorNodes: SimpleFlowNo
135123
}
136124
}
137125
}
126+
127+
/** 获取当前流程数据 */
128+
const getCurrentFlowData = () => {
129+
errorNodes = []
130+
validateNode(processNodeTree.value, errorNodes)
131+
if (errorNodes.length > 0) {
132+
errorDialogVisible.value = true
133+
return undefined
134+
}
135+
return processNodeTree.value
136+
}
137+
138+
defineExpose({
139+
getCurrentFlowData
140+
})
138141
</script>
139142

140143
<style lang="scss" scoped></style>

src/components/bpmnProcessDesigner/package/designer/ProcessDesigner.vue

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -160,13 +160,6 @@
160160
<XButton preIcon="ep:refresh" @click="processRestart()" />
161161
</el-tooltip>
162162
</ElButtonGroup>
163-
<XButton
164-
preIcon="ep:plus"
165-
title="保存模型"
166-
@click="processSave"
167-
:type="props.headerButtonType"
168-
:disabled="simulationStatus"
169-
/>
170163
</template>
171164
<!-- 用于打开本地文件-->
172165
<input

src/views/bpm/model/editor/index.vue

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,11 +205,53 @@ onBeforeUnmount(() => {
205205
w.bpmnInstances = null
206206
}
207207
})
208+
209+
/** 获取XML字符串 */
210+
const saveXML = async () => {
211+
if (!modeler.value) {
212+
return { xml: undefined }
213+
}
214+
try {
215+
return await modeler.value.saveXML({ format: true })
216+
} catch (error) {
217+
console.error('获取XML失败:', error)
218+
return { xml: undefined }
219+
}
220+
}
221+
222+
/** 获取SVG字符串 */
223+
const saveSVG = async () => {
224+
if (!modeler.value) {
225+
return { svg: undefined }
226+
}
227+
try {
228+
return await modeler.value.saveSVG()
229+
} catch (error) {
230+
console.error('获取SVG失败:', error)
231+
return { svg: undefined }
232+
}
233+
}
234+
235+
/** 刷新视图 */
236+
const refresh = () => {
237+
if (processDesigner.value?.refresh) {
238+
processDesigner.value.refresh()
239+
}
240+
}
241+
242+
// 暴露必要的属性和方法给父组件
243+
defineExpose({
244+
modeler,
245+
isModelerReady,
246+
saveXML,
247+
saveSVG,
248+
refresh
249+
})
208250
</script>
209251
<style lang="scss">
210252
.process-panel__container {
211253
position: absolute;
212-
top: 90px;
254+
top: 180px;
213255
right: 60px;
214256
}
215257
</style>

src/views/bpm/model/form/ProcessDesign.vue

Lines changed: 49 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
:model-key="modelData.key"
88
:model-name="modelData.name"
99
:value="modelData.bpmnXml"
10+
ref="bpmnEditorRef"
1011
@success="handleDesignSuccess"
1112
/>
1213
</template>
@@ -19,6 +20,7 @@
1920
:model-key="modelData.key"
2021
:model-name="modelData.name"
2122
:value="modelData.bpmnXml"
23+
ref="simpleEditorRef"
2224
@success="handleDesignSuccess"
2325
/>
2426
</template>
@@ -38,29 +40,65 @@ const props = defineProps({
3840
3941
const emit = defineEmits(['update:modelValue', 'success'])
4042
41-
const xmlString = ref<string>()
43+
const bpmnEditorRef = ref()
44+
const simpleEditorRef = ref()
4245
4346
// 创建本地数据副本
4447
const modelData = computed({
4548
get: () => props.modelValue,
4649
set: (val) => emit('update:modelValue', val)
4750
})
4851
49-
// 监听modelValue变化,确保XML数据同步
50-
watch(
51-
() => props.modelValue,
52-
(newVal) => {
53-
if (newVal?.bpmnXml) {
54-
xmlString.value = newVal.bpmnXml
52+
/** 表单校验 */
53+
const validate = async () => {
54+
try {
55+
// 根据流程类型获取对应的编辑器引用
56+
const editorRef =
57+
modelData.value.type === BpmModelType.BPMN ? bpmnEditorRef.value : simpleEditorRef.value
58+
if (!editorRef) {
59+
throw new Error('流程设计器未初始化')
60+
}
61+
62+
// 获取最新的XML数据
63+
const bpmnXml = await getXmlString()
64+
console.warn(bpmnXml, 'bpmnXml')
65+
if (!bpmnXml) {
66+
throw new Error('请设计流程')
5567
}
56-
},
57-
{ immediate: true, deep: true }
58-
)
68+
69+
return true
70+
} catch (error) {
71+
throw error
72+
}
73+
}
74+
75+
/** 获取当前XML字符串 */
76+
const getXmlString = async () => {
77+
try {
78+
if (modelData.value.type === BpmModelType.BPMN) {
79+
console.warn('bpmnEditorRef.value', bpmnEditorRef.value)
80+
// BPMN设计器
81+
if (bpmnEditorRef.value) {
82+
const { xml } = await bpmnEditorRef.value.saveXML()
83+
return xml
84+
}
85+
} else {
86+
// Simple设计器
87+
if (simpleEditorRef.value) {
88+
const flowData = simpleEditorRef.value.getCurrentFlowData()
89+
return flowData ? JSON.stringify(flowData) : undefined
90+
}
91+
}
92+
return undefined
93+
} catch (error) {
94+
console.error('获取流程数据失败:', error)
95+
return undefined
96+
}
97+
}
5998
6099
/** 处理设计器保存成功 */
61100
const handleDesignSuccess = (bpmnXml?: string) => {
62101
if (bpmnXml) {
63-
xmlString.value = bpmnXml
64102
modelData.value = {
65103
...modelData.value,
66104
bpmnXml
@@ -69,34 +107,11 @@ const handleDesignSuccess = (bpmnXml?: string) => {
69107
}
70108
}
71109
72-
/** 表单校验 */
73-
const validate = async () => {
74-
// 获取最新的XML数据
75-
const currentXml = xmlString.value || modelData.value?.bpmnXml
76-
77-
// 如果是修改场景且有XML数据(无论是新的还是原有的)
78-
if (modelData.value.id && currentXml) {
79-
return true
80-
}
81-
82-
// 新增场景必须有XML数据
83-
if (!currentXml) {
84-
throw new Error('请设计流程')
85-
}
86-
87-
return true
88-
}
89-
90110
/** 是否显示设计器 */
91111
const showDesigner = computed(() => {
92112
return Boolean(modelData.value?.key && modelData.value?.name)
93113
})
94114
95-
/** 获取当前XML字符串 */
96-
const getXmlString = () => {
97-
return xmlString.value || modelData.value?.bpmnXml || ''
98-
}
99-
100115
defineExpose({
101116
validate,
102117
getXmlString

src/views/bpm/model/form/index.vue

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
>
88
<!-- 左侧标题 -->
99
<div class="w-200px flex items-center overflow-hidden">
10-
<Icon icon="ep:arrow-left" class="cursor-pointer flex-shrink-0" @click="router.back()" />
10+
<Icon icon="ep:arrow-left" class="cursor-pointer flex-shrink-0" @click="handleBack" />
1111
<span class="ml-10px text-16px truncate" :title="formData.name || '创建流程'">
1212
{{ formData.name || '创建流程' }}
1313
</span>
@@ -322,6 +322,14 @@ const handleDesignSuccess = (bpmnXml?: string) => {
322322
}
323323
}
324324
325+
/** 返回列表页 */
326+
const handleBack = () => {
327+
// 先删除当前页签
328+
delView(unref(router.currentRoute))
329+
// 跳转到列表页
330+
router.push({ name: 'BpmModel' })
331+
}
332+
325333
/** 初始化 */
326334
onMounted(async () => {
327335
await initData()

0 commit comments

Comments
 (0)