From 1635bfb381b94ce4b6b195537e47775fa6e320ca Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期五, 24 四月 2026 11:06:55 +0800
Subject: [PATCH] fix: 应付金额去重并扣减历史记录

---
 src/views/salesManagement/receiptPaymentLedger/index.vue |   31 +++++++++++++++++++++++++------
 src/views/procurementManagement/paymentLedger/index.vue  |   28 +++++++++++++++++++++++++++-
 2 files changed, 52 insertions(+), 7 deletions(-)

diff --git a/src/views/procurementManagement/paymentLedger/index.vue b/src/views/procurementManagement/paymentLedger/index.vue
index 5b5ba9c..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,7 +222,25 @@
   );
 
   const paymentTotal = rows.reduce((sum, r) => sum + toNum(r?.paymentAmount), 0);
-  const payableTotal = rows.reduce((sum, r) => sum + toNum(r?.payableAmount), 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) => {
diff --git a/src/views/salesManagement/receiptPaymentLedger/index.vue b/src/views/salesManagement/receiptPaymentLedger/index.vue
index 30ca600..f2b148f 100644
--- a/src/views/salesManagement/receiptPaymentLedger/index.vue
+++ b/src/views/salesManagement/receiptPaymentLedger/index.vue
@@ -210,6 +210,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;
+  };
 
   // 浠ュ彸渚у綋鍓嶅睍绀烘暟鎹负鍑�
   const rows = receiptRecord.value || [];
@@ -234,14 +242,25 @@
     0
   );
 
-  // 搴旀敹閲戦淇濇寔涓昏〃褰撳墠瀹㈡埛鍙e緞
-  let unReceiptTotal = 0;
-  if (rows.length > 0) {
-    const index = tableData.value.findIndex((item) => item.id == customerId.value);
-    if (index > -1) {
-      unReceiptTotal = toNum(tableData.value[index]?.unReceiptPaymentAmount);
+  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) => {

--
Gitblit v1.9.3