Skip to content

Commit 40c2cb7

Browse files
committed
feat: 优化保存/提交按钮样式与完善保存/提交后的确认逻辑
1 parent 6cf3de0 commit 40c2cb7

File tree

1 file changed

+112
-49
lines changed

1 file changed

+112
-49
lines changed

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

Lines changed: 112 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@
4444

4545
<!-- 右侧按钮 -->
4646
<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>
4949
</div>
5050
</div>
5151

@@ -90,8 +90,10 @@ import { BpmModelType, BpmModelFormType } from '@/utils/constants'
9090
import BasicInfo from './BasicInfo.vue'
9191
import FormDesign from './FormDesign.vue'
9292
import ProcessDesign from './ProcessDesign.vue'
93+
import { useTagsViewStore } from '@/store/modules/tagsView'
9394
9495
const router = useRouter()
96+
const { delView } = useTagsViewStore() // 视图操作
9597
const route = useRoute()
9698
const message = useMessage()
9799
const userStore = useUserStoreWithOut()
@@ -102,24 +104,24 @@ const formDesignRef = ref()
102104
const processDesignRef = ref()
103105
104106
/** 步骤校验函数 */
105-
const validateStep1 = async () => {
107+
const validateBasic = async () => {
106108
await basicInfoRef.value?.validate()
107109
}
108110
109-
const validateStep2 = async () => {
111+
const validateForm = async () => {
110112
await formDesignRef.value?.validate()
111113
}
112114
113-
const validateStep3 = async () => {
115+
const validateProcess = async () => {
114116
await processDesignRef.value?.validate()
115117
}
116118
117119
// 步骤控制
118120
const currentStep = ref(0)
119121
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 }
123125
]
124126
125127
// 表单数据
@@ -166,71 +168,124 @@ const initData = async () => {
166168
userList.value = await UserApi.getSimpleUserList()
167169
}
168170
169-
/** 保存操作 */
170-
const handleSave = async () => {
171+
/** 校验所有步骤数据是否完整 */
172+
const validateAllSteps = async () => {
171173
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('请完善基本信息')
177179
}
178180
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('请完善自定义表单信息')
188193
}
189194
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+
190219
if (formData.value.id) {
220+
// 修改场景
191221
await ModelApi.updateModel(formData.value)
192222
message.success('修改成功')
223+
// 询问是否发布流程
224+
try {
225+
await message.confirm('修改流程成功,是否发布流程?')
226+
// 用户点击确认,执行发布
227+
await handleDeploy()
228+
} catch {
229+
// 用户点击取消,停留在当前页面
230+
}
193231
} else {
232+
// 新增场景
194233
const result = await ModelApi.createModel(formData.value)
195-
formData.value.id = result.id
234+
formData.value.id = result
196235
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+
}
197251
}
198-
} catch (error) {
252+
} catch (error: any) {
199253
console.error('保存失败:', error)
200-
message.error(error.message || '保存失败')
201-
throw error
254+
message.warning(error.message || '请完善所有步骤的必填信息')
202255
}
203256
}
204257
205258
/** 发布操作 */
206259
const handleDeploy = async () => {
207260
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+
209273
// 先保存所有数据
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+
211281
// 发布
212282
await ModelApi.deployModel(formData.value.id)
213283
message.success('发布成功')
284+
// 返回列表页
214285
router.push({ name: 'BpmModel' })
215-
} catch (error) {
286+
} catch (error: any) {
216287
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 || '发布失败')
234289
}
235290
}
236291
@@ -243,7 +298,7 @@ const handleStepClick = async (index: number) => {
243298
return
244299
}
245300
}
246-
301+
247302
// 只有在向后切换时才进行校验
248303
if (index > currentStep.value) {
249304
try {
@@ -271,6 +326,14 @@ const handleDesignSuccess = (bpmnXml?: string) => {
271326
onMounted(async () => {
272327
await initData()
273328
})
329+
330+
// 添加组件卸载前的清理代码
331+
onBeforeUnmount(() => {
332+
// 清理所有的引用
333+
basicInfoRef.value = null
334+
formDesignRef.value = null
335+
processDesignRef.value = null
336+
})
274337
</script>
275338

276339
<style lang="scss" scoped>

0 commit comments

Comments
 (0)