From 9bb858a6cb402463e157c7816ed08efde761aafd Mon Sep 17 00:00:00 2001
From: buhuazhen <hua100783@gmail.com>
Date: 星期四, 09 四月 2026 14:12:23 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_天津_阳光印刷' into dev_天津_阳光印刷

---
 src/views/collaborativeApproval/knowledgeBase/index.vue |  133 +++++++++++++++++++++++++++++++++++++------
 1 files changed, 113 insertions(+), 20 deletions(-)

diff --git a/src/views/collaborativeApproval/knowledgeBase/index.vue b/src/views/collaborativeApproval/knowledgeBase/index.vue
index 236962c..ff8da1b 100644
--- a/src/views/collaborativeApproval/knowledgeBase/index.vue
+++ b/src/views/collaborativeApproval/knowledgeBase/index.vue
@@ -145,8 +145,22 @@
             :on-error="handleUploadError"
             :on-success="handleUploadSuccess"
             :on-remove="handleRemove"
+            :on-preview="handlePreview"
+            :show-file-list="true"
           >
             <el-button type="primary">涓婁紶</el-button>
+            <template #file="{ file }">
+              <div style="display:flex; align-items:center; gap: 10px; width: 100%;">
+                <span style="flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;">
+                  {{ file.name }}
+                </span>
+                <div style="display:flex; align-items:center; gap: 6px;">
+                  <el-button link type="success" :icon="Download" @click="handleDownload(file)" />
+                  <el-button link type="primary" :icon="View" @click="handlePreview(file)" />
+                  <el-button link type="danger" :icon="Delete" @click="triggerRemoveFile(file)" />
+                </div>
+              </div>
+            </template>
             <template #tip>
               <div class="el-upload__tip">
                 鏀寔鏂囨。锛坉oc, docx, xls, xlsx, pdf, txt锛夊拰鍥剧墖锛坖pg, jpeg, png, gif锛夋牸寮�
@@ -222,9 +236,10 @@
         <div class="detail-section" v-if="currentKnowledge.commonFileList && currentKnowledge.commonFileList.length > 0">
           <h4>闄勪欢鏉愭枡</h4>
           <div class="file-list">
-            <div v-for="file in currentKnowledge.commonFileList" :key="file.id" class="file-item" style="margin-bottom: 8px;">
-              <el-icon><Document /></el-icon>
-              <el-link type="primary" :href="file.url" target="_blank" style="margin-left: 8px;">{{ file.name }}</el-link>
+            <div v-for="file in currentKnowledge.commonFileList" :key="file.id" class="file-item">
+              <div class="file-info">
+                <el-link :href="file.url" target="_blank" :download="file.name">{{ file.name }}</el-link>
+              </div>
             </div>
           </div>
         </div>
@@ -256,17 +271,18 @@
         </div>
       </div>
     </FormDialog>
+    <filePreview ref="filePreviewRef" />
   </div>
 </template>
 
 <script setup>
-import { Search, Document } from "@element-plus/icons-vue";
+import { Search, Download, View, Delete } from "@element-plus/icons-vue";
 import { onMounted, ref, reactive, toRefs, getCurrentInstance, computed, watch } from "vue";
 import { ElMessage, ElMessageBox } from "element-plus";
 import PIMTable from "@/components/PIMTable/PIMTable.vue";
 import FormDialog from '@/components/Dialog/FormDialog.vue';
-import { listKnowledgeBase, delKnowledgeBase,addKnowledgeBase,updateKnowledgeBase } from "@/api/collaborativeApproval/knowledgeBase.js";
-import { delLedgerFile } from "@/api/salesManagement/salesLedger.js";
+import filePreview from '@/components/filePreview/index.vue'
+import { listKnowledgeBase, delKnowledgeBase,addKnowledgeBase,updateKnowledgeBase, delKnowledgeBaseFile } from "@/api/collaborativeApproval/knowledgeBase.js";
 import useUserStore from '@/store/modules/user';
 import { userListNoPageByTenantId } from '@/api/system/user.js';
 import { getToken } from "@/utils/auth";
@@ -345,9 +361,30 @@
 
 // 琛ㄥ崟寮曠敤
 const formRef = ref();
+const fileUpload = ref()
+const filePreviewRef = ref()
 // 鐢ㄦ埛鐩稿叧
 const userStore = useUserStore();
 const userList = ref([]);
+
+const normalizeKnowledgeFiles = (files = []) => {
+  const list = Array.isArray(files) ? files : []
+  return list.map((f, index) => {
+    const name = f?.name || f?.originalName || f?.fileName || ''
+    const url = f?.url || f?.path || ''
+    return {
+      ...f,
+      name,
+      url,
+      uid: f?.uid || f?.id || `${Date.now()}_${index}`,
+      status: f?.status || 'success',
+    }
+  })
+}
+
+const getUploadFileUrl = (file) => {
+  return file?.url || file?.response?.data?.tempPath || file?.response?.data?.url
+}
 
 // 琛ㄦ牸鍒楅厤缃�
 const tableColumn = ref([
@@ -520,7 +557,9 @@
     });
   } else if (type === "edit" && row) {
     dialogTitle.value = "缂栬緫鐭ヨ瘑";
-    fileList.value = row.commonFileList || [];
+    const existingFiles = row.files || row.commonFileList || [];
+    const normalizedFiles = normalizeKnowledgeFiles(existingFiles);
+    fileList.value = normalizedFiles;
     Object.assign(form.value, {
       id: row.id,
       title: row.title,
@@ -532,7 +571,14 @@
       keyPoints: row.keyPoints,
       creator: row.creator,
       usageCount: row.usageCount,
-      files: row.commonFileList || []
+      files: normalizedFiles.map(f => ({
+        id: f.id,
+        tempId: f.tempId,
+        name: f.name,
+        url: f.url,
+        uid: f.uid
+      })),
+      
     });
   }
   dialogVisible.value = true;
@@ -673,22 +719,69 @@
     if (!form.value.files) {
       form.value.files = [];
     }
-    form.value.files.push({url:res.data.tempPath,name:res.data.originalName});
+    file.tempId = res?.data?.tempId
+    file.url = res?.data?.tempPath || res?.data?.url
+    file.name = res?.data?.originalName || file?.name
+    form.value.files.push({
+      tempId: file.tempId,
+      url: file.url,
+      name: file.name,
+      uid: file.uid,
+    });
     proxy.$modal.msgSuccess("涓婁紶鎴愬姛");
   } else {
     proxy.$modal.msgError(res.msg);
-    proxy.$refs.fileUpload.handleRemove(file);
+    fileUpload.value?.handleRemove?.(file) || proxy.$refs.fileUpload?.handleRemove?.(file);
   }
 }
 // 绉婚櫎鏂囦欢
-function handleRemove(file) {
-  if (dialogType.value === "edit") {
-    let ids = [];
-    ids.push(file.id);
-    delLedgerFile(ids).then((res) => {
-      proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+function handleRemove(file, fileList) {
+  // 濡傛灉鏄紪杈戞ā寮忎笖鏂囦欢鏈塱d锛岃皟鐢ˋPI鍒犻櫎
+  if (dialogType.value === "edit" && file.id) {
+    delKnowledgeBaseFile([file.id]).then((res) => {
+      if (res.code === 200) {
+        proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+        // 浠巉orm.value.files涓Щ闄�
+        const index = form.value.files.findIndex(f => f.id === file.id);
+        if (index > -1) {
+          form.value.files.splice(index, 1);
+        }
+      } else {
+        proxy.$modal.msgError(res.msg || "鍒犻櫎澶辫触");
+        // 濡傛灉鍒犻櫎澶辫触锛岄噸鏂版坊鍔犲洖鏂囦欢鍒楄〃
+        fileList.push(file);
+      }
+    }).catch((error) => {
+      proxy.$modal.msgError("鍒犻櫎澶辫触");
+      // 濡傛灉鍒犻櫎澶辫触锛岄噸鏂版坊鍔犲洖鏂囦欢鍒楄〃
+      fileList.push(file);
     });
+  } else {
+    // 鏂颁笂浼犵殑鏂囦欢锛岀洿鎺ヤ粠form.value.files涓Щ闄�
+    const index = form.value.files.findIndex(f => f.name === file.name && f.url === file.url);
+    if (index > -1) {
+      form.value.files.splice(index, 1);
+    }
   }
+}
+
+// 鏂囦欢棰勮/涓嬭浇
+const handleDownload = (file) => {
+  const url = getUploadFileUrl(file)
+  if (!url) return
+  proxy?.$modal?.loading?.("姝e湪涓嬭浇鏂囦欢锛岃绋嶅��...")
+  proxy.$download.name(url);
+  proxy?.$modal?.closeLoading?.()
+}
+
+function handlePreview(file) {
+  const url = getUploadFileUrl(file)
+  if (!url) return
+  filePreviewRef.value?.open?.(url)
+}
+
+function triggerRemoveFile(file) {
+  fileUpload.value?.handleRemove?.(file) || proxy.$refs.fileUpload?.handleRemove?.(file);
 }
 
 // 鎻愪氦鐭ヨ瘑琛ㄥ崟
@@ -803,12 +896,12 @@
 }
 
 .detail-content {
-  background: #f8f9fa;
-  padding: 16px;
-  border-radius: 6px;
   line-height: 1.6;
   color: #606266;
-  white-space: pre-wrap;
+}
+
+.detail-section {
+  margin-top: 24px;
 }
 
 .key-points {

--
Gitblit v1.9.3