From 04d6024553ac73e67148ce578cb01b541eebd02a Mon Sep 17 00:00:00 2001
From: yyb <995253665@qq.com>
Date: 星期一, 18 五月 2026 16:37:56 +0800
Subject: [PATCH] Merge branch 'dev_NEW_pro' into dev-new_pro_OA

---
 src/views/financialManagement/expenseManagement/index.vue |  241 ++++++++++++++---------------------------------
 1 files changed, 74 insertions(+), 167 deletions(-)

diff --git a/src/views/financialManagement/expenseManagement/index.vue b/src/views/financialManagement/expenseManagement/index.vue
index 2f84e84..173f8e1 100644
--- a/src/views/financialManagement/expenseManagement/index.vue
+++ b/src/views/financialManagement/expenseManagement/index.vue
@@ -34,8 +34,8 @@
           <el-button
             type="danger"
             icon="Delete"
-            :disabled="multipleList.length <= 0"
-            @click="deleteRow(multipleList.map((item) => item.id))"
+            :disabled="multipleList.length <= 0 || hasBusinessIdInSelection"
+            @click="handleBatchDelete"
           >
             鎵归噺鍒犻櫎
           </el-button>
@@ -51,11 +51,18 @@
           size: pagination.pageSize,
           total: pagination.total,
         }"
+        :isShowSummary="true"
+        :summaryMethod="summarizeMainTable"
         @selection-change="handleSelectionChange"
         @pagination="changePage"
       >
         <template #operation="{ row }">
-          <el-button type="primary" link @click="edit(row.id)">
+          <el-button 
+            type="primary" 
+            link 
+            :disabled="!!row.businessId"
+            @click="edit(row.id)"
+          >
             缂栬緫
           </el-button>
           <el-button
@@ -69,27 +76,18 @@
       </PIMTable>
     </div>
     <Modal ref="modalRef" @success="getTableData"></Modal>
-    <FileListDialog 
-      ref="fileListRef" 
-      v-model="fileListDialogVisible"
-      :show-upload-button="true"
-      :show-delete-button="true"
-      :upload-method="handleUpload"
-      :delete-method="handleFileDelete"
-    />
+    <FileList v-if="fileDialogVisible"  v-model:visible="fileDialogVisible" record-type="account_expense" :record-id="recordId"  />
   </div>
 </template>
 
 <script setup>
 import { usePaginationApi } from "@/hooks/usePaginationApi";
-import { listPage, delAccountExpense, fileListPage, fileAdd, fileDel } from "@/api/financialManagement/expenseManagement";
-import { onMounted, getCurrentInstance } from "vue";
+import { listPage, delAccountExpense } from "@/api/financialManagement/expenseManagement";
+import {onMounted, getCurrentInstance, ref, computed, defineAsyncComponent} from "vue";
 import Modal from "./Modal.vue";
 import { ElMessageBox, ElMessage } from "element-plus";
 import dayjs from "dayjs";
-import FileListDialog from "@/components/Dialog/FileListDialog.vue";
-import request from "@/utils/request";
-import { getToken } from "@/utils/auth";
+const FileList = defineAsyncComponent(() => import("@/components/Dialog/FileList.vue"));
 
 defineOptions({
   name: "鏀嚭绠$悊",
@@ -101,9 +99,6 @@
 const modalRef = ref();
 const { checkout_payment } = proxy.useDict("checkout_payment");
 const { expense_types } = proxy.useDict("expense_types");
-const fileListRef = ref(null);
-const fileListDialogVisible = ref(false);
-const currentFileRow = ref(null);
 const accountType = ref('鏀嚭');
 
 const {
@@ -197,15 +192,31 @@
   ]
 );
 
+// 琛ㄦ牸鍚堣锛氭敮鍑洪噾棰�
+const summarizeMainTable = (param) => {
+  return proxy.summarizeTable(param, ["expenseMoney"]);
+};
+
 // 澶氶�夊悗鍋氫粈涔�
 const handleSelectionChange = (selectionList) => {
   multipleList.value = selectionList;
 };
 
+// 鍒ゆ柇閫変腑鐨勯」涓槸鍚︽湁 businessId
+const hasBusinessIdInSelection = computed(() => {
+  return multipleList.value.some(item => item.businessId);
+});
+
 const add = () => {
   modalRef.value.openModal();
 };
 const edit = (id) => {
+  // 妫�鏌ュ綋鍓嶈鏄惁鏈� businessId
+  const row = dataList.value.find(item => item.id === id);
+  if (row && row.businessId) {
+    proxy.$modal.msgWarning("璇ヨ褰曞凡鍏宠仈涓氬姟锛屼笉鑳界紪杈�");
+    return;
+  }
   modalRef.value.loadForm(id);
 };
 const changePage = ({ page, limit }) => {
@@ -214,6 +225,25 @@
   onCurrentChange(page);
 };
 const deleteRow = (id) => {
+  // 濡傛灉鏄暟缁勶紝妫�鏌ユ槸鍚︽湁 businessId
+  if (Array.isArray(id)) {
+    const hasBusinessId = id.some(itemId => {
+      const row = dataList.value.find(item => item.id === itemId);
+      return row && row.businessId;
+    });
+    if (hasBusinessId) {
+      proxy.$modal.msgWarning("閫変腑鐨勮褰曚腑鍖呭惈宸插叧鑱斾笟鍔$殑璁板綍锛屼笉鑳藉垹闄�");
+      return;
+    }
+  } else {
+    // 鍗曚釜鍒犻櫎锛屾鏌ユ槸鍚︽湁 businessId
+    const row = dataList.value.find(item => item.id === id);
+    if (row && row.businessId) {
+      proxy.$modal.msgWarning("璇ヨ褰曞凡鍏宠仈涓氬姟锛屼笉鑳藉垹闄�");
+      return;
+    }
+  }
+  
   ElMessageBox.confirm("姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?", "鎻愮ず", {
     confirmButtonText: "纭畾",
     cancelButtonText: "鍙栨秷",
@@ -228,6 +258,23 @@
       getTableData();
     }
   });
+};
+
+// 鎵归噺鍒犻櫎
+const handleBatchDelete = () => {
+  if (multipleList.value.length === 0) {
+    proxy.$modal.msgWarning("璇烽�夋嫨瑕佸垹闄ょ殑鏁版嵁");
+    return;
+  }
+  
+  // 妫�鏌ユ槸鍚︽湁 businessId
+  if (hasBusinessIdInSelection.value) {
+    proxy.$modal.msgWarning("閫変腑鐨勮褰曚腑鍖呭惈宸插叧鑱斾笟鍔$殑璁板綍锛屼笉鑳藉垹闄�");
+    return;
+  }
+  
+  const ids = multipleList.value.map((item) => item.id);
+  deleteRow(ids);
 };
 
 const changeDaterange = (value) => {
@@ -256,156 +303,16 @@
       proxy.$modal.msg("宸插彇娑�");
     });
 };
+
+// 鎵撳紑闄勪欢寮圭獥
+const recordId =ref(0)
+const fileDialogVisible = ref(false)
+
 // 鎵撳紑闄勪欢寮规
 const openFilesFormDia = async (row) => {
-  currentFileRow.value = row;
-  accountType.value = '鏀嚭';
-  try {
-    const res = await fileListPage({
-      accountId: row.id,
-      accountType: accountType.value,
-      current: 1,
-      size: 100
-    });
-    if (res.code === 200 && fileListRef.value) {
-      // 灏嗘暟鎹浆鎹负 FileListDialog 闇�瑕佺殑鏍煎紡
-      const fileList = (res.data?.records || []).map(item => ({
-        name: item.name,
-        url: item.url,
-        id: item.id,
-        ...item
-      }));
-      fileListRef.value.open(fileList);
-      fileListDialogVisible.value = true;
-    }
-  } catch (error) {
-    proxy.$modal.msgError("鑾峰彇闄勪欢鍒楄〃澶辫触");
-  }
-};
-
-// 涓婁紶闄勪欢
-const handleUpload = async () => {
-  if (!currentFileRow.value) {
-    proxy.$modal.msgWarning("璇峰厛閫夋嫨鏁版嵁");
-    return null;
-  }
-  
-  return new Promise((resolve) => {
-    // 鍒涘缓涓�涓殣钘忕殑鏂囦欢杈撳叆鍏冪礌
-    const input = document.createElement('input');
-    input.type = 'file';
-    input.style.display = 'none';
-    input.onchange = async (e) => {
-      const file = e.target.files[0];
-      if (!file) {
-        resolve(null);
-        return;
-      }
-      
-      try {
-        // 浣跨敤 FormData 涓婁紶鏂囦欢
-        const formData = new FormData();
-        formData.append('file', file);
-        
-        const uploadRes = await request({
-          url: '/file/upload',
-          method: 'post',
-          data: formData,
-          headers: {
-            'Content-Type': 'multipart/form-data',
-            Authorization: `Bearer ${getToken()}`
-          }
-        });
-        
-        if (uploadRes.code === 200) {
-          // 淇濆瓨闄勪欢淇℃伅
-          const fileData = {
-            accountId: currentFileRow.value.id,
-            accountType: accountType.value,
-            name: uploadRes.data.originalName || file.name,
-            url: uploadRes.data.tempPath || uploadRes.data.url
-          };
-          
-          const saveRes = await fileAdd(fileData);
-          if (saveRes.code === 200) {
-            proxy.$modal.msgSuccess("鏂囦欢涓婁紶鎴愬姛");
-            // 閲嶆柊鍔犺浇鏂囦欢鍒楄〃
-            const listRes = await fileListPage({
-              accountId: currentFileRow.value.id,
-              accountType: accountType.value,
-              current: 1,
-              size: 100
-            });
-            if (listRes.code === 200 && fileListRef.value) {
-              const fileList = (listRes.data?.records || []).map(item => ({
-                name: item.name,
-                url: item.url,
-                id: item.id,
-                ...item
-              }));
-              fileListRef.value.setList(fileList);
-            }
-            // 杩斿洖鏂版枃浠朵俊鎭�
-            resolve({
-              name: fileData.name,
-              url: fileData.url,
-              id: saveRes.data?.id
-            });
-          } else {
-            proxy.$modal.msgError(saveRes.msg || "鏂囦欢淇濆瓨澶辫触");
-            resolve(null);
-          }
-        } else {
-          proxy.$modal.msgError(uploadRes.msg || "鏂囦欢涓婁紶澶辫触");
-          resolve(null);
-        }
-      } catch (error) {
-        proxy.$modal.msgError("鏂囦欢涓婁紶澶辫触");
-        resolve(null);
-      } finally {
-        document.body.removeChild(input);
-      }
-    };
-    
-    document.body.appendChild(input);
-    input.click();
-  });
-};
-
-// 鍒犻櫎闄勪欢
-const handleFileDelete = async (row) => {
-  try {
-    const res = await fileDel([row.id]);
-    if (res.code === 200) {
-      proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
-      // 閲嶆柊鍔犺浇鏂囦欢鍒楄〃
-      if (currentFileRow.value && fileListRef.value) {
-        const listRes = await fileListPage({
-          accountId: currentFileRow.value.id,
-          accountType: accountType.value,
-          current: 1,
-          size: 100
-        });
-        if (listRes.code === 200) {
-          const fileList = (listRes.data?.records || []).map(item => ({
-            name: item.name,
-            url: item.url,
-            id: item.id,
-            ...item
-          }));
-          fileListRef.value.setList(fileList);
-        }
-      }
-      return true; // 杩斿洖 true 琛ㄧず鍒犻櫎鎴愬姛锛岀粍浠朵細鏇存柊鍒楄〃
-    } else {
-      proxy.$modal.msgError(res.msg || "鍒犻櫎澶辫触");
-      return false;
-    }
-  } catch (error) {
-    proxy.$modal.msgError("鍒犻櫎澶辫触");
-    return false;
-  }
-};
+  recordId.value = row.id
+  fileDialogVisible.value = true
+}
 
 onMounted(() => {
   getTableData();

--
Gitblit v1.9.3