From f90c70b7cfe4492df2e12433f960717ca47f7852 Mon Sep 17 00:00:00 2001
From: wujianwei <wjw@11.com>
Date: 星期二, 23 十二月 2025 17:48:10 +0800
Subject: [PATCH] 应付接口

---
 service/src/main/java/com/ruoyi/cwgl/service/impl/PayableBillSettlementDetailServiceImpl.java |  211 +++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 207 insertions(+), 4 deletions(-)

diff --git a/service/src/main/java/com/ruoyi/cwgl/service/impl/PayableBillSettlementDetailServiceImpl.java b/service/src/main/java/com/ruoyi/cwgl/service/impl/PayableBillSettlementDetailServiceImpl.java
index 05551bd..50120ad 100644
--- a/service/src/main/java/com/ruoyi/cwgl/service/impl/PayableBillSettlementDetailServiceImpl.java
+++ b/service/src/main/java/com/ruoyi/cwgl/service/impl/PayableBillSettlementDetailServiceImpl.java
@@ -1,6 +1,10 @@
 package com.ruoyi.cwgl.service.impl;
 
+import java.math.BigDecimal;
 import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 import com.ruoyi.common.utils.DateUtils;
 import javax.annotation.Resource;
@@ -14,10 +18,16 @@
 import com.ruoyi.common.annotation.DataSource;
 import com.ruoyi.common.enums.DataSourceType;
 import com.ruoyi.common.core.service.BaseService;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.SecurityUtils;
 
 import com.ruoyi.cwgl.mapper.PayableBillSettlementDetailMapper;
 import com.ruoyi.cwgl.domain.PayableBillSettlementDetail;
 import com.ruoyi.cwgl.service.IPayableBillSettlementDetailService;
+import com.ruoyi.cwgl.service.IPayableBillManagementService;
+import com.ruoyi.cwgl.domain.PayableBillManagement;
+import com.ruoyi.cwgl.service.IPayableBillManagementLogService;
+import com.ruoyi.cwgl.domain.PayableBillManagementLog;
 import com.ruoyi.common.core.text.Convert;
 
 /**
@@ -33,6 +43,12 @@
     protected final Logger logger = LoggerFactory.getLogger(getClass());
     @Resource
     private PayableBillSettlementDetailMapper payableBillSettlementDetailMapper;
+    
+    @Resource
+    private IPayableBillManagementService payableBillManagementService;
+    
+    @Resource
+    private IPayableBillManagementLogService payableBillManagementLogService;
 
 
     /**
@@ -102,8 +118,29 @@
     @Override
     public int insertPayableBillSettlementDetail(PayableBillSettlementDetail payableBillSettlementDetail)
     {
+        // 1. 璁剧疆鍒涘缓鏃堕棿
         payableBillSettlementDetail.setCreateTime(DateUtils.getNowDate());
-        return payableBillSettlementDetailMapper.insertPayableBillSettlementDetail(payableBillSettlementDetail);
+        
+        // 2. 鎻掑叆缁撶畻鏄庣粏璁板綍
+        int result = payableBillSettlementDetailMapper.insertPayableBillSettlementDetail(payableBillSettlementDetail);
+        
+        // 3. 濡傛灉鎻掑叆鎴愬姛涓攂illId涓嶄负绌猴紝鍒欐洿鏂颁富琛ㄩ噾棰濆拰鐘舵��
+        if (result > 0 && payableBillSettlementDetail.getBillId() != null) {
+            updatePayableBillAmountAndStatus(payableBillSettlementDetail.getBillId());
+            
+            // 璁板綍娣诲姞缁撶畻鏄庣粏鎿嶄綔鏃ュ織
+            PayableBillManagement billManagement = payableBillManagementService.selectPayableBillManagementById(payableBillSettlementDetail.getBillId());
+            if (billManagement != null) {
+                PayableBillManagementLog log = new PayableBillManagementLog();
+                log.setBillId(payableBillSettlementDetail.getBillId());
+                log.setCreateBy(SecurityUtils.getUsername());
+                log.setCreateTime(DateUtils.getNowDate());
+                log.setOperation("娣诲姞缁撶畻鏄庣粏锛岃处鍗曠紪鍙凤細" + billManagement.getSystemNo());
+                payableBillManagementLogService.insertPayableBillManagementLog(log);
+            }
+        }
+        
+        return result;
     }
 
     /**
@@ -115,7 +152,49 @@
     @Override
     public int insertPayableBillSettlementDetailBatch(List<PayableBillSettlementDetail> payableBillSettlementDetails)
     {
+        // 1. 璁剧疆鍒涘缓鏃堕棿
+        for (PayableBillSettlementDetail detail : payableBillSettlementDetails) {
+            detail.setCreateTime(DateUtils.getNowDate());
+        }
+        
+        // 2. 鎵归噺鎻掑叆缁撶畻鏄庣粏璁板綍
         int rows = payableBillSettlementDetailMapper.insertPayableBillSettlementDetailBatch(payableBillSettlementDetails);
+        
+        // 3. 濡傛灉鎻掑叆鎴愬姛锛屽垯鏇存柊鐩稿叧涓昏〃閲戦鍜岀姸鎬�
+        if (rows > 0) {
+            // 鑾峰彇鎵�鏈変笉閲嶅鐨刡illId
+            Set<Integer> billIds = payableBillSettlementDetails.stream()
+                    .map(PayableBillSettlementDetail::getBillId)
+                    .filter(Objects::nonNull)
+                    .collect(Collectors.toSet());
+            
+            // 鏇存柊姣忎釜璐﹀崟涓昏〃鐨勯噾棰濆拰鐘舵��
+            for (Integer billId : billIds) {
+                updatePayableBillAmountAndStatus(billId);
+            }
+            
+            // 璁板綍娣诲姞缁撶畻鏄庣粏鎿嶄綔鏃ュ織
+            if (!billIds.isEmpty()) {
+                for (Integer billId : billIds) {
+                    PayableBillManagement billManagement = payableBillManagementService.selectPayableBillManagementById(billId);
+                    if (billManagement != null) {
+                        PayableBillManagementLog log = new PayableBillManagementLog();
+                        log.setBillId(billId);
+                        log.setCreateBy(SecurityUtils.getUsername());
+                        log.setCreateTime(DateUtils.getNowDate());
+                        
+                        // 璁$畻鏈娣诲姞鐨勬槑缁嗘暟閲�
+                        long detailCount = payableBillSettlementDetails.stream()
+                                .filter(detail -> billId.equals(detail.getBillId()))
+                                .count();
+                        
+                        log.setOperation("娣诲姞" + detailCount + "鏉$粨绠楁槑缁嗭紝璐﹀崟缂栧彿锛�" + billManagement.getSystemNo());
+                        payableBillManagementLogService.insertPayableBillManagementLog(log);
+                    }
+                }
+            }
+        }
+        
         return rows;
     }
 
@@ -128,8 +207,32 @@
     @Override
     public int updatePayableBillSettlementDetail(PayableBillSettlementDetail payableBillSettlementDetail)
     {
+        // 1. 鑾峰彇淇敼鍓嶇殑璁板綍锛岀敤浜庡悗缁洿鏂颁富琛�
+        PayableBillSettlementDetail oldDetail = null;
+        if (payableBillSettlementDetail.getId() != null) {
+            oldDetail = payableBillSettlementDetailMapper.selectPayableBillSettlementDetailById(payableBillSettlementDetail.getId());
+        }
+        
+        // 2. 璁剧疆鏇存柊鏃堕棿
         payableBillSettlementDetail.setUpdateTime(DateUtils.getNowDate());
-        return payableBillSettlementDetailMapper.updatePayableBillSettlementDetail(payableBillSettlementDetail);
+        
+        // 3. 鏇存柊缁撶畻鏄庣粏璁板綍
+        int result = payableBillSettlementDetailMapper.updatePayableBillSettlementDetail(payableBillSettlementDetail);
+        
+        // 4. 濡傛灉鏇存柊鎴愬姛锛屽垯鏇存柊鐩稿叧涓昏〃閲戦鍜岀姸鎬�
+        if (result > 0) {
+            // 鑾峰彇闇�瑕佹洿鏂扮殑billId锛堜紭鍏堜娇鐢ㄦ柊璁板綍鐨刡illId锛屽鏋滄病鏈夊垯浣跨敤鏃ц褰曠殑billId锛�
+            Integer billId = payableBillSettlementDetail.getBillId();
+            if (billId == null && oldDetail != null) {
+                billId = oldDetail.getBillId();
+            }
+            
+            if (billId != null) {
+                updatePayableBillAmountAndStatus(billId);
+            }
+        }
+        
+        return result;
     }
 
     /**
@@ -139,8 +242,52 @@
      * @return 缁撴灉
      */
     @Override
-    public int updatePayableBillSettlementDetailBatch(List<PayableBillSettlementDetail> payableBillSettlementDetails){
-        return payableBillSettlementDetailMapper.updatePayableBillSettlementDetailBatch(payableBillSettlementDetails);
+    public int updatePayableBillSettlementDetailBatch(List<PayableBillSettlementDetail> payableBillSettlementDetails)
+    {
+        // 1. 璁剧疆鏇存柊鏃堕棿
+        for (PayableBillSettlementDetail detail : payableBillSettlementDetails) {
+            detail.setUpdateTime(DateUtils.getNowDate());
+        }
+        
+        // 2. 鎵归噺鏇存柊缁撶畻鏄庣粏璁板綍
+        int rows = payableBillSettlementDetailMapper.updatePayableBillSettlementDetailBatch(payableBillSettlementDetails);
+        
+        // 3. 濡傛灉鏇存柊鎴愬姛锛屽垯鏇存柊鐩稿叧涓昏〃閲戦鍜岀姸鎬�
+        if (rows > 0) {
+            // 鑾峰彇鎵�鏈変笉閲嶅鐨刡illId
+            Set<Integer> billIds = payableBillSettlementDetails.stream()
+                    .map(PayableBillSettlementDetail::getBillId)
+                    .filter(Objects::nonNull)
+                    .collect(Collectors.toSet());
+            
+            // 鏇存柊姣忎釜璐﹀崟涓昏〃鐨勯噾棰濆拰鐘舵��
+            for (Integer billId : billIds) {
+                updatePayableBillAmountAndStatus(billId);
+            }
+            
+            // 璁板綍淇敼缁撶畻鏄庣粏鎿嶄綔鏃ュ織
+            if (!billIds.isEmpty()) {
+                for (Integer billId : billIds) {
+                    PayableBillManagement billManagement = payableBillManagementService.selectPayableBillManagementById(billId);
+                    if (billManagement != null) {
+                        PayableBillManagementLog log = new PayableBillManagementLog();
+                        log.setBillId(billId);
+                        log.setCreateBy(SecurityUtils.getUsername());
+                        log.setCreateTime(DateUtils.getNowDate());
+                        
+                        // 璁$畻鏈淇敼鐨勬槑缁嗘暟閲�
+                        long detailCount = payableBillSettlementDetails.stream()
+                                .filter(detail -> billId.equals(detail.getBillId()))
+                                .count();
+                        
+                        log.setOperation("淇敼" + detailCount + "鏉$粨绠楁槑缁嗭紝璐﹀崟缂栧彿锛�" + billManagement.getSystemNo());
+                        payableBillManagementLogService.insertPayableBillManagementLog(log);
+                    }
+                }
+            }
+        }
+        
+        return rows;
     }
 
     /**
@@ -179,4 +326,60 @@
     {
         return payableBillSettlementDetailMapper.deletePayableBillSettlementDetailById(id);
     }
+    
+    /**
+     * 鏇存柊搴斾粯璐﹀崟涓昏〃鐨勯噾棰濆拰鐘舵��
+     * 
+     * @param billId 搴斾粯璐﹀崟ID
+     */
+    private void updatePayableBillAmountAndStatus(Integer billId) {
+        // 1. 鏌ヨ搴斾粯璐﹀崟涓昏〃璁板綍
+        PayableBillManagement billManagement = payableBillManagementService.selectPayableBillManagementById(billId);
+        if (billManagement == null) {
+            throw new ServiceException("搴斾粯璐﹀崟涓昏〃璁板綍涓嶅瓨鍦紝ID锛�" + billId);
+        }
+        
+        // 2. 鏌ヨ璇ヨ处鍗曠殑鎵�鏈夌粨绠楁槑缁嗚褰�
+        PayableBillSettlementDetail queryDetail = new PayableBillSettlementDetail();
+        queryDetail.setBillId(billId);
+        List<PayableBillSettlementDetail> settlementDetails = payableBillSettlementDetailMapper.selectPayableBillSettlementDetailList(queryDetail);
+        
+        // 3. 璁$畻鎬讳粯娆鹃噾棰�
+        BigDecimal totalPaymentAmount = settlementDetails.stream()
+                .map(PayableBillSettlementDetail::getPaymentAmount)
+                .filter(amount -> amount != null)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+        
+        // 4. 楠岃瘉閲戦涓嶈兘涓鸿礋鏁�
+        if (totalPaymentAmount.compareTo(BigDecimal.ZERO) < 0) {
+            throw new ServiceException("浠樻閲戦涓嶈兘涓鸿礋鏁�");
+        }
+        
+        // 5. 璁$畻寰呬粯閲戦锛堝簲缁撶畻閲戦 - 宸蹭粯閲戦 - 鍑忓厤閲戦锛�
+        BigDecimal totalAmount = billManagement.getTotalAmount() != null ? billManagement.getTotalAmount() : BigDecimal.ZERO;
+        BigDecimal discountAmount = billManagement.getDiscountAmount() != null ? billManagement.getDiscountAmount() : BigDecimal.ZERO;
+        BigDecimal pendingAmount = totalAmount.subtract(totalPaymentAmount).subtract(discountAmount);
+        
+        // 6. 楠岃瘉寰呬粯閲戦涓嶈兘涓鸿礋鏁�
+        if (pendingAmount.compareTo(BigDecimal.ZERO) < 0) {
+            throw new ServiceException("寰呬粯閲戦涓嶈兘涓鸿礋鏁帮紝褰撳墠璁$畻鍊硷細" + pendingAmount);
+        }
+        
+        // 7. 鏇存柊涓昏〃閲戦
+        billManagement.setPaidAmount(totalPaymentAmount);
+        billManagement.setPendingAmount(pendingAmount);
+        
+        // 8. 鏍规嵁寰呬粯閲戦鏇存柊鐘舵��
+        if (pendingAmount.compareTo(BigDecimal.ZERO) == 0) {
+            // 寰呬粯閲戦涓�0锛岀姸鎬佹敼涓�3锛堝凡缁撶畻锛�
+            billManagement.setStatus("3");
+        } else {
+            // 寰呬粯閲戦澶т簬0锛岀姸鎬佹敼涓�1锛堢粨绠椾腑锛�
+            billManagement.setStatus("1");
+        }
+        
+        // 9. 鏇存柊涓昏〃璁板綍
+        billManagement.setUpdateTime(DateUtils.getNowDate());
+        payableBillManagementService.updatePayableBillManagement(billManagement);
+    }
 }

--
Gitblit v1.8.0