Skip to content

Commit 59281a7

Browse files
committed
fix: 修复第三步骤两个设计器绘制完的流程无法回显及在其他步骤点击保存/发布按钮无法获取到第三步骤的流程图数据bug
1 parent d885172 commit 59281a7

File tree

5 files changed

+522
-195
lines changed

5 files changed

+522
-195
lines changed

src/components/SimpleProcessDesignerV2/src/SimpleProcessDesigner.vue

Lines changed: 99 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,10 @@ const props = defineProps({
5454
modelName: {
5555
type: String,
5656
required: false
57+
},
58+
value: {
59+
type: [String, Object],
60+
required: false
5761
}
5862
})
5963
@@ -66,6 +70,10 @@ const userOptions = ref<UserApi.UserVO[]>([]) // 用户列表
6670
const deptOptions = ref<DeptApi.DeptVO[]>([]) // 部门列表
6771
const deptTreeOptions = ref()
6872
const userGroupOptions = ref<UserGroupApi.UserGroupVO[]>([]) // 用户组列表
73+
74+
// 添加当前值的引用
75+
const currentValue = ref<SimpleFlowNode | undefined>()
76+
6977
provide('formFields', formFields)
7078
provide('formType', formType)
7179
provide('roleList', roleOptions)
@@ -81,7 +89,7 @@ const errorDialogVisible = ref(false)
8189
let errorNodes: SimpleFlowNode[] = []
8290
8391
// 添加更新模型的方法
84-
const updateModel = (key?: string, name?: string) => {
92+
const updateModel = () => {
8593
if (!processNodeTree.value) {
8694
processNodeTree.value = {
8795
name: '发起人',
@@ -93,42 +101,78 @@ const updateModel = (key?: string, name?: string) => {
93101
type: NodeType.END_EVENT_NODE
94102
}
95103
}
104+
// 初始化时也触发一次保存
105+
saveSimpleFlowModel(processNodeTree.value)
96106
}
97107
}
98108
99-
// 监听属性变化
100-
watch([() => props.modelKey, () => props.modelName], ([newKey, newName]) => {
101-
if (!props.modelId && newKey && newName) {
102-
updateModel(newKey, newName)
109+
// 加载流程数据
110+
const loadProcessData = async (data: any) => {
111+
try {
112+
if (data) {
113+
const parsedData = typeof data === 'string' ? JSON.parse(data) : data
114+
processNodeTree.value = parsedData
115+
currentValue.value = parsedData
116+
// 确保数据加载后刷新视图
117+
await nextTick()
118+
if (simpleProcessModelRef.value?.refresh) {
119+
await simpleProcessModelRef.value.refresh()
120+
}
121+
}
122+
} catch (error) {
123+
console.error('加载流程数据失败:', error)
103124
}
104-
}, { immediate: true, deep: true })
125+
}
126+
127+
// 监听属性变化
128+
watch(
129+
() => props.value,
130+
async (newValue, oldValue) => {
131+
if (newValue && newValue !== oldValue) {
132+
await loadProcessData(newValue)
133+
}
134+
},
135+
{ immediate: true, deep: true }
136+
)
137+
138+
// 监听流程节点树变化,自动保存
139+
watch(
140+
() => processNodeTree.value,
141+
async (newValue, oldValue) => {
142+
if (newValue && oldValue && JSON.stringify(newValue) !== JSON.stringify(oldValue)) {
143+
await saveSimpleFlowModel(newValue)
144+
}
145+
},
146+
{ deep: true }
147+
)
105148
106149
const saveSimpleFlowModel = async (simpleModelNode: SimpleFlowNode) => {
107150
if (!simpleModelNode) {
108-
message.error('模型数据为空')
109151
return
110152
}
153+
154+
// 校验节点
155+
errorNodes = []
156+
validateNode(simpleModelNode, errorNodes)
157+
if (errorNodes.length > 0) {
158+
errorDialogVisible.value = true
159+
return
160+
}
161+
111162
try {
112-
loading.value = true
113163
if (props.modelId) {
114164
// 编辑模式
115165
const data = {
116166
id: props.modelId,
117167
simpleModel: simpleModelNode
118168
}
119-
const result = await updateBpmSimpleModel(data)
120-
if (result) {
121-
message.success('修改成功')
122-
emits('success')
123-
} else {
124-
message.alert('修改失败')
125-
}
126-
} else {
127-
// 新建模式,直接返回数据
128-
emits('success', simpleModelNode)
169+
await updateBpmSimpleModel(data)
129170
}
130-
} finally {
131-
loading.value = false
171+
// 无论是编辑还是新建模式,都更新当前值并触发事件
172+
currentValue.value = simpleModelNode
173+
emits('success', simpleModelNode)
174+
} catch (error) {
175+
console.error('保存失败:', error)
132176
}
133177
}
134178
@@ -193,31 +237,23 @@ onMounted(async () => {
193237
userOptions.value = await UserApi.getSimpleUserList()
194238
// 获得部门列表
195239
deptOptions.value = await DeptApi.getSimpleDeptList()
196-
197240
deptTreeOptions.value = handleTree(deptOptions.value as DeptApi.DeptVO[], 'id')
198241
// 获取用户组列表
199242
userGroupOptions.value = await UserGroupApi.getUserGroupSimpleList()
200243
244+
// 加载流程数据
201245
if (props.modelId) {
202-
//获取 SIMPLE 设计器模型
246+
// 获取 SIMPLE 设计器模型
203247
const result = await getBpmSimpleModel(props.modelId)
204248
if (result) {
205-
processNodeTree.value = result
206-
}
207-
}
208-
209-
// 如果没有现有模型,创建初始模型
210-
if (!processNodeTree.value) {
211-
processNodeTree.value = {
212-
name: props.modelName || '发起人',
213-
type: NodeType.START_USER_NODE,
214-
id: NodeId.START_USER_NODE_ID,
215-
childNode: {
216-
id: NodeId.END_EVENT_NODE_ID,
217-
name: '结束',
218-
type: NodeType.END_EVENT_NODE
219-
}
249+
await loadProcessData(result)
250+
} else {
251+
updateModel()
220252
}
253+
} else if (props.value) {
254+
await loadProcessData(props.value)
255+
} else {
256+
updateModel()
221257
}
222258
} finally {
223259
loading.value = false
@@ -228,14 +264,36 @@ const simpleProcessModelRef = ref()
228264
229265
/** 获取当前流程数据 */
230266
const getCurrentFlowData = async () => {
231-
if (simpleProcessModelRef.value) {
232-
return await simpleProcessModelRef.value.getCurrentFlowData()
267+
try {
268+
if (simpleProcessModelRef.value) {
269+
const data = await simpleProcessModelRef.value.getCurrentFlowData()
270+
if (data) {
271+
currentValue.value = data
272+
return data
273+
}
274+
}
275+
return currentValue.value
276+
} catch (error) {
277+
console.error('获取流程数据失败:', error)
278+
return currentValue.value
279+
}
280+
}
281+
282+
// 刷新方法
283+
const refresh = async () => {
284+
try {
285+
if (currentValue.value) {
286+
await loadProcessData(currentValue.value)
287+
}
288+
} catch (error) {
289+
console.error('刷新失败:', error)
233290
}
234-
return undefined
235291
}
236292
237293
defineExpose({
238294
getCurrentFlowData,
239-
updateModel
295+
updateModel,
296+
loadProcessData,
297+
refresh
240298
})
241299
</script>

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

Lines changed: 79 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,10 @@ const props = defineProps<{
3939
modelId?: string
4040
modelKey?: string
4141
modelName?: string
42+
value?: string
4243
}>()
4344
44-
const emit = defineEmits(['success'])
45+
const emit = defineEmits(['success', 'init-finished'])
4546
const message = useMessage() // 国际化
4647
4748
// 表单信息
@@ -98,8 +99,35 @@ const initModeler = async (item) => {
9899
// 确保 modeler 的所有实例都已经准备好
99100
if (initBpmnInstances()) {
100101
isModelerReady.value = true
101-
if (!props.modelId && props.modelKey && props.modelName) {
102-
await updateModelData(props.modelKey, props.modelName)
102+
emit('init-finished')
103+
104+
// 初始化完成后,设置初始值
105+
if (props.modelId) {
106+
// 编辑模式
107+
const data = await ModelApi.getModel(props.modelId)
108+
model.value = {
109+
...data,
110+
bpmnXml: undefined // 清空 bpmnXml 属性
111+
}
112+
xmlString.value = data.bpmnXml || getDefaultBpmnXml(data.key, data.name)
113+
} else if (props.modelKey && props.modelName) {
114+
// 新建模式
115+
xmlString.value = props.value || getDefaultBpmnXml(props.modelKey, props.modelName)
116+
model.value = {
117+
key: props.modelKey,
118+
name: props.modelName
119+
} as ModelApi.ModelVO
120+
}
121+
122+
// 导入XML并刷新视图
123+
await nextTick()
124+
try {
125+
await modeler.value.importXML(xmlString.value)
126+
if (processDesigner.value?.refresh) {
127+
processDesigner.value.refresh()
128+
}
129+
} catch (error) {
130+
console.error('导入XML失败:', error)
103131
}
104132
} else {
105133
console.error('modeler 实例未完全初始化')
@@ -123,6 +151,7 @@ const getDefaultBpmnXml = (key: string, name: string) => {
123151
/** 添加/修改模型 */
124152
const save = async (bpmnXml: string) => {
125153
try {
154+
xmlString.value = bpmnXml
126155
if (props.modelId) {
127156
// 编辑模式
128157
const data = {
@@ -141,58 +170,44 @@ const save = async (bpmnXml: string) => {
141170
}
142171
}
143172
144-
/** 初始化 */
145-
onMounted(async () => {
146-
try {
147-
if (props.modelId) {
148-
// 编辑模式
149-
// 查询模型
150-
const data = await ModelApi.getModel(props.modelId)
151-
model.value = {
152-
...data,
153-
bpmnXml: undefined // 清空 bpmnXml 属性
154-
}
155-
xmlString.value = data.bpmnXml || getDefaultBpmnXml(data.key, data.name)
156-
} else if (props.modelKey && props.modelName) {
157-
// 新建模式
158-
xmlString.value = getDefaultBpmnXml(props.modelKey, props.modelName)
159-
model.value = {
160-
key: props.modelKey,
161-
name: props.modelName
162-
} as ModelApi.ModelVO
163-
}
164-
} catch (error) {
165-
console.error('初始化失败:', error)
166-
message.error('初始化失败')
167-
}
168-
})
173+
// 监听 key、name 和 value 的变化
174+
watch(
175+
[() => props.modelKey, () => props.modelName, () => props.value],
176+
async ([newKey, newName, newValue]) => {
177+
if (!props.modelId && isModelerReady.value) {
178+
let shouldRefresh = false
169179
170-
/** 更新模型数据 */
171-
const updateModelData = async (key?: string, name?: string) => {
172-
if (key && name) {
173-
xmlString.value = getDefaultBpmnXml(key, name)
174-
model.value = {
175-
...model.value,
176-
key: key,
177-
name: name
178-
} as ModelApi.ModelVO
179-
// 确保更新后重新渲染
180-
await nextTick()
181-
if (processDesigner.value?.refresh) {
182-
processDesigner.value.refresh()
183-
}
184-
}
185-
}
180+
if (newKey && newName) {
181+
const newXml = newValue || getDefaultBpmnXml(newKey, newName)
182+
if (newXml !== xmlString.value) {
183+
xmlString.value = newXml
184+
shouldRefresh = true
185+
}
186+
model.value = {
187+
...model.value,
188+
key: newKey,
189+
name: newName
190+
} as ModelApi.ModelVO
191+
} else if (newValue && newValue !== xmlString.value) {
192+
xmlString.value = newValue
193+
shouldRefresh = true
194+
}
186195
187-
// 监听 key 和 name 的变化
188-
watch(
189-
[() => props.modelKey, () => props.modelName],
190-
async ([newKey, newName]) => {
191-
if (!props.modelId && newKey && newName && modeler.value) {
192-
await updateModelData(newKey, newName)
196+
if (shouldRefresh) {
197+
// 确保更新后重新渲染
198+
await nextTick()
199+
if (processDesigner.value?.refresh) {
200+
try {
201+
await modeler.value?.importXML(xmlString.value)
202+
processDesigner.value.refresh()
203+
} catch (error) {
204+
console.error('导入XML失败:', error)
205+
}
206+
}
207+
}
193208
}
194209
},
195-
{ immediate: true, deep: true }
210+
{ deep: true }
196211
)
197212
198213
// 在组件卸载时清理
@@ -209,13 +224,15 @@ onBeforeUnmount(() => {
209224
/** 获取XML字符串 */
210225
const saveXML = async () => {
211226
if (!modeler.value) {
212-
return { xml: undefined }
227+
return { xml: xmlString.value }
213228
}
214229
try {
215-
return await modeler.value.saveXML({ format: true })
230+
const result = await modeler.value.saveXML({ format: true })
231+
xmlString.value = result.xml
232+
return result
216233
} catch (error) {
217234
console.error('获取XML失败:', error)
218-
return { xml: undefined }
235+
return { xml: xmlString.value }
219236
}
220237
}
221238
@@ -233,9 +250,14 @@ const saveSVG = async () => {
233250
}
234251
235252
/** 刷新视图 */
236-
const refresh = () => {
237-
if (processDesigner.value?.refresh) {
238-
processDesigner.value.refresh()
253+
const refresh = async () => {
254+
if (processDesigner.value?.refresh && modeler.value) {
255+
try {
256+
await modeler.value.importXML(xmlString.value)
257+
processDesigner.value.refresh()
258+
} catch (error) {
259+
console.error('刷新视图失败:', error)
260+
}
239261
}
240262
}
241263

0 commit comments

Comments
 (0)