From dc3fc550fe292043cc452dc9aeb0c8a1eeab3b30 Mon Sep 17 00:00:00 2001
From: tuqin <tuqin@tuqin.cn>
Date: 星期四, 24 九月 2026 16:54:39 +0800
Subject: [PATCH] feat: 新增多模块导入导出入口

---
 src/views/customerService/feedbackRegistration/index.vue |  109 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 109 insertions(+), 0 deletions(-)

diff --git a/src/views/customerService/feedbackRegistration/index.vue b/src/views/customerService/feedbackRegistration/index.vue
index bcbb326..60aed6d 100644
--- a/src/views/customerService/feedbackRegistration/index.vue
+++ b/src/views/customerService/feedbackRegistration/index.vue
@@ -95,6 +95,10 @@
         </div>
         <div>
           <el-button @click="handleOut">瀵煎嚭</el-button>
+          <el-button type="info"
+                     plain
+                     icon="Upload"
+                     @click="handleImport">瀵煎叆</el-button>
           <el-button type="danger"
                      plain
                      @click="handleDelete">鍒犻櫎</el-button>
@@ -113,6 +117,42 @@
     <form-dia ref="formDia"
               @close="handleQuery"></form-dia>
     <view-dia ref="viewDia"></view-dia>
+    <!-- 鍙嶉鐧昏瀵煎叆瀵硅瘽妗� -->
+    <el-dialog :title="upload.title"
+               v-model="upload.open"
+               width="400px"
+               append-to-body>
+      <el-upload ref="uploadRef"
+                 :limit="1"
+                 accept=".xlsx, .xls"
+                 :headers="upload.headers"
+                 :action="upload.url"
+                 :disabled="upload.isUploading"
+                 :on-progress="handleFileUploadProgress"
+                 :on-success="handleFileSuccess"
+                 :on-error="handleFileError"
+                 :auto-upload="false"
+                 drag>
+        <el-icon class="el-icon--upload"><upload-filled /></el-icon>
+        <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
+        <template #tip>
+          <div class="el-upload__tip text-center">
+            <span>浠呭厑璁稿鍏� xls銆亁lsx 鏍煎紡鏂囦欢銆�</span>
+            <el-link type="primary"
+                     :underline="false"
+                     style="font-size: 12px; vertical-align: baseline"
+                     @click="importTemplate">涓嬭浇妯℃澘</el-link>
+          </div>
+        </template>
+      </el-upload>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary"
+                     @click="submitFileForm">纭� 瀹�</el-button>
+          <el-button @click="upload.open = false">鍙� 娑�</el-button>
+        </div>
+      </template>
+    </el-dialog>
   </div>
 </template>
 
@@ -135,6 +175,7 @@
     getSalesLedgerDetail,
   } from "@/api/customerService/index.js";
   import useUserStore from "@/store/modules/user.js";
+  import { getToken } from "@/utils/auth.js";
   const { proxy } = getCurrentInstance();
   const userStore = useUserStore();
   import { Document, FolderOpened, UserFilled } from "@element-plus/icons-vue";
@@ -328,6 +369,16 @@
   };
   const formDia = ref();
   const viewDia = ref();
+  const uploadRef = ref();
+
+  // 瀵煎叆寮圭獥
+  const upload = reactive({
+    open: false,
+    title: "",
+    isUploading: false,
+    headers: { Authorization: "Bearer " + getToken() },
+    url: import.meta.env.VITE_APP_BASE_API + "/afterSalesService/import",
+  });
 
   // 瀛楀吀鑾峰彇
   /* 
@@ -434,6 +485,64 @@
       });
   };
 
+  /** 瀵煎叆鎸夐挳鎿嶄綔 */
+  const handleImport = () => {
+    upload.title = "鍙嶉鐧昏瀵煎叆";
+    upload.open = true;
+  };
+
+  /** 涓嬭浇妯℃澘 */
+  const importTemplate = () => {
+    proxy.download(
+      "/afterSalesService/importTemplate",
+      {},
+      "鍙嶉鐧昏瀵煎叆妯℃澘.xlsx"
+    );
+  };
+
+  /** 鎻愪氦涓婁紶鏂囦欢 */
+  const submitFileForm = () => {
+    upload.isUploading = true;
+    uploadRef.value.submit();
+  };
+
+  /** 鏂囦欢涓婁紶涓鐞� */
+  const handleFileUploadProgress = () => {
+    upload.isUploading = true;
+  };
+
+  /** 鏂囦欢涓婁紶鎴愬姛澶勭悊 */
+  const handleFileSuccess = response => {
+    upload.isUploading = false;
+    upload.open = false;
+    uploadRef.value.clearFiles();
+    if (response.code === 200) {
+      const failCount = response.failCount || 0;
+      if (failCount > 0) {
+        const errors = Array.isArray(response.errors) ? response.errors : [];
+        proxy.$modal
+          .alert(`${response.msg}\n\n${errors.join("\n")}`, "瀵煎叆缁撴灉", {
+            confirmButtonText: "鐭ラ亾浜�",
+            dangerouslyUseHTMLString: false,
+          })
+          .then(() => {
+            getList();
+          });
+      } else {
+        proxy.$modal.msgSuccess(response.msg || "瀵煎叆鎴愬姛");
+        getList();
+      }
+    } else {
+      proxy.$modal.msgError(response.msg || "瀵煎叆澶辫触");
+    }
+  };
+
+  /** 鏂囦欢涓婁紶澶辫触澶勭悊 */
+  const handleFileError = () => {
+    upload.isUploading = false;
+    proxy.$modal.msgError("鏂囦欢涓婁紶澶辫触");
+  };
+
   const getStatsCountByStatus = (list, status) => {
     if (!Array.isArray(list)) return 0;
     return list.find(item => item?.status === status)?.count || 0;

--
Gitblit v1.9.3