From abb6d7f841c9a0fcd4ca2e1f9b5caaf849b40482 Mon Sep 17 00:00:00 2001
From: yyb <995253665@qq.com>
Date: 星期五, 24 四月 2026 11:07:08 +0800
Subject: [PATCH] Merge branch 'dev_河南_鹤壁天沐玻璃厂' of http://114.132.189.42:9002/r/product-inventory-management into dev_河南_鹤壁天沐玻璃厂

---
 src/views/reportAnalysis/dataDashboard/components/basic/left-bottom.vue |    2 
 src/views/procurementManagement/procurementLedger/index.vue             |    4 
 src/views/procurementManagement/procurementReport/index.vue             |   34 ++++----
 src/views/salesManagement/receiptPayment/index.vue                      |    8 +
 src/views/reportAnalysis/qualityAnalysis/components/right-top.vue       |    2 
 src/views/salesManagement/receiptPaymentLedger/index.vue                |  117 +++++++++++++++++++++-------
 src/views/procurementManagement/purchaseReturnOrder/index.vue           |    2 
 src/views/salesManagement/salesLedger/index.vue                         |    4 
 src/views/reportAnalysis/dataDashboard/components/basic/center-top.vue  |    8 +-
 src/views/procurementManagement/paymentLedger/index.vue                 |   33 +++++++-
 10 files changed, 150 insertions(+), 64 deletions(-)

diff --git a/src/views/procurementManagement/paymentLedger/index.vue b/src/views/procurementManagement/paymentLedger/index.vue
index f86e188..e707d08 100644
--- a/src/views/procurementManagement/paymentLedger/index.vue
+++ b/src/views/procurementManagement/paymentLedger/index.vue
@@ -195,6 +195,14 @@
     const n = Number(v);
     return Number.isFinite(n) ? n : 0;
   };
+  const toTime = (v) => {
+    const t = new Date(v).getTime();
+    return Number.isFinite(t) ? t : -Infinity;
+  };
+  const toId = (v) => {
+    const n = Number(v);
+    return Number.isFinite(n) ? n : -Infinity;
+  };
 
   // 浠ュ綋鍓嶅彸渚ц〃鏍煎睍绀虹殑鏁版嵁涓哄噯锛堝垎椤� slice 鍚庣殑鏁版嵁锛�
   const rows = originalTableDataSon.value || [];
@@ -214,6 +222,25 @@
   );
 
   const paymentTotal = rows.reduce((sum, r) => sum + toNum(r?.paymentAmount), 0);
+  const latestRowByContract = new Map();
+  for (const r of rows) {
+    const contractNo = r?.purchaseContractNumber;
+    if (!contractNo) continue;
+    const existed = latestRowByContract.get(contractNo);
+    const currentTime = toTime(r?.paymentDate);
+    const existedTime = toTime(existed?.paymentDate);
+    const shouldReplace =
+      !existed ||
+      currentTime > existedTime ||
+      (currentTime === existedTime && toId(r?.id) > toId(existed?.id));
+    if (shouldReplace) {
+      latestRowByContract.set(contractNo, r);
+    }
+  }
+  const payableTotal = Array.from(latestRowByContract.values()).reduce(
+    (sum, r) => sum + toNum(r?.payableAmount),
+    0
+  );
 
   const columns = param?.columns || [];
   const summary = columns.map((col, idx) => {
@@ -221,13 +248,9 @@
     const prop = col?.property ?? col?.prop;
     if (prop === "invoiceAmount") return invoiceTotal.toFixed(2);
     if (prop === "paymentAmount") return paymentTotal.toFixed(2);
+    if (prop === "payableAmount") return payableTotal.toFixed(2);
     return "";
   });
-
-  if (summary.length > 0) {
-    summary[summary.length - 1] =
-      rows.length > 0 ? toNum(rows[rows.length - 1]?.payableAmount).toFixed(2) : "0.00";
-  }
 
   return summary;
 };
diff --git a/src/views/procurementManagement/procurementLedger/index.vue b/src/views/procurementManagement/procurementLedger/index.vue
index 0355e45..525c41c 100644
--- a/src/views/procurementManagement/procurementLedger/index.vue
+++ b/src/views/procurementManagement/procurementLedger/index.vue
@@ -108,8 +108,8 @@
                                prop="quantity" />
               <el-table-column label="鍙敤鏁伴噺"
                                prop="availableQuality" />
-              <el-table-column label="閫�璐ф暟閲�"
-                               prop="returnQuality" />
+              <!-- <el-table-column label="閫�璐ф暟閲�"
+                               prop="returnQuality" /> -->
               <el-table-column label="鍏ュ簱鐘舵��"
                                width="100px"
                                align="center">
diff --git a/src/views/procurementManagement/procurementReport/index.vue b/src/views/procurementManagement/procurementReport/index.vue
index 182e164..225e38d 100644
--- a/src/views/procurementManagement/procurementReport/index.vue
+++ b/src/views/procurementManagement/procurementReport/index.vue
@@ -127,24 +127,24 @@
       return val ? parseFloat(val).toLocaleString() : '0'
     }
   },
+  // {
+  //   label: '閫�璐ф暟閲�',
+  //   prop: 'returnQuantity',
+  //   width: 120,
+  //   formatData: (val) => {
+  //     return val ? parseFloat(val).toLocaleString() : '0'
+  //   }
+  // },
+  // {
+  //   label: '閫�璐ч噾棰�',
+  //   prop: 'returnAmount',
+  //   width: 120,
+  //   formatData: (val) => {
+  //     return val ? `楼${parseFloat(val).toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}` : '楼0.00'
+  //   }
+  // },
   {
-    label: '閫�璐ф暟閲�',
-    prop: 'returnQuantity',
-    width: 120,
-    formatData: (val) => {
-      return val ? parseFloat(val).toLocaleString() : '0'
-    }
-  },
-  {
-    label: '閫�璐ч噾棰�',
-    prop: 'returnAmount',
-    width: 120,
-    formatData: (val) => {
-      return val ? `楼${parseFloat(val).toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}` : '楼0.00'
-    }
-  },
-  {
-    label: '閫�娆惧偍閲�',
+    label: '璐拱閲戦',
     prop: 'purchaseAmount',
     formatData: (val) => {
       return val ? `楼${parseFloat(val).toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}` : '楼0.00'
diff --git a/src/views/procurementManagement/purchaseReturnOrder/index.vue b/src/views/procurementManagement/purchaseReturnOrder/index.vue
index 8de2877..70ca2b1 100644
--- a/src/views/procurementManagement/purchaseReturnOrder/index.vue
+++ b/src/views/procurementManagement/purchaseReturnOrder/index.vue
@@ -82,7 +82,7 @@
           <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" min-width="140" show-overflow-tooltip />
           <el-table-column label="鍗曚綅" prop="unit" width="80" />
           <el-table-column label="鏁伴噺" prop="quantity" width="80" />
-          <el-table-column label="閫�璐ф暟閲�" prop="returnQuantity" width="100" />
+          <!-- <el-table-column label="閫�璐ф暟閲�" prop="returnQuantity" width="100" /> -->
           <el-table-column label="搴撳瓨棰勮鏁伴噺" prop="warnNum" width="120" />
           <el-table-column label="绋庣巼(%)" prop="taxRate" width="90" />
           <el-table-column label="鍚◣鍗曚环(鍏�)" prop="taxInclusiveUnitPrice" width="130">
diff --git a/src/views/reportAnalysis/dataDashboard/components/basic/center-top.vue b/src/views/reportAnalysis/dataDashboard/components/basic/center-top.vue
index 113ee12..5d7863f 100644
--- a/src/views/reportAnalysis/dataDashboard/components/basic/center-top.vue
+++ b/src/views/reportAnalysis/dataDashboard/components/basic/center-top.vue
@@ -21,12 +21,12 @@
         <div class="card-content">
           <span class="card-label">瀹㈡埛鎬绘暟</span>
           <span class="card-value">{{ totalCustomers }}</span>
-          <div class="card-compare"
+          <!-- <div class="card-compare"
                :class="compareClass(customersYoY)">
             <span>鍚屾瘮</span>
             <span class="compare-value">{{ formatPercent(customersYoY) }}</span>
             <span class="compare-icon">{{ customersYoY >= 0 ? '鈫�' : '鈫�' }}</span>
-          </div>
+          </div> -->
         </div>
       </div>
       <div class="stat-card">
@@ -36,12 +36,12 @@
         <div class="card-content">
           <span class="card-label">渚涘簲鍟嗘�绘暟</span>
           <span class="card-value">{{ totalSuppliers }}</span>
-          <div class="card-compare"
+          <!-- <div class="card-compare"
                :class="compareClass(suppliersYoY)">
             <span>鍚屾瘮</span>
             <span class="compare-value">{{ formatPercent(suppliersYoY) }}</span>
             <span class="compare-icon">{{ suppliersYoY >= 0 ? '鈫�' : '鈫�' }}</span>
-          </div>
+          </div> -->
         </div>
       </div>
     </div>
diff --git a/src/views/reportAnalysis/dataDashboard/components/basic/left-bottom.vue b/src/views/reportAnalysis/dataDashboard/components/basic/left-bottom.vue
index da736e1..3c5df33 100644
--- a/src/views/reportAnalysis/dataDashboard/components/basic/left-bottom.vue
+++ b/src/views/reportAnalysis/dataDashboard/components/basic/left-bottom.vue
@@ -163,7 +163,7 @@
 
 const fetchCustomerOptions = async () => {
   try {
-    const params = { pageNum: 1, pageSize: 200 }
+    const params = { current: -1, size: -1 }
     const res = await listCustomer(params)
     const records = res?.records || res?.data?.records || res?.rows || []
     customerOptions.value = records.map((r) => ({
diff --git a/src/views/reportAnalysis/qualityAnalysis/components/right-top.vue b/src/views/reportAnalysis/qualityAnalysis/components/right-top.vue
index 890e99a..7120c3a 100644
--- a/src/views/reportAnalysis/qualityAnalysis/components/right-top.vue
+++ b/src/views/reportAnalysis/qualityAnalysis/components/right-top.vue
@@ -1,6 +1,6 @@
 <template>
   <div>
-    <PanelHeader title="涓嶅悎鏍间骇鍝佹帓鍚�" />
+    <PanelHeader title="鍚堟牸浜у搧鎺掑悕" />
     <div class="main-panel panel-item-customers">
       <div class="main-panel-container">
         <div style="color: white" class="main-panel-box" v-for="(item, index) in panelList" :key="index">
diff --git a/src/views/salesManagement/receiptPayment/index.vue b/src/views/salesManagement/receiptPayment/index.vue
index b56abd6..1354591 100644
--- a/src/views/salesManagement/receiptPayment/index.vue
+++ b/src/views/salesManagement/receiptPayment/index.vue
@@ -204,6 +204,8 @@
         border
         style="width: 100%"
         size="small"
+        show-summary
+        :summary-method="summarizeFormTable"
       >
         <el-table-column type="index" label="搴忓彿" width="50" align="center"/>
         <el-table-column label="閿�鍞悎鍚屽彿" prop="salesContractNo" show-overflow-tooltip />
@@ -403,7 +405,7 @@
 const summarizeMainTable = (param) => {
   return proxy.summarizeTable(
     param,
-    ["receiptPaymentAmountTotal", "noReceiptAmount"],
+    ["invoiceTotal", "pendingInvoiceTotal"],
     {
       ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
       futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
@@ -414,6 +416,10 @@
 const summarizeChildrenTable = (param) => {
   return proxy.summarizeTable(param, ["receiptPaymentAmount"]);
 };
+// 鏂板鍥炴寮圭獥琛ㄥ悎璁℃柟娉�
+const summarizeFormTable = (param) => {
+  return proxy.summarizeTable(param, ["pendingInvoiceTotal", "receiptPaymentAmount"]);
+};
 // 鎵撳紑寮规
 const openForm = () => {
   if (selectedRows.value.length === 0) {
diff --git a/src/views/salesManagement/receiptPaymentLedger/index.vue b/src/views/salesManagement/receiptPaymentLedger/index.vue
index 7029cfc..f2b148f 100644
--- a/src/views/salesManagement/receiptPaymentLedger/index.vue
+++ b/src/views/salesManagement/receiptPaymentLedger/index.vue
@@ -16,7 +16,7 @@
         >
       </div>
     </div>
-    <div style="display: flex">
+    <div class="ledger-content">
       <div class="table_list">
         <el-table
           :data="tableData"
@@ -27,38 +27,39 @@
           :summary-method="summarizeMainTable"
           @row-click="rowClickMethod"
           height="calc(100vh - 18.5em)"
+          style="width: 100%"
         >
           <el-table-column
             align="center"
             label="搴忓彿"
             type="index"
-            width="60"
+            min-width="60"
           />
           <el-table-column
             label="瀹㈡埛鍚嶇О"
             prop="customerName"
             show-overflow-tooltip
-						width="200"
+						min-width="200"
           />
           <el-table-column
             label="鍚堝悓閲戦(鍏�)"
             prop="invoiceTotal"
             show-overflow-tooltip
             :formatter="formattedNumber"
-						width="200"
+						min-width="200"
           />
           <el-table-column
             label="鍥炴閲戦(鍏�)"
             prop="receiptPaymentAmount"
             show-overflow-tooltip
             :formatter="formattedNumber"
-						width="200"
+						min-width="200"
           />
           <el-table-column
             label="搴旀敹閲戦(鍏�)"
             prop="unReceiptPaymentAmount"
             show-overflow-tooltip
-						width="200"
+						min-width="200"
           >
             <template #default="{ row, column }">
               <el-text type="danger">
@@ -84,44 +85,45 @@
           show-summary
           :summary-method="summarizeMainTable1"
           height="calc(100vh - 18.5em)"
+          style="width: 100%"
         >
           <el-table-column
             align="center"
             label="搴忓彿"
             type="index"
-            width="60"
+            min-width="60"
           />
           <el-table-column
             label="鍙戠敓鏃ユ湡"
             prop="receiptPaymentDate"
             show-overflow-tooltip
-						width="110"
+						min-width="110"
           />
           <el-table-column
             label="閿�鍞悎鍚屽彿"
             prop="salesContractNo"
             show-overflow-tooltip
-						width="200"
+						min-width="200"
           />
           <el-table-column
             label="鍚堝悓閲戦(鍏�)"
             prop="invoiceTotal"
             show-overflow-tooltip
             :formatter="formattedNumber"
-						width="200"
+						min-width="200"
           />
           <el-table-column
             label="鍥炴閲戦(鍏�)"
             prop="receiptPaymentAmount"
             show-overflow-tooltip
             :formatter="formattedNumber"
-						width="200"
+						min-width="200"
           />
           <el-table-column
             label="搴旀敹閲戦(鍏�)"
             prop="unReceiptPaymentAmount"
             show-overflow-tooltip
-						width="200"
+						min-width="200"
           >
             <template #default="{ row, column }">
               <el-text type="danger">
@@ -188,7 +190,8 @@
   });
 };
 const formattedNumber = (row, column, cellValue) => {
-  return parseFloat(cellValue).toFixed(2);
+  const num = Number(cellValue);
+  return Number.isFinite(num) ? num.toFixed(2) : "0.00";
 };
 // 涓昏〃鍚堣鏂规硶
 const summarizeMainTable = (param) => {
@@ -203,25 +206,71 @@
 };
 // 瀛愯〃鍚堣鏂规硶
 const summarizeMainTable1 = (param) => {
-  var summarizeTable = proxy.summarizeTable(
-    param,
-    ["invoiceAmount", "receiptAmount", "unReceiptAmount"],
-    {
-      ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-      futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
+  const toNum = (v) => {
+    const n = Number(v);
+    return Number.isFinite(n) ? n : 0;
+  };
+  const toTime = (v) => {
+    const t = new Date(v).getTime();
+    return Number.isFinite(t) ? t : -Infinity;
+  };
+  const toId = (v) => {
+    const n = Number(v);
+    return Number.isFinite(n) ? n : -Infinity;
+  };
+
+  // 浠ュ彸渚у綋鍓嶅睍绀烘暟鎹负鍑�
+  const rows = receiptRecord.value || [];
+
+  // 鍚堝悓閲戦鎸夐攢鍞悎鍚屽彿鍘婚噸
+  const invoiceByContract = new Map();
+  for (const row of rows) {
+    const contractNo = row?.salesContractNo;
+    if (!contractNo) continue;
+    if (!invoiceByContract.has(contractNo)) {
+      invoiceByContract.set(contractNo, toNum(row?.invoiceTotal));
     }
-  );
-  // 鍙栨渶鍚庝竴琛屾暟鎹�;
-  if (receiptRecord.value?.length > 0) {
-    const index = tableData.value.findIndex(
-      (item) => item.id == customerId.value
-    );
-    summarizeTable[summarizeTable.length - 1] =
-      tableData.value[index].unReceiptPaymentAmount.toFixed(2);
-  } else {
-    summarizeTable[summarizeTable.length - 1] = 0.0;
   }
-  return summarizeTable;
+  const invoiceTotal = Array.from(invoiceByContract.values()).reduce(
+    (sum, val) => sum + val,
+    0
+  );
+
+  // 鍥炴閲戦姝e父姹傚拰
+  const receiptTotal = rows.reduce(
+    (sum, row) => sum + toNum(row?.receiptPaymentAmount),
+    0
+  );
+
+  const latestRowByContract = new Map();
+  for (const row of rows) {
+    const contractNo = row?.salesContractNo;
+    if (!contractNo) continue;
+    const existed = latestRowByContract.get(contractNo);
+    const currentTime = toTime(row?.receiptPaymentDate);
+    const existedTime = toTime(existed?.receiptPaymentDate);
+    const shouldReplace =
+      !existed ||
+      currentTime > existedTime ||
+      (currentTime === existedTime && toId(row?.id) > toId(existed?.id));
+    if (shouldReplace) {
+      latestRowByContract.set(contractNo, row);
+    }
+  }
+  const unReceiptTotal = Array.from(latestRowByContract.values()).reduce(
+    (sum, row) => sum + toNum(row?.unReceiptPaymentAmount),
+    0
+  );
+
+  const columns = param?.columns || [];
+  return columns.map((column, index) => {
+    if (index === 0) return "鍚堣";
+    const prop = column?.property ?? column?.prop;
+    if (prop === "invoiceTotal") return invoiceTotal.toFixed(2);
+    if (prop === "receiptPaymentAmount") return receiptTotal.toFixed(2);
+    if (prop === "unReceiptPaymentAmount") return unReceiptTotal.toFixed(2);
+    return "";
+  });
 };
 
 const receiptPaymentList = (id) => {
@@ -262,7 +311,13 @@
 </script>
 
 <style scoped lang="scss">
+.ledger-content {
+  display: flex;
+  gap: 12px;
+}
+
 .table_list {
-  width: 50%;
+  flex: 1;
+  min-width: 0;
 }
 </style>
diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue
index e9b1ff9..e4206ad 100644
--- a/src/views/salesManagement/salesLedger/index.vue
+++ b/src/views/salesManagement/salesLedger/index.vue
@@ -66,8 +66,10 @@
                        :value="2" />
             <el-option label="瀹℃壒澶辫触"
                        :value="3" />
-            <el-option label="宸插彂璐�"
+            <el-option label="瀹℃壒閫氳繃"
                        :value="4" />
+            <el-option label="宸插彂璐�"
+                       :value="5" />
           </el-select>
         </el-form-item>
         <el-form-item label="鍏ュ簱鐘舵�侊細">

--
Gitblit v1.9.3