소스 검색

优化非自然月实收按天计算bug

Signed-off-by: java110 <928255095@qq.com>
java110 10 달 전
부모
커밋
20258410be
1개의 변경된 파일124개의 추가작업 그리고 20개의 파일을 삭제
  1. 124 20
      service-fee/src/main/java/com/java110/fee/feeMonth/PayFeeMonthHelp.java

+ 124 - 20
service-fee/src/main/java/com/java110/fee/feeMonth/PayFeeMonthHelp.java

@@ -135,7 +135,15 @@ public class PayFeeMonthHelp implements IPayFeeMonthHelp {
 
         for (FeeDetailDto feeDetailDto : feeDetailDtos) {
             // todo 逐条去离散
-            doDispersedFeeDetail(feeDetailDto, feeDto, payFeeMonthOwnerDto, feePrice);
+            try {
+                // 自然月实收处理
+                doDispersedFeeDetailNormalMonth(feeDetailDto, feeDto, payFeeMonthOwnerDto, feePrice);
+
+                //非自然月或者一次性费用处理已经交过费的
+                doDispersedFeeDetailUnNormalMonth(feeDetailDto, feeDto, payFeeMonthOwnerDto, feePrice);
+            }catch (Exception e){
+                e.printStackTrace();
+            }
         }
     }
 
@@ -165,10 +173,10 @@ public class PayFeeMonthHelp implements IPayFeeMonthHelp {
         }
 
         // 自然月周期性费用计算
-        waitDispersedOweFeeCycleNormalMonth(feeDto,payFeeMonthOwnerDto,feePrice,deadlineTime);
+        waitDispersedOweFeeCycleNormalMonth(feeDto, payFeeMonthOwnerDto, feePrice, deadlineTime);
 
         // 一次性或者非自然月处理
-        waitDispersedOweFeeOnceUnNormalMonth(feeDto,payFeeMonthOwnerDto,feePrice,deadlineTime,oweMonth);
+        waitDispersedOweFeeOnceUnNormalMonth(feeDto, payFeeMonthOwnerDto, feePrice, deadlineTime, oweMonth);
 
     }
 
@@ -186,7 +194,7 @@ public class PayFeeMonthHelp implements IPayFeeMonthHelp {
             return;
         }
         // 不是自然月 费用直接返回
-        if(DateUtil.getDay(feeDto.getStartTime()) !=1){
+        if (DateUtil.getDay(feeDto.getStartTime()) != 1) {
             return;
         }
         List<PayFeeDetailMonthPo> payFeeDetailMonthPos = new ArrayList<>();
@@ -257,15 +265,16 @@ public class PayFeeMonthHelp implements IPayFeeMonthHelp {
 
     /**
      * 一次性或者非自然月处理
+     *
      * @param feeDto
      * @param payFeeMonthOwnerDto
      * @param deadlineTime
      * @param oweMonth
      */
-    private void waitDispersedOweFeeOnceUnNormalMonth(FeeDto feeDto, PayFeeMonthOwnerDto payFeeMonthOwnerDto,double feePrice, Date deadlineTime, double oweMonth) {
+    private void waitDispersedOweFeeOnceUnNormalMonth(FeeDto feeDto, PayFeeMonthOwnerDto payFeeMonthOwnerDto, double feePrice, Date deadlineTime, double oweMonth) {
 
         // 不是一次性费用 并且是 自然月就返回
-        if(!FeeDto.FEE_FLAG_ONCE.equals(feeDto.getFeeFlag()) && DateUtil.getDay(feeDto.getStartTime()) == 1){
+        if (!FeeDto.FEE_FLAG_ONCE.equals(feeDto.getFeeFlag()) && DateUtil.getDay(feeDto.getStartTime()) == 1) {
             return;
         }
         List<PayFeeDetailMonthPo> payFeeDetailMonthPos = new ArrayList<>();
@@ -274,7 +283,7 @@ public class PayFeeMonthHelp implements IPayFeeMonthHelp {
         Date endTime = DateUtil.deadTimeToDate(deadlineTime);
 
 
-        BigDecimal receivableAmount = new BigDecimal(feePrice).multiply(new BigDecimal(oweMonth)).setScale(8,BigDecimal.ROUND_HALF_UP);
+        BigDecimal receivableAmount = new BigDecimal(feePrice).multiply(new BigDecimal(oweMonth)).setScale(8, BigDecimal.ROUND_HALF_UP);
 
         BigDecimal dayReceivableAmount = null;
 
@@ -325,8 +334,27 @@ public class PayFeeMonthHelp implements IPayFeeMonthHelp {
         payFeeDetailMonthInnerServiceSMOImpl.savePayFeeDetailMonths(payFeeDetailMonthPos);
     }
 
-    private void doDispersedFeeDetail(FeeDetailDto feeDetailDto, FeeDto feeDto, PayFeeMonthOwnerDto
+
+
+
+    /**
+     * 自然月处理已经交过费的
+     *
+     * @param feeDetailDto
+     * @param feeDto
+     * @param payFeeMonthOwnerDto
+     * @param feePrice
+     */
+    private void doDispersedFeeDetailNormalMonth(FeeDetailDto feeDetailDto, FeeDto feeDto, PayFeeMonthOwnerDto
             payFeeMonthOwnerDto, Double feePrice) {
+        // 一次性费用直接返回
+        if (FeeDto.FEE_FLAG_ONCE.equals(feeDto.getFeeFlag())) {
+            return;
+        }
+        // 不是自然月 费用直接返回
+        if (DateUtil.getDay(feeDto.getStartTime()) != 1) {
+            return;
+        }
         List<PayFeeDetailMonthPo> payFeeDetailMonthPos = new ArrayList<>();
 
         // todo 去除 开始时间和 结束时间的 小时 分钟 秒
@@ -344,8 +372,8 @@ public class PayFeeMonthHelp implements IPayFeeMonthHelp {
         BigDecimal receivableAmount = new BigDecimal(feePrice + "");
         BigDecimal receivedAmount = new BigDecimal(Double.parseDouble(feeDetailDto.getReceivedAmount()));
 
-        BigDecimal dayReceivableAmount = receivableAmount.divide(new BigDecimal(day), 8, BigDecimal.ROUND_HALF_UP);// 日 应收
-        BigDecimal dayReceivedAmount = receivedAmount.divide(new BigDecimal(day), 8, BigDecimal.ROUND_HALF_UP);// 日 实收
+        BigDecimal dayReceivableAmount = null;
+        BigDecimal dayReceivedAmount = null;
 
         // todo 寻找第一个自然月 一日
         Calendar firstMonthDayCal = Calendar.getInstance();
@@ -366,11 +394,9 @@ public class PayFeeMonthHelp implements IPayFeeMonthHelp {
             Calendar calendar = Calendar.getInstance();
             calendar.setTime(startMonthDayTime);
             curMonthMaxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
-            if (!FeeDto.FEE_FLAG_ONCE.equals(feeDto.getFeeFlag())) {
-                dayReceivableAmount = receivableAmount.divide(new BigDecimal(curMonthMaxDay), 8, BigDecimal.ROUND_HALF_UP);// 日 实收
-                dayReceivedAmount = receivedAmount.divide(new BigDecimal(month + ""), 8, BigDecimal.ROUND_HALF_UP);// 日 实收
-                dayReceivedAmount = dayReceivedAmount.divide(new BigDecimal(curMonthMaxDay), 8, BigDecimal.ROUND_HALF_UP);// 日 实收
-            }
+            dayReceivableAmount = receivableAmount.divide(new BigDecimal(curMonthMaxDay), 8, BigDecimal.ROUND_HALF_UP);// 日 实收
+            dayReceivedAmount = receivedAmount.divide(new BigDecimal(month + ""), 8, BigDecimal.ROUND_HALF_UP);// 日 实收
+            dayReceivedAmount = dayReceivedAmount.divide(new BigDecimal(curMonthMaxDay), 8, BigDecimal.ROUND_HALF_UP);// 日 实收
             // todo 计算 应收
             curMonthReceivableAmount = new BigDecimal(curDay).multiply(dayReceivableAmount).setScale(4, BigDecimal.ROUND_HALF_UP);
             // todo 计算 实收
@@ -395,11 +421,90 @@ public class PayFeeMonthHelp implements IPayFeeMonthHelp {
         Calendar calendar = Calendar.getInstance();
         calendar.setTime(startMonthDayTime);
         curMonthMaxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
-        if (!FeeDto.FEE_FLAG_ONCE.equals(feeDto.getFeeFlag())) {
-            dayReceivableAmount = receivableAmount.divide(new BigDecimal(curMonthMaxDay), 8, BigDecimal.ROUND_HALF_UP);// 日 实收
-            dayReceivedAmount = receivedAmount.divide(new BigDecimal(month + ""), 8, BigDecimal.ROUND_HALF_UP);// 日 实收
-            dayReceivedAmount = dayReceivedAmount.divide(new BigDecimal(curMonthMaxDay), 8, BigDecimal.ROUND_HALF_UP);// 日 实收
+        dayReceivableAmount = receivableAmount.divide(new BigDecimal(curMonthMaxDay), 8, BigDecimal.ROUND_HALF_UP);// 日 实收
+        dayReceivedAmount = receivedAmount.divide(new BigDecimal(month + ""), 8, BigDecimal.ROUND_HALF_UP);// 日 实收
+        dayReceivedAmount = dayReceivedAmount.divide(new BigDecimal(curMonthMaxDay), 8, BigDecimal.ROUND_HALF_UP);// 日 实收
+
+        // todo 计算 应收
+        curMonthReceivableAmount = new BigDecimal(curDay).multiply(dayReceivableAmount).setScale(4, BigDecimal.ROUND_HALF_UP);
+        // todo 计算 实收
+        curMonthReceivedAmount = new BigDecimal(curDay).multiply(dayReceivedAmount).setScale(4, BigDecimal.ROUND_HALF_UP);
+
+        // todo 保存数据到pay_fee_detail_month
+        toSavePayFeeDetailMonth(curMonthReceivableAmount.doubleValue(), curMonthReceivedAmount.doubleValue(), feeDetailDto, feeDto, payFeeMonthOwnerDto, payFeeDetailMonthPos, startMonthDayTime, endTime);
+        payFeeDetailMonthInnerServiceSMOImpl.savePayFeeDetailMonths(payFeeDetailMonthPos);
+    }
+
+
+    /**
+     * 非自然月或者一次性费用处理已经交过费的
+     *
+     * @param feeDetailDto
+     * @param feeDto
+     * @param payFeeMonthOwnerDto
+     * @param feePrice
+     */
+    private void doDispersedFeeDetailUnNormalMonth(FeeDetailDto feeDetailDto, FeeDto feeDto, PayFeeMonthOwnerDto
+            payFeeMonthOwnerDto, Double feePrice) {
+        // 不是一次性费用 并且是 自然月就返回
+        if (!FeeDto.FEE_FLAG_ONCE.equals(feeDto.getFeeFlag()) && DateUtil.getDay(feeDto.getStartTime()) == 1) {
+            return;
+        }
+
+        List<PayFeeDetailMonthPo> payFeeDetailMonthPos = new ArrayList<>();
+
+        // todo 去除 开始时间和 结束时间的 小时 分钟 秒
+        Date startTime = DateUtil.timeToDate(feeDetailDto.getStartTime());
+        Date endTime = feeDetailDto.getEndTime();
+        endTime = DateUtil.getNextSecDateTime(endTime);
+        endTime = DateUtil.timeToDate(endTime);
+
+        int day = DateUtil.daysBetween(endTime, startTime);
+        if (day < 1) {
+            day = 1;
         }
+
+        BigDecimal receivableAmount = new BigDecimal(feeDetailDto.getReceivableAmount());
+        BigDecimal receivedAmount = new BigDecimal(feeDetailDto.getReceivedAmount());
+
+        BigDecimal dayReceivableAmount = receivableAmount.divide(new BigDecimal(day), 8, BigDecimal.ROUND_HALF_UP);// 日 应收
+        BigDecimal dayReceivedAmount = receivedAmount.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;
+        BigDecimal curMonthReceivableAmount = null;
+        BigDecimal curMonthReceivedAmount = null;
+        int curMonthMaxDay = 30;
+        while (firstMonthDayTime.getTime() < endTime.getTime()) {
+            curDay = DateUtil.daysBetween(firstMonthDayTime, startMonthDayTime);
+            // todo 计算 应收
+            curMonthReceivableAmount = new BigDecimal(curDay).multiply(dayReceivableAmount).setScale(4, BigDecimal.ROUND_HALF_UP);
+            // todo 计算 实收
+            curMonthReceivedAmount = new BigDecimal(curDay).multiply(dayReceivedAmount).setScale(4, BigDecimal.ROUND_HALF_UP);
+            // todo 保存数据到pay_fee_detail_month
+            toSavePayFeeDetailMonth(curMonthReceivableAmount.doubleValue(), curMonthReceivedAmount.doubleValue(), feeDetailDto, feeDto, payFeeMonthOwnerDto, payFeeDetailMonthPos, startMonthDayTime, endTime);
+
+            // todo 将startTime 修改为 下月1日时间
+            startMonthDayTime = firstMonthDayTime;
+            firstMonthDayCal.add(Calendar.MONTH, 1);
+            firstMonthDayTime = firstMonthDayCal.getTime();
+        }
+
+        //todo 最后处理 最后 startMonthDayTime 到endTime 的
+        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 计算 实收
@@ -410,7 +515,6 @@ public class PayFeeMonthHelp implements IPayFeeMonthHelp {
         payFeeDetailMonthInnerServiceSMOImpl.savePayFeeDetailMonths(payFeeDetailMonthPos);
 
     }
-
     /**
      * 保存数据
      *