Browse Source

fix: 修复新增流程时无法通过第三步的bpm必填校验问题

GoldenZqqq 8 months ago
parent
commit
36157a8f24
2 changed files with 32 additions and 30 deletions
  1. 13 9
      src/views/bpm/model/form/ProcessDesign.vue
  2. 19 21
      src/views/bpm/model/form/index.vue

+ 13 - 9
src/views/bpm/model/form/ProcessDesign.vue

@@ -50,7 +50,7 @@ const modelData = computed({
 watch(
   () => props.modelValue,
   (newVal) => {
-    if (newVal.bpmnXml) {
+    if (newVal?.bpmnXml) {
       xmlString.value = newVal.bpmnXml
     }
   },
@@ -61,24 +61,29 @@ watch(
 const handleDesignSuccess = (bpmnXml?: string) => {
   if (bpmnXml) {
     xmlString.value = bpmnXml
-    emit('update:modelValue', {
+    modelData.value = {
       ...modelData.value,
       bpmnXml
-    })
+    }
     emit('success', bpmnXml)
   }
 }
 
 /** 表单校验 */
 const validate = async () => {
-  // 修改场景下,如果已有 modelData.bpmnXml 则不需要重新校验
-  if (modelData.value.id && modelData.value.bpmnXml) {
+  // 获取最新的XML数据
+  const currentXml = xmlString.value || modelData.value?.bpmnXml
+
+  // 如果是修改场景且有XML数据(无论是新的还是原有的)
+  if (modelData.value.id && currentXml) {
     return true
   }
-  // 新增场景或无 bpmnXml 时才校验
-  if (!xmlString.value) {
+
+  // 新增场景必须有XML数据
+  if (!currentXml) {
     throw new Error('请设计流程')
   }
+
   return true
 }
 
@@ -89,8 +94,7 @@ const showDesigner = computed(() => {
 
 /** 获取当前XML字符串 */
 const getXmlString = () => {
-  // 优先返回最新的 xmlString
-  return xmlString.value || modelData.value?.bpmnXml
+  return xmlString.value || modelData.value?.bpmnXml || ''
 }
 
 defineExpose({

+ 19 - 21
src/views/bpm/model/form/index.vue

@@ -169,19 +169,24 @@ const initData = async () => {
 /** 保存操作 */
 const handleSave = async () => {
   try {
-    // 保存前确保当前步骤的数据已经验证通过
-    if (typeof steps[currentStep.value].validator === 'function') {
-      await steps[currentStep.value].validator()
+    // 保存前确保所有步骤的数据都已经验证通过
+    for (const step of steps) {
+      if (step.validator) {
+        await step.validator()
+      }
     }
-    
-    // 如果是第三步,需要先获取最新的流程设计数据
+
+    // 如果是第三步,需要先获取最新的流程设计数据
     if (currentStep.value === 2) {
+      await nextTick()
       const bpmnXml = processDesignRef.value?.getXmlString()
-      if (bpmnXml) {
-        formData.value.bpmnXml = bpmnXml
+      // 确保有XML数据
+      if (!bpmnXml) {
+        throw new Error('请设计流程')
       }
+      formData.value.bpmnXml = bpmnXml
     }
-    
+
     if (formData.value.id) {
       await ModelApi.updateModel(formData.value)
       message.success('修改成功')
@@ -193,6 +198,7 @@ const handleSave = async () => {
   } catch (error) {
     console.error('保存失败:', error)
     message.error(error.message || '保存失败')
+    throw error
   }
 }
 
@@ -200,24 +206,14 @@ const handleSave = async () => {
 const handleDeploy = async () => {
   try {
     await message.confirm('是否确认发布该流程?')
-    // 发布时才进行全部校验
-    for (const step of steps) {
-      if (step.validator) {
-        await step.validator()
-      }
-    }
-    // 如果是第三步,需要先获取最新的流程设计数据
-    if (currentStep.value === 2) {
-      const bpmnXml = processDesignRef.value?.getXmlString()
-      if (bpmnXml) {
-        formData.value.bpmnXml = bpmnXml
-      }
-    }
+    // 先保存所有数据
     await handleSave()
+    // 发布
     await ModelApi.deployModel(formData.value.id)
     message.success('发布成功')
     router.push({ name: 'BpmModel' })
   } catch (error) {
+    console.error('发布失败:', error)
     if (error instanceof Error) {
       // 校验失败时,跳转到对应步骤
       const failedStep = steps.findIndex((step) => {
@@ -231,6 +227,8 @@ const handleDeploy = async () => {
       if (failedStep !== -1) {
         currentStep.value = failedStep
         message.warning('请完善必填信息')
+      } else {
+        message.error(error.message || '发布失败')
       }
     }
   }