2024-12-16 17:23:27 +08:00
|
|
|
<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"
|
2024-12-24 22:24:54 +08:00
|
|
|
:value="modelData.bpmnXml"
|
2024-12-16 17:23:27 +08:00
|
|
|
@success="handleDesignSuccess"
|
|
|
|
/>
|
|
|
|
</template>
|
|
|
|
|
|
|
|
<!-- Simple设计器 -->
|
|
|
|
<template v-else>
|
|
|
|
<SimpleModelDesign
|
|
|
|
v-if="showDesigner"
|
|
|
|
:model-id="modelData.id"
|
|
|
|
:model-key="modelData.key"
|
|
|
|
:model-name="modelData.name"
|
2024-12-24 22:24:54 +08:00
|
|
|
:value="modelData.bpmnXml"
|
2024-12-16 17:23:27 +08:00
|
|
|
@success="handleDesignSuccess"
|
|
|
|
/>
|
|
|
|
</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 xmlString = ref<string>()
|
|
|
|
|
|
|
|
// 创建本地数据副本
|
|
|
|
const modelData = computed({
|
|
|
|
get: () => props.modelValue,
|
|
|
|
set: (val) => emit('update:modelValue', val)
|
|
|
|
})
|
|
|
|
|
2024-12-24 22:24:54 +08:00
|
|
|
// 监听modelValue变化,确保XML数据同步
|
2024-12-25 14:10:16 +08:00
|
|
|
watch(
|
|
|
|
() => props.modelValue,
|
|
|
|
(newVal) => {
|
|
|
|
if (newVal.bpmnXml) {
|
|
|
|
xmlString.value = newVal.bpmnXml
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{ immediate: true, deep: true }
|
|
|
|
)
|
2024-12-24 22:24:54 +08:00
|
|
|
|
2024-12-16 17:23:27 +08:00
|
|
|
/** 处理设计器保存成功 */
|
|
|
|
const handleDesignSuccess = (bpmnXml?: string) => {
|
|
|
|
if (bpmnXml) {
|
|
|
|
xmlString.value = bpmnXml
|
|
|
|
emit('update:modelValue', {
|
|
|
|
...modelData.value,
|
|
|
|
bpmnXml
|
|
|
|
})
|
2024-12-24 22:24:54 +08:00
|
|
|
emit('success', bpmnXml)
|
2024-12-16 17:23:27 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/** 表单校验 */
|
|
|
|
const validate = async () => {
|
2024-12-25 14:10:16 +08:00
|
|
|
// 修改场景下,如果已有 modelData.bpmnXml 则不需要重新校验
|
|
|
|
if (modelData.value.id && modelData.value.bpmnXml) {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
// 新增场景或无 bpmnXml 时才校验
|
2024-12-16 17:23:27 +08:00
|
|
|
if (!xmlString.value) {
|
|
|
|
throw new Error('请设计流程')
|
|
|
|
}
|
2024-12-24 22:24:54 +08:00
|
|
|
return true
|
2024-12-16 17:23:27 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/** 是否显示设计器 */
|
|
|
|
const showDesigner = computed(() => {
|
2024-12-25 14:10:16 +08:00
|
|
|
return Boolean(modelData.value?.key && modelData.value?.name)
|
2024-12-16 17:23:27 +08:00
|
|
|
})
|
|
|
|
|
2024-12-25 14:10:16 +08:00
|
|
|
/** 获取当前XML字符串 */
|
|
|
|
const getXmlString = () => {
|
|
|
|
// 优先返回最新的 xmlString
|
|
|
|
return xmlString.value || modelData.value?.bpmnXml
|
|
|
|
}
|
|
|
|
|
2024-12-16 17:23:27 +08:00
|
|
|
defineExpose({
|
2024-12-24 22:24:54 +08:00
|
|
|
validate,
|
2024-12-25 14:10:16 +08:00
|
|
|
getXmlString
|
2024-12-16 17:23:27 +08:00
|
|
|
})
|
2024-12-25 14:10:16 +08:00
|
|
|
</script>
|