From 801a3bc53415f6214800c561a562d17ea58b88f1 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期三, 01 四月 2026 11:40:14 +0800
Subject: [PATCH] 军泰伟业 1.bom导入和产品导入成功和失败逻辑修改

---
 src/components/Dialog/ImportDialog.vue |  119 ++++++++++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 97 insertions(+), 22 deletions(-)

diff --git a/src/components/Dialog/ImportDialog.vue b/src/components/Dialog/ImportDialog.vue
index 5b126dc..9388b20 100644
--- a/src/components/Dialog/ImportDialog.vue
+++ b/src/components/Dialog/ImportDialog.vue
@@ -8,17 +8,16 @@
   >
     <el-upload
       ref="uploadRef"
+      v-model:file-list="fileList"
       :limit="limit"
       :accept="accept"
       :headers="headers"
       :action="action"
       :disabled="disabled"
       :before-upload="beforeUpload"
-      :on-progress="onProgress"
-      :on-success="onSuccess"
-      :on-error="onError"
-      :on-change="onChange"
-      :auto-upload="autoUpload"
+      :http-request="handleHttpRequest"
+      :on-change="onChange || (() => {})"
+      :auto-upload="false"
       drag
     >
       <el-icon class="el-icon--upload"><UploadFilled /></el-icon>
@@ -39,7 +38,7 @@
     </el-upload>
     <template #footer>
       <div class="dialog-footer">
-        <el-button type="primary" @click="handleConfirm">纭� 瀹�</el-button>
+        <el-button type="primary" @click="handleConfirm" :loading="uploading">纭� 瀹�</el-button>
         <el-button @click="handleCancel">鍙� 娑�</el-button>
       </div>
     </template>
@@ -49,6 +48,9 @@
 <script setup>
 import { computed, ref } from 'vue'
 import { UploadFilled } from '@element-plus/icons-vue'
+import axios from 'axios'
+import { getToken } from '@/utils/auth'
+import { ElMessage } from 'element-plus'
 
 const props = defineProps({
   modelValue: {
@@ -84,10 +86,6 @@
     required: true
   },
   disabled: {
-    type: Boolean,
-    default: false
-  },
-  autoUpload: {
     type: Boolean,
     default: false
   },
@@ -129,19 +127,96 @@
 })
 
 const uploadRef = ref(null)
+const fileList = ref([])
+const uploading = ref(false)
 
 const handleClose = () => {
   emit('close')
 }
 
-const handleConfirm = () => {
-  emit('confirm')
+const handleHttpRequest = async (options) => {
+  const { file, onProgress, onSuccess, onError } = options
+  
+  uploading.value = true
+  
+  const formData = new FormData()
+  formData.append('file', file)
+  
+  try {
+    const response = await axios({
+      url: props.action,
+      method: 'post',
+      data: formData,
+      headers: {
+        'Authorization': 'Bearer ' + getToken(),
+        ...props.headers,
+        'Content-Type': 'multipart/form-data'
+      },
+      responseType: 'blob',
+      onUploadProgress: (progressEvent) => {
+        const percent = Math.round((progressEvent.loaded * 100) / progressEvent.total)
+        if (onProgress) {
+          onProgress({ percent })
+        }
+        if (props.onProgress) {
+          props.onProgress({ percent }, file)
+        }
+      }
+    })
+    
+    uploading.value = false
+    const blob = response.data
+    
+    // 鍏堝皾璇曞皢 blob 瑙f瀽涓� JSON锛堟棤璁� content-type 鏄粈涔堬級
+    try {
+      const text = await blob.text()
+      const jsonResponse = JSON.parse(text)
+      // 鎴愬姛瑙f瀽涓� JSON
+      if (jsonResponse.code === 200) {
+        if (onSuccess) onSuccess(jsonResponse)
+        if (props.onSuccess) props.onSuccess(jsonResponse, file)
+      } else {
+        const error = new Error(jsonResponse.msg || '瀵煎叆澶辫触')
+        error.response = { data: jsonResponse }
+        if (onError) onError(error)
+        if (props.onError) props.onError(jsonResponse, file)
+      }
+    } catch (e) {
+      // 涓嶆槸 JSON锛屾槸鏂囦欢娴侊紝涓嬭浇閿欒鏂囦欢
+      downloadBlob(blob, '瀵煎叆閿欒鏁版嵁.xlsx')
+      if (onError) {
+        const error = new Error('瀵煎叆澶辫触锛岃鏌ョ湅涓嬭浇鐨勯敊璇枃浠�')
+        error.response = { data: blob }
+        onError(error)
+      }
+      if (props.onError) {
+        props.onError(blob, file)
+      }
+    }
+  } catch (error) {
+    uploading.value = false
+    if (options.onError) options.onError(error)
+    if (props.onError) props.onError(error, file)
+  }
 }
 
-const submit = () => {
-  if (uploadRef.value) {
-    uploadRef.value.submit()
+const downloadBlob = (blob, filename) => {
+  const downloadElement = document.createElement('a')
+  const href = window.URL.createObjectURL(blob)
+  downloadElement.href = href
+  downloadElement.download = filename
+  document.body.appendChild(downloadElement)
+  downloadElement.click()
+  document.body.removeChild(downloadElement)
+  window.URL.revokeObjectURL(href)
+}
+
+const handleConfirm = () => {
+  if (!fileList.value || fileList.value.length === 0) {
+    ElMessage.warning('璇烽�夋嫨鏂囦欢')
+    return
   }
+  uploadRef.value.submit()
 }
 
 const handleCancel = () => {
@@ -153,14 +228,15 @@
   emit('download-template')
 }
 
+const clearFiles = () => {
+  if (uploadRef.value) {
+    uploadRef.value.clearFiles()
+  }
+}
+
 defineExpose({
   uploadRef,
-  submit,
-  clearFiles: () => {
-    if (uploadRef.value) {
-      uploadRef.value.clearFiles()
-    }
-  }
+  clearFiles
 })
 </script>
 
@@ -169,4 +245,3 @@
   text-align: center;
 }
 </style>
-

--
Gitblit v1.9.3