From 1ef08126ca554a8cd4b9ba47d19dc3b790e2c018 Mon Sep 17 00:00:00 2001
From: yyb <995253665@qq.com>
Date: 星期二, 19 五月 2026 17:21:19 +0800
Subject: [PATCH] Merge branch 'dev-new_pro_OA' of http://114.132.189.42:9002/r/product-inventory-management into dev-new_pro_OA

---
 src/views/financialManagement/revenueManagement/index.vue |  352 +++++++++++++++++++++++++++++++++++-----------------------
 1 files changed, 214 insertions(+), 138 deletions(-)

diff --git a/src/views/financialManagement/revenueManagement/index.vue b/src/views/financialManagement/revenueManagement/index.vue
index 35f3075..bcef5b6 100644
--- a/src/views/financialManagement/revenueManagement/index.vue
+++ b/src/views/financialManagement/revenueManagement/index.vue
@@ -1,24 +1,24 @@
 <template>
   <div class="app-container">
     <el-form :model="filters" :inline="true">
-      <el-form-item label="褰曞叆鏃ユ湡:">
+      <el-form-item label="鏀跺叆鏃ユ湡:">
         <el-date-picker v-model="filters.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
-                        placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
+                        placeholder="璇烽�夋嫨" clearable @change="changeDaterange"/>
       </el-form-item>
       <el-form-item label="鏀舵鏂瑰紡:">
         <el-select
-                v-model="filters.incomeMethod"
-                placeholder="璇烽�夋嫨"
-                clearable
-                style="width: 200px;"
-              >
-                <el-option
-                  v-for="item in payment_methods"
-                  :key="item.value"
-                  :label="item.label"
-                  :value="item.value"
-                />
-              </el-select>
+            v-model="filters.incomeMethodLabel"
+            placeholder="璇烽�夋嫨"
+            clearable
+            style="width: 200px;"
+        >
+          <el-option
+              v-for="item in incomeMethodOptions"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+          />
+        </el-select>
       </el-form-item>
       <el-form-item>
         <el-button type="primary" @click="getTableData">鎼滅储</el-button>
@@ -29,39 +29,51 @@
       <div class="actions">
         <div></div>
         <div>
-          <el-button type="primary" @click="add" icon="Plus"> 鏂板 </el-button>
+          <el-button type="primary" @click="add" icon="Plus"> 鏂板</el-button>
           <el-button @click="handleOut" icon="download">瀵煎嚭</el-button>
           <el-button
-            type="danger"
-            icon="Delete"
-            :disabled="multipleList.length <= 0"
-            @click="deleteRow(multipleList.map((item) => item.id))"
+              type="danger"
+              icon="Delete"
+              :disabled="multipleList.length <= 0 || hasBusinessIdInSelection"
+              @click="handleBatchDelete"
           >
             鎵归噺鍒犻櫎
           </el-button>
         </div>
       </div>
       <PIMTable
-        rowKey="id"
-        isSelection
-        :column="columns"
-        :tableData="dataList"
-        :page="{
+          rowKey="id"
+          isSelection
+          :column="columns"
+          :tableData="dataList"
+          :page="{
           current: pagination.currentPage,
           size: pagination.pageSize,
           total: pagination.total,
         }"
-        @selection-change="handleSelectionChange"
-        @pagination="changePage"
+          :isShowSummary="true"
+          :summaryMethod="summarizeMainTable"
+          @selection-change="handleSelectionChange"
+          @pagination="changePage"
       >
+        <template #incomeMethodSlot="{ row }">
+          <el-tag>
+            {{ getIncomeMethodLabel(row) }}
+          </el-tag>
+        </template>
         <template #operation="{ row }">
-          <el-button type="primary" text @click="edit(row.id)" icon="editPen">
+          <el-button
+              type="primary"
+              link
+              :disabled="!!row.businessId"
+              @click="edit(row.id)"
+          >
             缂栬緫
           </el-button>
           <el-button
-            type="primary"
-            text
-            @click="openFilesFormDia(row)"
+              type="primary"
+              link
+              @click="openFilesFormDia(row)"
           >
             闄勪欢
           </el-button>
@@ -69,18 +81,16 @@
       </PIMTable>
     </div>
     <Modal ref="modalRef" @success="getTableData"></Modal>
-    <files-dia ref="filesDia"></files-dia>
+    <FileListDialog v-if="fileListDialogVisible" :record-id="currentRecordId" record-type="account_income" v-model:visible="fileListDialogVisible"/>
   </div>
 </template>
 
 <script setup>
-import { usePaginationApi } from "@/hooks/usePaginationApi";
-import { listPage, delAccountIncome } from "@/api/financialManagement/revenueManagement";
-import { onMounted, getCurrentInstance } from "vue";
-import Modal from "./Modal.vue";
-import { ElMessageBox, ElMessage } from "element-plus";
+import {usePaginationApi} from "@/hooks/usePaginationApi";
+import {listPage, delAccountIncome} from "@/api/financialManagement/revenueManagement";
+import {onMounted, getCurrentInstance, ref, computed} from "vue";
+import {ElMessageBox, ElMessage} from "element-plus";
 import dayjs from "dayjs";
-import FilesDia from "./filesDia.vue";
 
 defineOptions({
   name: "鏀跺叆绠$悊",
@@ -88,11 +98,27 @@
 
 // 琛ㄦ牸澶氶�夋閫変腑椤�
 const multipleList = ref([]);
-const { proxy } = getCurrentInstance();
+const {proxy} = getCurrentInstance();
 const modalRef = ref();
-const { payment_methods } = proxy.useDict("payment_methods");
-const { income_types } = proxy.useDict("income_types");
-const filesDia = ref()
+const {payment_methods} = proxy.useDict("payment_methods");
+const {receipt_payment_type} = proxy.useDict("receipt_payment_type");
+const {income_types} = proxy.useDict("income_types");
+const fileListRef = ref(null);
+const fileListDialogVisible = ref(false);
+const currentRecordId = ref(0);
+
+const incomeMethodOptions = computed(() => {
+  const merged = [...(payment_methods.value || []), ...(receipt_payment_type.value || [])];
+  const uniqueMap = new Map();
+  merged.forEach((item) => {
+    const label = item?.label;
+    if (!label) return;
+    if (!uniqueMap.has(label)) {
+      uniqueMap.set(label, {label, value: label});
+    }
+  });
+  return Array.from(uniqueMap.values());
+});
 
 const {
   filters,
@@ -103,117 +129,154 @@
   resetFilters,
   onCurrentChange,
 } = usePaginationApi(
-  listPage,
-  {
-    incomeMethod: undefined,
-  },
-  [
+    listPage,
     {
-      label: "鏀跺叆鏃ユ湡",
-      align: "center",
-      prop: "incomeDate",
+      incomeMethodLabel: undefined,
+      entryDate: undefined,
     },
-    {
-      label: "鏀跺叆绫诲瀷",
-      align: "center",
-      prop: "incomeType",
-      dataType: "tag",
-      formatData: (params) => {
-        if (income_types.value.find((m) => m.value == params)) {
-          return income_types.value.find((m) => m.value == params).label;
-        } else {
-          return null
-        }
+    [
+      {
+        label: "鏀跺叆鏃ユ湡",
+        prop: "incomeDate",
       },
-    },
-    {
-      label: "瀹㈡埛鍚嶇О",
-      align: "center",
-      prop: "customerName",
-
-    },
-    {
-      label: "鏀跺叆閲戦",
-      align: "center",
-      prop: "incomeMoney",
-
-    },
-    {
-      label: "鏀跺叆鎻忚堪",
-      align: "center",
-      prop: "incomeDescribed",
-
-    },
-    {
-      label: "鏀舵鏂瑰紡",
-      align: "center",
-      prop: "incomeMethod",
-      dataType: "tag",
-      formatData: (params) => {
-        if (payment_methods.value.find((m) => m.value == params)) {
-          return payment_methods.value.find((m) => m.value == params).label;
-        } else {
-          return null
-        }
+      {
+        label: "鏀跺叆绫诲瀷",
+        prop: "incomeType",
+        dataType: "tag",
+        formatData: (params) => {
+          if (income_types.value.find((m) => m.value == params)) {
+            return income_types.value.find((m) => m.value == params).label;
+          } else {
+            return null
+          }
+        },
       },
-    },
-    {
-      label: "鍙戠エ鍙风爜",
-      align: "center",
-      prop: "invoiceNumber",
+      {
+        label: "瀹㈡埛鍚嶇О",
+        prop: "customerName",
+        width: '200'
 
-    },
-    {
-      label: "澶囨敞",
-      align: "center",
-      prop: "note",
+      },
+      {
+        label: "鏀跺叆閲戦",
+        prop: "incomeMoney",
 
-    },
-    {
-      label: "褰曞叆浜�",
-      align: "center",
-      prop: "inputUser",
-    },
-    {
-      label: "褰曞叆鏃ユ湡",
-      align: "center",
-      prop: "inputTime",
+      },
+      {
+        label: "鏀跺叆鎻忚堪",
+        prop: "incomeDescribed",
 
-    },
+      },
+      {
+        label: "鏀舵鏂瑰紡",
+        prop: "incomeMethodLabel",
+        align: 'center',
+        width: '100',
+        dataType: "slot",
+        slot: "incomeMethodSlot",
+      },
+      {
+        label: "鍙戠エ鍙风爜",
+        prop: "invoiceNumber",
+
+      },
+      {
+        label: "澶囨敞",
+        prop: "note",
+
+      },
+      {
+        label: "褰曞叆浜�",
+        prop: "inputUser",
+      },
+      {
+        label: "褰曞叆鏃ユ湡",
+        prop: "inputTime",
+
+      },
+      {
+        fixed: "right",
+        label: "鎿嶄綔",
+        dataType: "slot",
+        slot: "operation",
+        align: "center",
+        width: "160px",
+      },
+    ],
+    undefined,
     {
-      fixed: "right",
-      label: "鎿嶄綔",
-      dataType: "slot",
-      slot: "operation",
-      align: "center",
-      width: "200px",
-    },
-  ]
+      incomeMethodLabel: (value) => ({
+        incomeMethodLabel: value || undefined,
+      }),
+    }
 );
+
+// 琛ㄦ牸鍚堣锛氭敹鍏ラ噾棰�
+const summarizeMainTable = (param) => {
+  return proxy.summarizeTable(param, ["incomeMoney"]);
+};
+
+const getIncomeMethodLabel = (row) => {
+  const methodValue = row?.incomeMethod;
+  const dictList = String(row?.businessType) === "1"
+      ? receipt_payment_type.value
+      : payment_methods.value;
+  return dictList.find((item) => item.value == methodValue)?.label || "--";
+};
 
 // 澶氶�夊悗鍋氫粈涔�
 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 }) => {
+const changePage = ({page, limit}) => {
   pagination.currentPage = page;
-	pagination.pageSize = limit;
+  pagination.pageSize = limit;
   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: "鍙栨秷",
     type: "warning",
   }).then(async () => {
-    const { code } = await delAccountIncome(id);
+    const {code} = await delAccountIncome(id);
     if (code == 200) {
       ElMessage({
         type: "success",
@@ -224,11 +287,30 @@
   });
 };
 
+// 鎵归噺鍒犻櫎
+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) => {
   if (value) {
+    filters.entryDate = value;
     filters.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
     filters.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
   } else {
+    filters.entryDate = null;
     filters.entryDateStart = undefined;
     filters.entryDateEnd = undefined;
   }
@@ -241,27 +323,20 @@
     cancelButtonText: "鍙栨秷",
     type: "warning",
   })
-    .then(() => {
-      proxy.download(`/account/accountIncome/export`, {}, "鏀跺叆鍙拌处.xlsx");
-    })
-    .catch(() => {
-      proxy.$modal.msg("宸插彇娑�");
-    });
+      .then(() => {
+        proxy.download(`/account/accountIncome/export`, {}, "鏀跺叆鍙拌处.xlsx");
+      })
+      .catch(() => {
+        proxy.$modal.msg("宸插彇娑�");
+      });
 };
 // 鎵撳紑闄勪欢寮规
-const openFilesFormDia = (row) => {
-  nextTick(() => {
-    filesDia.value?.openDialog( row,'鏀跺叆')
-  })
+const openFilesFormDia = async (row) => {
+  currentRecordId.value = row.id;
+  fileListDialogVisible.value = true;
 };
 
 onMounted(() => {
-  filters.entryDate = [
-    dayjs().format("YYYY-MM-DD"),
-    dayjs().add(1, "day").format("YYYY-MM-DD"),
-  ]
-  filters.entryDateStart = dayjs().format("YYYY-MM-DD")
-  filters.entryDateEnd = dayjs().add(1, "day").format("YYYY-MM-DD")
   getTableData();
 });
 </script>
@@ -270,6 +345,7 @@
 .table_list {
   margin-top: unset;
 }
+
 .actions {
   display: flex;
   justify-content: space-between;

--
Gitblit v1.9.3