From ff5b4a4202405b26393c5f71999e43f3e2746499 Mon Sep 17 00:00:00 2001
From: 张诺 <zhang_12370@163.com>
Date: 星期三, 08 四月 2026 15:13:12 +0800
Subject: [PATCH] feat(知识库): 添加批量操作和文件删除功能

---
 src/pages/cooperativeOffice/collaborativeApproval/knowledgeBase/index.vue |  206 ++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 200 insertions(+), 6 deletions(-)

diff --git a/src/pages/cooperativeOffice/collaborativeApproval/knowledgeBase/index.vue b/src/pages/cooperativeOffice/collaborativeApproval/knowledgeBase/index.vue
index 5370e3c..a68e1cb 100644
--- a/src/pages/cooperativeOffice/collaborativeApproval/knowledgeBase/index.vue
+++ b/src/pages/cooperativeOffice/collaborativeApproval/knowledgeBase/index.vue
@@ -2,7 +2,32 @@
   <view class="sales-accoun">
     <!-- 浣跨敤閫氱敤椤甸潰澶撮儴缁勪欢 -->
     <PageHeader title="鐭ヨ瘑搴�"
-                @back="goBack" />
+                @back="goBack">
+      <template #right>
+        <view class="header-actions">
+          <uni-icons v-if="!batchMode"
+                     type="download"
+                     size="20"
+                     color="#333"
+                     @click="handleExport" />
+          <uni-icons v-if="!batchMode"
+                     type="trash"
+                     size="20"
+                     color="#333"
+                     @click="enterBatchMode" />
+          <uni-icons v-if="batchMode"
+                     type="trash"
+                     size="20"
+                     color="#333"
+                     @click="handleBatchDelete" />
+          <uni-icons v-if="batchMode"
+                     type="closeempty"
+                     size="20"
+                     color="#333"
+                     @click="exitBatchMode" />
+        </view>
+      </template>
+    </PageHeader>
     <!-- 鎼滅储鍜岀瓫閫夊尯鍩� -->
     <view class="search-section">
       <view class="search-bar">
@@ -20,6 +45,18 @@
                   color="#999"></u-icon>
         </view>
       </view>
+      <view class="filter-row">
+        <view class="filter-input">
+          <up-input v-model="typeName"
+                    readonly
+                    placeholder="璇烽�夋嫨鐭ヨ瘑绫诲瀷"
+                    @click="showTypeSheet = true" />
+        </view>
+        <view class="filter-reset"
+              @click="resetFilters">
+          閲嶇疆
+        </view>
+      </view>
     </view>
     <!-- 鎷滆璁板綍鍒楄〃 -->
     <view class="ledger-list"
@@ -35,6 +72,13 @@
                          color="#ffffff"></up-icon>
               </view>
               <text class="item-id">鐭ヨ瘑鏍囬锛歿{ item.title || '-' }}</text>
+            </view>
+            <view v-if="batchMode"
+                  class="select-icon"
+                  @click.stop="toggleSelection(item)">
+              <uni-icons :type="isSelected(item) ? 'checkbox-filled' : 'checkbox'"
+                         size="20"
+                         :color="isSelected(item) ? '#667eea' : '#999'" />
             </view>
           </view>
           <up-divider></up-divider>
@@ -66,25 +110,26 @@
             </view>
           </view>
           <!-- 鎸夐挳鍖哄煙 -->
-          <view class="action-buttons">
+          <view class="action-buttons"
+                v-if="!batchMode">
             <u-button type="info"
                       size="small"
                       class="action-btn"
                       plain
-                      @click="viewDetail(item, 3)">
+                      @click.stop="viewDetail(item, 3)">
               鏌ョ湅璇︽儏
             </u-button>
             <u-button type="primary"
                       size="small"
                       class="action-btn"
-                      @click="viewDetail(item, 2)">
+                      @click.stop="viewDetail(item, 2)">
               缂栬緫
             </u-button>
             <u-button type="error"
                       size="small"
                       class="action-btn"
                       plain
-                      @click="confirmDelete(item)">
+                      @click.stop="confirmDelete(item)">
               鍒犻櫎
             </u-button>
           </view>
@@ -102,6 +147,12 @@
                size="24"
                color="#ffffff"></up-icon>
     </view>
+
+    <up-action-sheet :show="showTypeSheet"
+                     :actions="typeOptions"
+                     title="璇烽�夋嫨鐭ヨ瘑绫诲瀷"
+                     @select="onTypeSelect"
+                     @close="showTypeSheet = false" />
   </view>
 </template>
 
@@ -115,6 +166,8 @@
     delKnowledgeBase,
   } from "@/api/managementMeetings/knowledgeBase";
   import useUserStore from "@/store/modules/user";
+  import config from "@/config";
+  import { getToken } from "@/utils/auth";
 
   defineOptions({ name: "knowledge-base-index" });
   
@@ -129,9 +182,13 @@
 
   // 鎼滅储鍏抽敭璇�
   const name = ref("");
+  const type = ref("");
+  const showTypeSheet = ref(false);
 
   // 鎷滆璁板綍鏁版嵁
   const visitList = ref([]);
+  const batchMode = ref(false);
+  const selectedIds = ref([]);
 
   // 杩斿洖涓婁竴椤�
   const goBack = () => {
@@ -139,6 +196,30 @@
   };
   
   const { knowledge_type } = useDict("knowledge_type");
+  const typeOptions = computed(() => {
+    const opts = (knowledge_type?.value || []).map(item => ({
+      name: item.label,
+      value: item.value
+    }));
+    return [{ name: "鍏ㄩ儴", value: "" }, ...opts];
+  });
+
+  const typeName = computed(() => {
+    const item = typeOptions.value.find(i => String(i.value) === String(type.value));
+    return item ? item.name : (type.value || "");
+  });
+
+  const onTypeSelect = (action) => {
+    type.value = action.value;
+    showTypeSheet.value = false;
+    handleQuery();
+  };
+
+  const resetFilters = () => {
+    name.value = "";
+    type.value = "";
+    handleQuery();
+  };
   
   // 鏍煎紡鍖栧洖娆炬柟寮�
   const formatReceiptType = params => {
@@ -190,6 +271,7 @@
       current: -1,
       size: -1,
       title: name.value,
+      type: type.value || undefined,
     };
     listKnowledgeBase(params)
       .then(res => {
@@ -234,6 +316,49 @@
     });
   };
 
+  const enterBatchMode = () => {
+    batchMode.value = true;
+    selectedIds.value = [];
+  };
+
+  const exitBatchMode = () => {
+    batchMode.value = false;
+    selectedIds.value = [];
+  };
+
+  const toggleSelection = item => {
+    const id = item?.id;
+    if (!id) return;
+    const idx = selectedIds.value.findIndex(v => String(v) === String(id));
+    if (idx > -1) {
+      selectedIds.value.splice(idx, 1);
+    } else {
+      selectedIds.value.push(id);
+    }
+  };
+
+  const isSelected = item => {
+    const id = item?.id;
+    if (!id) return false;
+    return selectedIds.value.some(v => String(v) === String(id));
+  };
+
+  const handleBatchDelete = () => {
+    if (selectedIds.value.length === 0) {
+      showToast("璇烽�夋嫨瑕佸垹闄ょ殑鐭ヨ瘑");
+      return;
+    }
+    uni.showModal({
+      title: "鍒犻櫎纭",
+      content: `纭畾瑕佸垹闄ら�変腑鐨� ${selectedIds.value.length} 鏉$煡璇嗗悧锛焋,
+      success: res => {
+        if (res.confirm) {
+          deleteKnowledge(selectedIds.value);
+        }
+      },
+    });
+  };
+
   // 鍒犻櫎纭
   const confirmDelete = item => {
     uni.showModal({
@@ -250,11 +375,15 @@
   // 鎵ц鍒犻櫎
   const deleteKnowledge = id => {
     showLoadingToast("鍒犻櫎涓�...");
-    delKnowledgeBase([id])
+    const ids = Array.isArray(id) ? id : [id];
+    delKnowledgeBase(ids)
       .then(res => {
         closeToast();
         if (res.code === 200) {
           showToast("鍒犻櫎鎴愬姛");
+          if (batchMode.value) {
+            exitBatchMode();
+          }
           getList(); // 閲嶆柊鑾峰彇鍒楄〃
         } else {
           showToast("鍒犻櫎澶辫触");
@@ -264,6 +393,41 @@
         closeToast();
         showToast("鍒犻櫎澶辫触");
       });
+  };
+
+  const handleExport = async () => {
+    try {
+      uni.showLoading({ title: "瀵煎嚭涓�...", mask: true });
+      const params = {
+        title: name.value || undefined,
+        type: type.value || undefined,
+      };
+      const query = Object.entries(params)
+        .filter(([, v]) => v !== undefined && v !== null && v !== "")
+        .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`)
+        .join("&");
+      const url = config.baseUrl + "/knowledgeBase/export" + (query ? `?${query}` : "");
+      const res = await uni.downloadFile({
+        url,
+        header: {
+          Authorization: "Bearer " + getToken(),
+        },
+      });
+      uni.hideLoading();
+
+      if (res.statusCode !== 200) {
+        showToast("瀵煎嚭澶辫触");
+        return;
+      }
+      uni.openDocument({
+        filePath: res.tempFilePath,
+        showMenu: true,
+        fail: () => showToast("鎵撳紑鏂囦欢澶辫触"),
+      });
+    } catch (e) {
+      uni.hideLoading();
+      showToast("瀵煎嚭澶辫触");
+    }
   };
 
   onMounted(() => {
@@ -318,6 +482,36 @@
     z-index: 100;
   }
 
+  .header-actions {
+    display: flex;
+    align-items: center;
+    gap: 12px;
+    padding-right: 8px;
+  }
+
+  .filter-row {
+    margin-top: 10px;
+    display: flex;
+    align-items: center;
+    gap: 10px;
+  }
+
+  .filter-input {
+    flex: 1;
+  }
+
+  .filter-reset {
+    padding: 6px 12px;
+    background: #f5f7fa;
+    border-radius: 6px;
+    color: #666;
+    font-size: 12px;
+  }
+
+  .select-icon {
+    padding-left: 10px;
+  }
+
   .action-buttons {
     display: flex;
     justify-content: flex-end;

--
Gitblit v1.9.3