From 46675f1b0e738d6feac132606612e16056c9aee6 Mon Sep 17 00:00:00 2001
From: java110 <928255095@qq.com>
Date: 星期四, 15 五月 2025 01:02:52 +0800
Subject: [PATCH] 优化基础报表产生数据逻辑将自然月和非自然月却别对待

---
 service-fee/src/main/java/com/java110/fee/feeMonth/PayFeeMonthHelp.java |  117 ++++++++++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 97 insertions(+), 20 deletions(-)

diff --git a/service-fee/src/main/java/com/java110/fee/feeMonth/PayFeeMonthHelp.java b/service-fee/src/main/java/com/java110/fee/feeMonth/PayFeeMonthHelp.java
index 6fe0331..c441b20 100644
--- a/service-fee/src/main/java/com/java110/fee/feeMonth/PayFeeMonthHelp.java
+++ b/service-fee/src/main/java/com/java110/fee/feeMonth/PayFeeMonthHelp.java
@@ -159,7 +159,7 @@
      * @param deadlineTime
      */
     @Override
-    public void waitDispersedOweFee(FeeDto feeDto, PayFeeMonthOwnerDto payFeeMonthOwnerDto, Double feePrice, Date deadlineTime) {
+    public void waitDispersedOweFee(FeeDto feeDto, PayFeeMonthOwnerDto payFeeMonthOwnerDto, Double feePrice, Date deadlineTime, double owePrice) {
 
 
         // todo 娓呯悊 detailId 涓�-1 鐨勬暟鎹�
@@ -174,6 +174,31 @@
             return;
         }
 
+        // 鑷劧鏈堝懆鏈熸�ц垂鐢ㄨ绠�
+        waitDispersedOweFeeCycleNormalMonth(feeDto,payFeeMonthOwnerDto,feePrice,deadlineTime);
+
+        // 涓�娆℃�ф垨鑰呴潪鑷劧鏈堝鐞�
+        waitDispersedOweFeeOnceUnNormalMonth(feeDto,payFeeMonthOwnerDto,deadlineTime,owePrice);
+
+    }
+
+    /**
+     * 鑷劧鏈堝懆鏈熸�ц垂鐢ㄨ绠�
+     *
+     * @param feeDto
+     * @param payFeeMonthOwnerDto
+     * @param feePrice
+     * @param deadlineTime
+     */
+    private void waitDispersedOweFeeCycleNormalMonth(FeeDto feeDto, PayFeeMonthOwnerDto payFeeMonthOwnerDto, Double feePrice, Date deadlineTime) {
+        // 涓�娆℃�ц垂鐢ㄧ洿鎺ヨ繑鍥�
+        if (FeeDto.FEE_FLAG_ONCE.equals(feeDto.getFeeFlag())) {
+            return;
+        }
+        // 涓嶆槸鑷劧鏈� 璐圭敤鐩存帴杩斿洖
+        if(DateUtil.getMonthDay(feeDto.getStartTime()) !=1){
+            return;
+        }
         List<PayFeeDetailMonthPo> payFeeDetailMonthPos = new ArrayList<>();
         // todo 澶勭悊 寮�濮嬫椂闂村拰缁撴潫鏃堕棿
         Date startTime = DateUtil.timeToDate(feeDto.getEndTime());
@@ -182,15 +207,6 @@
         BigDecimal receivableAmount = new BigDecimal(feePrice);
 
         BigDecimal dayReceivableAmount = null;
-
-        //todo 涓�娆℃�ц垂鐢� 鏃ュ簲鏀惰绠�
-        if (FeeDto.FEE_FLAG_ONCE.equals(feeDto.getFeeFlag())) {
-            int day = DateUtil.daysBetween(endTime, startTime);
-            if (day < 1) {
-                day = 1;
-            }
-            dayReceivableAmount = receivableAmount.divide(new BigDecimal(day), 8, BigDecimal.ROUND_HALF_UP);// 鏃� 搴旀敹
-        }
 
         // todo 瀵绘壘绗竴涓嚜鐒舵湀 涓�鏃�
         Calendar firstMonthDayCal = Calendar.getInstance();
@@ -212,11 +228,7 @@
             calendar.setTime(startMonthDayTime);
             curMonthMaxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
 
-
-            //todo 鍛ㄦ湡鎬ц垂鐢� 鏃ュ簲鏀堕噸鏂扮畻
-            if (!FeeDto.FEE_FLAG_ONCE.equals(feeDto.getFeeFlag())) {
-                dayReceivableAmount = receivableAmount.divide(new BigDecimal(curMonthMaxDay), 8, BigDecimal.ROUND_HALF_UP);// 鏃� 瀹炴敹
-            }
+            dayReceivableAmount = receivableAmount.divide(new BigDecimal(curMonthMaxDay), 8, BigDecimal.ROUND_HALF_UP);// 鏃� 瀹炴敹
             // todo 璁$畻 搴旀敹
             curMonthReceivableAmount = new BigDecimal(curDay).multiply(dayReceivableAmount).setScale(4, BigDecimal.ROUND_HALF_UP);
 
@@ -240,21 +252,86 @@
         Calendar calendar = Calendar.getInstance();
         calendar.setTime(startMonthDayTime);
         curMonthMaxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
-        // todo 濡傛灉涓嶆槸鏁存湀锛屽垯杞崲涓烘寜澶╄绠�
-//        if (curDay != curMonthMaxDay) {
         //todo 鍛ㄦ湡鎬ц垂鐢� 鏃ュ簲鏀堕噸鏂扮畻
         if (!FeeDto.FEE_FLAG_ONCE.equals(feeDto.getFeeFlag())) {
             dayReceivableAmount = receivableAmount.divide(new BigDecimal(curMonthMaxDay), 8, BigDecimal.ROUND_HALF_UP);// 鏃� 瀹炴敹
         }
         // todo 璁$畻 搴旀敹
         curMonthReceivableAmount = new BigDecimal(curDay).multiply(dayReceivableAmount).setScale(4, BigDecimal.ROUND_HALF_UP);
-//        } else { // todo 濡傛灉鏄暣鏈� 閭e氨鎸夋湀璁$畻锛屼互鍏� 杞崲鎴愬ぉ鍐� 涔樹互澶╂暟鍚庣殑璇樊
-//            curMonthReceivableAmount = receivableAmount;
-//        }
+
         // todo 淇濆瓨鏁版嵁鍒皃ay_fee_detail_month
         toSavePayFeeDetailMonth(curMonthReceivableAmount.doubleValue(), 0, null, feeDto, payFeeMonthOwnerDto, payFeeDetailMonthPos, startMonthDayTime, deadlineTime);
         payFeeDetailMonthInnerServiceSMOImpl.savePayFeeDetailMonths(payFeeDetailMonthPos);
+    }
 
+
+    /**
+     * 涓�娆℃�ф垨鑰呴潪鑷劧鏈堝鐞�
+     * @param feeDto
+     * @param payFeeMonthOwnerDto
+     * @param deadlineTime
+     * @param oweMonth
+     */
+    private void waitDispersedOweFeeOnceUnNormalMonth(FeeDto feeDto, PayFeeMonthOwnerDto payFeeMonthOwnerDto, Date deadlineTime, double oweMonth) {
+
+        // 涓嶆槸涓�娆℃�ц垂鐢� 骞朵笖鏄� 鑷劧鏈堝氨杩斿洖
+        if(!FeeDto.FEE_FLAG_ONCE.equals(feeDto.getFeeFlag()) && DateUtil.getMonthDay(feeDto.getStartTime()) == 1){
+            return;
+        }
+        List<PayFeeDetailMonthPo> payFeeDetailMonthPos = new ArrayList<>();
+        // todo 澶勭悊 寮�濮嬫椂闂村拰缁撴潫鏃堕棿
+        Date startTime = DateUtil.timeToDate(feeDto.getEndTime());
+        Date endTime = DateUtil.deadTimeToDate(deadlineTime);
+
+        BigDecimal receivableAmount = new BigDecimal(oweMonth);
+
+        BigDecimal dayReceivableAmount = null;
+
+
+        int day = DateUtil.daysBetween(endTime, startTime);
+        if (day < 1) {
+            day = 1;
+        }
+        dayReceivableAmount = receivableAmount.divide(new BigDecimal(day), 8, BigDecimal.ROUND_HALF_UP);// 鏃� 搴旀敹
+
+        // todo 瀵绘壘绗竴涓嚜鐒舵湀 涓�鏃�
+        Calendar firstMonthDayCal = Calendar.getInstance();
+        firstMonthDayCal.setTime(startTime);
+        firstMonthDayCal.add(Calendar.MONTH, 1);
+        firstMonthDayCal.set(Calendar.DAY_OF_MONTH, 1);
+        Date firstMonthDayTime = firstMonthDayCal.getTime();
+
+        Date startMonthDayTime = startTime;
+        // todo  寰幆锛屽彧鍒� firstMonthDayTime 澶т簬 endTime
+        int curDay = 0;
+        int curMonthMaxDay = 30;
+        BigDecimal curMonthReceivableAmount = null;
+
+        while (firstMonthDayTime.getTime() < endTime.getTime()) {
+            curDay = DateUtil.daysBetween(firstMonthDayTime, startMonthDayTime);
+            // todo 璁$畻 搴旀敹
+            curMonthReceivableAmount = new BigDecimal(curDay).multiply(dayReceivableAmount).setScale(4, BigDecimal.ROUND_HALF_UP);
+
+            // todo 淇濆瓨鏁版嵁鍒皃ay_fee_detail_month
+            toSavePayFeeDetailMonth(curMonthReceivableAmount.doubleValue(), 0, null, feeDto, payFeeMonthOwnerDto, payFeeDetailMonthPos, startMonthDayTime, deadlineTime);
+
+            // todo 灏唖tartTime 淇敼涓� 涓嬫湀1鏃ユ椂闂�
+            startMonthDayTime = firstMonthDayTime;
+            firstMonthDayCal.add(Calendar.MONTH, 1);
+            firstMonthDayTime = firstMonthDayCal.getTime();
+        }
+
+        //todo 鏈�鍚庡鐞� 鏈�鍚� startMonthDayTime 鍒癳ndTime 鐨�
+        if (startMonthDayTime.getTime() >= endTime.getTime()) {
+            payFeeDetailMonthInnerServiceSMOImpl.savePayFeeDetailMonths(payFeeDetailMonthPos);
+            return;
+        }
+        curDay = DateUtil.daysBetween(endTime, startMonthDayTime);
+        // todo 璁$畻 搴旀敹
+        curMonthReceivableAmount = new BigDecimal(curDay).multiply(dayReceivableAmount).setScale(4, BigDecimal.ROUND_HALF_UP);
+        // todo 淇濆瓨鏁版嵁鍒皃ay_fee_detail_month
+        toSavePayFeeDetailMonth(curMonthReceivableAmount.doubleValue(), 0, null, feeDto, payFeeMonthOwnerDto, payFeeDetailMonthPos, startMonthDayTime, deadlineTime);
+        payFeeDetailMonthInnerServiceSMOImpl.savePayFeeDetailMonths(payFeeDetailMonthPos);
     }
 
     private void doDispersedFeeDetail(FeeDetailDto feeDetailDto, FeeDto feeDto, PayFeeMonthOwnerDto

--
Gitblit v1.8.0