44
44
45
45
<!-- 右侧按钮 -->
46
46
<div class =" w-200px flex items-center justify-end gap-2" >
47
- <el-button @click =" handleSave " >保 存 </el-button >
48
- <el-button type =" primary" @click =" handleDeploy " >发 布 </el-button >
47
+ <el-button v-if = " route.params.id " type = " success " @click =" handleDeploy " >发 布 </el-button >
48
+ <el-button type =" primary" @click =" handleSave " >保 存 </el-button >
49
49
</div >
50
50
</div >
51
51
@@ -90,8 +90,10 @@ import { BpmModelType, BpmModelFormType } from '@/utils/constants'
90
90
import BasicInfo from ' ./BasicInfo.vue'
91
91
import FormDesign from ' ./FormDesign.vue'
92
92
import ProcessDesign from ' ./ProcessDesign.vue'
93
+ import { useTagsViewStore } from ' @/store/modules/tagsView'
93
94
94
95
const router = useRouter ()
96
+ const { delView } = useTagsViewStore () // 视图操作
95
97
const route = useRoute ()
96
98
const message = useMessage ()
97
99
const userStore = useUserStoreWithOut ()
@@ -102,24 +104,24 @@ const formDesignRef = ref()
102
104
const processDesignRef = ref ()
103
105
104
106
/** 步骤校验函数 */
105
- const validateStep1 = async () => {
107
+ const validateBasic = async () => {
106
108
await basicInfoRef .value ?.validate ()
107
109
}
108
110
109
- const validateStep2 = async () => {
111
+ const validateForm = async () => {
110
112
await formDesignRef .value ?.validate ()
111
113
}
112
114
113
- const validateStep3 = async () => {
115
+ const validateProcess = async () => {
114
116
await processDesignRef .value ?.validate ()
115
117
}
116
118
117
119
// 步骤控制
118
120
const currentStep = ref (0 )
119
121
const steps = [
120
- { title: ' 基本信息' , validator: validateStep1 },
121
- { title: ' 表单设计' , validator: validateStep2 },
122
- { title: ' 流程设计' , validator: validateStep3 }
122
+ { title: ' 基本信息' , validator: validateBasic },
123
+ { title: ' 表单设计' , validator: validateForm },
124
+ { title: ' 流程设计' , validator: validateProcess }
123
125
]
124
126
125
127
// 表单数据
@@ -166,71 +168,124 @@ const initData = async () => {
166
168
userList .value = await UserApi .getSimpleUserList ()
167
169
}
168
170
169
- /** 保存操作 */
170
- const handleSave = async () => {
171
+ /** 校验所有步骤数据是否完整 */
172
+ const validateAllSteps = async () => {
171
173
try {
172
- // 保存前确保所有步骤的数据都已经验证通过
173
- for ( const step of steps ) {
174
- if (step . validator ) {
175
- await step . validator ()
176
- }
174
+ // 基本信息校验
175
+ await basicInfoRef . value ?. validate ()
176
+ if (! formData . value . key || ! formData . value . name || ! formData . value . category ) {
177
+ currentStep . value = 0
178
+ throw new Error ( ' 请完善基本信息 ' )
177
179
}
178
180
179
- // 如果是在第三步,需要先获取最新的流程设计数据
180
- if (currentStep .value === 2 ) {
181
- await nextTick ()
182
- const bpmnXml = processDesignRef .value ?.getXmlString ()
183
- // 确保有XML数据
184
- if (! bpmnXml ) {
185
- throw new Error (' 请设计流程' )
186
- }
187
- formData .value .bpmnXml = bpmnXml
181
+ // 表单设计校验
182
+ await formDesignRef .value ?.validate ()
183
+ if (formData .value .formType === 10 && ! formData .value .formId ) {
184
+ currentStep .value = 1
185
+ throw new Error (' 请选择流程表单' )
186
+ }
187
+ if (
188
+ formData .value .formType === 20 &&
189
+ (! formData .value .formCustomCreatePath || ! formData .value .formCustomViewPath )
190
+ ) {
191
+ currentStep .value = 1
192
+ throw new Error (' 请完善自定义表单信息' )
188
193
}
189
194
195
+ // 流程设计校验
196
+ await processDesignRef .value ?.validate ()
197
+ const bpmnXml = processDesignRef .value ?.getXmlString ()
198
+ if (! bpmnXml ) {
199
+ currentStep .value = 2
200
+ throw new Error (' 请设计流程' )
201
+ }
202
+
203
+ return true
204
+ } catch (error ) {
205
+ throw error
206
+ }
207
+ }
208
+
209
+ /** 保存操作 */
210
+ const handleSave = async () => {
211
+ try {
212
+ // 保存前校验所有步骤的数据
213
+ await validateAllSteps ()
214
+
215
+ // 获取最新的流程设计数据
216
+ const bpmnXml = processDesignRef .value ?.getXmlString ()
217
+ formData .value .bpmnXml = bpmnXml
218
+
190
219
if (formData .value .id ) {
220
+ // 修改场景
191
221
await ModelApi .updateModel (formData .value )
192
222
message .success (' 修改成功' )
223
+ // 询问是否发布流程
224
+ try {
225
+ await message .confirm (' 修改流程成功,是否发布流程?' )
226
+ // 用户点击确认,执行发布
227
+ await handleDeploy ()
228
+ } catch {
229
+ // 用户点击取消,停留在当前页面
230
+ }
193
231
} else {
232
+ // 新增场景
194
233
const result = await ModelApi .createModel (formData .value )
195
- formData .value .id = result . id
234
+ formData .value .id = result
196
235
message .success (' 新增成功' )
236
+ try {
237
+ await message .confirm (' 创建流程成功,是否继续编辑?' )
238
+ // 用户点击继续编辑,跳转到编辑页面
239
+ await nextTick ()
240
+ // 先删除当前页签
241
+ delView (unref (router .currentRoute ))
242
+ // 跳转到编辑页面
243
+ await router .push ({
244
+ name: ' BpmModelUpdate' ,
245
+ params: { id: formData .value .id }
246
+ })
247
+ } catch {
248
+ // 用户点击返回列表
249
+ await router .push ({ name: ' BpmModel' })
250
+ }
197
251
}
198
- } catch (error ) {
252
+ } catch (error : any ) {
199
253
console .error (' 保存失败:' , error )
200
- message .error (error .message || ' 保存失败' )
201
- throw error
254
+ message .warning (error .message || ' 请完善所有步骤的必填信息' )
202
255
}
203
256
}
204
257
205
258
/** 发布操作 */
206
259
const handleDeploy = async () => {
207
260
try {
208
- await message .confirm (' 是否确认发布该流程?' )
261
+ // 修改场景下直接发布,新增场景下需要先确认
262
+ if (! formData .value .id ) {
263
+ await message .confirm (' 是否确认发布该流程?' )
264
+ }
265
+
266
+ // 校验所有步骤
267
+ await validateAllSteps ()
268
+
269
+ // 获取最新的流程设计数据
270
+ const bpmnXml = processDesignRef .value ?.getXmlString ()
271
+ formData .value .bpmnXml = bpmnXml
272
+
209
273
// 先保存所有数据
210
- await handleSave ()
274
+ if (formData .value .id ) {
275
+ await ModelApi .updateModel (formData .value )
276
+ } else {
277
+ const result = await ModelApi .createModel (formData .value )
278
+ formData .value .id = result .id
279
+ }
280
+
211
281
// 发布
212
282
await ModelApi .deployModel (formData .value .id )
213
283
message .success (' 发布成功' )
284
+ // 返回列表页
214
285
router .push ({ name: ' BpmModel' })
215
- } catch (error ) {
286
+ } catch (error : any ) {
216
287
console .error (' 发布失败:' , error )
217
- if (error instanceof Error ) {
218
- // 校验失败时,跳转到对应步骤
219
- const failedStep = steps .findIndex ((step ) => {
220
- try {
221
- step .validator && step .validator ()
222
- return false
223
- } catch {
224
- return true
225
- }
226
- })
227
- if (failedStep !== - 1 ) {
228
- currentStep .value = failedStep
229
- message .warning (' 请完善必填信息' )
230
- } else {
231
- message .error (error .message || ' 发布失败' )
232
- }
233
- }
288
+ message .warning (error .message || ' 发布失败' )
234
289
}
235
290
}
236
291
@@ -243,7 +298,7 @@ const handleStepClick = async (index: number) => {
243
298
return
244
299
}
245
300
}
246
-
301
+
247
302
// 只有在向后切换时才进行校验
248
303
if (index > currentStep .value ) {
249
304
try {
@@ -271,6 +326,14 @@ const handleDesignSuccess = (bpmnXml?: string) => {
271
326
onMounted (async () => {
272
327
await initData ()
273
328
})
329
+
330
+ // 添加组件卸载前的清理代码
331
+ onBeforeUnmount (() => {
332
+ // 清理所有的引用
333
+ basicInfoRef .value = null
334
+ formDesignRef .value = null
335
+ processDesignRef .value = null
336
+ })
274
337
</script >
275
338
276
339
<style lang="scss" scoped>
0 commit comments