Skip to content

Commit 21c28c3

Browse files
committed
feat: 修改设计流程切换到第三步自动赋值流程标识与流程名称逻辑
1 parent 9459a72 commit 21c28c3

File tree

5 files changed

+245
-73
lines changed

5 files changed

+245
-73
lines changed

src/components/SimpleProcessDesignerV2/src/SimpleProcessDesigner.vue

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,32 @@ const processNodeTree = ref<SimpleFlowNode | undefined>()
7979
const errorDialogVisible = ref(false)
8080
let errorNodes: SimpleFlowNode[] = []
8181
82+
// 添加更新模型的方法
83+
const updateModel = (key?: string, name?: string) => {
84+
if (!processNodeTree.value) {
85+
processNodeTree.value = {
86+
name: name || '发起人',
87+
type: NodeType.START_USER_NODE,
88+
id: NodeId.START_USER_NODE_ID,
89+
childNode: {
90+
id: NodeId.END_EVENT_NODE_ID,
91+
name: '结束',
92+
type: NodeType.END_EVENT_NODE
93+
}
94+
}
95+
} else if (name) {
96+
// 更新现有模型的名称
97+
processNodeTree.value.name = name
98+
}
99+
}
100+
101+
// 监听属性变化
102+
watch([() => props.modelKey, () => props.modelName], ([newKey, newName]) => {
103+
if (!props.modelId && newKey && newName) {
104+
updateModel(newKey, newName)
105+
}
106+
}, { immediate: true, deep: true })
107+
82108
const saveSimpleFlowModel = async (simpleModelNode: SimpleFlowNode) => {
83109
if (!simpleModelNode) {
84110
message.error('模型数据为空')

src/components/bpmnProcessDesigner/package/penal/PropertiesPanel.vue

Lines changed: 83 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<template>
22
<div class="process-panel__container" :style="{ width: `${width}px` }">
3-
<el-collapse v-model="activeTab">
3+
<el-collapse v-model="activeTab" v-if="isReady">
44
<el-collapse-item name="base">
55
<!-- class="panel-tab__title" -->
66
<template #title>
@@ -108,24 +108,16 @@ const elementBusinessObject = ref<any>({}) // 元素 businessObject 镜像,提
108108
const conditionFormVisible = ref(false) // 流转条件设置
109109
const formVisible = ref(false) // 表单配置
110110
const bpmnElement = ref()
111+
const isReady = ref(false)
111112
112113
provide('prefix', props.prefix)
113114
provide('width', props.width)
114-
const bpmnInstances = () => (window as any)?.bpmnInstances
115-
116-
// 监听 props.bpmnModeler 然后 initModels
117-
const unwatchBpmn = watch(
118-
() => props.bpmnModeler,
119-
() => {
120-
// 避免加载时 流程图 并未加载完成
121-
if (!props.bpmnModeler) {
122-
console.log('缺少props.bpmnModeler')
123-
return
124-
}
125115
126-
console.log('props.bpmnModeler 有值了!!!')
127-
const w = window as any
128-
w.bpmnInstances = {
116+
// 初始化 bpmnInstances
117+
const initBpmnInstances = () => {
118+
if (!props.bpmnModeler) return false
119+
try {
120+
const instances = {
129121
modeler: props.bpmnModeler,
130122
modeling: props.bpmnModeler.get('modeling'),
131123
moddle: props.bpmnModeler.get('moddle'),
@@ -136,17 +128,55 @@ const unwatchBpmn = watch(
136128
replace: props.bpmnModeler.get('replace'),
137129
selection: props.bpmnModeler.get('selection')
138130
}
131+
132+
// 检查所有实例是否都存在
133+
const allInstancesExist = Object.values(instances).every(instance => instance)
134+
if (allInstancesExist) {
135+
const w = window as any
136+
w.bpmnInstances = instances
137+
return true
138+
}
139+
return false
140+
} catch (error) {
141+
console.error('初始化 bpmnInstances 失败:', error)
142+
return false
143+
}
144+
}
145+
146+
const bpmnInstances = () => (window as any)?.bpmnInstances
147+
148+
// 监听 props.bpmnModeler 然后 initModels
149+
const unwatchBpmn = watch(
150+
() => props.bpmnModeler,
151+
async () => {
152+
// 避免加载时 流程图 并未加载完成
153+
if (!props.bpmnModeler) {
154+
console.log('缺少props.bpmnModeler')
155+
return
156+
}
139157
140-
console.log(bpmnInstances(), 'window.bpmnInstances')
141-
getActiveElement()
142-
unwatchBpmn()
158+
try {
159+
// 等待 modeler 初始化完成
160+
await nextTick()
161+
if (initBpmnInstances()) {
162+
isReady.value = true
163+
await nextTick()
164+
getActiveElement()
165+
} else {
166+
console.error('modeler 实例未完全初始化')
167+
}
168+
} catch (error) {
169+
console.error('初始化失败:', error)
170+
}
143171
},
144172
{
145173
immediate: true
146174
}
147175
)
148176
149177
const getActiveElement = () => {
178+
if (!isReady.value || !props.bpmnModeler) return
179+
150180
// 初始第一个选中元素 bpmn:Process
151181
initFormOnChanged(null)
152182
props.bpmnModeler.on('import.done', (e) => {
@@ -164,41 +194,48 @@ const getActiveElement = () => {
164194
}
165195
})
166196
}
197+
167198
// 初始化数据
168199
const initFormOnChanged = (element) => {
200+
if (!isReady.value || !bpmnInstances()) return
201+
169202
let activatedElement = element
170203
if (!activatedElement) {
171204
activatedElement =
172205
bpmnInstances().elementRegistry.find((el) => el.type === 'bpmn:Process') ??
173206
bpmnInstances().elementRegistry.find((el) => el.type === 'bpmn:Collaboration')
174207
}
175208
if (!activatedElement) return
176-
console.log(`
177-
----------
178-
select element changed:
179-
id: ${activatedElement.id}
180-
type: ${activatedElement.businessObject.$type}
181-
----------
182-
`)
183-
console.log('businessObject: ', activatedElement.businessObject)
184-
bpmnInstances().bpmnElement = activatedElement
185-
bpmnElement.value = activatedElement
186-
elementId.value = activatedElement.id
187-
elementType.value = activatedElement.type.split(':')[1] || ''
188-
elementBusinessObject.value = JSON.parse(JSON.stringify(activatedElement.businessObject))
189-
conditionFormVisible.value = !!(
190-
elementType.value === 'SequenceFlow' &&
191-
activatedElement.source &&
192-
activatedElement.source.type.indexOf('StartEvent') === -1
193-
)
194-
formVisible.value = elementType.value === 'UserTask' || elementType.value === 'StartEvent'
209+
210+
try {
211+
console.log(`
212+
----------
213+
select element changed:
214+
id: ${activatedElement.id}
215+
type: ${activatedElement.businessObject.$type}
216+
----------
217+
`)
218+
console.log('businessObject: ', activatedElement.businessObject)
219+
bpmnInstances().bpmnElement = activatedElement
220+
bpmnElement.value = activatedElement
221+
elementId.value = activatedElement.id
222+
elementType.value = activatedElement.type.split(':')[1] || ''
223+
elementBusinessObject.value = JSON.parse(JSON.stringify(activatedElement.businessObject))
224+
conditionFormVisible.value = !!(
225+
elementType.value === 'SequenceFlow' &&
226+
activatedElement.source &&
227+
activatedElement.source.type.indexOf('StartEvent') === -1
228+
)
229+
formVisible.value = elementType.value === 'UserTask' || elementType.value === 'StartEvent'
230+
} catch (error) {
231+
console.error('初始化表单数据失败:', error)
232+
}
195233
}
196234
197235
onBeforeUnmount(() => {
198236
const w = window as any
199237
w.bpmnInstances = null
200-
console.log(props, 'props1')
201-
console.log(props.bpmnModeler, 'props.bpmnModeler1')
238+
isReady.value = false
202239
})
203240
204241
watch(
@@ -208,3 +245,10 @@ watch(
208245
}
209246
)
210247
</script>
248+
<style lang="scss">
249+
.process-panel__container {
250+
position: absolute;
251+
top: 90px;
252+
right: 60px;
253+
}
254+
</style>

src/views/bpm/model/CreateUpdate.vue

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,7 @@
274274
<!-- BPMN设计器 -->
275275
<template v-if="formData.type === BpmModelType.BPMN">
276276
<BpmModelEditor
277+
v-if="showDesigner"
277278
:model-id="formData.id"
278279
:model-key="formData.key"
279280
:model-name="formData.name"
@@ -284,6 +285,7 @@
284285
<!-- Simple设计器 -->
285286
<template v-else>
286287
<SimpleModelDesign
288+
v-if="showDesigner"
287289
:model-id="formData.id"
288290
:model-key="formData.key"
289291
:model-name="formData.name"
@@ -547,16 +549,43 @@ const handleDesignSuccess = (bpmnXml?: string) => {
547549
// 步骤切换处理
548550
const handleStepClick = async (index: number) => {
549551
// 如果是切换到第三步(流程设计),需要校验key和name
550-
if (index === 2 && !formData.value.id) {
551-
// 新增时才校验
552-
if (!formData.value.key || !formData.value.name) {
553-
message.warning('请先填写流程标识和流程名称')
554-
return
552+
if (index === 2) {
553+
if (!formData.value.id) {
554+
// 新增时才校验
555+
try {
556+
await formRef.value?.validateField(['key', 'name'])
557+
// 确保数据已经准备好
558+
await nextTick()
559+
} catch (error) {
560+
message.warning('请先填写流程标识和流程名称')
561+
return
562+
}
555563
}
564+
// 确保数据已经准备好再切换
565+
await nextTick()
556566
}
557-
558567
currentStep.value = index
559568
}
569+
570+
// 添加一个计算属性来判断是否显示设计器
571+
const showDesigner = computed(() => {
572+
return currentStep.value === 2 && Boolean(formData.value.id || (formData.value.key && formData.value.name))
573+
})
574+
575+
// 监听步骤变化,确保数据准备完成
576+
watch(() => currentStep.value, async (newStep) => {
577+
if (newStep === 2) {
578+
await nextTick()
579+
}
580+
}, { immediate: false })
581+
582+
// 在组件卸载时清理
583+
onBeforeUnmount(() => {
584+
const w = window as any
585+
if (w.bpmnInstances) {
586+
w.bpmnInstances = null
587+
}
588+
})
560589
</script>
561590

562591
<style lang="scss" scoped>

0 commit comments

Comments
 (0)