From 4d0fb83e8779001057238f92d6d1d643b98fea8c Mon Sep 17 00:00:00 2001
From: Your Name <you@example.com>
Date: 星期二, 24 一月 2023 03:05:00 +0800
Subject: [PATCH] 优化 访客功能

---
 java110-core/src/main/java/com/java110/core/smo/impl/ComputeFeeSMOImpl.java |  753 ++++++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 557 insertions(+), 196 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 03c5f55..a6c5e7e 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
@@ -1,14 +1,17 @@
 package com.java110.core.smo.impl;
 
+import com.alibaba.fastjson.JSONObject;
 import com.java110.config.properties.code.Java110Properties;
 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.community.CommunityDto;
 import com.java110.dto.contract.ContractDto;
 import com.java110.dto.contractRoom.ContractRoomDto;
 import com.java110.dto.fee.*;
+import com.java110.dto.integralRuleConfig.IntegralRuleConfigDto;
 import com.java110.dto.machine.CarInoutDetailDto;
 import com.java110.dto.machine.CarInoutDto;
 import com.java110.dto.owner.OwnerCarDto;
@@ -29,6 +32,7 @@
 import com.java110.intf.user.IOwnerCarInnerServiceSMO;
 import com.java110.intf.user.IOwnerInnerServiceSMO;
 import com.java110.po.feeReceiptDetail.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;
@@ -42,12 +46,10 @@
 import javax.script.ScriptEngine;
 import javax.script.ScriptEngineManager;
 import java.math.BigDecimal;
-import java.text.DateFormat;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.time.ZoneId;
-import java.time.format.DateTimeFormatter;
 import java.util.*;
 
 /**
@@ -287,7 +289,7 @@
             } else if ("1101".equals(computingFormula)) { // 绉熼噾
                 feeReceiptDetailPo.setArea("");
                 feeReceiptDetailPo.setSquarePrice(roomDto.getRoomRent());
-            }  else if ("1102".equals(computingFormula)) { // 绉熼噾
+            } else if ("1102".equals(computingFormula)) { // 绉熼噾
                 feeReceiptDetailPo.setArea("");
                 feeReceiptDetailPo.setSquarePrice(roomDto.getRoomRent());
             } else if ("4004".equals(computingFormula)) {
@@ -328,7 +330,7 @@
             } else if ("1102".equals(computingFormula)) { //绉熼噾
                 feeReceiptDetailPo.setArea(roomDtos.get(0).getBuiltUpArea());
                 feeReceiptDetailPo.setSquarePrice(roomDtos.get(0).getRoomRent());
-            }else {
+            } else {
             }
         } else if (FeeDto.PAYER_OBJ_TYPE_CAR.equals(feeDto.getPayerObjType())) {//杞︿綅鐩稿叧
             String computingFormula = feeDto.getComputingFormula();
@@ -434,16 +436,16 @@
                 for (ContractRoomDto tmpContractRoomDto : contractRoomDtos) {
                     builtUpArea = builtUpArea.add(new BigDecimal(Double.parseDouble(tmpContractRoomDto.getRoomRent())));
                 }
-                feeReceiptDetailPo.setArea(builtUpArea.doubleValue() + "");
-                feeReceiptDetailPo.setSquarePrice(feeDto.getSquarePrice() + "/" + feeDto.getAdditionalAmount());
+                feeReceiptDetailPo.setArea("");
+                feeReceiptDetailPo.setSquarePrice(builtUpArea.doubleValue() + "");
             } else if ("1102".equals(computingFormula)) { // 绉熼噾
                 BigDecimal builtUpArea = new BigDecimal(0);
                 for (ContractRoomDto tmpContractRoomDto : contractRoomDtos) {
                     builtUpArea = builtUpArea.add(new BigDecimal(Double.parseDouble(tmpContractRoomDto.getRoomRent())));
                 }
-                feeReceiptDetailPo.setArea(builtUpArea.doubleValue() + "");
-                feeReceiptDetailPo.setSquarePrice(feeDto.getSquarePrice() + "/" + feeDto.getAdditionalAmount());
-            }else if ("4004".equals(computingFormula)) {
+                feeReceiptDetailPo.setArea("");
+                feeReceiptDetailPo.setSquarePrice(builtUpArea.doubleValue() + "");
+            } else if ("4004".equals(computingFormula)) {
             } else if ("5005".equals(computingFormula)) {
                 if (StringUtil.isEmpty(feeDto.getCurDegrees())) {
                 } else {
@@ -763,7 +765,7 @@
         endCalender.add(Calendar.HOUR, hours);
         if (FeeDto.FEE_FLAG_ONCE.equals(feeDto.getFeeFlag())) {
             return FeeDto.STATE_FINISH;
-        } else if(FeeDto.FEE_FLAG_CYCLE_ONCE.equals(feeDto.getFeeFlag())){
+        } else if (FeeDto.FEE_FLAG_CYCLE_ONCE.equals(feeDto.getFeeFlag())) {
             if ((endCalender.getTime()).after(feeDto.getDeadlineTime())) {
                 return FeeDto.STATE_FINISH;
             }
@@ -798,7 +800,10 @@
             } else {
                 endCalender.setTime(feeDto.getImportFeeEndTime());
             }
-        } else if(FeeDto.FEE_FLAG_CYCLE_ONCE.equals(feeDto.getFeeFlag())){
+        } else if (FeeDto.FEE_FLAG_CYCLE_ONCE.equals(feeDto.getFeeFlag())) {
+            if (feeDto.getDeadlineTime() == null) {
+                throw new IllegalArgumentException("闂存帴鎬ц垂鐢ㄦ湭璁剧疆缁撴潫鏃堕棿");
+            }
             if ((endCalender.getTime()).after(feeDto.getDeadlineTime())) {
                 endCalender.setTime(feeDto.getDeadlineTime());
             }
@@ -828,22 +833,22 @@
                 BigDecimal squarePrice = new BigDecimal(Double.parseDouble(tmpReportFeeDto.getSquarePrice()));
                 BigDecimal builtUpArea = new BigDecimal(Double.parseDouble(reportRoomDto.getBuiltUpArea()));
                 BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(tmpReportFeeDto.getAdditionalAmount()));
-                feePrice = squarePrice.multiply(builtUpArea).add(additionalAmount).setScale(2, BigDecimal.ROUND_HALF_UP);
+                feePrice = squarePrice.multiply(builtUpArea).add(additionalAmount).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
             } else if ("2002".equals(computingFormula)) { // 鍥哄畾璐圭敤
                 //feePrice = Double.parseDouble(feeDto.getAdditionalAmount());
                 BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(tmpReportFeeDto.getAdditionalAmount()));
-                feePrice = additionalAmount.setScale(2, BigDecimal.ROUND_HALF_UP);
+                feePrice = additionalAmount.setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
             } else if ("3003".equals(computingFormula)) { // 鍥哄畾璐圭敤
                 BigDecimal squarePrice = new BigDecimal(Double.parseDouble(tmpReportFeeDto.getSquarePrice()));
                 BigDecimal builtUpArea = new BigDecimal(Double.parseDouble(tmpReportFeeDto.getRoomArea()));
                 BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(tmpReportFeeDto.getAdditionalAmount()));
-                feePrice = squarePrice.multiply(builtUpArea).add(additionalAmount).setScale(3, BigDecimal.ROUND_HALF_UP);
+                feePrice = squarePrice.multiply(builtUpArea).add(additionalAmount).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
             } else if ("1101".equals(computingFormula)) { // 绉熼噾
                 BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(tmpReportFeeDto.getRoomRent()));
-                feePrice = additionalAmount.setScale(3, BigDecimal.ROUND_HALF_UP);
-            }  else if ("1102".equals(computingFormula)) { // 绉熼噾
+                feePrice = additionalAmount.setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
+            } else if ("1102".equals(computingFormula)) { // 绉熼噾
                 BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(tmpReportFeeDto.getRoomRent()));
-                feePrice = additionalAmount.setScale(3, BigDecimal.ROUND_HALF_UP);
+                feePrice = additionalAmount.setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
             } else if ("4004".equals(computingFormula)) {
                 feePrice = new BigDecimal(Double.parseDouble(tmpReportFeeDto.getAmount()));
             } else if ("5005".equals(computingFormula)) {
@@ -857,7 +862,7 @@
                     BigDecimal sub = curDegree.subtract(preDegree);
                     feePrice = sub.multiply(squarePrice)
                             .add(additionalAmount)
-                            .setScale(2, BigDecimal.ROUND_HALF_UP);
+                            .setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                 }
             } else if ("6006".equals(computingFormula)) {
                 feePrice = new BigDecimal(Double.parseDouble(tmpReportFeeDto.getAmount()));
@@ -874,7 +879,7 @@
                     BigDecimal sub = curDegree.subtract(preDegree);
                     feePrice = sub.multiply(squarePrice)
                             .add(additionalAmount)
-                            .setScale(2, BigDecimal.ROUND_HALF_UP);
+                            .setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                 }
             } else {
                 throw new IllegalArgumentException("鏆備笉鏀寔璇ョ被鍏紡");
@@ -886,19 +891,19 @@
                 BigDecimal squarePrice = new BigDecimal(Double.parseDouble(tmpReportFeeDto.getSquarePrice()));
                 BigDecimal builtUpArea = new BigDecimal(Double.parseDouble("0"));
                 BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(tmpReportFeeDto.getAdditionalAmount()));
-                feePrice = squarePrice.multiply(builtUpArea).add(additionalAmount).setScale(2, BigDecimal.ROUND_HALF_UP);
+                feePrice = squarePrice.multiply(builtUpArea).add(additionalAmount).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
             } else if ("2002".equals(computingFormula)) { // 鍥哄畾璐圭敤
                 //feePrice = Double.parseDouble(feeDto.getAdditionalAmount());
                 BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(tmpReportFeeDto.getAdditionalAmount()));
-                feePrice = additionalAmount.setScale(2, BigDecimal.ROUND_HALF_UP);
+                feePrice = additionalAmount.setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
             } else if ("3003".equals(computingFormula)) { // 鍥哄畾璐圭敤
                 //feePrice = Double.parseDouble(feeDto.getAdditionalAmount());
                 feePrice = new BigDecimal(0);
             } else if ("1101".equals(computingFormula)) { // 绉熼噾
                 feePrice = new BigDecimal(0);
-            }  else if ("1102".equals(computingFormula)) { // 绉熼噾
+            } else if ("1102".equals(computingFormula)) { // 绉熼噾
                 feePrice = new BigDecimal(0);
-            }else if ("4004".equals(computingFormula)) {
+            } else if ("4004".equals(computingFormula)) {
                 feePrice = new BigDecimal(Double.parseDouble(tmpReportFeeDto.getAmount()));
             } else if ("5005".equals(computingFormula)) {
                 if (StringUtil.isEmpty(tmpReportFeeDto.getCurDegrees())) {
@@ -911,7 +916,7 @@
                     BigDecimal sub = curDegree.subtract(preDegree);
                     feePrice = sub.multiply(squarePrice)
                             .add(additionalAmount)
-                            .setScale(2, BigDecimal.ROUND_HALF_UP);
+                            .setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                 }
             } else if ("6006".equals(computingFormula)) {
                 feePrice = new BigDecimal(Double.parseDouble(tmpReportFeeDto.getAmount()));
@@ -928,13 +933,13 @@
                     BigDecimal sub = curDegree.subtract(preDegree);
                     feePrice = sub.multiply(squarePrice)
                             .add(additionalAmount)
-                            .setScale(2, BigDecimal.ROUND_HALF_UP);
+                            .setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                 }
             } else {
                 throw new IllegalArgumentException("鏆備笉鏀寔璇ョ被鍏紡");
             }
         }
-        return feePrice.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
+        return feePrice.setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP).doubleValue();
     }
 
     @Override
@@ -942,6 +947,49 @@
         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
+     * @return
+     */
     @Override
     public Map getFeePrice(FeeDto feeDto, RoomDto roomDto) {
         BigDecimal feePrice = new BigDecimal("0.0");
@@ -967,88 +1015,95 @@
                 BigDecimal squarePrice = new BigDecimal(Double.parseDouble(feeDto.getSquarePrice()));
                 BigDecimal builtUpArea = new BigDecimal(Double.parseDouble(roomDto.getBuiltUpArea()));
                 BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
-                feePrice = squarePrice.multiply(builtUpArea).add(additionalAmount).setScale(3, BigDecimal.ROUND_HALF_UP);
-                if (!StringUtil.isEmpty(feeDto.getCycle()) && !"0".equals(feeDto.getCycle())) {
-                    BigDecimal cycle = new BigDecimal(feeDto.getCycle());
-                    feeTotalPrice = (squarePrice.multiply(builtUpArea).add(additionalAmount)).multiply(cycle).setScale(3, BigDecimal.ROUND_HALF_UP);
+                feePrice = squarePrice.multiply(builtUpArea).add(additionalAmount).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
+                BigDecimal cycle = null;
+                if (!StringUtil.isEmpty(feeDto.getCycle())) {
+                    cycle = new BigDecimal(feeDto.getCycle());
                 }
-                if (!StringUtil.isEmpty(feeDto.getCycle()) && "0".equals(feeDto.getCycle()) && !StringUtil.isEmpty(feeDto.getCustEndTime())) {
-                    //璁$畻鍛ㄦ湡
-                    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);
-                    }
-
+                if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
+                    cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
+                }
+                if (cycle == null) {
+                    feeTotalPrice = new BigDecimal(0);
+                } else {
+                    feeTotalPrice = (squarePrice.multiply(builtUpArea).add(additionalAmount)).multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                 }
             } else if ("2002".equals(computingFormula)) { // 鍥哄畾璐圭敤
                 //feePrice = Double.parseDouble(feeDto.getAdditionalAmount());
                 BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
-                feePrice = additionalAmount.setScale(3, BigDecimal.ROUND_HALF_UP);
+                feePrice = additionalAmount.setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
+                BigDecimal cycle = null;
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
-                    BigDecimal cycle1 = new BigDecimal(feeDto.getCycle());
-                    feeTotalPrice = additionalAmount.multiply(cycle1).setScale(3, BigDecimal.ROUND_HALF_UP);
+                    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 {
+                    feeTotalPrice = additionalAmount.multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                 }
             } else if ("3003".equals(computingFormula)) { // 鍥哄畾璐圭敤
                 BigDecimal squarePrice = new BigDecimal(Double.parseDouble(feeDto.getSquarePrice()));
                 BigDecimal builtUpArea = new BigDecimal(Double.parseDouble(roomDto.getRoomArea()));
                 BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
-                feePrice = squarePrice.multiply(builtUpArea).add(additionalAmount).setScale(3, BigDecimal.ROUND_HALF_UP);
+                feePrice = squarePrice.multiply(builtUpArea).add(additionalAmount).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
+                BigDecimal cycle = null;
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
-                    BigDecimal cycle1 = new BigDecimal(feeDto.getCycle());
-                    feeTotalPrice = (squarePrice.multiply(builtUpArea).add(additionalAmount)).multiply(cycle1).setScale(3, BigDecimal.ROUND_HALF_UP);
+                    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 {
+                    feeTotalPrice = (squarePrice.multiply(builtUpArea).add(additionalAmount)).multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                 }
             } else if ("1101".equals(computingFormula)) { // 绉熼噾
                 BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(roomDto.getRoomRent()));
-                feePrice = additionalAmount.setScale(3, BigDecimal.ROUND_HALF_UP);
+                feePrice = additionalAmount.setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
+                BigDecimal cycle = null;
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
-                    BigDecimal cycle1 = new BigDecimal(feeDto.getCycle());
-                    feeTotalPrice = additionalAmount.multiply(cycle1).setScale(3, BigDecimal.ROUND_HALF_UP);
+                    cycle = new BigDecimal(feeDto.getCycle());
                 }
-            }else if ("1102".equals(computingFormula)) { // 绉熼噾
+                if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
+                    cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
+                }
+                if (cycle == null) {
+                    feeTotalPrice = new BigDecimal(0);
+                } else {
+                    feeTotalPrice = additionalAmount.multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
+                }
+            } else if ("1102".equals(computingFormula)) { // 绉熼噾
                 BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(roomDto.getRoomRent()));
-                feePrice = additionalAmount.setScale(3, BigDecimal.ROUND_HALF_UP);
+                feePrice = additionalAmount.setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
+                BigDecimal cycle = null;
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
-                    BigDecimal cycle1 = new BigDecimal(feeDto.getCycle());
-                    feeTotalPrice = additionalAmount.multiply(cycle1).setScale(3, BigDecimal.ROUND_HALF_UP);
+                    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 {
+                    feeTotalPrice = additionalAmount.multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                 }
             } else if ("4004".equals(computingFormula)) {  //鍔ㄦ�佽垂鐢�
                 feePrice = new BigDecimal(Double.parseDouble(feeDto.getAmount()));
+                BigDecimal cycle = null;
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
-                    BigDecimal cycle1 = new BigDecimal(feeDto.getCycle());
-                    BigDecimal amount = new BigDecimal(feeDto.getAmount());
-                    feeTotalPrice = amount.multiply(cycle1).setScale(3, BigDecimal.ROUND_HALF_UP);
+                    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 {
+                    feeTotalPrice = feePrice.multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                 }
             } else if ("5005".equals(computingFormula)) {  //(鏈湡搴︽暟-涓婃湡搴︽暟)*鍗曚环+闄勫姞璐�
                 if (StringUtil.isEmpty(feeDto.getCurDegrees())) {
@@ -1061,32 +1116,73 @@
                     BigDecimal sub = curDegree.subtract(preDegree);
                     feePrice = sub.multiply(squarePrice)
                             .add(additionalAmount)
-                            .setScale(2, BigDecimal.ROUND_HALF_UP);
+                            .setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
 
+                    BigDecimal cycle = null;
                     if (!StringUtil.isEmpty(feeDto.getCycle())) {
-                        BigDecimal cycle1 = new BigDecimal(feeDto.getCycle());
-                        feeTotalPrice = (sub.multiply(squarePrice).add(additionalAmount)).multiply(cycle1).setScale(3, BigDecimal.ROUND_HALF_UP);
+                        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 {
+                        feeTotalPrice = (sub.multiply(squarePrice).add(additionalAmount)).multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                     }
                 }
             } else if ("6006".equals(computingFormula)) {
                 feePrice = new BigDecimal(Double.parseDouble(feeDto.getAmount()));
+
+                BigDecimal cycle = null;
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
-                    BigDecimal cycle1 = new BigDecimal(feeDto.getCycle());
-                    BigDecimal amount = new BigDecimal(feeDto.getAmount());
-                    feeTotalPrice = amount.multiply(cycle1).setScale(3, BigDecimal.ROUND_HALF_UP);
+                    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 {
+                    feeTotalPrice = feePrice.multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                 }
             } else if ("7007".equals(computingFormula)) { //鑷畾涔夊叕寮�
+                if (roomDto == null) {
+                    roomDto = new RoomDto();
+                    roomDto.setRoomId(feeDto.getPayerObjId());
+                    roomDto.setCommunityId(feeDto.getCommunityId());
+                    List<RoomDto> roomDtos = roomInnerServiceSMOImpl.queryRooms(roomDto);
+                    if (roomDtos == null || roomDtos.size() != 1) {
+                        throw new ListenerExecuteException(ResponseConstant.RESULT_CODE_ERROR, "鏈煡鍒版埧灞嬩俊鎭紝鏌ヨ澶氭潯鏁版嵁 roomId=" + feeDto.getPayerObjId());
+                    }
+                    roomDto = roomDtos.get(0);
+                }
                 feePrice = computeRoomCustomizeFormula(feeDto, roomDto);
+                BigDecimal cycle = null;
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
-                    BigDecimal cycle1 = new BigDecimal(feeDto.getCycle());
-                    feeTotalPrice = feePrice.multiply(cycle1).setScale(3, BigDecimal.ROUND_HALF_UP);
+                    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 {
+                    feeTotalPrice = feePrice.multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                 }
             } else if ("8008".equals(computingFormula)) {  //鎵嬪姩鍔ㄦ�佽垂鐢�
                 feePrice = new BigDecimal(Double.parseDouble(feeDto.getAmount()));
+                BigDecimal cycle = null;
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
-                    BigDecimal cycle1 = new BigDecimal(feeDto.getCycle());
-                    BigDecimal amount = new BigDecimal(feeDto.getAmount());
-                    feeTotalPrice = amount.multiply(cycle1).setScale(3, BigDecimal.ROUND_HALF_UP);
+                    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 {
+                    feeTotalPrice = feePrice.multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                 }
             } else if ("9009".equals(computingFormula)) {  //(鏈湡搴︽暟-涓婃湡搴︽暟)*鍔ㄦ�佸崟浠�+闄勫姞璐�
                 if (StringUtil.isEmpty(feeDto.getCurDegrees())) {
@@ -1100,9 +1196,17 @@
                     feePrice = sub.multiply(squarePrice)
                             .add(additionalAmount)
                             .setScale(2, BigDecimal.ROUND_HALF_UP);
+                    BigDecimal cycle = null;
                     if (!StringUtil.isEmpty(feeDto.getCycle())) {
-                        BigDecimal cycle1 = new BigDecimal(feeDto.getCycle());
-                        feeTotalPrice = (sub.multiply(squarePrice).add(additionalAmount)).multiply(cycle1).setScale(3, BigDecimal.ROUND_HALF_UP);
+                        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 {
+                        feeTotalPrice = (sub.multiply(squarePrice).add(additionalAmount)).multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                     }
                 }
             } else {
@@ -1128,48 +1232,99 @@
                 BigDecimal squarePrice = new BigDecimal(Double.parseDouble(feeDto.getSquarePrice()));
                 BigDecimal builtUpArea = new BigDecimal(Double.parseDouble(parkingSpaceDtos.get(0).getArea()));
                 BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
-                feePrice = squarePrice.multiply(builtUpArea).add(additionalAmount).setScale(2, BigDecimal.ROUND_HALF_UP);
+                feePrice = squarePrice.multiply(builtUpArea).add(additionalAmount).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
+                BigDecimal cycle = null;
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
-                    BigDecimal cycle1 = new BigDecimal(feeDto.getCycle());
-                    feeTotalPrice = (squarePrice.multiply(builtUpArea).add(additionalAmount)).multiply(cycle1).setScale(3, BigDecimal.ROUND_HALF_UP);
+                    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 {
+                    feeTotalPrice = (squarePrice.multiply(builtUpArea).add(additionalAmount)).multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                 }
             } else if ("2002".equals(computingFormula)) { // 鍥哄畾璐圭敤
                 //feePrice = Double.parseDouble(feeDto.getAdditionalAmount());
                 BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
-                feePrice = additionalAmount.setScale(2, BigDecimal.ROUND_HALF_UP);
+                feePrice = additionalAmount.setScale(4, BigDecimal.ROUND_HALF_UP);
+
+                BigDecimal cycle = null;
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
-                    BigDecimal cycle1 = new BigDecimal(feeDto.getCycle());
-                    feeTotalPrice = additionalAmount.multiply(cycle1).setScale(3, BigDecimal.ROUND_HALF_UP);
+                    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 {
+                    feeTotalPrice = additionalAmount.multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                 }
             } else if ("3003".equals(computingFormula)) { // 鍥哄畾璐圭敤
                 BigDecimal squarePrice = new BigDecimal(Double.parseDouble(feeDto.getSquarePrice()));
                 BigDecimal builtUpArea = new BigDecimal(Double.parseDouble(roomDto.getRoomArea()));
                 BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
-                feePrice = squarePrice.multiply(builtUpArea).add(additionalAmount).setScale(3, BigDecimal.ROUND_HALF_UP);
+                feePrice = squarePrice.multiply(builtUpArea).add(additionalAmount).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
+
+                BigDecimal cycle = null;
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
-                    BigDecimal cycle1 = new BigDecimal(feeDto.getCycle());
-                    feeTotalPrice = (squarePrice.multiply(builtUpArea).add(additionalAmount)).multiply(cycle1).setScale(3, BigDecimal.ROUND_HALF_UP);
+                    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 {
+                    feeTotalPrice = (squarePrice.multiply(builtUpArea).add(additionalAmount)).multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                 }
             } else if ("1101".equals(computingFormula)) { // 绉熼噾
                 BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(roomDto.getRoomRent()));
-                feePrice = additionalAmount.setScale(3, BigDecimal.ROUND_HALF_UP);
+                feePrice = additionalAmount.setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
+
+                BigDecimal cycle = null;
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
-                    BigDecimal cycle1 = new BigDecimal(feeDto.getCycle());
-                    feeTotalPrice = additionalAmount.multiply(cycle1).setScale(3, BigDecimal.ROUND_HALF_UP);
+                    cycle = new BigDecimal(feeDto.getCycle());
                 }
-            }  else if ("1102".equals(computingFormula)) { // 绉熼噾
+                if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
+                    cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
+                }
+                if (cycle == null) {
+                    feeTotalPrice = new BigDecimal(0);
+                } else {
+                    feeTotalPrice = additionalAmount.multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
+                }
+            } else if ("1102".equals(computingFormula)) { // 绉熼噾
                 BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(roomDto.getRoomRent()));
-                feePrice = additionalAmount.setScale(3, BigDecimal.ROUND_HALF_UP);
+                feePrice = additionalAmount.setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
+
+                BigDecimal cycle = null;
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
-                    BigDecimal cycle1 = new BigDecimal(feeDto.getCycle());
-                    feeTotalPrice = additionalAmount.multiply(cycle1).setScale(3, BigDecimal.ROUND_HALF_UP);
+                    cycle = new BigDecimal(feeDto.getCycle());
                 }
-            }else if ("4004".equals(computingFormula)) {
+                if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
+                    cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
+                }
+                if (cycle == null) {
+                    feeTotalPrice = new BigDecimal(0);
+                } else {
+                    feeTotalPrice = additionalAmount.multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
+                }
+            } else if ("4004".equals(computingFormula)) {
                 feePrice = new BigDecimal(Double.parseDouble(feeDto.getAmount()));
+                BigDecimal cycle = null;
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
-                    BigDecimal cycle1 = new BigDecimal(feeDto.getCycle());
-                    BigDecimal amount = new BigDecimal(feeDto.getAmount());
-                    feeTotalPrice = amount.multiply(cycle1).setScale(3, BigDecimal.ROUND_HALF_UP);
+                    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 {
+                    feeTotalPrice = feePrice.multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                 }
             } else if ("5005".equals(computingFormula)) {
                 if (StringUtil.isEmpty(feeDto.getCurDegrees())) {
@@ -1182,24 +1337,50 @@
                     BigDecimal sub = curDegree.subtract(preDegree);
                     feePrice = sub.multiply(squarePrice)
                             .add(additionalAmount)
-                            .setScale(2, BigDecimal.ROUND_HALF_UP);
+                            .setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
+
+                    BigDecimal cycle = null;
                     if (!StringUtil.isEmpty(feeDto.getCycle())) {
-                        BigDecimal cycle1 = new BigDecimal(feeDto.getCycle());
-                        feeTotalPrice = (sub.multiply(squarePrice).add(additionalAmount)).multiply(cycle1).setScale(3, BigDecimal.ROUND_HALF_UP);
+                        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 {
+                        feeTotalPrice = (sub.multiply(squarePrice).add(additionalAmount)).multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                     }
                 }
             } else if ("6006".equals(computingFormula)) {
                 feePrice = new BigDecimal(Double.parseDouble(feeDto.getAmount()));
+
+                BigDecimal cycle = null;
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
-                    BigDecimal cycle1 = new BigDecimal(feeDto.getCycle());
-                    BigDecimal amount = new BigDecimal(feeDto.getAmount());
-                    feeTotalPrice = amount.multiply(cycle1).setScale(3, BigDecimal.ROUND_HALF_UP);
+                    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 {
+                    feeTotalPrice = feePrice.multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                 }
             } else if ("7007".equals(computingFormula)) { //鑷畾涔夊叕寮�
                 feePrice = computeCarCustomizeFormula(feeDto, ownerCarDtos.get(0));
+
+                BigDecimal cycle = null;
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
-                    BigDecimal cycle1 = new BigDecimal(feeDto.getCycle());
-                    feeTotalPrice = feePrice.multiply(cycle1).setScale(3, BigDecimal.ROUND_HALF_UP);
+                    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 {
+                    feeTotalPrice = feePrice.multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                 }
             } else if ("9009".equals(computingFormula)) {  //(鏈湡搴︽暟-涓婃湡搴︽暟)*鍔ㄦ�佸崟浠�+闄勫姞璐�
                 if (StringUtil.isEmpty(feeDto.getCurDegrees())) {
@@ -1212,10 +1393,19 @@
                     BigDecimal sub = curDegree.subtract(preDegree);
                     feePrice = sub.multiply(squarePrice)
                             .add(additionalAmount)
-                            .setScale(2, BigDecimal.ROUND_HALF_UP);
+                            .setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
+
+                    BigDecimal cycle = null;
                     if (!StringUtil.isEmpty(feeDto.getCycle())) {
-                        BigDecimal cycle1 = new BigDecimal(feeDto.getCycle());
-                        feeTotalPrice = (sub.multiply(squarePrice).add(additionalAmount)).multiply(cycle1).setScale(3, BigDecimal.ROUND_HALF_UP);
+                        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 {
+                        feeTotalPrice = (sub.multiply(squarePrice).add(additionalAmount)).multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                     }
                 }
             } else {
@@ -1239,50 +1429,102 @@
                 }
                 feeDto.setBuiltUpArea(builtUpArea.doubleValue() + "");
                 BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
-                feePrice = squarePrice.multiply(builtUpArea).add(additionalAmount).setScale(3, BigDecimal.ROUND_HALF_UP);
+                feePrice = squarePrice.multiply(builtUpArea).add(additionalAmount).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
+                BigDecimal cycle = null;
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
-                    BigDecimal cycle1 = new BigDecimal(feeDto.getCycle());
-                    feeTotalPrice = (squarePrice.multiply(builtUpArea).add(additionalAmount)).multiply(cycle1).setScale(3, BigDecimal.ROUND_HALF_UP);
+                    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 {
+                    feeTotalPrice = (squarePrice.multiply(builtUpArea).add(additionalAmount)).multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                 }
             } else if ("2002".equals(computingFormula)) { // 鍥哄畾璐圭敤
                 //feePrice = Double.parseDouble(feeDto.getAdditionalAmount());
                 BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
 //                BigDecimal roomDount = new BigDecimal(contractRoomDtos.size());
 //                additionalAmount = additionalAmount.multiply(roomDount);
-                feePrice = additionalAmount.setScale(3, BigDecimal.ROUND_HALF_UP);
+                feePrice = additionalAmount.setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
+
+                BigDecimal cycle = null;
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
-                    BigDecimal cycle1 = new BigDecimal(feeDto.getCycle());
-                    feeTotalPrice = additionalAmount.multiply(cycle1).setScale(3, BigDecimal.ROUND_HALF_UP);
+                    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 {
+                    feeTotalPrice = additionalAmount.multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                 }
             } else if ("3003".equals(computingFormula)) { // 鍥哄畾璐圭敤
                 BigDecimal squarePrice = new BigDecimal(Double.parseDouble(feeDto.getSquarePrice()));
                 BigDecimal builtUpArea = new BigDecimal(Double.parseDouble(roomDto.getRoomArea()));
                 BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
-                feePrice = squarePrice.multiply(builtUpArea).add(additionalAmount).setScale(3, BigDecimal.ROUND_HALF_UP);
+                feePrice = squarePrice.multiply(builtUpArea).add(additionalAmount).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
+
+                BigDecimal cycle = null;
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
-                    BigDecimal cycle1 = new BigDecimal(feeDto.getCycle());
-                    feeTotalPrice = (squarePrice.multiply(builtUpArea).add(additionalAmount)).multiply(cycle1).setScale(3, BigDecimal.ROUND_HALF_UP);
+                    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 {
+                    feeTotalPrice = (squarePrice.multiply(builtUpArea).add(additionalAmount)).multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                 }
             } else if ("1101".equals(computingFormula)) { // 绉熼噾
                 BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(roomDto.getRoomRent()));
-                feePrice = additionalAmount.setScale(3, BigDecimal.ROUND_HALF_UP);
+                feePrice = additionalAmount.setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
+
+                BigDecimal cycle = null;
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
-                    BigDecimal cycle1 = new BigDecimal(feeDto.getCycle());
-                    feeTotalPrice = additionalAmount.multiply(cycle1).setScale(3, BigDecimal.ROUND_HALF_UP);
+                    cycle = new BigDecimal(feeDto.getCycle());
                 }
-            }else if ("1102".equals(computingFormula)) { // 绉熼噾
+                if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
+                    cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
+                }
+                if (cycle == null) {
+                    feeTotalPrice = new BigDecimal(0);
+                } else {
+                    feeTotalPrice = additionalAmount.multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
+                }
+            } else if ("1102".equals(computingFormula)) { // 绉熼噾
                 BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(roomDto.getRoomRent()));
-                feePrice = additionalAmount.setScale(3, BigDecimal.ROUND_HALF_UP);
+                feePrice = additionalAmount.setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
+
+                BigDecimal cycle = null;
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
-                    BigDecimal cycle1 = new BigDecimal(feeDto.getCycle());
-                    feeTotalPrice = additionalAmount.multiply(cycle1).setScale(3, BigDecimal.ROUND_HALF_UP);
+                    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 {
+                    feeTotalPrice = additionalAmount.multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                 }
             } else if ("4004".equals(computingFormula)) {  //鍔ㄦ�佽垂鐢�
                 feePrice = new BigDecimal(Double.parseDouble(feeDto.getAmount()));
+
+                BigDecimal cycle = null;
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
-                    BigDecimal cycle1 = new BigDecimal(feeDto.getCycle());
-                    BigDecimal amount = new BigDecimal(feeDto.getAmount());
-                    feeTotalPrice = amount.multiply(cycle1).setScale(3, BigDecimal.ROUND_HALF_UP);
+                    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 {
+                    feeTotalPrice = feePrice.multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                 }
             } else if ("5005".equals(computingFormula)) {  //(鏈湡搴︽暟-涓婃湡搴︽暟)*鍗曚环+闄勫姞璐�
                 if (StringUtil.isEmpty(feeDto.getCurDegrees())) {
@@ -1295,31 +1537,66 @@
                     BigDecimal sub = curDegree.subtract(preDegree);
                     feePrice = sub.multiply(squarePrice)
                             .add(additionalAmount)
-                            .setScale(2, BigDecimal.ROUND_HALF_UP);
+                            .setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
+
+
+                    BigDecimal cycle = null;
                     if (!StringUtil.isEmpty(feeDto.getCycle())) {
-                        BigDecimal cycle1 = new BigDecimal(feeDto.getCycle());
-                        feeTotalPrice = (sub.multiply(squarePrice).add(additionalAmount)).multiply(cycle1).setScale(3, BigDecimal.ROUND_HALF_UP);
+                        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 {
+                        feeTotalPrice = (sub.multiply(squarePrice).add(additionalAmount)).multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                     }
                 }
             } else if ("6006".equals(computingFormula)) {
                 feePrice = new BigDecimal(Double.parseDouble(feeDto.getAmount()));
+
+                BigDecimal cycle = null;
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
-                    BigDecimal cycle1 = new BigDecimal(feeDto.getCycle());
-                    BigDecimal amount = new BigDecimal(feeDto.getAmount());
-                    feeTotalPrice = amount.multiply(cycle1).setScale(3, BigDecimal.ROUND_HALF_UP);
+                    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 {
+                    feeTotalPrice = feePrice.multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                 }
             } else if ("7007".equals(computingFormula)) { //鑷畾涔夊叕寮�
                 feePrice = computeContractCustomizeFormula(feeDto, contractRoomDtos);
+
+                BigDecimal cycle = null;
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
-                    BigDecimal cycle1 = new BigDecimal(feeDto.getCycle());
-                    feeTotalPrice = feePrice.multiply(cycle1).setScale(3, BigDecimal.ROUND_HALF_UP);
+                    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 {
+                    feeTotalPrice = feePrice.multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                 }
             } else if ("8008".equals(computingFormula)) {  //鎵嬪姩鍔ㄦ�佽垂鐢�
                 feePrice = new BigDecimal(Double.parseDouble(feeDto.getAmount()));
+
+                BigDecimal cycle = null;
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
-                    BigDecimal cycle1 = new BigDecimal(feeDto.getCycle());
-                    BigDecimal amount = new BigDecimal(feeDto.getAmount());
-                    feeTotalPrice = amount.multiply(cycle1).setScale(3, BigDecimal.ROUND_HALF_UP);
+                    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 {
+                    feeTotalPrice = feePrice.multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                 }
             } else if ("9009".equals(computingFormula)) {  //(鏈湡搴︽暟-涓婃湡搴︽暟)*鍔ㄦ�佸崟浠�+闄勫姞璐�
                 if (StringUtil.isEmpty(feeDto.getCurDegrees())) {
@@ -1332,10 +1609,19 @@
                     BigDecimal sub = curDegree.subtract(preDegree);
                     feePrice = sub.multiply(squarePrice)
                             .add(additionalAmount)
-                            .setScale(2, BigDecimal.ROUND_HALF_UP);
+                            .setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
+
+                    BigDecimal cycle = null;
                     if (!StringUtil.isEmpty(feeDto.getCycle())) {
-                        BigDecimal cycle1 = new BigDecimal(feeDto.getCycle());
-                        feeTotalPrice = sub.multiply(squarePrice).add(additionalAmount).multiply(cycle1).setScale(3, BigDecimal.ROUND_HALF_UP);
+                        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 {
+                        feeTotalPrice = sub.multiply(squarePrice).add(additionalAmount).multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                     }
                 }
             } else {
@@ -1343,7 +1629,7 @@
             }
         }
 
-        feePrice.setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue();
+        feePrice.setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP).doubleValue();
         feeAmount.put("feePrice", feePrice);
         feeAmount.put("feeTotalPrice", feeTotalPrice);
         return feeAmount;
@@ -1439,6 +1725,11 @@
     private BigDecimal computeRoomCustomizeFormula(FeeDto feeDto, RoomDto roomDto) {
 
         String value = feeDto.getComputingFormulaText();
+
+        if (StringUtil.isEmpty(value)) {
+            return new BigDecimal(0);
+        }
+
         value = value.replace("\n", "")
                 .replace("\r", "")
                 .trim();
@@ -1456,6 +1747,13 @@
             value = value.replace("F", roomDto.getFloorArea());
         } else if (value.contains("U")) { //澶勭悊鍗曞厓
             value = value.replace("U", roomDto.getUnitArea());
+        } else if (value.contains("RL")) {
+            List<RoomAttrDto> roomAttrDtos = roomDto.getRoomAttrDto();
+            if (roomAttrDtos != null && roomAttrDtos.size() > 0) {
+                for (RoomAttrDto roomAttrDto : roomAttrDtos) {
+                    value = value.replace("RL" + roomAttrDto.getSpecCd(), roomAttrDto.getValue());
+                }
+            }
         } else if (value.contains("R")) { //澶勭悊 鎴垮眿闈㈢Н
             value = value.replace("R", roomDto.getBuiltUpArea());
         } else if (value.contains("X")) {// 澶勭悊 鎴垮眿绯绘暟
@@ -1517,8 +1815,10 @@
             }
             //鍒ゆ柇褰撳墠璐圭敤鏄笉鏄鍏ヨ垂鐢�
             oweMonth = 1.0;
-        }else if(FeeDto.FEE_FLAG_CYCLE_ONCE.equals(feeDto.getFeeFlag())){
-            maxEndTime = feeDto.getDeadlineTime();
+        } else if (FeeDto.FEE_FLAG_CYCLE_ONCE.equals(feeDto.getFeeFlag())) {
+            if (feeDto.getDeadlineTime() != null) {
+                maxEndTime = feeDto.getDeadlineTime();
+            }
             Date billEndTime = DateUtil.getCurrentDate();
             //寤鸿处鏃堕棿
             Date startDate = feeDto.getStartTime();
@@ -1653,19 +1953,19 @@
         //鍦ㄥ綋鍓嶆湀涓� 杩欏潡鏈夐棶棰�
         if (toDate.getTime() < newFromMaxDay.getTime().getTime()) {
             monthDay = new BigDecimal(newFrom.getActualMaximum(Calendar.DAY_OF_MONTH));
-            return tmpDays.divide(monthDay, 2, BigDecimal.ROUND_HALF_UP).add(new BigDecimal(result)).doubleValue();
+            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, 2, BigDecimal.ROUND_HALF_UP);
+        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, 2, BigDecimal.ROUND_HALF_UP).add(new BigDecimal(result)).add(preRresMonth).doubleValue();
+        resMonth = tmpDays.divide(monthDay, 4, BigDecimal.ROUND_HALF_UP).add(new BigDecimal(result)).add(preRresMonth).doubleValue();
         return resMonth;
     }
 
@@ -1868,16 +2168,63 @@
     }
 
     /**
-     *
      * @param feeDto
      * @param cycle
      */
-    public void dealRentRateCycle(FeeDto feeDto,double cycle){
+    public void dealRentRateCycle(FeeDto feeDto, double cycle) {
+
+        if (!FeeConfigDto.COMPUTING_FORMULA_RANT_RATE.equals(feeDto.getComputingFormula())) {
+            return;
+        }
+
         Date endTime = feeDto.getEndTime();
-        Date date = getTargetEndTime(cycle,endTime);
+        Date date = getTargetEndTime(cycle, endTime);
         feeDto.setDeadlineTime(date);
         dealRentRate(feeDto);
 
+    }
+
+    /**
+     * @param feeDto
+     * @param custEndTime
+     */
+    public void dealRentRateCustEndTime(FeeDto feeDto, Date custEndTime) {
+
+        if (!FeeConfigDto.COMPUTING_FORMULA_RANT_RATE.equals(feeDto.getComputingFormula())) {
+            return;
+        }
+
+        feeDto.setDeadlineTime(custEndTime);
+        dealRentRate(feeDto);
+
+    }
+
+    @Override
+    public long computeOneIntegralQuantity(IntegralRuleConfigDto integralRuleConfigDto, JSONObject reqJson) {
+        String computingFormula = integralRuleConfigDto.getComputingFormula();
+        BigDecimal amountDec = null;
+        long amount = 0;
+        if (IntegralRuleConfigDto.COMPUTING_FORMULA_AREA.equals(computingFormula)) { //闈㈢Н涔樹互鍗曚环
+            BigDecimal areaDec = new BigDecimal(Double.parseDouble(reqJson.getString("area")));
+            BigDecimal squarePriceDec = new BigDecimal(Double.parseDouble(integralRuleConfigDto.getSquarePrice()));
+            amountDec = areaDec.multiply(squarePriceDec).setScale(2, BigDecimal.ROUND_HALF_UP);
+        } else if (IntegralRuleConfigDto.COMPUTING_FORMULA_MONEY.equals(computingFormula)) { // 閲戦涔樹互鍗曚环
+            BigDecimal aDec = new BigDecimal(Double.parseDouble(reqJson.getString("amount")));
+            BigDecimal squarePriceDec = new BigDecimal(Double.parseDouble(integralRuleConfigDto.getSquarePrice()));
+            amountDec = aDec.multiply(squarePriceDec).setScale(2, BigDecimal.ROUND_HALF_UP);
+        } else if (IntegralRuleConfigDto.COMPUTING_FORMULA_FIXED.equals(computingFormula)) { // 鍥哄畾绉垎
+            amountDec = new BigDecimal(Double.parseDouble(integralRuleConfigDto.getAdditionalAmount()));
+        } else {
+            amountDec = new BigDecimal(0);
+        }
+
+        if (IntegralRuleConfigDto.SCALE_UP.equals(integralRuleConfigDto.getScale())) {
+            amount = new Double(Math.ceil(amountDec.doubleValue())).longValue();
+        } else {
+            amount = new Double(Math.floor(amountDec.doubleValue())).longValue();
+        }
+        integralRuleConfigDto.setQuantity(amount + "");
+        return amount;
     }
 
     /**
@@ -1887,10 +2234,6 @@
      */
     public void dealRentRate(FeeDto feeDto) {
         if (!FeeConfigDto.COMPUTING_FORMULA_RANT_RATE.equals(feeDto.getComputingFormula())) {
-            return;
-        }
-
-        if (!FeeDto.STATE_DOING.equals(feeDto.getState())) {
             return;
         }
 
@@ -1909,19 +2252,24 @@
         try {
             for (FeeAttrDto tmpFeeAttrDto : feeAttrDtos) {
                 if (FeeAttrDto.SPEC_CD_RATE.equals(tmpFeeAttrDto.getSpecCd())) {
-                    feeDto.setRate(tmpFeeAttrDto.getValue());
-                    rate = Double.parseDouble(tmpFeeAttrDto.getValue());
+                    feeDto.setRate(tmpFeeAttrDto.getValue().trim());
+                    rate = Double.parseDouble(tmpFeeAttrDto.getValue().trim());
                 }
                 if (FeeAttrDto.SPEC_CD_RATE_CYCLE.equals(tmpFeeAttrDto.getSpecCd())) {
-                    feeDto.setRateCycle(tmpFeeAttrDto.getValue());
-                    rateCycle = Integer.parseInt(tmpFeeAttrDto.getValue());
+                    feeDto.setRateCycle(tmpFeeAttrDto.getValue().trim());
+                    rateCycle = Integer.parseInt(tmpFeeAttrDto.getValue().trim());
                 }
                 if (FeeAttrDto.SPEC_CD_RATE_START_TIME.equals(tmpFeeAttrDto.getSpecCd())) {
-                    rateStartTime = DateUtil.getDateFromString(tmpFeeAttrDto.getValue(), DateUtil.DATE_FORMATE_STRING_B);
+                    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;
         }
 
@@ -1939,36 +2287,49 @@
         BigDecimal curFeePrice = new BigDecimal(feeDto.getFeePrice());
         if (feeDto.getEndTime().getTime() < rateStartTime.getTime()) {
             curOweMonth = dayCompare(feeDto.getEndTime(), rateStartTime);
-            oweAmountDec = curFeePrice.multiply(new BigDecimal(curOweMonth)).setScale(2, BigDecimal.ROUND_HALF_UP);
+            oweAmountDec = curFeePrice.multiply(new BigDecimal(curOweMonth)).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
         }
 
         curOweMonth = dayCompare(rateStartTime, feeDto.getDeadlineTime());
 
-        double maxCycle = Math.floor(curOweMonth / rateCycle);
+        double maxCycle = Math.ceil(curOweMonth / rateCycle);
 
-        //鍩哄噯
-        BigDecimal firstAmount = curFeePrice.multiply(new BigDecimal(rateCycle));
-        BigDecimal preCycleAmount = firstAmount;
+        // 澧為暱鍓嶇殑娆犺垂
+        BigDecimal addTotalAmount = oweAmountDec;
+        BigDecimal preCycleAmount = curFeePrice.multiply(new BigDecimal(rateCycle));
         BigDecimal rateDec = null; //閫掑鍛ㄦ湡鎵�鏀惰垂鐢�
         BigDecimal lastRateAmountDec = null;
         double curCycle = 0;
-        for (int cycleIndex = 0; cycleIndex < maxCycle; maxCycle++) {
-            rateDec = preCycleAmount.multiply(new BigDecimal(rate)).setScale(2, BigDecimal.ROUND_HALF_UP);
+        BigDecimal curAmount = null; // 褰撴湡閲戦
+        Date curEndTime = null;
+        for (int cycleIndex = 0; cycleIndex < maxCycle; cycleIndex++) {
+            //褰撴湡澧為暱閮ㄥ垎
+            rateDec = preCycleAmount.multiply(new BigDecimal(rate)).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
             //澧為暱鍛ㄦ湡鐨勫�嶆暟
             curCycle = (cycleIndex + 1) * rateCycle;
+
+            // 璁$畻鏈疆鐨� 璁¤垂璧峰鏃堕棿
+            Calendar curEndTimeCalender = Calendar.getInstance();
+            curEndTimeCalender.setTime(rateStartTime);
+            curEndTimeCalender.add(Calendar.MONTH, new Double(curCycle).intValue());
+            curEndTime = curEndTimeCalender.getTime();
             if (curCycle > curOweMonth) {
-                rateDec = new BigDecimal(curOweMonth / rateCycle - Math.ceil(curOweMonth / rateCycle)).multiply(rateDec).setScale(2, BigDecimal.ROUND_HALF_UP);
-                lastRateAmountDec = new BigDecimal(curOweMonth / rateCycle - Math.ceil(curOweMonth / rateCycle)).multiply(preCycleAmount).setScale(2, BigDecimal.ROUND_HALF_UP);
-                firstAmount = firstAmount.add(rateDec).add(lastRateAmountDec);
+                //涓嶈冻澧為暱鍛ㄦ湡澧為暱鐜�
+                rateDec = new BigDecimal(curOweMonth / rateCycle - Math.floor(curOweMonth / rateCycle)).multiply(rateDec).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
+                lastRateAmountDec = new BigDecimal(curOweMonth / rateCycle - Math.floor(curOweMonth / rateCycle)).multiply(preCycleAmount).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
+                addTotalAmount = addTotalAmount.add(rateDec).add(lastRateAmountDec);
                 continue;
             }
-            firstAmount = firstAmount.add(rateDec).add(preCycleAmount);
-            preCycleAmount = preCycleAmount.add(rateDec);
+            //鏈湡閲戦
+            curAmount = rateDec.add(preCycleAmount);// 澧為暱閮ㄥ垎 + 涓婃湰鏈熻垂鐢�
+            //濡傛灉璁¤垂璧峰鏃堕棿 澶т簬 閫掑寮�濮嬫椂闂� 閭d箞鏈疆 涓嶈鍏�
+            if (feeDto.getEndTime().getTime() < curEndTime.getTime()) {
+                addTotalAmount = addTotalAmount.add(curAmount); // 璁″叆鎬荤殑 璐圭敤涓�
+            }
+            preCycleAmount = curAmount;
         }
-
-        firstAmount = firstAmount.add(oweAmountDec);
-        feeDto.setAmountOwed(firstAmount.doubleValue() + "");
-        feeDto.setFeeTotalPrice(firstAmount.doubleValue());
+        feeDto.setAmountOwed(addTotalAmount.doubleValue() + "");
+        feeDto.setFeeTotalPrice(addTotalAmount.doubleValue());
     }
 }
 

--
Gitblit v1.8.0