hurx 4 недель назад
Родитель
Сommit
624649af4d
1 измененных файлов с 30 добавлено и 7 удалено
  1. 30 7
      src/views/customer/customerFile/customerInfo/overview/baseInfo.vue

+ 30 - 7
src/views/customer/customerFile/customerInfo/overview/baseInfo.vue

@@ -1118,15 +1118,20 @@ const removeInvoice = (data: any) => {
 
 // 保存按钮
 const handleSave = async () => {
+  // 1. 先检查 ref 是否存在,避免静默失败
+  if (!formRef.value || !salesFormRef.value) {
+    ElMessage.error('表单组件未加载,请刷新页面');
+    return;
+  }
+
   try {
-    // 验证基本信息表单
-    await formRef.value?.validate();
-    // 验证销售信息表单
-    await salesFormRef.value?.validate();
+    // 2. 串行验证,任何一步失败都会抛出异常,进入 catch
+    // 注意:ElementPlus 的 validate 失败时会 reject 一个包含错误信息的对象
+    await formRef.value.validate();
+    await salesFormRef.value.validate();
 
     submitLoading.value = true;
 
-    // 组装提交数据
     const submitData: CustomerInfoForm = {
       ...form,
       customerBusinessBo: businessInfo,
@@ -1135,13 +1140,31 @@ const handleSave = async () => {
     };
 
     await updateCustomerInfo(submitData);
+
     ElMessage.success('保存成功');
 
     // 重新加载数据
     await loadCustomerData(custId.value);
+
+    // 可选:保存成功后重置表单或关闭弹窗
+    // emit('update:visible', false);
   } catch (error) {
-    console.error('保存失败:', error);
-    ElMessage.error('保存失败,请重试');
+    // 3. 关键优化:区分验证错误和系统错误
+
+    // ElementPlus 的 validate 失败时,error 通常是一个包含 fields 信息的对象
+    // 或者你可以判断 error 是否包含特定的验证失败标记
+    const isValidationError = error && typeof error === 'object' && 'fields' in error;
+    // 有些版本可能是 error instanceof Error 且 message 包含特定字样,具体视 EP 版本而定
+    // 最简单的判断:如果是因为 validate 抛出的,通常不需要报全局错误,因为表单上已经红字提示了
+
+    if (isValidationError) {
+      console.warn('表单验证未通过', error);
+      // 让用户专注于表单上的红色提示,不要弹全局 Toast 干扰用户
+      return;
+    }
+
+    // 如果是真正的系统错误(如网络断开、后端报错)
+    ElMessage.error('保存失败,请稍后重试或联系管理员');
   } finally {
     submitLoading.value = false;
   }