From 55aac55195dc2bd404042ec099045fee8ac73e81 Mon Sep 17 00:00:00 2001
From: liusheng <337615773@qq.com>
Date: 星期三, 02 七月 2025 21:48:53 +0800
Subject: [PATCH] 代码提交

---
 ruoyi-project/src/main/java/com/ruoyi/project/domain/vo/TaxMoneySumEO.java                   |    8 +
 ruoyi-project/src/main/resources/mapper/project/ServiceFunddetailMapper.xml                  |    7 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/project/ServiceFunddetailController.java  |   18 +-
 ruoyi-project/src/main/resources/mapper/project/ServiceFundMapper.xml                        |    8 +
 ruoyi-project/src/main/java/com/ruoyi/project/mapper/ServiceFundMapper.java                  |    1 
 ruoyi-project/src/main/java/com/ruoyi/project/mapper/ServiceFunddetailMapper.java            |    2 
 ruoyi-project/src/main/java/com/ruoyi/project/service/impl/ServiceFundtaxServiceImpl.java    |   57 +++++++-
 ruoyi-project/src/main/java/com/ruoyi/project/service/IServiceFunddetailService.java         |    5 
 ruoyi-project/src/main/java/com/ruoyi/project/service/impl/ServiceFunddetailServiceImpl.java |  304 ++++++++++++++++++-------------------------
 9 files changed, 214 insertions(+), 196 deletions(-)

diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/project/ServiceFunddetailController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/project/ServiceFunddetailController.java
index d08876e..4dc7e41 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/project/ServiceFunddetailController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/project/ServiceFunddetailController.java
@@ -12,6 +12,8 @@
 import com.ruoyi.project.domain.FunddetailReqVo;
 import com.ruoyi.project.domain.ServiceFunddetail;
 import com.ruoyi.project.domain.SpStatBonusReq;
+import com.ruoyi.project.domain.vo.TaxMoneyByItemEO;
+import com.ruoyi.project.domain.vo.TaxMoneySumEO;
 import com.ruoyi.project.domain.vo.TaxMoneyVO;
 import com.ruoyi.project.service.IServiceFunddetailService;
 import io.swagger.annotations.Api;
@@ -20,8 +22,10 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.Arrays;
-import java.util.List;
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.time.temporal.TemporalAdjusters;
+import java.util.*;
 
 /**
  * 璐圭敤鐢宠鏄庣粏Controller
@@ -161,11 +165,11 @@
         return AjaxResult.success(serviceFunddetailService.getFundDetail(id));
     }
 
-    @ApiOperation("鏍规嵁鏉′欢绠楃◣")
-    @PostMapping("/calculateTax")
-    public AjaxResult calculateTax(@RequestBody List<ServiceFunddetail> serviceFunddetails) {
-        return AjaxResult.success(serviceFunddetailService.calculateTax(serviceFunddetails));
-    }
+//    @ApiOperation("鏍规嵁鏉′欢绠楃◣")
+//    @PostMapping("/calculateTax")
+//    public AjaxResult calculateTax(@RequestBody List<ServiceFunddetail> serviceFunddetails) {
+//        return AjaxResult.success(serviceFunddetailService.calculateTax2(serviceFunddetails));
+//    }
 
 //    /**
 //     * 缁╂晥璁$畻
diff --git a/ruoyi-project/src/main/java/com/ruoyi/project/domain/vo/TaxMoneySumEO.java b/ruoyi-project/src/main/java/com/ruoyi/project/domain/vo/TaxMoneySumEO.java
index 0855132..d777773 100644
--- a/ruoyi-project/src/main/java/com/ruoyi/project/domain/vo/TaxMoneySumEO.java
+++ b/ruoyi-project/src/main/java/com/ruoyi/project/domain/vo/TaxMoneySumEO.java
@@ -20,6 +20,14 @@
      * 绋庡悗鎬婚
      */
     private double taxedAmounts;
+    /**
+     * 搴忓彿
+     */
+    private Long xh;
+    /**
+     * 韬唤璇佸彿
+     */
+    private String IDCardNo;
 
 
 }
diff --git a/ruoyi-project/src/main/java/com/ruoyi/project/mapper/ServiceFundMapper.java b/ruoyi-project/src/main/java/com/ruoyi/project/mapper/ServiceFundMapper.java
index 64234ab..5fe6e16 100644
--- a/ruoyi-project/src/main/java/com/ruoyi/project/mapper/ServiceFundMapper.java
+++ b/ruoyi-project/src/main/java/com/ruoyi/project/mapper/ServiceFundMapper.java
@@ -39,5 +39,6 @@
     List<SpFinancialExpensesFundOut> getExpertfeeList(@Param("PAAPPLYTYPE") Integer PAAPPLYTYPE, @Param("PFUNDTAXID") Integer PFUNDTAXID, @Param("DONORNAME") String DONORNAME, @Param("PADEPARTID") Integer PADEPARTID, @Param("PAUSERNAME") String PAUSERNAME);
 
     Boolean updateFundTaxIdById(@Param("id") Long id, @Param("fundTaxId") Long fundTaxId);
+    Boolean updateFundIsTexById(@Param("id") Long id, @Param("isTax") Long isTax);
 
 }
diff --git a/ruoyi-project/src/main/java/com/ruoyi/project/mapper/ServiceFunddetailMapper.java b/ruoyi-project/src/main/java/com/ruoyi/project/mapper/ServiceFunddetailMapper.java
index 7c564a7..4167c09 100644
--- a/ruoyi-project/src/main/java/com/ruoyi/project/mapper/ServiceFunddetailMapper.java
+++ b/ruoyi-project/src/main/java/com/ruoyi/project/mapper/ServiceFunddetailMapper.java
@@ -53,7 +53,7 @@
 
     boolean updateTaxTime(ServiceFunddetail serviceFunddetail);
 
-    TaxMoneySumEO getTaxSum(TaxMoneyByItemEO taxMoneyByItemEO);
+    List<TaxMoneySumEO> getTaxSum(TaxMoneyByItemEO taxMoneyByItemEO);
 
     Long getMaxXH(TaxMoneyByItemEO taxMoneyByItemEO);
 
diff --git a/ruoyi-project/src/main/java/com/ruoyi/project/service/IServiceFunddetailService.java b/ruoyi-project/src/main/java/com/ruoyi/project/service/IServiceFunddetailService.java
index cc2ccfb..b2e1da2 100644
--- a/ruoyi-project/src/main/java/com/ruoyi/project/service/IServiceFunddetailService.java
+++ b/ruoyi-project/src/main/java/com/ruoyi/project/service/IServiceFunddetailService.java
@@ -6,6 +6,7 @@
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.project.domain.*;
+import com.ruoyi.project.domain.vo.TaxMoneySumEO;
 import com.ruoyi.project.domain.vo.TaxMoneyVO;
 import com.ruoyi.project.domain.vo.TaxedMoneyVO;
 import org.springframework.web.bind.annotation.PathVariable;
@@ -65,7 +66,9 @@
      *
      * @param serviceFunddetails
      */
-    public Boolean calculateTax(List<ServiceFunddetail> serviceFunddetails);
+    public Boolean calculateTax(List<ServiceFunddetail> serviceFunddetails, Map<String, TaxMoneySumEO> tempTaxSumMap);
+
+//    public Boolean calculateTax2(List<ServiceFunddetail> serviceFunddetails);
 
     /**
      * 缁╂晥璁$畻
diff --git a/ruoyi-project/src/main/java/com/ruoyi/project/service/impl/ServiceFunddetailServiceImpl.java b/ruoyi-project/src/main/java/com/ruoyi/project/service/impl/ServiceFunddetailServiceImpl.java
index 0f5631a..5717177 100644
--- a/ruoyi-project/src/main/java/com/ruoyi/project/service/impl/ServiceFunddetailServiceImpl.java
+++ b/ruoyi-project/src/main/java/com/ruoyi/project/service/impl/ServiceFunddetailServiceImpl.java
@@ -267,217 +267,171 @@
     }
 
     /**
-     * 鏍规嵁鏉′欢绠楃◣
+     * 鎵归噺绠楃◣涓绘柟娉�
+     * 1. 鏍¢獙鍙傛暟
+     * 2. 鎺掑簭鏄庣粏锛屼繚璇佺◣鏃堕棿涓虹┖鐨勬帓鍦ㄥ悗闈�
+     * 3. 閬嶅巻姣忔潯鏄庣粏锛屽垎韬唤璇佸彿涓虹┖鍜屼笉涓虹┖涓ょ鎯呭喌鍒嗗埆澶勭悊
+     * - 韬唤璇佸彿涓虹┖锛氱洿鎺ユ寜瑙勫垯璧嬪�肩◣鍚庨噾棰濄�佺◣閲�
+     * - 韬唤璇佸彿涓嶄负绌猴細
+     * a. 鏌ヨ鏈湀绗竴澶╋紝鑾峰彇鏈�澶у簭鍙�
+     * b. 鏌ヨ鏈湀绱绋庡墠銆佺◣閲戙�佺◣鍚庨噾棰�
+     * c. 鏍规嵁"绋庡墠/绋庡悗"绫诲瀷鍒嗗埆璁$畻绋庨噾銆佺◣鍚庨噾棰�
+     * d. 璁剧疆绠楃◣鏃堕棿銆佸簭鍙风瓑
+     * 4. 绱鏈壒娆℃�荤◣鍓嶃�佺◣鍚庨噾棰�
+     * 5. 鎵归噺鏇存柊鎵�鏈夋槑缁�
+     * 6. 鏇存柊涓昏〃ServiceFund鐨勬�婚噾棰濄�佺畻绋庢椂闂淬�佺姸鎬�
      *
-     * @param serviceFunddetails
+     * @param serviceFunddetails 璐圭敤鏄庣粏鍒楄〃
+     * @return 鏄惁绠楃◣鎴愬姛
      */
     @Override
-    @Transactional(rollbackFor = Exception.class)
-    public Boolean calculateTax(List<ServiceFunddetail> serviceFunddetails) {
+    public Boolean calculateTax(List<ServiceFunddetail> serviceFunddetails, Map<String, TaxMoneySumEO> tempTaxSumMap) {
+        // 1. 鏍¢獙鍙傛暟
         if (CollectionUtils.isEmpty(serviceFunddetails)) {
             throw new BaseException("绠楃◣鏉′欢涓虹┖锛岃妫�鏌ュ悗锛屽啀杩涜璁$畻");
         }
-        // 鐢ㄤ簬涓存椂淇濆瓨宸茬粡绠楀ソ鐨�"璐圭敤璇︽儏鏁版嵁"
-        List<ServiceFunddetail> temporarySave = new ArrayList<>();
-        // 鐢ㄤ簬璁板綍搴忓彿
-        Map<String, Long> xhMap = new HashMap<>();
+        // 2. 鎺掑簭锛岀◣鏃堕棿涓虹┖鐨勬帓鍚庨潰
+        serviceFunddetails.sort(Comparator.comparing(obj -> ObjectUtils.isEmpty(obj.getTaxTime()) ? 1 : 0));
 
-        // 鍏堝serviceFunddetails鎺掑簭
-        Comparator<ServiceFunddetail> customComparator = Comparator.comparing(obj -> {
-            if (ObjectUtils.isEmpty(obj.getTaxTime())) {
-                return 1; // 杩斿洖1琛ㄧず瀛楁涓虹┖鐨勫璞℃帓鍦ㄥ悗闈�
-            } else {
-                return 0; // 杩斿洖0琛ㄧず瀛楁涓嶄负绌虹殑瀵硅薄淇濇寔鍘熼『搴�
-            }
-        });
-        Collections.sort(serviceFunddetails, customComparator);
-
-        //杩欎釜鏄负浜嗚幏鍙杅und_tax_time
+        // 3. 鑾峰彇鏈壒娆undid鍙婁富琛ㄤ俊鎭�
         Long fundid = serviceFunddetails.get(0).getFundid();
         log.info("绠楃◣鐨刦undid鐨勫�间负锛歿}", fundid);
         ServiceFund serviceFund1 = serviceFundMapper.selectById(fundid);
         log.info("fund琛ㄧ殑fundtextime鍊间负锛歿}", serviceFund1.getFundtaxtime());
-        //淇濆瓨鎬荤◣鍓嶉噾棰濓紙鐢ㄤ簬鏇存柊fund琛ㄩ噷鐨勶級
-        BigDecimal pretaxcost = BigDecimal.valueOf(0.00);
-        BigDecimal taxedcost = BigDecimal.valueOf(0.00);
-        for (ServiceFunddetail serviceFunddetail : serviceFunddetails) {
-            if (serviceFunddetail.getBeneficiaryname().equals("鍚村悍鏉�")) {
-                System.out.println(serviceFunddetail);
-            }
-            if (StringUtils.isEmpty(serviceFunddetail.getIdcardno())) {
-                logger.info("serviceFunddetail鏁版嵁鍏ュ弬 锛� {}", serviceFunddetail);
-                //濡傛灉韬唤璇佸彿涓虹┖锛屽氨涓嶇敤鏌ヤ簡锛屽彲鑳芥槸鍖婚櫌鐨勮褰�
-                if (StringUtils.isEmpty(serviceFunddetail.getServicesscopename()) || !serviceFunddetail.getServicesscopename().contains("绋庡悗")) {
-                    serviceFunddetail.setTaxedamount(serviceFunddetail.getAmount());
-                } else {
-                    serviceFunddetail.setAmount(serviceFunddetail.getTaxedamount());
-                }
-                //鍏徃鐨勭敵璇烽噾棰濅篃瑕佸姞杩涘幓
-                pretaxcost = pretaxcost.add(BigDecimal.valueOf(serviceFunddetail.getAmount()));
-                taxedcost = taxedcost.add(BigDecimal.valueOf(serviceFunddetail.getTaxedamount()));
+        // 4. 鍒濆鍖栫疮璁¢噾棰濄�佸緟鏇存柊鏄庣粏鍒楄〃銆佸簭鍙风紦瀛樸�佺疮璁¢噾棰濈紦瀛�
+        BigDecimal pretaxcost = BigDecimal.ZERO;
+        BigDecimal taxedcost = BigDecimal.ZERO;
 
-                serviceFunddetail.setTaxamount(0.0);
-                logger.info("serviceFunddetail鏇存柊鍚庣殑鏁版嵁 锛� {}", serviceFunddetail);
-                boolean b = this.updateById(serviceFunddetail);
-                logger.info("serviceFunddetail淇敼缁撴灉 锛� {}", b);
+        //鍒涘缓涓�涓敤浜庡瓨鏀锯�滈渶瑕佹洿鏂板埌鏁版嵁搴撶殑ServiceFunddetail瀵硅薄鈥濈殑鍒楄〃
+        List<ServiceFunddetail> updateList = new ArrayList<>();
+
+        // 5. 閬嶅巻姣忔潯鏄庣粏锛屽垎鎯呭喌澶勭悊
+        for (ServiceFunddetail detail : serviceFunddetails) {
+            // 5.1 韬唤璇佸彿涓虹┖锛岀洿鎺ヨ祴鍊硷紙涓�浜涗汉鎴栧叕鍙革紝涓嶉渶瑕佺畻绋庯級
+            if (StringUtils.isEmpty(detail.getIdcardno())) {
+                if (StringUtils.isEmpty(detail.getServicesscopename()) || !detail.getServicesscopename().contains("绋庡悗")) {
+                    // 鏅�氭槑缁嗭紝绋庡悗閲戦=鐢宠閲戦
+                    detail.setTaxedamount(detail.getAmount());
+                } else {
+                    // 绋庡悗鏄庣粏锛岀敵璇烽噾棰�=绋庡悗閲戦
+                    detail.setAmount(detail.getTaxedamount());
+                }
+                // 绱鏈壒娆℃�婚噾棰�
+                pretaxcost = pretaxcost.add(BigDecimal.valueOf(detail.getAmount()));
+                taxedcost = taxedcost.add(BigDecimal.valueOf(detail.getTaxedamount()));
+                detail.setTaxamount(0.0);
+                updateList.add(detail);
                 continue;
             }
 
-            //鑾峰彇褰撴湀鐨勭涓�澶�
-            Date firstDay = Date.from(LocalDate.now().with(TemporalAdjusters.firstDayOfMonth()).atStartOfDay(ZoneId.systemDefault()).toInstant());
-            //鑾峰彇鍒板綋鍓嶄汉鐨勬湰鏈堢畻绋庡簭鍙锋渶澶у��
-            TaxMoneyByItemEO taxMoneyByItemEO = new TaxMoneyByItemEO();
-            taxMoneyByItemEO.setFirstDay(firstDay);
-            taxMoneyByItemEO.setIDCard(serviceFunddetail.getIdcardno());
-            taxMoneyByItemEO.setTaxTime(new Date());
-            //鏍规嵁鏉′欢鑾峰彇琛ㄤ腑璇ユ潯鏁版嵁鐨勨�濆簭鍙封�滄渶澶у��
-            Long maxXH = serviceFunddetailMapper.getMaxXH(taxMoneyByItemEO);
-            if (maxXH == null) {
-                maxXH = 1L;
-            } else {
-                maxXH = maxXH + 1;
-            }
-            //搴忓彿Map涓庢暟鎹簱琛ㄩ噷鐨剎h鍚屾椂涓嶄负绌猴紝閭e氨浠ap閲岀殑涓哄噯
-            if (ObjectUtils.isNotEmpty(xhMap)) {
-                Long xhValue = xhMap.get(serviceFunddetail.getIdcardno());
-                if (xhValue != null) maxXH = xhValue + 1;
-            }
+            // 5.2 韬唤璇佸彿涓嶄负绌猴紝闇�鏌ュ巻鍙茬疮璁¢噾棰濄�佸簭鍙�
+            String idcard = detail.getIdcardno().trim();
 
-            TaxMoneyByItemEO taxMoneyVO = new TaxMoneyByItemEO();
-            if (serviceFund1.getFundtaxtime() != null) {
-                taxMoneyVO.setTaxTime(serviceFund1.getFundtaxtime());
-            } else {
-                taxMoneyVO.setTaxTime(new Date());
-            }
-            taxMoneyVO.setFirstDay(firstDay);
-            // 鑾峰彇璇ヨ韩浠借瘉鍙峰湪鏈湀鐨勬墍鏈夎褰�
-            taxMoneyVO.setFundID(serviceFunddetail.getFundid());
-            taxMoneyVO.setIDCard(serviceFunddetail.getIdcardno());
-            if (serviceFunddetail.getXh() != null) {
-                serviceFunddetail.setXh(null);
-                taxMoneyVO.setXh(maxXH);
-                xhMap.put(serviceFunddetail.getIdcardno(), maxXH);
-            } else {
-                taxMoneyVO.setXh(maxXH);
-                xhMap.put(serviceFunddetail.getIdcardno(), maxXH);
-            }
-            //鏌ュ嚭绋庡墠銆佺◣銆佺◣鍚庣殑鎬婚锛堜笉鍖呭惈鏈锛�
-            logger.info("taxMoneyVO鍏ュ弬鐨勫�� 锛� {}", taxMoneyVO);
-            TaxMoneySumEO taxSum = serviceFunddetailMapper.getTaxSum(taxMoneyVO);
-            logger.info("鏌ヨ鐨則axSum鐨勫�� 锛� {}", taxSum);
-            if (ObjectUtils.isEmpty(taxSum)) {
+            // 5.2.1 鏌ヨ鏈湀绱閲戦锛堢紦瀛橀伩鍏嶉噸澶嶆煡搴擄級
+            TaxMoneySumEO taxSum = tempTaxSumMap.getOrDefault(idcard, null);
+            if (taxSum == null) {
                 taxSum = new TaxMoneySumEO();
+                taxSum.setXh(1L);
+                detail.setXh(1L);
+                tempTaxSumMap.put(idcard, taxSum);
+                detail.setAllAmount(taxSum.getAmounts());
+            } else {
+                long xh = taxSum.getXh() + 1;
+                taxSum.setXh(xh);
+                tempTaxSumMap.put(idcard, taxSum);
+                detail.setXh(xh);
+                detail.setAllAmount(taxSum.getAmounts());
             }
 
-            //鍒ゆ柇涓存椂闆嗗悎temporarySave涓紝鏈夋病鏈夊凡缁忕畻杩囩殑鏁版嵁
-            if (CollectionUtils.isNotEmpty(temporarySave)) {
-                for (ServiceFunddetail serviceFunddetail1 : temporarySave) {
-                    //濡傛灉鏈鐨勨�濅汉鍛樼被鍨嬧�溿�佲�濊韩浠借瘉鍙封�滃湪涓存椂闆嗗悎涓瓨鍦紝鍒欏皢闆嗗悎鏁版嵁涓殑璇ュ彈鐩婁汉鐨勶紝绋庡墠銆佺◣閲戙�佺◣鍚庯紝鍜屾�荤殑鐩稿姞锛屽苟灏嗚�佺殑瑕嗙洊
-                    // if (serviceFunddetail1.getApplytype().equals(serviceFunddetail.getApplytype()) && serviceFunddetail1.getBeneficiaryno().equals(serviceFunddetail.getBeneficiaryno())) {
-                    if (serviceFunddetail1.getIdcardno().trim().equals(serviceFunddetail.getIdcardno().trim())) {
-                        //灏嗛泦鍚堟暟鎹腑鐨勮鍙楃泭浜虹殑锛岀◣鍓嶃�佺◣閲戙�佺◣鍚庯紝鍜屾�荤殑鐩稿姞
-                        BigDecimal amounts = BigDecimal.valueOf(taxSum.getAmounts()).add(new BigDecimal(String.valueOf(serviceFunddetail1.getAmount())));
-                        BigDecimal taxAmounts = BigDecimal.valueOf(taxSum.getTaxAmounts()).add(new BigDecimal(String.valueOf(serviceFunddetail1.getTaxamount())));
-                        BigDecimal TaxedAmounts = BigDecimal.valueOf(taxSum.getTaxedAmounts()).add(new BigDecimal(String.valueOf(serviceFunddetail1.getTaxedamount())));
-                        //灏嗚�佺殑瑕嗙洊
-                        taxSum.setAmounts(amounts.doubleValue());
-                        taxSum.setTaxAmounts(taxAmounts.doubleValue());
-                        taxSum.setTaxedAmounts(TaxedAmounts.doubleValue());
-                    }
+            // 5.2.3 绠楃◣閫昏緫
+            if (detail.getServicesscopename().contains("绋庡悗")) {
+                // 绋庡悗鏄庣粏锛氱疮璁$◣鍚庨噾棰濓紝鍙嶆帹绋庡墠閲戦鍜岀◣閲�
+                if (idcard.equals("330103196704060019")) {
+                    log.info("330103196704060019");
                 }
-            }
-            //璁板綍涓�涓嬭繖涓◣鍓嶆�婚
-            serviceFunddetail.setAllAmount(taxSum.getAmounts());
-
-            if (serviceFunddetail.getXh() == null) {
-                serviceFunddetail.setXh(maxXH);
-            }
-
-            if (StringUtils.isEmpty(serviceFunddetail.getServicesscopename()) || !serviceFunddetail.getServicesscopename().contains("绋庡悗")) {
-                logger.info("璁$畻绋庡墠淇℃伅寮�濮嬶細{}", serviceFunddetail);
-                logger.info("taxSum鍏ュ弬鏁版嵁锛歿}", taxSum);
-                // 濡備綍绋庡墠閲戦涓嶄负绌猴紝鐢ㄤ箣鍓嶇殑鈥濇�荤◣鍓嶉噾棰濃�滐紝鍔犱笂褰撳墠鈥濈◣鍓嶉噾棰濃��
-                BigDecimal newAmounts = BigDecimal.valueOf(taxSum.getAmounts()).add(BigDecimal.valueOf(serviceFunddetail.getAmount()));
-
-                // 璁$畻鎬荤◣閲戯紙鍖呭惈鏈锛�
-                String taxation = TaxtUtils.getTaxation(newAmounts);
-                //璁$畻鏈绋庨噾锛堟�荤◣閲戯紙鍖呭惈鏈锛� - 鎬荤◣閲戯紙涓嶅寘鍚湰娆★級锛�
-                BigDecimal taxAmountNow = new BigDecimal(taxation).subtract(new BigDecimal(String.valueOf(taxSum.getTaxAmounts())));
-
-                //璁$畻鏈鐨勭◣鍚庨噾棰�(鏈鐨勭◣鍓嶉噾棰� - 绋庨噾)
-                BigDecimal texdAfterNow = BigDecimal.valueOf(serviceFunddetail.getAmount()).subtract(taxAmountNow);
-                logger.info("鎵撳嵃newAmounts锛歿},taxation:{},taxAmountNow:{},texdAfterNow:{}", newAmounts, taxation, taxAmountNow, texdAfterNow);
-
-                //灏嗗惊鐜殑鏁版嵁閲嶆柊鏀惧埌涓�涓柊瀵硅薄涓�
-                ServiceFunddetail serviceFunddetail3 = DtoConversionUtils.sourceToTarget(serviceFunddetail, ServiceFunddetail.class);
-                serviceFunddetail3.setTaxamount(taxAmountNow.doubleValue());
-                serviceFunddetail3.setTaxedamount(texdAfterNow.doubleValue());
-                if (ObjectUtils.isEmpty(serviceFund1.getFundtaxtime())) {
-                    serviceFunddetail3.setTaxTime(new Date());
-                } else {
-                    serviceFunddetail3.setTaxTime(serviceFund1.getFundtaxtime());
-                }
-                logger.info("鎵撳嵃绋庡墠serviceFunddetail3鏁版嵁 :{}", serviceFunddetail3);
-
-                // 灏嗚鏉℃暟鎹洿鏂�
-
-                boolean b = this.updateById(serviceFunddetail3);
-                pretaxcost = pretaxcost.add(BigDecimal.valueOf(serviceFunddetail.getAmount()));
-                taxedcost = taxedcost.add(BigDecimal.valueOf(serviceFunddetail.getTaxedamount()));
-//                // 鎶婅鏁版嵁锛屾斁鍒颁复鏃剁殑闆嗗悎涓�
-                temporarySave.add(serviceFunddetail3);
-            } else if (serviceFunddetail.getServicesscopename().contains("绋庡悗")) {
-                logger.info("璁$畻绋庡悗淇℃伅寮�濮嬶細{}", serviceFunddetail);
-                logger.info("taxSum鍏ュ弬鏁版嵁锛歿}", taxSum);
-                //绋庡悗涓嶄负绌�, 鐢ㄤ箣鍓嶇殑鈥濇�荤◣鍚庨噾棰濃�滐紝鍔犱笂褰撳墠鈥濈◣鍚庨噾棰濃��
-                BigDecimal newTaxedAmounts = BigDecimal.valueOf(taxSum.getTaxedAmounts()).add(BigDecimal.valueOf(serviceFunddetail.getTaxedamount()));
-
-                //閫氳繃鎬荤◣鍚庯紙鍖呭惈鏈锛夌畻鍑烘�荤◣鍓�
+                BigDecimal newTaxedAmounts = BigDecimal.valueOf(taxSum.getTaxedAmounts()).add(BigDecimal.valueOf(detail.getTaxedamount()));
                 String taxationBefore = TaxtUtils.getTaxationBefore(newTaxedAmounts);
-                //绠楀嚭鏈绋庡墠锛堟�荤◣鍓嶏紙鍖呭惈鏈锛� - 鎬荤◣鍓嶏紙涓嶅寘鍚湰娆★級锛�
                 BigDecimal amountNow = new BigDecimal(taxationBefore).subtract(BigDecimal.valueOf(taxSum.getAmounts()));
-
-                //绠楀嚭鏈绋庨噾(鏈绋庡墠 - 鏈绋庡悗)
-                BigDecimal tax = amountNow.subtract(BigDecimal.valueOf(serviceFunddetail.getTaxedamount()));
-                logger.info("鎵撳嵃newTaxedAmounts锛歿},taxationBefore:{},amountNow:{},tax:{}", newTaxedAmounts, taxationBefore, amountNow, tax);
-
-                //灏嗗惊鐜殑鏁版嵁閲嶆柊鏀惧埌涓�涓柊瀵硅薄涓�
-                ServiceFunddetail serviceFunddetail3 = DtoConversionUtils.sourceToTarget(serviceFunddetail, ServiceFunddetail.class);
-                serviceFunddetail3.setAmount(amountNow.doubleValue());
-                serviceFunddetail3.setTaxamount(tax.doubleValue());
+                BigDecimal tax = amountNow.subtract(BigDecimal.valueOf(detail.getTaxedamount()));
+                detail.setAmount(amountNow.doubleValue());
+                detail.setTaxamount(tax.doubleValue());
                 if (ObjectUtils.isEmpty(serviceFund1.getFundtaxtime())) {
-                    serviceFunddetail3.setTaxTime(new Date());
+                    detail.setTaxTime(new Date());
                 } else {
-                    serviceFunddetail3.setTaxTime(serviceFund1.getFundtaxtime());
+                    detail.setTaxTime(serviceFund1.getFundtaxtime());
                 }
-                logger.info("鎵撳嵃serviceFunddetail3:{}", serviceFunddetail3);
-                //鑾峰彇鍒板綋鍓嶄汉鐨勬湰鏈堢畻绋庡簭鍙锋渶澶у��
-                TaxMoneyByItemEO byItemEO = new TaxMoneyByItemEO();
-                byItemEO.setFirstDay(firstDay);
-                byItemEO.setIDCard(serviceFunddetail.getIdcardno());
-                byItemEO.setTaxTime(new Date());
-                // 灏嗚鏉℃暟鎹洿鏂�
-                updateById(serviceFunddetail3);
-                pretaxcost = pretaxcost.add(BigDecimal.valueOf(serviceFunddetail3.getAmount()));
-                taxedcost = taxedcost.add(BigDecimal.valueOf(serviceFunddetail3.getTaxedamount()));
-//                // 鎶婅鏁版嵁锛屾斁鍒颁复鏃剁殑闆嗗悎涓�
-                temporarySave.add(serviceFunddetail3);
+                if (tax.doubleValue() < 0) {
+                    log.info("灏忎簬0浜�");
+                }
+                taxSum.setAmounts((BigDecimal.valueOf(taxSum.getAmounts()).add(amountNow)).doubleValue());
+                taxSum.setTaxAmounts((BigDecimal.valueOf(taxSum.getTaxAmounts()).add(tax)).doubleValue());
+                taxSum.setTaxedAmounts(newTaxedAmounts.doubleValue());
+            } else {
+                // 绋庡墠鏄庣粏锛氱疮璁$◣鍓嶉噾棰濓紝绠楁�荤◣閲戯紝鍐嶇畻鏈绋庨噾鍜岀◣鍚庨噾棰�
+                BigDecimal newAmounts = BigDecimal.valueOf(taxSum.getAmounts()).add(BigDecimal.valueOf(detail.getAmount()));
+                if (idcard.equals("330103196704060019")) {
+                    log.info("330103196704060019");
+                }
+                String taxation = TaxtUtils.getTaxation(newAmounts);
+                BigDecimal taxAmountNow = new BigDecimal(taxation).subtract(new BigDecimal(String.valueOf(taxSum.getTaxAmounts())));
+                BigDecimal texdAfterNow = BigDecimal.valueOf(detail.getAmount()).subtract(taxAmountNow);
+                detail.setTaxamount(taxAmountNow.doubleValue());
+                detail.setTaxedamount(texdAfterNow.doubleValue());
+                if (taxAmountNow.doubleValue() < 0) {
+                    log.info("灏忎簬0浜�");
+                }
+
+                if (ObjectUtils.isEmpty(serviceFund1.getFundtaxtime())) {
+                    detail.setTaxTime(new Date());
+                } else {
+                    detail.setTaxTime(serviceFund1.getFundtaxtime());
+                }
+                taxSum.setAmounts(newAmounts.doubleValue());
+                taxSum.setTaxAmounts((BigDecimal.valueOf(taxSum.getTaxAmounts()).add(taxAmountNow).doubleValue()));
+                taxSum.setTaxedAmounts((BigDecimal.valueOf(taxSum.getTaxedAmounts()).add(texdAfterNow)).doubleValue());
             }
+
+            updateList.add(detail);
+
+            pretaxcost = pretaxcost.add(BigDecimal.valueOf(detail.getAmount()));
+            taxedcost = taxedcost.add(BigDecimal.valueOf(detail.getTaxedamount()));
+
         }
+        // 6. 鎵归噺鏇存柊鎵�鏈夋槑缁�
+        for (ServiceFunddetail d : updateList) {
+            this.updateById(d);
+        }
+        // 7. 鏇存柊涓昏〃ServiceFund
         ServiceFund serviceFund = new ServiceFund();
         serviceFund.setPretaxcost(pretaxcost.doubleValue());
         serviceFund.setTaxedcost(taxedcost.doubleValue());
         serviceFund.setId(serviceFunddetails.get(0).getFundid());
-        if (ObjectUtils.isEmpty(serviceFund1.getFundtaxtime())) {
-            serviceFund.setFundtaxtime(new Date());
-        }
-        // 1 宸茬畻绋�
+        serviceFund.setFundtaxtime(new Date());
+
         serviceFund.setIstax(1);
         serviceFundMapper.updateById(serviceFund);
-
         return true;
     }
 
+//    @Override
+//    public Boolean calculateTax2(List<ServiceFunddetail> serviceFunddetails) {
+//        //鐢ㄤ簬缂撳瓨姣忎釜韬唤璇佸彿锛坕dcardno锛夋湰鏈堢疮璁$殑绋庡墠銆佺◣閲戙�佺◣鍚庨噾棰濓紙TaxMoneySumEO瀵硅薄锛�
+//        Map<String, TaxMoneySumEO> tempTaxSumMap = new HashMap<>();
+//
+//        TaxMoneyByItemEO taxMoneyVO = new TaxMoneyByItemEO();
+//        Date firstDay = Date.from(LocalDate.now().with(TemporalAdjusters.firstDayOfMonth()).atStartOfDay(ZoneId.systemDefault()).toInstant());
+//        taxMoneyVO.setFirstDay(firstDay);
+//        taxMoneyVO.setTaxTime(new Date());
+//
+//        List<TaxMoneySumEO> taxSum = serviceFunddetailMapper.getTaxSum(taxMoneyVO);
+//        for (TaxMoneySumEO taxMoneySumEO : taxSum) {
+//            tempTaxSumMap.put(taxMoneySumEO.getIDCardNo(), taxMoneySumEO);
+//        }
+//
+//        return calculateTax(serviceFunddetails, tempTaxSumMap);
+//    }
+
+
     @Override
     public Map<String, Double> performance(ServiceFunddetail serviceFunddetail) {
         //鏍规嵁"韬唤璇佸彿"鍜�"缁╂晥鏃ユ湡(骞翠唤)"鏌ヨ涓汉鍘嗗彶缁╂晥
diff --git a/ruoyi-project/src/main/java/com/ruoyi/project/service/impl/ServiceFundtaxServiceImpl.java b/ruoyi-project/src/main/java/com/ruoyi/project/service/impl/ServiceFundtaxServiceImpl.java
index cbc1d52..04b4c89 100644
--- a/ruoyi-project/src/main/java/com/ruoyi/project/service/impl/ServiceFundtaxServiceImpl.java
+++ b/ruoyi-project/src/main/java/com/ruoyi/project/service/impl/ServiceFundtaxServiceImpl.java
@@ -9,6 +9,9 @@
 import com.ruoyi.project.domain.ServiceFunddetail;
 import com.ruoyi.project.domain.ServiceFundtax;
 import com.ruoyi.project.domain.vo.FundTaxVO;
+import com.ruoyi.project.domain.vo.TaxMoneyByItemEO;
+import com.ruoyi.project.domain.vo.TaxMoneySumEO;
+import com.ruoyi.project.mapper.ServiceFundMapper;
 import com.ruoyi.project.mapper.ServiceFunddetailMapper;
 import com.ruoyi.project.mapper.ServiceFundtaxMapper;
 import com.ruoyi.project.service.IServiceFundService;
@@ -20,8 +23,10 @@
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.Comparator;
-import java.util.List;
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.time.temporal.TemporalAdjusters;
+import java.util.*;
 
 /**
  * 涓撳璐圭敤绠楃◣鐢宠涓籗ervice涓氬姟灞傚鐞�
@@ -41,6 +46,9 @@
     private IServiceFundService serviceFundService;
     @Autowired
     private ServiceFundtaxMapper serviceFundtaxMapper;
+
+    @Autowired
+    private ServiceFundMapper serviceFundMapper;
 
 
     /**
@@ -159,34 +167,67 @@
         return serviceFundtaxMapper.getMaxFundTaxId();
     }
 
+    /**
+     * 鎵归噺绠楃◣涓诲叆鍙�
+     * 1. 鏍¢獙鍙傛暟
+     * 2. 鏍¢獙鎵规鍚堟硶鎬э紙濡傛湁蹇呰锛�
+     * 3. 鏌ヨ鏈壒娆℃墍鏈塖erviceFund锛堟寜id鍗囧簭锛�
+     * 4. 棰勬煡璇㈡湰鏈堟墍鏈夎韩浠借瘉鍙风殑绱閲戦锛岀紦瀛樺埌Map锛屾彁鍗囧悗缁畻绋庢晥鐜�
+     * 5. 閬嶅巻姣忎釜ServiceFund锛屾壒閲忕畻绋�
+     *
+     * @param fundTaxVO 鎵规绠楃◣鍙傛暟
+     * @return 鏄惁绠楃◣鎴愬姛
+     */
     @Override
-    @Transactional(rollbackFor = Exception.class)
     public Boolean batchFundTax(FundTaxVO fundTaxVO) {
         log.info("鎵归噺绠楃◣鐨刦undTaxVO鍏ュ弬涓猴細{}", fundTaxVO);
+        // 1. 鏍¢獙鍙傛暟
         if (fundTaxVO.getFundTaxId() == null) {
             throw new BaseException("鍒嗘壒绠楃◣鍑洪棶棰樹簡,璇锋鏌ュ悗鍐嶈繘琛岃绠�");
         }
+        // 2. 鏍¢獙鎵规鍚堟硶鎬э紙浠呴檺淇敼鎿嶄綔锛�
         if (fundTaxVO.getAddOrupdate() == 1) {
             Integer maxFundTaxId = serviceFundtaxMapper.getMaxFundTaxId();
             log.info("鎵归噺绠楃◣鐨刴axFundTaxId涓猴細{}", maxFundTaxId);
-            if (fundTaxVO.getFundTaxId() != maxFundTaxId.longValue()) {
+            if (!fundTaxVO.getFundTaxId().equals(Long.valueOf(maxFundTaxId))) {
                 throw new BaseException("璇ユ壒鏁版嵁涓嶈兘绠楃◣");
             }
         }
 
+        // 3. 鏌ヨ鏈壒娆℃墍鏈塖erviceFund锛堟寜id鍗囧簭锛�
         ServiceFund serviceFund = new ServiceFund();
         serviceFund.setFundTaxId(fundTaxVO.getFundTaxId());
         serviceFund.setDel_flag(0);
         List<ServiceFund> serviceFunds = serviceFundService.selectServiceFundList(serviceFund);
-        if (CollectionUtils.isEmpty(serviceFunds)) {
-            //鏍规嵁id鎺掑簭锛堝崌搴忥級
-            serviceFunds.sort(Comparator.comparing(ServiceFund::getId));
+        for (ServiceFund serviceFund1 : serviceFunds) {
+            serviceFundMapper.updateFundIsTexById(serviceFund1.getId(), 0L);
         }
+
+        // 鎸塱d鍗囧簭鎺掑簭锛屼繚璇佸鐞嗛『搴忎竴鑷�
+        serviceFunds.sort(Comparator.comparing(ServiceFund::getId));
+        if (CollectionUtils.isEmpty(serviceFunds)) {
+            log.warn("鏈煡璇㈠埌鐩稿叧ServiceFund锛宖undTaxId={}", fundTaxVO.getFundTaxId());
+            return false;
+        }
+
+        // 4. 棰勬煡璇㈡湰鏈堟墍鏈夎韩浠借瘉鍙风殑绱閲戦锛岀紦瀛樺埌Map锛屾彁鍗囧悗缁畻绋庢晥鐜�
+        TaxMoneyByItemEO taxMoneyVO = new TaxMoneyByItemEO();
+        Date firstDay = Date.from(LocalDate.now().with(TemporalAdjusters.firstDayOfMonth()).atStartOfDay(ZoneId.systemDefault()).toInstant());
+        taxMoneyVO.setFirstDay(firstDay);
+        taxMoneyVO.setTaxTime(new Date());
+        Map<String, TaxMoneySumEO> tempTaxSumMap = new HashMap<>();
+        List<TaxMoneySumEO> taxSum = serviceFunddetailMapper.getTaxSum(taxMoneyVO);
+        for (TaxMoneySumEO taxMoneySumEO : taxSum) {
+            tempTaxSumMap.put(taxMoneySumEO.getIDCardNo(), taxMoneySumEO);
+        }
+
+        // 5. 閬嶅巻姣忎釜ServiceFund锛屾壒閲忕畻绋�
         for (ServiceFund serviceFund1 : serviceFunds) {
             ServiceFunddetail serviceFunddetail = new ServiceFunddetail();
             serviceFunddetail.setFundid(serviceFund1.getId());
             List<ServiceFunddetail> serviceFunddetails = serviceFunddetailMapper.selectServiceFunddetailList(serviceFunddetail);
-            serviceFunddetailService.calculateTax(serviceFunddetails);
+            // 浼犲叆绱閲戦缂撳瓨锛屾彁鍗囩畻绋庢晥鐜�
+            serviceFunddetailService.calculateTax(serviceFunddetails, tempTaxSumMap);
         }
         return true;
     }
diff --git a/ruoyi-project/src/main/resources/mapper/project/ServiceFundMapper.xml b/ruoyi-project/src/main/resources/mapper/project/ServiceFundMapper.xml
index 16808bb..fee27fe 100644
--- a/ruoyi-project/src/main/resources/mapper/project/ServiceFundMapper.xml
+++ b/ruoyi-project/src/main/resources/mapper/project/ServiceFundMapper.xml
@@ -282,4 +282,12 @@
         </set>
         where id = #{id}
     </update>
+    <update id="updateFundIsTexById">
+        update service_fund
+        <set>
+            istax = #{isTax},
+            fundtaxtime = null
+        </set>
+        where id = #{id}
+    </update>
 </mapper>
diff --git a/ruoyi-project/src/main/resources/mapper/project/ServiceFunddetailMapper.xml b/ruoyi-project/src/main/resources/mapper/project/ServiceFunddetailMapper.xml
index 6c4e22f..263f923 100644
--- a/ruoyi-project/src/main/resources/mapper/project/ServiceFunddetailMapper.xml
+++ b/ruoyi-project/src/main/resources/mapper/project/ServiceFunddetailMapper.xml
@@ -278,22 +278,21 @@
 
     <select id="getTaxSum" parameterType="com.ruoyi.project.domain.vo.TaxMoneyByItemEO"
             resultType="com.ruoyi.project.domain.vo.TaxMoneySumEO">
-        SELECT sum(a.Amount) amounts, sum(a.TaxAmount) taxAmounts, sum(a.TaxedAmount) taxedAmounts
+        SELECT sum(a.Amount) amounts, sum(a.TaxAmount) taxAmounts, sum(a.TaxedAmount) taxedAmounts, max(a.xh) as xh,a.IDCardNo
         FROM service_funddetail a,
              service_fund b
         where a.FundID = b.id
           and a.tax_time &lt;= #{taxTime}
-          and a.xh &lt; #{xh}
+          and b.istax = 1
           and a.tax_time >= #{firstDay}
-          and TRIM(a.IDCardNo) = #{IDCard}
           and a.del_flag != 1
-          and b.id != #{fundID}
           and b.fundtaxtime
             &lt;= #{taxTime}
           and b.fundtaxtime >= #{firstDay}
           and b.del_flag != 1
           and b.ApplyType in (1
             , 2)
+group by a.IDCardNo
     </select>
 
     <select id="getMaxXH" parameterType="com.ruoyi.project.domain.vo.TaxMoneyByItemEO"

--
Gitblit v1.9.3