From 09095d67f2e2acf45dcd55155da491e44206db4e Mon Sep 17 00:00:00 2001
From: wuxw <928255095@qq.com>
Date: 星期五, 05 四月 2024 15:38:14 +0800
Subject: [PATCH] 修改时间 将时间修改 未23:59:59秒

---
 java110-core/src/main/java/com/java110/core/smo/impl/ComputeFeeSMOImpl.java |  672 ++++++++++++++++++++++++++-----------------------------
 1 files changed, 323 insertions(+), 349 deletions(-)

diff --git a/java110-core/src/main/java/com/java110/core/smo/impl/ComputeFeeSMOImpl.java b/java110-core/src/main/java/com/java110/core/smo/impl/ComputeFeeSMOImpl.java
index 450f09c..5161aec 100755
--- a/java110-core/src/main/java/com/java110/core/smo/impl/ComputeFeeSMOImpl.java
+++ b/java110-core/src/main/java/com/java110/core/smo/impl/ComputeFeeSMOImpl.java
@@ -5,13 +5,13 @@
 import com.java110.core.context.Environment;
 import com.java110.core.log.LoggerFactory;
 import com.java110.core.smo.IComputeFeeSMO;
-import com.java110.dto.RoomAttrDto;
-import com.java110.dto.RoomDto;
+import com.java110.dto.room.RoomAttrDto;
+import com.java110.dto.room.RoomDto;
 import com.java110.dto.community.CommunityDto;
 import com.java110.dto.contract.ContractDto;
-import com.java110.dto.contractRoom.ContractRoomDto;
+import com.java110.dto.contract.ContractRoomDto;
 import com.java110.dto.fee.*;
-import com.java110.dto.integralRuleConfig.IntegralRuleConfigDto;
+import com.java110.dto.integral.IntegralRuleConfigDto;
 import com.java110.dto.machine.CarInoutDetailDto;
 import com.java110.dto.machine.CarInoutDto;
 import com.java110.dto.owner.OwnerCarDto;
@@ -31,14 +31,11 @@
 import com.java110.intf.store.IContractRoomInnerServiceSMO;
 import com.java110.intf.user.IOwnerCarInnerServiceSMO;
 import com.java110.intf.user.IOwnerInnerServiceSMO;
-import com.java110.po.feeReceiptDetail.FeeReceiptDetailPo;
+import com.java110.po.fee.FeeReceiptDetailPo;
 import com.java110.utils.constant.FeeConfigConstant;
 import com.java110.utils.constant.ResponseConstant;
 import com.java110.utils.exception.ListenerExecuteException;
-import com.java110.utils.util.Assert;
-import com.java110.utils.util.BeanConvertUtil;
-import com.java110.utils.util.DateUtil;
-import com.java110.utils.util.StringUtil;
+import com.java110.utils.util.*;
 import org.slf4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -120,6 +117,46 @@
         computeFeePrice(tmpFeeDto, roomDto);
     }
 
+    /**
+     * 璁惧畾缁撴潫鏃堕棿
+     *
+     * @param feeDto
+     * @param targetEndTime
+     */
+    @Override
+    public void computeEveryOweFeeByTargetEndTime(FeeDto feeDto, String targetEndTime) {
+
+        Date targetEndDate = DateUtil.getDateFromStringB(targetEndTime);
+        double oweMonth = 1.0;
+        if (feeDto.getEndTime().getTime() > targetEndDate.getTime()) {
+            targetEndDate = feeDto.getEndTime();
+        }
+        if (feeDto.getEndTime().getTime() < targetEndDate.getTime()) {
+            // 鐩爣鍒版湡鏃堕棿 - 鍒版湡鏃堕棿 = 娆犺垂鏈堜唤
+            oweMonth = DateUtil.dayCompare(feeDto.getEndTime(), targetEndDate);
+        }
+
+        String computingFormula = feeDto.getComputingFormula();
+        Map feePriceAll = getFeePrice(feeDto, null);
+        feeDto.setFeePrice(Double.parseDouble(feePriceAll.get("feePrice").toString()));
+
+        BigDecimal price = new BigDecimal(feeDto.getFeePrice());
+        price = price.multiply(new BigDecimal(oweMonth));
+        feeDto.setFeeTotalPrice(price.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
+        feeDto.setDeadlineTime(targetEndDate);
+
+        //鍔ㄦ�佽垂鐢�
+        if ("4004".equals(computingFormula)
+                && FeeDto.FEE_FLAG_ONCE.equals(feeDto.getFeeFlag())
+                && !FeeDto.STATE_FINISH.equals(feeDto.getState())) {
+            feeDto.setAmountOwed(feeDto.getFeeTotalPrice() + "");
+            //feeDto.setDeadlineTime(DateUtil.getCurrentDate()); 娆犺垂鏃ユ湡涓嶅鍏堟敞閲�
+        }
+
+        //todo 鑰冭檻绉熼噾閫掑
+        dealRentRate(feeDto);
+    }
+
 
     /**
      * 璁$畻娆犺垂閲戦
@@ -161,54 +198,6 @@
     }
 
     private void computeFeePrice(FeeDto feeDto, RoomDto roomDto) {
-
-        if (FeeDto.PAYER_OBJ_TYPE_ROOM.equals(feeDto.getPayerObjType())) { //鎴垮眿鐩稿叧
-            computeFeePriceByRoom(feeDto, roomDto);
-        } else if (FeeDto.PAYER_OBJ_TYPE_CAR.equals(feeDto.getPayerObjType())) {//杞︿綅鐩稿叧
-            computeFeePriceByParkingSpace(feeDto);
-        } else if (FeeDto.PAYER_OBJ_TYPE_CONTRACT.equals(feeDto.getPayerObjType())) { //鎴垮眿鐩稿叧
-            computeFeePriceByContract(feeDto, roomDto);
-        }
-    }
-
-    private void computeFeePriceByParkingSpace(FeeDto feeDto) {
-        Map<String, Object> targetEndDateAndOweMonth = getTargetEndDateAndOweMonth(feeDto);
-        Date targetEndDate = (Date) targetEndDateAndOweMonth.get("targetEndDate");
-        double oweMonth = (double) targetEndDateAndOweMonth.get("oweMonth");
-        OwnerCarDto ownerCarDto = new OwnerCarDto();
-        ownerCarDto.setCommunityId(feeDto.getCommunityId());
-        ownerCarDto.setCarId(feeDto.getPayerObjId());
-        List<OwnerCarDto> ownerCarDtos = ownerCarInnerServiceSMOImpl.queryOwnerCars(ownerCarDto);
-
-        if (ownerCarDtos == null || ownerCarDtos.size() < 1) { //鏁版嵁鏈夐棶棰�
-            return;
-        }
-
-        String computingFormula = feeDto.getComputingFormula();
-        Map feePriceAll = getFeePrice(feeDto);
-
-        feeDto.setFeePrice(Double.parseDouble(feePriceAll.get("feePrice").toString()));
-        BigDecimal price = new BigDecimal(feeDto.getFeePrice());
-        price = price.multiply(new BigDecimal(oweMonth));
-        feeDto.setFeeTotalPrice(price.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
-        feeDto.setDeadlineTime(targetEndDate);
-
-        //鍔ㄦ�佽垂鐢�
-        if ("4004".equals(computingFormula)
-                && FeeDto.FEE_FLAG_ONCE.equals(feeDto.getFeeFlag())
-                && !FeeDto.STATE_FINISH.equals(feeDto.getState())) {
-            feeDto.setAmountOwed(feeDto.getFeeTotalPrice() + "");
-            //feeDto.setDeadlineTime(DateUtil.getCurrentDate()); 娆犺垂鏃ユ湡涓嶅鍏堟敞閲�
-        }
-
-    }
-
-    /**
-     * 鏍规嵁鎴垮眿鏉ョ畻鍗曚环
-     *
-     * @param feeDto
-     */
-    private void computeFeePriceByRoom(FeeDto feeDto, RoomDto roomDto) {
         Map<String, Object> targetEndDateAndOweMonth = getTargetEndDateAndOweMonth(feeDto);
         Date targetEndDate = (Date) targetEndDateAndOweMonth.get("targetEndDate");
         double oweMonth = (double) targetEndDateAndOweMonth.get("oweMonth");
@@ -216,7 +205,7 @@
         String computingFormula = feeDto.getComputingFormula();
         Map feePriceAll = getFeePrice(feeDto, roomDto);
         feeDto.setFeePrice(Double.parseDouble(feePriceAll.get("feePrice").toString()));
-        //double month = dayCompare(feeDto.getEndTime(), DateUtil.getCurrentDate());
+
         BigDecimal price = new BigDecimal(feeDto.getFeePrice());
         price = price.multiply(new BigDecimal(oweMonth));
         feeDto.setFeeTotalPrice(price.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
@@ -230,36 +219,8 @@
             //feeDto.setDeadlineTime(DateUtil.getCurrentDate()); 娆犺垂鏃ユ湡涓嶅鍏堟敞閲�
         }
 
-        //鑰冭檻绉熼噾閫掑
+        //todo 鑰冭檻绉熼噾閫掑
         dealRentRate(feeDto);
-    }
-
-    /**
-     * 鏍规嵁鎴垮眿鏉ョ畻鍗曚环
-     *
-     * @param feeDto
-     */
-    private void computeFeePriceByContract(FeeDto feeDto, RoomDto roomDto) {
-        Map<String, Object> targetEndDateAndOweMonth = getTargetEndDateAndOweMonth(feeDto);
-        Date targetEndDate = (Date) targetEndDateAndOweMonth.get("targetEndDate");
-        double oweMonth = (double) targetEndDateAndOweMonth.get("oweMonth");
-
-        String computingFormula = feeDto.getComputingFormula();
-        Map feePriceAll = getFeePrice(feeDto, roomDto);
-        feeDto.setFeePrice(Double.parseDouble(feePriceAll.get("feePrice").toString()));
-        //double month = dayCompare(feeDto.getEndTime(), DateUtil.getCurrentDate());
-        BigDecimal price = new BigDecimal(feeDto.getFeePrice());
-        price = price.multiply(new BigDecimal(oweMonth));
-        feeDto.setFeeTotalPrice(price.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
-        feeDto.setDeadlineTime(targetEndDate);
-
-        //鍔ㄦ�佽垂鐢�
-        if ("4004".equals(computingFormula)
-                && FeeDto.FEE_FLAG_ONCE.equals(feeDto.getFeeFlag())
-                && !FeeDto.STATE_FINISH.equals(feeDto.getState())) {
-            feeDto.setAmountOwed(feeDto.getFeeTotalPrice() + "");
-            //feeDto.setDeadlineTime(DateUtil.getCurrentDate()); 娆犺垂鏃ユ湡涓嶅鍏堟敞閲�
-        }
     }
 
 
@@ -788,9 +749,6 @@
         Calendar endCalender = Calendar.getInstance();
         endCalender.setTime(endTime);
         endCalender.add(Calendar.MONTH, new Double(Math.floor(cycle)).intValue());
-//        Calendar futureDate = Calendar.getInstance();
-//        futureDate.setTime(endCalender.getTime());
-//        futureDate.add(Calendar.MONTH, 1);
         int futureDay = endCalender.getActualMaximum(Calendar.DAY_OF_MONTH);
         int hours = new Double((cycle - Math.floor(cycle)) * futureDay * 24).intValue();
         endCalender.add(Calendar.HOUR, hours);
@@ -951,44 +909,7 @@
         return getFeePrice(feeDto, null);
     }
 
-    /**
-     * //璁$畻鍛ㄦ湡
-     * //                    Map<String, Object> cycleResults = dateDiff(feeDto.getEndTime(), feeDto.getCustEndTime());
-     * //                    //鏈堜唤澶т簬0
-     * //                    Integer months = Integer.valueOf(cycleResults.get("months").toString());
-     * //                    Integer days = Integer.valueOf(cycleResults.get("days").toString());
-     * //                    Integer startMonthDays = Integer.valueOf(cycleResults.get("startMonthDays").toString());
-     * //                    Integer endMonthDays = Integer.valueOf(cycleResults.get("endMonthDays").toString());
-     * //                    String isOneMonth = cycleResults.get("isOneMonth").toString();
-     * //                    //鏁存暟鏈�
-     * //                    if (months > 0 && days == 0) {
-     * //                        BigDecimal cycle = new BigDecimal(months);
-     * //                        feeTotalPrice = (squarePrice.multiply(builtUpArea).add(additionalAmount)).multiply(cycle).setScale(3, BigDecimal.ROUND_HALF_UP);
-     * //                    }
-     * //                    //鍑犱釜鏈堝嚑澶�   锛堝崟浠�*闈㈢Н+闄勫姞璐癸級*鏈堜唤+((鍗曚环*闈㈢Н+闄勫姞璐�)/鎬诲ぉ鏁�)*瀹為檯澶╂暟
-     * //                    if (months > 0 && days > 0) {
-     * //                        BigDecimal cycle = new BigDecimal(months);
-     * //                        BigDecimal endMonthDayss = new BigDecimal(endMonthDays);
-     * //                        BigDecimal dayss = new BigDecimal(days);
-     * //                        BigDecimal monthPrice = squarePrice.multiply(builtUpArea).add(additionalAmount);
-     * //                        feeTotalPrice = (monthPrice).multiply(cycle).add(monthPrice.divide(endMonthDayss).multiply(dayss)).setScale(3, BigDecimal.ROUND_HALF_UP);
-     * //                    }
-     * //                    //璺ㄦ湀浠� 涓嶈冻涓�鏈�  ((鍗曚环*闈㈢Н+闄勫姞璐�)/寮�濮嬫湀浠芥�诲ぉ鏁�)*瀹為檯澶╂暟+((鍗曚环*闈㈢Н+闄勫姞璐�)/缁撴潫鏈堜唤鎬诲ぉ鏁�)*瀹為檯澶╂暟
-     * //                    if (months == 0 && days > 0 && "true".equals(isOneMonth)) {
-     * //                        BigDecimal startEndOfMonth = new BigDecimal(cycleResults.get("startEndOfMonth").toString());
-     * //                        BigDecimal endBeginningOfMonth = new BigDecimal(cycleResults.get("endBeginningOfMonth").toString());
-     * //                        BigDecimal endMonthDayss = new BigDecimal(endMonthDays);
-     * //                        BigDecimal startMonthDayss = new BigDecimal(startMonthDays);
-     * //                        BigDecimal monthPrice = squarePrice.multiply(builtUpArea).add(additionalAmount);
-     * //                        feeTotalPrice = monthPrice.divide(startMonthDayss, 4, BigDecimal.ROUND_HALF_UP).multiply(startEndOfMonth).add(monthPrice.divide(endMonthDayss, 4, BigDecimal.ROUND_HALF_UP).multiply(endBeginningOfMonth)).setScale(3, BigDecimal.ROUND_HALF_UP);
-     * //                    }
-     * //                    //涓嶈法鏈堜唤 涓嶈冻涓�鏈�  (鍗曚环*闈㈢Н+闄勫姞璐�/寮�濮嬫湀浠芥�诲ぉ鏁�)*瀹為檯澶╂暟
-     * //                    if (months == 0 && days > 0 && "false".equals(isOneMonth)) {
-     * //                        BigDecimal cycle = new BigDecimal(days);
-     * //                        BigDecimal startMonthDayss = new BigDecimal(startMonthDays);
-     * //                        BigDecimal monthPrice = squarePrice.multiply(builtUpArea).add(additionalAmount);
-     * //                        feeTotalPrice = monthPrice.divide(startMonthDayss, 4, BigDecimal.ROUND_HALF_UP).multiply(cycle).setScale(3, BigDecimal.ROUND_HALF_UP);
-     * //                    }
+    /*
      *
      * @param feeDto
      * @param roomDto
@@ -1002,6 +923,18 @@
         if (Environment.isOwnerPhone(java110Properties)) {
             return getOwnerPhoneFee(feeAmount);
         }
+
+        //todo 濡傛灉 cycle 涓�105 鍒� 鏍规嵁缂磋垂鏃堕棿娈� 鏀瑰啓涓�
+        if ("105".equals(feeDto.getCycle())) {
+            double cycle = DateUtil.dayCompare(DateUtil.getDateFromStringB(feeDto.getCustomStartTime()), DateUtil.getDateFromStringB(feeDto.getCustomEndTime()));
+            feeDto.setCycle(cycle + "");
+        }
+        // todo 鎸夌粨鏉熸椂闂寸即璐�
+        if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
+            double cycle = DateUtil.dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime()));
+            feeDto.setCycle(cycle + "");
+        }
+
         if (FeeDto.PAYER_OBJ_TYPE_ROOM.equals(feeDto.getPayerObjType())) { //鎴垮眿鐩稿叧
             String computingFormula = feeDto.getComputingFormula();
             if (roomDto == null) {
@@ -1024,9 +957,6 @@
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
                     cycle = new BigDecimal(feeDto.getCycle());
                 }
-                if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
-                    cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
-                }
                 if (cycle == null) {
                     feeTotalPrice = new BigDecimal(0);
                 } else {
@@ -1039,9 +969,6 @@
                 BigDecimal cycle = null;
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
                     cycle = new BigDecimal(feeDto.getCycle());
-                }
-                if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
-                    cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
                 }
                 if (cycle == null) {
                     feeTotalPrice = new BigDecimal(0);
@@ -1057,9 +984,6 @@
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
                     cycle = new BigDecimal(feeDto.getCycle());
                 }
-                if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
-                    cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
-                }
                 if (cycle == null) {
                     feeTotalPrice = new BigDecimal(0);
                 } else {
@@ -1071,9 +995,6 @@
                 BigDecimal cycle = null;
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
                     cycle = new BigDecimal(feeDto.getCycle());
-                }
-                if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
-                    cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
                 }
                 if (cycle == null) {
                     feeTotalPrice = new BigDecimal(0);
@@ -1087,9 +1008,6 @@
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
                     cycle = new BigDecimal(feeDto.getCycle());
                 }
-                if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
-                    cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
-                }
                 if (cycle == null) {
                     feeTotalPrice = new BigDecimal(0);
                 } else {
@@ -1100,9 +1018,6 @@
                 BigDecimal cycle = null;
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
                     cycle = new BigDecimal(feeDto.getCycle());
-                }
-                if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
-                    cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
                 }
                 if (cycle == null) {
                     feeTotalPrice = new BigDecimal(0);
@@ -1126,9 +1041,6 @@
                     if (!StringUtil.isEmpty(feeDto.getCycle())) {
                         cycle = new BigDecimal(feeDto.getCycle());
                     }
-                    if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
-                        cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
-                    }
                     if (cycle == null) {
                         feeTotalPrice = new BigDecimal(0);
                     } else {
@@ -1141,9 +1053,6 @@
                 BigDecimal cycle = null;
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
                     cycle = new BigDecimal(feeDto.getCycle());
-                }
-                if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
-                    cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
                 }
                 if (cycle == null) {
                     feeTotalPrice = new BigDecimal(0);
@@ -1166,9 +1075,6 @@
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
                     cycle = new BigDecimal(feeDto.getCycle());
                 }
-                if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
-                    cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
-                }
                 if (cycle == null) {
                     feeTotalPrice = new BigDecimal(0);
                 } else {
@@ -1179,9 +1085,6 @@
                 BigDecimal cycle = null;
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
                     cycle = new BigDecimal(feeDto.getCycle());
-                }
-                if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
-                    cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
                 }
                 if (cycle == null) {
                     feeTotalPrice = new BigDecimal(0);
@@ -1203,9 +1106,6 @@
                     BigDecimal cycle = null;
                     if (!StringUtil.isEmpty(feeDto.getCycle())) {
                         cycle = new BigDecimal(feeDto.getCycle());
-                    }
-                    if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
-                        cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
                     }
                     if (cycle == null) {
                         feeTotalPrice = new BigDecimal(0);
@@ -1241,9 +1141,6 @@
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
                     cycle = new BigDecimal(feeDto.getCycle());
                 }
-                if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
-                    cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
-                }
                 if (cycle == null) {
                     feeTotalPrice = new BigDecimal(0);
                 } else {
@@ -1257,9 +1154,6 @@
                 BigDecimal cycle = null;
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
                     cycle = new BigDecimal(feeDto.getCycle());
-                }
-                if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
-                    cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
                 }
                 if (cycle == null) {
                     feeTotalPrice = new BigDecimal(0);
@@ -1276,9 +1170,6 @@
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
                     cycle = new BigDecimal(feeDto.getCycle());
                 }
-                if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
-                    cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
-                }
                 if (cycle == null) {
                     feeTotalPrice = new BigDecimal(0);
                 } else {
@@ -1291,9 +1182,6 @@
                 BigDecimal cycle = null;
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
                     cycle = new BigDecimal(feeDto.getCycle());
-                }
-                if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
-                    cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
                 }
                 if (cycle == null) {
                     feeTotalPrice = new BigDecimal(0);
@@ -1308,9 +1196,6 @@
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
                     cycle = new BigDecimal(feeDto.getCycle());
                 }
-                if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
-                    cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
-                }
                 if (cycle == null) {
                     feeTotalPrice = new BigDecimal(0);
                 } else {
@@ -1321,9 +1206,6 @@
                 BigDecimal cycle = null;
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
                     cycle = new BigDecimal(feeDto.getCycle());
-                }
-                if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
-                    cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
                 }
                 if (cycle == null) {
                     feeTotalPrice = new BigDecimal(0);
@@ -1347,9 +1229,6 @@
                     if (!StringUtil.isEmpty(feeDto.getCycle())) {
                         cycle = new BigDecimal(feeDto.getCycle());
                     }
-                    if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
-                        cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
-                    }
                     if (cycle == null) {
                         feeTotalPrice = new BigDecimal(0);
                     } else {
@@ -1363,9 +1242,6 @@
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
                     cycle = new BigDecimal(feeDto.getCycle());
                 }
-                if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
-                    cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
-                }
                 if (cycle == null) {
                     feeTotalPrice = new BigDecimal(0);
                 } else {
@@ -1377,9 +1253,6 @@
                 BigDecimal cycle = null;
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
                     cycle = new BigDecimal(feeDto.getCycle());
-                }
-                if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
-                    cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
                 }
                 if (cycle == null) {
                     feeTotalPrice = new BigDecimal(0);
@@ -1402,9 +1275,6 @@
                     BigDecimal cycle = null;
                     if (!StringUtil.isEmpty(feeDto.getCycle())) {
                         cycle = new BigDecimal(feeDto.getCycle());
-                    }
-                    if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
-                        cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
                     }
                     if (cycle == null) {
                         feeTotalPrice = new BigDecimal(0);
@@ -1438,9 +1308,6 @@
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
                     cycle = new BigDecimal(feeDto.getCycle());
                 }
-                if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
-                    cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
-                }
                 if (cycle == null) {
                     feeTotalPrice = new BigDecimal(0);
                 } else {
@@ -1457,9 +1324,6 @@
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
                     cycle = new BigDecimal(feeDto.getCycle());
                 }
-                if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
-                    cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
-                }
                 if (cycle == null) {
                     feeTotalPrice = new BigDecimal(0);
                 } else {
@@ -1475,9 +1339,6 @@
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
                     cycle = new BigDecimal(feeDto.getCycle());
                 }
-                if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
-                    cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
-                }
                 if (cycle == null) {
                     feeTotalPrice = new BigDecimal(0);
                 } else {
@@ -1490,9 +1351,6 @@
                 BigDecimal cycle = null;
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
                     cycle = new BigDecimal(feeDto.getCycle());
-                }
-                if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
-                    cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
                 }
                 if (cycle == null) {
                     feeTotalPrice = new BigDecimal(0);
@@ -1507,9 +1365,6 @@
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
                     cycle = new BigDecimal(feeDto.getCycle());
                 }
-                if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
-                    cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
-                }
                 if (cycle == null) {
                     feeTotalPrice = new BigDecimal(0);
                 } else {
@@ -1521,9 +1376,6 @@
                 BigDecimal cycle = null;
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
                     cycle = new BigDecimal(feeDto.getCycle());
-                }
-                if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
-                    cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
                 }
                 if (cycle == null) {
                     feeTotalPrice = new BigDecimal(0);
@@ -1548,9 +1400,6 @@
                     if (!StringUtil.isEmpty(feeDto.getCycle())) {
                         cycle = new BigDecimal(feeDto.getCycle());
                     }
-                    if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
-                        cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
-                    }
                     if (cycle == null) {
                         feeTotalPrice = new BigDecimal(0);
                     } else {
@@ -1564,9 +1413,6 @@
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
                     cycle = new BigDecimal(feeDto.getCycle());
                 }
-                if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
-                    cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
-                }
                 if (cycle == null) {
                     feeTotalPrice = new BigDecimal(0);
                 } else {
@@ -1579,9 +1425,6 @@
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
                     cycle = new BigDecimal(feeDto.getCycle());
                 }
-                if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
-                    cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
-                }
                 if (cycle == null) {
                     feeTotalPrice = new BigDecimal(0);
                 } else {
@@ -1593,9 +1436,6 @@
                 BigDecimal cycle = null;
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
                     cycle = new BigDecimal(feeDto.getCycle());
-                }
-                if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
-                    cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
                 }
                 if (cycle == null) {
                     feeTotalPrice = new BigDecimal(0);
@@ -1618,9 +1458,6 @@
                     BigDecimal cycle = null;
                     if (!StringUtil.isEmpty(feeDto.getCycle())) {
                         cycle = new BigDecimal(feeDto.getCycle());
-                    }
-                    if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
-                        cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
                     }
                     if (cycle == null) {
                         feeTotalPrice = new BigDecimal(0);
@@ -1775,13 +1612,13 @@
         ScriptEngineManager manager = new ScriptEngineManager();
         ScriptEngine engine = manager.getEngineByName("JavaScript");
         BigDecimal valueObj = null;
-        logger.debug("璁$畻鍏紡涓猴細{}",value);
+        logger.debug("璁$畻鍏紡涓猴細{}", value);
         try {
             value = engine.eval(value).toString();
             valueObj = new BigDecimal(Double.parseDouble(value));
         } catch (Exception e) {
             //throw new IllegalArgumentException("鍏紡璁$畻寮傚父锛屽叕寮忎负銆�" + feeDto.getComputingFormulaText() + "銆�,璁$畻 銆�" + value + "銆戝紓甯�");
-            logger.error("鍏紡璁$畻寮傚父锛屽叕寮忎负銆�" + feeDto.getComputingFormulaText() + "銆�,璁$畻 銆�" + value + "銆戝紓甯�",e);
+            logger.error("鍏紡璁$畻寮傚父锛屽叕寮忎负銆�" + feeDto.getComputingFormulaText() + "銆�,璁$畻 銆�" + value + "銆戝紓甯�", e);
             valueObj = new BigDecimal(0);
         }
 
@@ -1791,6 +1628,12 @@
 
         return valueObj;
 
+    }
+
+    @Override
+    public Date getDeadlineTime(FeeDto feeDto) {
+        Map info = getTargetEndDateAndOweMonth(feeDto);
+        return (Date) info.get("targetEndDate");
     }
 
     /**
@@ -1805,15 +1648,27 @@
         double oweMonth = 0.0;
 
         Map<String, Object> targetEndDateAndOweMonth = new HashMap<>();
-        //鍒ゆ柇褰撳墠璐圭敤鏄惁宸茬粨鏉�
+        //todo 鍒ゆ柇褰撳墠璐圭敤鏄惁宸茬粨鏉�
         if (FeeDto.STATE_FINISH.equals(feeDto.getState())) {
             targetEndDate = feeDto.getEndTime();
             targetEndDateAndOweMonth.put("oweMonth", oweMonth);
             targetEndDateAndOweMonth.put("targetEndDate", targetEndDate);
             return targetEndDateAndOweMonth;
         }
-        //褰撳墠璐圭敤涓轰竴娆℃�ц垂鐢�
-        Date maxEndTime = feeDto.getConfigEndTime();
+
+        //todo 鑰冭檻璐圭敤椤� 璐圭敤鎻愬墠鐢熸垚
+        Calendar preEndTimeCal = Calendar.getInstance();
+        preEndTimeCal.setTime(feeDto.getEndTime());
+        if (StringUtil.isNumber(feeDto.getPrepaymentPeriod())) {
+            preEndTimeCal.add(Calendar.DAY_OF_MONTH, Integer.parseInt(feeDto.getPrepaymentPeriod()) * -1);
+        }
+        Date preEndTime = preEndTimeCal.getTime();
+
+        //todo 褰撳墠璐圭敤涓轰竴娆℃�ц垂鐢�
+        Date maxEndTime = feeDto.getDeadlineTime();
+        if (maxEndTime == null) {
+            maxEndTime = feeDto.getConfigEndTime();
+        }
         if (FeeDto.FEE_FLAG_ONCE.equals(feeDto.getFeeFlag())) {
             //鍏堝彇 deadlineTime
             if (feeDto.getDeadlineTime() != null) {
@@ -1825,12 +1680,17 @@
             } else {
                 targetEndDate = feeDto.getImportFeeEndTime();
             }
-            //鍒ゆ柇褰撳墠璐圭敤鏄笉鏄鍏ヨ垂鐢�
-            oweMonth = 1.0;
-        } else if (FeeDto.FEE_FLAG_CYCLE_ONCE.equals(feeDto.getFeeFlag())) {
-            if (feeDto.getDeadlineTime() != null) {
-                maxEndTime = feeDto.getDeadlineTime();
+            //璇存槑娆犺垂
+            if (preEndTime.getTime() <= DateUtil.getCurrentDate().getTime()) {
+                // 鐩爣鍒版湡鏃堕棿 - 鍒版湡鏃堕棿 = 娆犺垂鏈堜唤
+                oweMonth = 1.0;
             }
+
+            //todo 杩欓噷鑰冭檻 璐﹀崟妯″紡鐨勫満鏅�
+            if (StringUtil.isNumber(feeDto.getMonthCycle())) {
+                oweMonth = Integer.parseInt(feeDto.getMonthCycle());
+            }
+        } else {
             Date billEndTime = DateUtil.getCurrentDate();
             //寤鸿处鏃堕棿
             Date startDate = feeDto.getStartTime();
@@ -1840,7 +1700,7 @@
             long paymentCycle = Long.parseLong(feeDto.getPaymentCycle());
             // 褰撳墠鏃堕棿 - 寮�濮嬫椂闂�  = 鏈堜唤
             double mulMonth = 0.0;
-            mulMonth = dayCompare(startDate, billEndTime);
+            mulMonth = DateUtil.dayCompare(startDate, billEndTime);
 
             // 鏈堜唤/ 鍛ㄦ湡 = 杞暟锛堝悜涓婂彇鏁达級
             double round = 0.0;
@@ -1851,49 +1711,22 @@
             }
             // 杞暟 * 鍛ㄦ湡 * 30 + 寮�濮嬫椂闂� = 鐩爣 鍒版湡鏃堕棿
             targetEndDate = getTargetEndTime(round * paymentCycle, startDate);//鐩爣缁撴潫鏃堕棿
-            //璐圭敤椤圭殑缁撴潫鏃堕棿<缂磋垂鐨勭粨鏉熸椂闂�  璐圭敤蹇粨鏉熶簡   鍙栬垂鐢ㄩ」鐨勭粨鏉熸椂闂�
+
+            //todo 濡傛灉 鍒颁簡 棰勪粯鏈� 浜х敓涓嬩釜鍛ㄦ湡鐨勮垂鐢�
+            if (DateUtil.getFormatTimeStringB(targetEndDate).equals(DateUtil.getFormatTimeStringB(endDate))
+                    && DateUtil.getCurrentDate().getTime() > preEndTime.getTime()
+            ) {
+                targetEndDate = getTargetEndTime((round + 1) * paymentCycle, startDate);//鐩爣缁撴潫鏃堕棿
+            }
+
+            //todo 璐圭敤椤圭殑缁撴潫鏃堕棿<缂磋垂鐨勭粨鏉熸椂闂�  璐圭敤蹇粨鏉熶簡   鍙栬垂鐢ㄩ」鐨勭粨鏉熸椂闂�
             if (maxEndTime.getTime() < targetEndDate.getTime()) {
                 targetEndDate = maxEndTime;
             }
             //璇存槑娆犺垂
             if (endDate.getTime() < targetEndDate.getTime()) {
                 // 鐩爣鍒版湡鏃堕棿 - 鍒版湡鏃堕棿 = 娆犺垂鏈堜唤
-                oweMonth = dayCompare(endDate, targetEndDate);
-            }
-
-            if (feeDto.getEndTime().getTime() > targetEndDate.getTime()) {
-                targetEndDate = feeDto.getEndTime();
-            }
-        } else { //鍛ㄦ湡鎬ц垂鐢�
-            //褰撳墠鏃堕棿
-            Date billEndTime = DateUtil.getCurrentDate();
-            //寤鸿处鏃堕棿
-            Date startDate = feeDto.getStartTime();
-            //璁¤垂璧峰鏃堕棿
-            Date endDate = feeDto.getEndTime();
-            //缂磋垂鍛ㄦ湡
-            long paymentCycle = Long.parseLong(feeDto.getPaymentCycle());
-            // 褰撳墠鏃堕棿 - 寮�濮嬫椂闂�  = 鏈堜唤
-            double mulMonth = 0.0;
-            mulMonth = dayCompare(startDate, billEndTime);
-
-            // 鏈堜唤/ 鍛ㄦ湡 = 杞暟锛堝悜涓婂彇鏁达級
-            double round = 0.0;
-            if ("1200".equals(feeDto.getPaymentCd())) { // 1200棰勪粯璐�
-                round = Math.floor(mulMonth / paymentCycle) + 1;
-            } else { //2100鍚庝粯璐�
-                round = Math.floor(mulMonth / paymentCycle);
-            }
-            // 杞暟 * 鍛ㄦ湡 * 30 + 寮�濮嬫椂闂� = 鐩爣 鍒版湡鏃堕棿
-            targetEndDate = getTargetEndTime(round * paymentCycle, startDate);//鐩爣缁撴潫鏃堕棿
-            //璐圭敤椤圭殑缁撴潫鏃堕棿<缂磋垂鐨勭粨鏉熸椂闂�  璐圭敤蹇粨鏉熶簡   鍙栬垂鐢ㄩ」鐨勭粨鏉熸椂闂�
-            if (maxEndTime.getTime() < targetEndDate.getTime()) {
-                targetEndDate = maxEndTime;
-            }
-            //璇存槑娆犺垂
-            if (endDate.getTime() < targetEndDate.getTime()) {
-                // 鐩爣鍒版湡鏃堕棿 - 鍒版湡鏃堕棿 = 娆犺垂鏈堜唤
-                oweMonth = dayCompare(endDate, targetEndDate);
+                oweMonth = DateUtil.dayCompare(endDate, targetEndDate, true);
             }
 
             if (feeDto.getEndTime().getTime() > targetEndDate.getTime()) {
@@ -1907,79 +1740,72 @@
     }
 
     public Map getTargetEndDateAndOweMonth(FeeDto feeDto) {
-
-//        if (FeeDto.PAYER_OBJ_TYPE_CAR.equals(feeDto.getPayerObjType())) {
-//            OwnerCarDto ownerCarDto = new OwnerCarDto();
-//            ownerCarDto.setCommunityId(feeDto.getCommunityId());
-//            ownerCarDto.setCarId(feeDto.getPayerObjId());
-//            List<OwnerCarDto> ownerCarDtos = ownerCarInnerServiceSMOImpl.queryOwnerCars(ownerCarDto);
-//            return getTargetEndDateAndOweMonth(feeDto, ownerCarDtos == null || ownerCarDtos.size() < 1 ? null : ownerCarDtos.get(0));
-//        }
         return getTargetEndDateAndOweMonth(feeDto, null);
     }
 
-    /**
-     * 璁$畻 涓や釜鏃堕棿鐐规湀浠�
-     *
-     * @param fromDate 寮�濮嬫椂闂�
-     * @param toDate   缁撴潫鏃堕棿
-     * @return
-     */
-    @Override
-    public double dayCompare(Date fromDate, Date toDate) {
-        double resMonth = 0.0;
-        Calendar from = Calendar.getInstance();
-        from.setTime(fromDate);
-        Calendar to = Calendar.getInstance();
-        to.setTime(toDate);
-        //姣旇緝鏈堜唤宸� 鍙兘鏈夋暣鏁� 涔熶細璐熸暟
-        int result = to.get(Calendar.MONTH) - from.get(Calendar.MONTH);
-        //姣旇緝骞村樊
-        int month = (to.get(Calendar.YEAR) - from.get(Calendar.YEAR)) * 12;
 
-        //鐪熷疄 鐩稿樊鏈堜唤
-        result = result + month;
-
-        //寮�濮嬫椂闂�  2021-06-01  2021-08-05   result = 2    2021-08-01
-        Calendar newFrom = Calendar.getInstance();
-        newFrom.setTime(fromDate);
-        newFrom.add(Calendar.MONTH, result);
-        //濡傛灉鍔犳湀浠藉悗 澶т簬浜嗗綋鍓嶆椂闂� 榛樿鍔� 鏈堜唤 -1 鎯呭喌 12-19  21-01-10
-        //杩欎釜鏄鐨勯�昏緫涓�瀹氬ソ濂界悊瑙�
-        if (newFrom.getTime().getTime() > toDate.getTime()) {
-            newFrom.setTime(fromDate);
-            result = result - 1;
-            newFrom.add(Calendar.MONTH, result);
-        }
-
-        // t1 2021-08-01   t2 2021-08-05
-        long t1 = newFrom.getTime().getTime();
-        long t2 = to.getTime().getTime();
-        //鐩稿樊姣
-        double days = (t2 - t1) * 1.00 / (24 * 60 * 60 * 1000);
-        BigDecimal tmpDays = new BigDecimal(days); //鐩稿樊澶╂暟
-        BigDecimal monthDay = null;
-        Calendar newFromMaxDay = Calendar.getInstance();
-        newFromMaxDay.set(newFrom.get(Calendar.YEAR), newFrom.get(Calendar.MONTH), 1, 0, 0, 0);
-        newFromMaxDay.add(Calendar.MONTH, 1); //涓嬩釜鏈�1鍙�
-        //鍦ㄥ綋鍓嶆湀涓� 杩欏潡鏈夐棶棰�
-        if (toDate.getTime() < newFromMaxDay.getTime().getTime()) {
-            monthDay = new BigDecimal(newFrom.getActualMaximum(Calendar.DAY_OF_MONTH));
-            return tmpDays.divide(monthDay, 4, BigDecimal.ROUND_HALF_UP).add(new BigDecimal(result)).doubleValue();
-        }
-        // 涓婃湀澶╂暟
-        days = (newFromMaxDay.getTimeInMillis() - t1) * 1.00 / (24 * 60 * 60 * 1000);
-        tmpDays = new BigDecimal(days);
-        monthDay = new BigDecimal(newFrom.getActualMaximum(Calendar.DAY_OF_MONTH));
-        BigDecimal preRresMonth = tmpDays.divide(monthDay, 4, BigDecimal.ROUND_HALF_UP);
-
-        //涓嬫湀澶╂暟
-        days = (t2 - newFromMaxDay.getTimeInMillis()) * 1.00 / (24 * 60 * 60 * 1000);
-        tmpDays = new BigDecimal(days);
-        monthDay = new BigDecimal(newFromMaxDay.getActualMaximum(Calendar.DAY_OF_MONTH));
-        resMonth = tmpDays.divide(monthDay, 4, BigDecimal.ROUND_HALF_UP).add(new BigDecimal(result)).add(preRresMonth).doubleValue();
-        return resMonth;
-    }
+//    /**
+//     * 璁$畻 涓や釜鏃堕棿鐐规湀浠�
+//     *
+//     * @param fromDate 寮�濮嬫椂闂�
+//     * @param toDate   缁撴潫鏃堕棿
+//     * @return
+//     */
+//
+//    public double dayCompareOld(Date fromDate, Date toDate) {
+//        double resMonth = 0.0;
+//        Calendar from = Calendar.getInstance();
+//        from.setTime(fromDate);
+//        Calendar to = Calendar.getInstance();
+//        to.setTime(toDate);
+//        //姣旇緝鏈堜唤宸� 鍙兘鏈夋暣鏁� 涔熶細璐熸暟
+//        int result = to.get(Calendar.MONTH) - from.get(Calendar.MONTH);
+//        //姣旇緝骞村樊
+//        int month = (to.get(Calendar.YEAR) - from.get(Calendar.YEAR)) * 12;
+//
+//        //鐪熷疄 鐩稿樊鏈堜唤
+//        result = result + month;
+//
+//        //寮�濮嬫椂闂�  2021-06-01  2021-08-05   result = 2    2021-08-01
+//        Calendar newFrom = Calendar.getInstance();
+//        newFrom.setTime(fromDate);
+//        newFrom.add(Calendar.MONTH, result);
+//        //濡傛灉鍔犳湀浠藉悗 澶т簬浜嗗綋鍓嶆椂闂� 榛樿鍔� 鏈堜唤 -1 鎯呭喌 12-19  21-01-10
+//        //杩欎釜鏄鐨勯�昏緫涓�瀹氬ソ濂界悊瑙�
+//        if (newFrom.getTime().getTime() > toDate.getTime()) {
+//            newFrom.setTime(fromDate);
+//            result = result - 1;
+//            newFrom.add(Calendar.MONTH, result);
+//        }
+//
+//        // t1 2021-08-01   t2 2021-08-05
+//        long t1 = newFrom.getTime().getTime();
+//        long t2 = to.getTime().getTime();
+//        //鐩稿樊姣
+//        double days = (t2 - t1) * 1.00 / (24 * 60 * 60 * 1000);
+//        BigDecimal tmpDays = new BigDecimal(days); //鐩稿樊澶╂暟
+//        BigDecimal monthDay = null;
+//        Calendar newFromMaxDay = Calendar.getInstance();
+//        newFromMaxDay.set(newFrom.get(Calendar.YEAR), newFrom.get(Calendar.MONTH), 1, 0, 0, 0);
+//        newFromMaxDay.add(Calendar.MONTH, 1); //涓嬩釜鏈�1鍙�
+//        //鍦ㄥ綋鍓嶆湀涓� 杩欏潡鏈夐棶棰�
+//        if (toDate.getTime() < newFromMaxDay.getTime().getTime()) {
+//            monthDay = new BigDecimal(newFrom.getActualMaximum(Calendar.DAY_OF_MONTH));
+//            return tmpDays.divide(monthDay, 4, BigDecimal.ROUND_HALF_UP).add(new BigDecimal(result)).doubleValue();
+//        }
+//        // 涓婃湀澶╂暟
+//        days = (newFromMaxDay.getTimeInMillis() - t1) * 1.00 / (24 * 60 * 60 * 1000);
+//        tmpDays = new BigDecimal(days);
+//        monthDay = new BigDecimal(newFrom.getActualMaximum(Calendar.DAY_OF_MONTH));
+//        BigDecimal preRresMonth = tmpDays.divide(monthDay, 4, BigDecimal.ROUND_HALF_UP);
+//
+//        //涓嬫湀澶╂暟
+//        days = (t2 - newFromMaxDay.getTimeInMillis()) * 1.00 / (24 * 60 * 60 * 1000);
+//        tmpDays = new BigDecimal(days);
+//        monthDay = new BigDecimal(newFromMaxDay.getActualMaximum(Calendar.DAY_OF_MONTH));
+//        resMonth = tmpDays.divide(monthDay, 4, BigDecimal.ROUND_HALF_UP).add(new BigDecimal(result)).add(preRresMonth).doubleValue();
+//        return resMonth;
+//    }
 
 
     //鎵嬫満绔即璐瑰鐞�
@@ -2293,6 +2119,151 @@
             return;
         }
 
+        //todo 閫掑鏃堕棿 涓嶆槸 璐圭敤寤鸿处鏃堕棿鐨勫�嶆暟鏃讹紝淇涓�涓�
+        rateStartTime = correctByFeeStartTime(rateStartTime, feeDto.getStartTime());
+
+        BigDecimal addTotalAmount = new BigDecimal("0");
+        double curOweMonth = 0;
+        BigDecimal curFeePrice = new BigDecimal(feeDto.getFeePrice());
+
+        //todo 閫掑鏈疆娆犺垂寮�濮嬫椂闂�
+        Date curOweStartTime = null;
+        // todo 濡傛灉璁¤垂璧峰鏃堕棿 灏忎簬 閫掑寮�濮嬫椂闂�
+        if (feeDto.getEndTime().getTime() < rateStartTime.getTime()) {
+            //todo 閫掑鍓嶇殑娆犺垂
+            curOweMonth = DateUtil.dayCompare(feeDto.getEndTime(), rateStartTime);
+            addTotalAmount = curFeePrice.multiply(new BigDecimal(curOweMonth)).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
+            // todo 閫掑
+            curOweStartTime = rateStartTime;
+        } else {
+            // todo 閫掑
+            curOweStartTime = feeDto.getEndTime();
+        }
+        double rateMonth = DateUtil.dayCompare(rateStartTime, feeDto.getDeadlineTime());
+
+        // todo 鏈�澶у懆鏈� 閫掑杞暟
+        double maxCycle = Math.ceil(rateMonth / rateCycle);
+
+        // todo 澧為暱鍓嶇殑娆犺垂
+        BigDecimal rateDec = new BigDecimal(rate + "");
+        BigDecimal oweAmountDec = null;
+        //todo 閫掑杞暟 寰幆 curFeePrice 杩欎釜鏄� 鍘熷绉熼噾
+        for (int cycleIndex = 0; cycleIndex < maxCycle; cycleIndex++) {
+            //todo 閫掑鏈堝崟浠�
+            curFeePrice = new BigDecimal("1").add(rateDec).multiply(curFeePrice).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
+
+            //todo 璁$畻 curCycleRateEneTime 鏈疆閫掑缁撴潫鏃堕棿
+            Date curCycleRateEneTime = DateUtil.stepMonth(rateStartTime, (cycleIndex + 1) * rateCycle);
+
+            //todo 璇存槑杩欎釜宸茬粡缂磋垂浜�
+            if (curOweStartTime.getTime() > curCycleRateEneTime.getTime()) {
+                continue;
+            }
+            //todo 鏈疆 娆犺垂寮�濮嬫椂闂村ぇ浜� deadlineTime 璺宠繃
+            if (curOweStartTime.getTime() >= feeDto.getDeadlineTime().getTime()) {
+                continue;
+            }
+
+            //todo 鏈疆閫掑鏃堕棿鏈埌 璐圭敤deadlineTime
+            if (curCycleRateEneTime.getTime() < feeDto.getDeadlineTime().getTime()) {
+                curOweMonth = DateUtil.dayCompare(curOweStartTime, curCycleRateEneTime);
+                curOweStartTime = curCycleRateEneTime;
+            } else {
+                curOweMonth = DateUtil.dayCompare(curOweStartTime, feeDto.getDeadlineTime());
+                curOweStartTime = feeDto.getDeadlineTime();
+            }
+
+            oweAmountDec = curFeePrice.multiply(new BigDecimal(curOweMonth)).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
+
+            addTotalAmount = addTotalAmount.add(oweAmountDec);
+        }
+
+        Double amountOwed = MoneyUtil.computePriceScale(addTotalAmount.doubleValue(), feeDto.getScale(), Integer.parseInt(feeDto.getDecimalPlace()));
+        feeDto.setAmountOwed(amountOwed + "");
+        feeDto.setFeeTotalPrice(amountOwed);
+    }
+
+    /**
+     * 淇閫掑 寮�濮嬫椂闂�
+     * 濡傛灉璁剧疆鐨� 閫掑寮�濮嬫椂闂村拰寤鸿处鏃堕棿涓嶆槸鍚屼竴澶� 寮哄埗淇涓�
+     *
+     * @param rateStartTime
+     * @param startTime
+     * @return
+     */
+    private Date correctByFeeStartTime(Date rateStartTime, Date startTime) {
+        Calendar rateCalendar = Calendar.getInstance();
+        rateCalendar.setTime(rateStartTime);
+        int rateDay = rateCalendar.get(Calendar.DAY_OF_MONTH);
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(startTime);
+        int day = calendar.get(Calendar.DAY_OF_MONTH);
+        if (rateDay == day) {
+            return rateStartTime;
+        }
+
+        rateCalendar = Calendar.getInstance();
+        rateCalendar.setTime(rateStartTime);
+        rateCalendar.add(Calendar.MONTH, 1);
+        rateCalendar.set(Calendar.DAY_OF_MONTH, day);
+        return rateCalendar.getTime();
+    }
+
+
+    /**
+     * 绉熼噾澶勭悊
+     *
+     * @param feeDto
+     */
+    public void dealRentRateOLd(FeeDto feeDto) {
+        if (!FeeConfigDto.COMPUTING_FORMULA_RANT_RATE.equals(feeDto.getComputingFormula())) {
+            return;
+        }
+
+        //鏌ヨ閫掑淇℃伅
+        FeeAttrDto feeAttrDto = new FeeAttrDto();
+        feeAttrDto.setFeeId(feeDto.getFeeId());
+        feeAttrDto.setCommunityId(feeDto.getCommunityId());
+        List<FeeAttrDto> feeAttrDtos = feeAttrInnerServiceSMOImpl.queryFeeAttrs(feeAttrDto);
+
+        if (feeAttrDtos == null || feeAttrDtos.size() < 1) {
+            return;
+        }
+        int rateCycle = 0;
+        double rate = 0.0;
+        Date rateStartTime = null;
+        try {
+            for (FeeAttrDto tmpFeeAttrDto : feeAttrDtos) {
+                if (FeeAttrDto.SPEC_CD_RATE.equals(tmpFeeAttrDto.getSpecCd())) {
+                    feeDto.setRate(tmpFeeAttrDto.getValue().trim());
+                    rate = Double.parseDouble(tmpFeeAttrDto.getValue().trim());
+                }
+                if (FeeAttrDto.SPEC_CD_RATE_CYCLE.equals(tmpFeeAttrDto.getSpecCd())) {
+                    feeDto.setRateCycle(tmpFeeAttrDto.getValue().trim());
+                    rateCycle = Integer.parseInt(tmpFeeAttrDto.getValue().trim());
+                }
+                if (FeeAttrDto.SPEC_CD_RATE_START_TIME.equals(tmpFeeAttrDto.getSpecCd())) {
+                    feeDto.setRateStartTime(tmpFeeAttrDto.getValue().trim());
+                    rateStartTime = DateUtil.getDateFromString(tmpFeeAttrDto.getValue().trim(), DateUtil.DATE_FORMATE_STRING_B);
+                }
+            }
+        } catch (Exception e) {
+            logger.error("绉熼噾閫掑寮傚父", e);
+            return;
+        }
+
+        if (!FeeDto.STATE_DOING.equals(feeDto.getState())) {
+            return;
+        }
+
+        if (rateCycle == 0 || rate == 0) {
+            return;
+        }
+
+        if (feeDto.getDeadlineTime().getTime() <= rateStartTime.getTime()) {
+            return;
+        }
+
         BigDecimal oweAmountDec = new BigDecimal(0);
         //璁$畻 璁¤垂璧峰鏃堕棿 鍒� rateStartTime 鏃剁殑璐圭敤
         double curOweMonth = 0;
@@ -2301,18 +2272,19 @@
         // todo 濡傛灉璁¤垂璧峰鏃堕棿 灏忓尯 閫掑寮�濮嬫椂闂�
         if (feeDto.getEndTime().getTime() < rateStartTime.getTime()) {
             //todo 閫掑鍓嶇殑娆犺垂
-            curOweMonth = dayCompare(feeDto.getEndTime(), rateStartTime);
+            curOweMonth = DateUtil.dayCompare(feeDto.getEndTime(), rateStartTime);
             oweAmountDec = curFeePrice.multiply(new BigDecimal(curOweMonth)).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
             // todo 閫掑
-            curOweMonth = dayCompare(rateStartTime, feeDto.getDeadlineTime());
-        }else{
+            curOweMonth = DateUtil.dayCompare(rateStartTime, feeDto.getDeadlineTime());
+        } else {
             // todo 閫掑
-            curOweMonth = dayCompare(feeDto.getEndTime(), feeDto.getDeadlineTime());
+            curOweMonth = DateUtil.dayCompare(feeDto.getEndTime(), feeDto.getDeadlineTime());
         }
-        double rateMonth = dayCompare(rateStartTime, feeDto.getDeadlineTime());
+        double rateMonth = DateUtil.dayCompare(rateStartTime, feeDto.getDeadlineTime());
 
-        // todo 鏈�澶у懆鏈�
+        // todo 鏈�澶у懆鏈� 閫掑杞暟
         double maxCycle = Math.ceil(rateMonth / rateCycle);
+
 
         // todo 澧為暱鍓嶇殑娆犺垂
         BigDecimal addTotalAmount = oweAmountDec;
@@ -2349,8 +2321,10 @@
             }
             preCycleAmount = curAmount;
         }
-        feeDto.setAmountOwed(addTotalAmount.doubleValue() + "");
-        feeDto.setFeeTotalPrice(addTotalAmount.doubleValue());
+
+        Double amountOwed = MoneyUtil.computePriceScale(addTotalAmount.doubleValue(), feeDto.getScale(), Integer.parseInt(feeDto.getDecimalPlace()));
+        feeDto.setAmountOwed(amountOwed + "");
+        feeDto.setFeeTotalPrice(amountOwed);
     }
 }
 

--
Gitblit v1.8.0