From 684e4306a08feeae188070f264148e6765da8dcf Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期日, 20 九月 2026 19:25:15 +0800
Subject: [PATCH] feat(account): 更新往来付款回款流水表及接口

---
 src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java |  112 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 112 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
index 5a80184..553b2fa 100644
--- a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -37,6 +37,10 @@
 import com.ruoyi.framework.security.LoginUser;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.framework.web.domain.R;
+import com.ruoyi.measuringinstrumentledger.mapper.SparePartsMapper;
+import com.ruoyi.measuringinstrumentledger.pojo.SpareParts;
+import com.ruoyi.measuringinstrumentledger.pojo.SparePartsRecord;
+import com.ruoyi.measuringinstrumentledger.service.SparePartsRecordService;
 import com.ruoyi.other.mapper.TempFileMapper;
 import com.ruoyi.procurementrecord.mapper.ProcurementRecordMapper;
 import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
@@ -96,6 +100,16 @@
 @RequiredArgsConstructor
 public class PurchaseLedgerServiceImpl extends ServiceImpl<PurchaseLedgerMapper, PurchaseLedger> implements IPurchaseLedgerService {
 
+    /**
+     * 鏄庣粏绫诲瀷锛氶噰璐紙sales_ledger_product.type锛夈�備粎閲囪喘鏄庣粏鎵嶅洖鍐欏浠跺簱瀛�
+     */
+    private static final Integer LEDGER_TYPE_PURCHASE = 2;
+
+    /**
+     * 澶囦欢娴佹按鏉ユ簮锛氶噰璐叆搴撱�傝 spare_parts_record.source_type
+     */
+    private static final Integer SPARE_PARTS_SOURCE_PURCHASE = 1;
+
     private final PurchaseLedgerMapper purchaseLedgerMapper;
     private final SalesLedgerMapper salesLedgerMapper;
     private final SalesLedgerProductMapper salesLedgerProductMapper;
@@ -121,6 +135,8 @@
     private final StockUtils stockUtils;
     private final ApprovalTemplateMapper approvalTemplateMapper;
     private final OilDepotMapper oilDepotMapper;
+    private final SparePartsMapper sparePartsMapper;
+    private final SparePartsRecordService sparePartsRecordService;
 
     @Override
     public List<PurchaseLedger> selectPurchaseLedgerList(PurchaseLedger purchaseLedger) {
@@ -190,6 +206,8 @@
             purchaseLedger.setPurchaseContractNumber(generatePurchaseContractNo(purchaseLedger.getEntryDate()));
         }
         this.saveOrUpdate(purchaseLedger);
+        // 鍥炲啓涓婚敭锛屼緵璋冪敤鏂癸紙濡傞噰璐敵璇疯浆璁㈠崟锛夎幏鍙栨柊鐢熸垚鐨勯噰璐彴璐d
+        purchaseLedgerDto.setId(purchaseLedger.getId());
 
         // 4. 澶勭悊瀛愯〃鏁版嵁
         List<SalesLedgerProduct> productList = purchaseLedgerDto.getProductData();
@@ -707,6 +725,13 @@
                 salesLedgerProductMapper.insert(salesLedgerProduct);
             }
         }
+        // 閲囪喘鏄庣粏鍥炲啓澶囦欢锛氬厛鎸夊彴璐﹀洖婊氫笂涓�娆$殑娴佹按锛屽啀鎸夊綋鍓嶆槑缁嗘暣浣撻噸寤恒��
+        // 缂栬緫鏃舵槑缁嗚鍙兘琚Щ闄わ紝鍙鏂板琛屼細婕忔帀绉婚櫎鐨勯偅浜涳紱鏁翠綋閲嶅缓澶╃劧涓庡綋鍓嶆槑缁嗗榻愩��
+        // 娉ㄦ剰杩欐蹇呴』鍦� insertList 涔嬪锛屽惁鍒欍�屽彧鍒犳槑缁嗐�佷笉鏂板銆嶇殑缂栬緫涓嶄細瑙﹀彂鍥炴粴
+        if (LEDGER_TYPE_PURCHASE.equals(ledgerType)) {
+            rollbackSparePartsInbound(salesLedgerId);
+            recordSparePartsInbound(products, purchaseLedger);
+        }
 
         // 璁$畻鎬诲惈绋庨噾棰�
         BigDecimal totalTaxInclusiveAmount = products.stream()
@@ -721,6 +746,90 @@
         }
     }
 
+    /**
+     * 鎸夐噰璐彴璐﹀洖婊氬浠讹細鎶婅鍙拌处浜х敓鐨勫叆搴撴祦姘撮�愬浠跺噺鍥炲簱瀛橈紝鐒跺悗鍒犻櫎杩欎簺娴佹按銆�
+     *
+     * <p>澶囦欢鍏堢敱閲囪喘鍏ヨ处銆佸悗缁缁翠慨/淇濆吇棰嗙敤鍑鸿处锛岃嫢鍏ヨ处閲忓凡缁忚棰嗙敤鎺夛紝鍑忓洖浼氬嚭鐜拌礋搴撳瓨锛�
+     * 姝ゆ椂鐩存帴鎷︿綇涓嶈鍒狅紝閬垮厤鎶婂浠惰处鍋氳姳銆傚垹闄ゅ彴璐︿笌缂栬緫閲嶅缓閮借蛋杩欓噷锛屽彛寰勭粺涓�銆�</p>
+     */
+    private void rollbackSparePartsInbound(Long ledgerId) {
+        List<SparePartsRecord> records = sparePartsRecordService.list(new LambdaQueryWrapper<SparePartsRecord>()
+                .eq(SparePartsRecord::getSourceType, SPARE_PARTS_SOURCE_PURCHASE)
+                .eq(SparePartsRecord::getSourceId, ledgerId));
+        if (CollectionUtils.isEmpty(records)) {
+            return;
+        }
+        Map<Long, BigDecimal> rollbackBySparePartsId = new HashMap<>();
+        for (SparePartsRecord record : records) {
+            BigDecimal quantity = record.getQuantity() == null ? BigDecimal.ZERO : record.getQuantity();
+            rollbackBySparePartsId.merge(record.getSparePartsId(), quantity, BigDecimal::add);
+        }
+        for (Map.Entry<Long, BigDecimal> entry : rollbackBySparePartsId.entrySet()) {
+            if (entry.getKey() == null) {
+                continue;
+            }
+            SpareParts spareParts = sparePartsMapper.selectById(entry.getKey());
+            if (spareParts == null) {
+                continue;
+            }
+            BigDecimal current = spareParts.getQuantity() == null ? BigDecimal.ZERO : spareParts.getQuantity();
+            if (current.compareTo(entry.getValue()) < 0) {
+                throw new BaseException("澶囦欢銆�" + spareParts.getName() + "銆嶅綋鍓嶅簱瀛� " + current
+                        + "锛屼笉瓒充互鍥炴粴鏈閲囪喘鍏ュ簱鐨� " + entry.getValue() + "锛岃鍏堝鐞嗛鐢ㄨ褰�");
+            }
+            spareParts.setQuantity(current.subtract(entry.getValue()));
+            sparePartsMapper.updateById(spareParts);
+        }
+        sparePartsRecordService.removeByIds(records.stream()
+                .map(SparePartsRecord::getId)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toList()));
+    }
+
+    /**
+     * 閲囪喘鍙拌处鏄庣粏鎸夎鏍煎尮閰嶅浠讹細绱姞澶囦欢搴撳瓨骞惰涓�鏉″叆搴撴祦姘淬��
+     * 鏈淮鎶よ鏍肩殑澶囦欢涓嶅弬涓庯紝闈欓粯璺宠繃銆�
+     *
+     * <p>璋冪敤鍓嶅繀椤诲厛 {@link #rollbackSparePartsInbound(Long)}锛屼袱鑰呮垚瀵瑰嚭鐜帮細
+     * 鍥炴粴鏃ф祦姘� + 鎸夊綋鍓嶆槑缁嗛噸寤猴紝鎵嶈兘淇濊瘉缂栬緫鍙拌处鍚庡浠舵暟閲忎笌鏄庣粏涓�鑷淬��</p>
+     */
+    private void recordSparePartsInbound(List<SalesLedgerProduct> products, PurchaseLedger purchaseLedger) {
+        List<Long> modelIds = products.stream()
+                .map(SalesLedgerProduct::getProductModelId)
+                .filter(Objects::nonNull)
+                .distinct()
+                .collect(Collectors.toList());
+        if (modelIds.isEmpty()) {
+            return;
+        }
+        List<SpareParts> sparePartsList = sparePartsMapper.selectList(new LambdaQueryWrapper<SpareParts>()
+                .in(SpareParts::getProductModelId, modelIds));
+        if (CollectionUtils.isEmpty(sparePartsList)) {
+            return;
+        }
+        Map<Long, SpareParts> sparePartsByModelId = sparePartsList.stream()
+                .collect(Collectors.toMap(SpareParts::getProductModelId, s -> s, (a, b) -> a));
+        for (SalesLedgerProduct product : products) {
+            SpareParts spareParts = sparePartsByModelId.get(product.getProductModelId());
+            if (spareParts == null || product.getQuantity() == null
+                    || product.getQuantity().compareTo(BigDecimal.ZERO) <= 0) {
+                continue;
+            }
+            BigDecimal quantity = product.getQuantity();
+            spareParts.setQuantity((spareParts.getQuantity() == null ? BigDecimal.ZERO : spareParts.getQuantity()).add(quantity));
+            sparePartsMapper.updateById(spareParts);
+
+            SparePartsRecord record = new SparePartsRecord();
+            record.setSparePartsId(spareParts.getId());
+            record.setDirection(1);
+            record.setQuantity(quantity);
+            record.setSourceType(1);
+            record.setSourceId(purchaseLedger.getId());
+            record.setSourceNo(purchaseLedger.getPurchaseContractNumber());
+            sparePartsRecordService.save(record);
+        }
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public int deletePurchaseLedgerByIds(Long[] ids) {
@@ -732,6 +841,9 @@
             if (purchaseLedger.getApprovalStatus().equals(3)) {
                 throw new BaseException(purchaseLedger.getPurchaseContractNumber()+"宸茬粡瀹℃壒閫氳繃锛屼笉鍏佽鍒犻櫎");
             }
+            // 鍙拌处鍒犻櫎瑕佹妸璇ュ彴璐﹂噰璐叆搴撴椂绱姞鍒板浠朵笂鐨勬暟閲忓噺鍥炲幓锛屽苟鍒犳帀瀵瑰簲娴佹按锛�
+            // 鍚﹀垯澶囦欢搴撳瓨铏氶珮銆佹祦姘存畫鐣欍�傚浠跺凡棰嗙敤瀵艰嚧鍑忓洖涓鸿礋鏃朵細鍦ㄨ繖閲屾嫤浣�
+            rollbackSparePartsInbound(id);
         }
         // 鎵归噺鍒犻櫎鍏宠仈鐨勯噰璐叆搴撹褰�
         LambdaQueryWrapper<SalesLedgerProduct> salesLedgerProductQueryWrapper = new LambdaQueryWrapper<>();

--
Gitblit v1.9.3