From 2eeeb70e4733e7fc41635c3aa2143f13cbc43d58 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期三, 04 十一月 2026 17:11:34 +0800
Subject: [PATCH] feat(erp): 采购来票分摊合计改为不超过来票金额即可

---
 yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/enums/ErrorCodeConstants.java                       |    2 +-
 yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseInvoiceServiceImpl.java |   14 ++++++--------
 docs/erp_purchase_invoice_multi_order_integration.md                                                           |    6 +++---
 3 files changed, 10 insertions(+), 12 deletions(-)

diff --git a/docs/erp_purchase_invoice_multi_order_integration.md b/docs/erp_purchase_invoice_multi_order_integration.md
index 8f467ba..832b29e 100644
--- a/docs/erp_purchase_invoice_multi_order_integration.md
+++ b/docs/erp_purchase_invoice_multi_order_integration.md
@@ -37,7 +37,7 @@
 | orderAllocations[].price | BigDecimal | 鏄� | 鏈紶鏉ョエ鍒嗘憡鍒拌璁㈠崟鐨勯噾棰濓紝涓嶈兘灏忎簬 0 |
 | purchaseOrderId | Long | 鍚� | **涓嶅啀鐢卞墠绔紶**锛屽悗绔彇鍒嗘憡鏄庣粏绗竴琛屽洖濉� |
 | supplierId | Long | 鍚� | **涓嶅啀鐢卞墠绔紶**锛屽悗绔彇绗竴寮犺鍗曠殑渚涘簲鍟嗗洖濉� |
-| price | BigDecimal | 鏄� | 鏉ョエ閲戦锛屽繀椤荤瓑浜庡悇琛屽垎鎽婇噾棰濅箣鍜� |
+| price | BigDecimal | 鏄� | 鏉ョエ閲戦锛屽繀椤诲ぇ浜庣瓑浜庡悇琛屽垎鎽婇噾棰濅箣鍜岋紙鏈垎鎽婇儴鍒嗗彲鍚庣画缂栬緫琛ュ厖璁㈠崟锛� |
 
 **page 璇锋眰鍙傛暟鏂板锛�**
 
@@ -80,7 +80,7 @@
 | 瀛楁 | 灞曠ず浣嶇疆 | 璇存槑 |
 |------|----------|------|
 | 閲囪喘璁㈠崟 | 鏉ョエ鏂板/缂栬緫寮圭獥 | 澶氶�夊脊绐楋紙宸插鏍� + 鏈紑绁ㄩ噾棰濆ぇ浜� 0锛夛紝琛ㄦ牸鍒楋細璁㈠崟鍙枫�佷緵搴斿晢銆佽鍗曢噾棰濄�佹湭寮�绁ㄩ噾棰濄�佹湰娆″垎鎽婇噾棰濓紙鍙紪杈戯級銆佺Щ闄� |
-| 鍒嗘憡鍚堣 / 寰呭垎鎽婂樊棰� | 鍒嗘憡琛ㄦ牸涓嬫柟 | 瀹炴椂鏄剧ず锛屽樊棰濅笉涓� 0 鏃朵繚瀛樿鎷︽埅 |
+| 鍒嗘憡鍚堣 / 寰呭垎鎽婂樊棰� | 鍒嗘憡琛ㄦ牸涓嬫柟 | 瀹炴椂鏄剧ず锛涘樊棰濅负姝o紙鏈垎鎽婏級鍏佽淇濆瓨锛屼负璐燂紙瓒呭嚭锛夋椂淇濆瓨琚嫤鎴� |
 | 渚涘簲鍟� | 鏉ョエ琛ㄥ崟 | 鐢辨墍閫夎鍗曚緵搴斿晢甯﹀嚭锛堝悓涓�渚涘簲鍟嗭級锛屽彧璇� |
 | 閲囪喘璁㈠崟缂栧彿 | 鏉ョエ鍒楄〃 | 灞曠ず orderNos锛涘巻鍙叉暟鎹洖閫�鍒颁富璁㈠崟鍙� |
 | 鏈紑绁ㄩ噾棰� | 閲囪喘璁㈠崟鍒楄〃 / 閫夋嫨寮圭獥 | 鎸夊垎鎽婃槑缁嗗疄鏃惰绠� |
@@ -89,7 +89,7 @@
 
 | 鍦烘櫙 | 瑙勫垯 |
 |------|------|
-| 鍒嗘憡鍚堣 | 蹇呴』绛変簬鏉ョエ閲戦锛屽惁鍒欐姤閿欏苟鍒楀嚭鏉ョエ閲戦銆佸垎鎽婂悎璁″拰宸 |
+| 鍒嗘憡鍚堣 | 涓嶈兘澶т簬鏉ョエ閲戦锛堣秴鍑烘椂鎶ラ敊骞跺垪鍑烘潵绁ㄩ噾棰濄�佸垎鎽婂悎璁″拰瓒呭嚭閲戦锛夛紱鍏佽灏忎簬鏉ョエ閲戦锛屾湭鍒嗘憡閮ㄥ垎鍙繚瀛樺悗缂栬緫鏉ョエ鍐嶈ˉ鍏呴噰璐鍗� |
 | 鍗曡鍗曚笂闄� | 姣忚鍒嗘憡閲戦涓嶅緱瓒呰繃璇ヨ鍗曘�屾湭寮�绁ㄩ噾棰濄�嶏紙璁㈠崟閲戦 鈭� 鍏朵粬鏉ョエ宸插崰鐢級 |
 | 璁㈠崟閲嶅 | 鍚屼竴寮犳潵绁ㄥ唴鍚屼竴璁㈠崟鍙兘鍑虹幇涓�娆� |
 | 璁㈠崟鐘舵�� | 鍙湁宸插鏍搁�氳繃锛坰tatus=20锛夌殑閲囪喘璁㈠崟鎵嶈兘鐧昏鏉ョエ |
diff --git a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/enums/ErrorCodeConstants.java b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/enums/ErrorCodeConstants.java
index 058e140..c63c613 100644
--- a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/enums/ErrorCodeConstants.java
+++ b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/enums/ErrorCodeConstants.java
@@ -65,7 +65,7 @@
     ErrorCode PURCHASE_INVOICE_ALLOCATION_EMPTY = new ErrorCode(1_030_105_009, "璇疯嚦灏戦�夋嫨涓�寮犻噰璐鍗曪紝骞舵妸鏉ョエ閲戦鍒嗘憡鍒拌鍗曚笂");
     ErrorCode PURCHASE_INVOICE_ALLOCATION_ORDER_DUPLICATE = new ErrorCode(1_030_105_010, "鍚屼竴寮犳潵绁ㄥ唴鐨勯噰璐鍗曚笉鑳介噸澶嶉�夋嫨");
     ErrorCode PURCHASE_INVOICE_ALLOCATION_PRICE_INVALID = new ErrorCode(1_030_105_011, "鍒嗘憡閲戦蹇呴』濉啓涓斾笉鑳藉皬浜� 0");
-    ErrorCode PURCHASE_INVOICE_ALLOCATION_SUM_MISMATCH = new ErrorCode(1_030_105_012, "鍚勯噰璐鍗曠殑鍒嗘憡閲戦鍚堣蹇呴』绛変簬鏉ョエ閲戦");
+    ErrorCode PURCHASE_INVOICE_ALLOCATION_SUM_MISMATCH = new ErrorCode(1_030_105_012, "鍚勯噰璐鍗曠殑鍒嗘憡閲戦鍚堣涓嶈兘澶т簬鏉ョエ閲戦");
     ErrorCode PURCHASE_INVOICE_ALLOCATION_SUPPLIER_MISMATCH = new ErrorCode(1_030_105_013, "鍚屼竴寮犳潵绁ㄥ彧鑳藉叧鑱斿悓涓�渚涘簲鍟嗙殑閲囪喘璁㈠崟");
 
     // ========== ERP 閲囪喘閫�璐э紙1-030-103-000锛� ==========
diff --git a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseInvoiceServiceImpl.java b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseInvoiceServiceImpl.java
index 016d052..abfd6ff 100644
--- a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseInvoiceServiceImpl.java
+++ b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseInvoiceServiceImpl.java
@@ -132,18 +132,16 @@
         }
         // 1.2 鏍¢獙鎵�鏈夐噰璐鍗曞繀椤绘槸鍚屼竴渚涘簲鍟嗭紙鏉ョエ瀵瑰簲涓�涓緵搴斿晢锛�
         validateSameSupplier(orders);
-        // 2. 鏍¢獙鍒嗘憡鍚堣 = 鏉ョエ閲戦
+        // 2. 鏍¢獙鍒嗘憡鍚堣涓嶈兘澶т簬鏉ョエ閲戦锛堝厑璁稿皬浜庯細鏈垎鎽婇儴鍒嗗彲鍚庣画缂栬緫鏉ョエ鏃跺啀琛ュ厖閲囪喘璁㈠崟锛�
         BigDecimal allocationTotal = allocations.stream().map(ErpPurchaseInvoiceOrderReqVO::getPrice)
                 .reduce(BigDecimal.ZERO, BigDecimal::add);
-        if (allocationTotal.compareTo(reqVO.getPrice()) != 0) {
-            BigDecimal diff = reqVO.getPrice().subtract(allocationTotal);
-            String detail = diff.compareTo(BigDecimal.ZERO) > 0
-                    ? StrUtil.format("杩樻湁 {} 鍏冩湭鍒嗘憡鍒拌鍗曪紝璇蜂负璁㈠崟濉啓鍒嗘憡閲戦鎴栨敼閫夎鍗�", diff.stripTrailingZeros().toPlainString())
-                    : StrUtil.format("鍒嗘憡鍚堣姣旀潵绁ㄩ噾棰濆 {} 鍏冿紝璇峰噺灏戝垎鎽婇噾棰�", diff.negate().stripTrailingZeros().toPlainString());
+        if (allocationTotal.compareTo(reqVO.getPrice()) > 0) {
             throw new ServiceException(PURCHASE_INVOICE_ALLOCATION_SUM_MISMATCH.getCode(),
-                    StrUtil.format("鏉ョエ閲戦 {} 鍏冿紝鍚勮鍗曞垎鎽婂悎璁� {} 鍏冿紝涓よ�呭繀椤荤浉绛夛紙宸锛歿}锛夈��",
+                    StrUtil.format("鏉ョエ閲戦 {} 鍏冿紝鍚勮鍗曞垎鎽婂悎璁� {} 鍏冿紝鍒嗘憡鍚堣涓嶈兘澶т簬鏉ョエ閲戦锛堣秴鍑� {} 鍏冿級銆�"
+                                    + "璇峰噺灏戣鍗曠殑鍒嗘憡閲戦锛屾垨鎻愰珮鏉ョエ閲戦鍚庨噸璇曪紱鏈垎鎽婄殑閮ㄥ垎鍙互鐣欏緟浠ュ悗鍐嶇紪杈戞潵绁ㄨˉ鍏呴噰璐鍗曘��",
                             reqVO.getPrice().stripTrailingZeros().toPlainString(),
-                            allocationTotal.stripTrailingZeros().toPlainString(), detail));
+                            allocationTotal.stripTrailingZeros().toPlainString(),
+                            allocationTotal.subtract(reqVO.getPrice()).stripTrailingZeros().toPlainString()));
         }
         // 3. 涓昏鍗曘�佷緵搴斿晢鍙栧垎鎽婃槑缁嗙涓�寮狅紙涓�寮犳潵绁ㄦ秹鍙婂涓緵搴斿晢鏃讹紝鍒楄〃/浠樻娌跨敤绗竴瀹讹級
         reqVO.setPurchaseOrderId(allocations.get(0).getPurchaseOrderId());

--
Gitblit v1.9.3