wuxw лет назад: 3
Родитель
Сommit
91ff9f520b

+ 6 - 0
java110-core/src/main/java/com/java110/core/smo/IComputeFeeSMO.java

@@ -179,4 +179,10 @@ public interface IComputeFeeSMO {
     void dealRentRateCycle(FeeDto feeDto,double cycle);
 
 
+    /**
+     * 租金处理
+     * @param feeDto
+     * @param custEndTime
+     */
+    void dealRentRateCustEndTime(FeeDto feeDto, Date custEndTime);
 }

+ 406 - 115
java110-core/src/main/java/com/java110/core/smo/impl/ComputeFeeSMOImpl.java

@@ -942,6 +942,48 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
         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");
@@ -968,87 +1010,94 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
                 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);
+                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(3, 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);
+                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(3, 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);
+                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(3, 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);
+                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(3, 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);
+                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(3, 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(3, BigDecimal.ROUND_HALF_UP);
                 }
             } else if ("5005".equals(computingFormula)) {  //(本期度数-上期度数)*单价+附加费
                 if (StringUtil.isEmpty(feeDto.getCurDegrees())) {
@@ -1063,30 +1112,61 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
                             .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(3, 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(3, BigDecimal.ROUND_HALF_UP);
                 }
             } else if ("7007".equals(computingFormula)) { //自定义公式
                 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(3, 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(3, BigDecimal.ROUND_HALF_UP);
                 }
             } else if ("9009".equals(computingFormula)) {  //(本期度数-上期度数)*动态单价+附加费
                 if (StringUtil.isEmpty(feeDto.getCurDegrees())) {
@@ -1100,9 +1180,17 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
                     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(3, BigDecimal.ROUND_HALF_UP);
                     }
                 }
             } else {
@@ -1129,47 +1217,98 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
                 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);
+                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(3, 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);
+
+                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(3, 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);
+
+                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(3, 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);
+
+                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(3, 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);
+
+                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(3, 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(3, BigDecimal.ROUND_HALF_UP);
                 }
             } else if ("5005".equals(computingFormula)) {
                 if (StringUtil.isEmpty(feeDto.getCurDegrees())) {
@@ -1183,23 +1322,49 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
                     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(3, 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(3, 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(3, BigDecimal.ROUND_HALF_UP);
                 }
             } else if ("9009".equals(computingFormula)) {  //(本期度数-上期度数)*动态单价+附加费
                 if (StringUtil.isEmpty(feeDto.getCurDegrees())) {
@@ -1213,9 +1378,18 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
                     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(3, BigDecimal.ROUND_HALF_UP);
                     }
                 }
             } else {
@@ -1240,9 +1414,17 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
                 feeDto.setBuiltUpArea(builtUpArea.doubleValue() + "");
                 BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
                 feePrice = squarePrice.multiply(builtUpArea).add(additionalAmount).setScale(3, 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(3, BigDecimal.ROUND_HALF_UP);
                 }
             } else if ("2002".equals(computingFormula)) { // 固定费用
                 //feePrice = Double.parseDouble(feeDto.getAdditionalAmount());
@@ -1250,39 +1432,83 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
 //                BigDecimal roomDount = new BigDecimal(contractRoomDtos.size());
 //                additionalAmount = additionalAmount.multiply(roomDount);
                 feePrice = additionalAmount.setScale(3, 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(3, 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);
+
+                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(3, 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);
+
+                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(3, 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);
+
+                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(3, 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(3, BigDecimal.ROUND_HALF_UP);
                 }
             } else if ("5005".equals(computingFormula)) {  //(本期度数-上期度数)*单价+附加费
                 if (StringUtil.isEmpty(feeDto.getCurDegrees())) {
@@ -1296,30 +1522,65 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
                     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(3, 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(3, 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(3, 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(3, BigDecimal.ROUND_HALF_UP);
                 }
             } else if ("9009".equals(computingFormula)) {  //(本期度数-上期度数)*动态单价+附加费
                 if (StringUtil.isEmpty(feeDto.getCurDegrees())) {
@@ -1333,9 +1594,18 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
                     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(3, BigDecimal.ROUND_HALF_UP);
                     }
                 }
             } else {
@@ -1875,6 +2145,11 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
      * @param 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);
         feeDto.setDeadlineTime(date);
@@ -1882,6 +2157,22 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
 
     }
 
+    /**
+     *
+     * @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);
+
+    }
+
     /**
      * 租金处理
      *
@@ -1947,7 +2238,7 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
 
         curOweMonth = dayCompare(rateStartTime, feeDto.getDeadlineTime());
 
-        double maxCycle = Math.floor(curOweMonth / rateCycle);
+        double maxCycle = Math.ceil(curOweMonth / rateCycle);
 
         // 增长前的欠费
         BigDecimal addTotalAmount = oweAmountDec ;
@@ -1963,8 +2254,8 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
             curCycle = (cycleIndex + 1) * rateCycle;
             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);
+                rateDec = new BigDecimal(curOweMonth / rateCycle - Math.floor(curOweMonth / rateCycle)).multiply(rateDec).setScale(2, BigDecimal.ROUND_HALF_UP);
+                lastRateAmountDec = new BigDecimal(curOweMonth / rateCycle - Math.floor(curOweMonth / rateCycle)).multiply(preCycleAmount).setScale(2, BigDecimal.ROUND_HALF_UP);
                 addTotalAmount = addTotalAmount.add(rateDec).add(lastRateAmountDec);
                 continue;
             }

+ 11 - 0
java110-utils/src/main/java/com/java110/utils/util/DateUtil.java

@@ -139,6 +139,17 @@ public class DateUtil {
         }
     }
 
+    public static Date getDateFromStringB(String date){
+        SimpleDateFormat sDateFormat = getDateFormat(DateUtil.DATE_FORMATE_STRING_B);
+        try{
+            synchronized (sDateFormat) {
+                return sDateFormat.parse(date);
+            }
+        }catch (Exception e){
+            throw new IllegalArgumentException(e);
+        }
+    }
+
     public static Date getDefaultDateFromString(String date)
             throws ParseException {
         return getDateFromString(date, "yyyyMMddHHmmss");

+ 13 - 1
service-fee/src/main/java/com/java110/fee/bmo/impl/QueryOweFeeImpl.java

@@ -20,6 +20,7 @@ import com.java110.intf.user.IOwnerCarInnerServiceSMO;
 import com.java110.intf.user.IOwnerInnerServiceSMO;
 import com.java110.utils.cache.MappingCache;
 import com.java110.utils.constant.ResponseConstant;
+import com.java110.utils.exception.CmdException;
 import com.java110.utils.exception.ListenerExecuteException;
 import com.java110.utils.util.Assert;
 import com.java110.utils.util.DateUtil;
@@ -33,6 +34,7 @@ import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.text.ParseException;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
@@ -182,7 +184,17 @@ public class QueryOweFeeImpl implements IQueryOweFee {
         feeDto.setFeePrice(Double.parseDouble(feePriceAll.get("feePrice").toString()));
         feeDto.setFeeTotalPrice(Double.parseDouble(feePriceAll.get("feeTotalPrice").toString()));
 
-        computeFeeSMOImpl.dealRentRateCycle(feeDto, NumberUtil.getDouble(feeDto.getCycle()));
+        if(!StringUtil.isEmpty(custEndTime)){
+            try {
+                computeFeeSMOImpl.dealRentRateCustEndTime(feeDto, DateUtil.getDateFromString(custEndTime,DateUtil.DATE_FORMATE_STRING_B));
+            } catch (Exception e) {
+                throw new CmdException("计算费用失败"+e);
+            }
+        }else {
+            computeFeeSMOImpl.dealRentRateCycle(feeDto, NumberUtil.getDouble(feeDto.getCycle()));
+        }
+
+
         //应收款取值
         //先取单小区的如果没有配置 取 全局的
         String val = CommunitySettingFactory.getValue(feeDto.getCommunityId(), TOTAL_FEE_PRICE);

+ 24 - 12
service-fee/src/main/java/com/java110/fee/cmd/fee/PayFeeCmd.java

@@ -247,7 +247,7 @@ public class PayFeeCmd extends Cmd {
             }
             for (int columnIndex = 0; columnIndex < jsonArray.size(); columnIndex++) {
                 JSONObject param = jsonArray.getJSONObject(columnIndex);
-                if (!StringUtil.isEmpty(param.getString("acctType")) && param.getString("acctType").equals("2004")) { //积分账户
+                if (AccountDto.ACCT_TYPE_INTEGRAL.equals(param.getString("acctType"))) { //积分账户
                     //账户金额
                     BigDecimal amount = new BigDecimal(param.getString("amount"));
                     //获取最大抵扣积分
@@ -590,32 +590,44 @@ public class PayFeeCmd extends Cmd {
             targetEndTime = endCalender.getTime();
             paramInJson.put("tmpCycles", cycles.doubleValue());
             businessFeeDetail.put("cycles", cycles.doubleValue());
-            businessFeeDetail.put("receivableAmount", receivedAmount.doubleValue());
-        } else if ("-103".equals(paramInJson.getString("cycles"))) {
-            String custEndTime = paramInJson.getString("custEndTime");
-            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
-            Date endDates = null;
-            try {
-                endDates = format.parse(custEndTime);
-            } catch (ParseException e) {
-                e.printStackTrace();
+            //处理 可能还存在 实收手工减免的情况
+            if(paramInJson.containsKey("receivableAmount") && !StringUtil.isEmpty(paramInJson.getString("receivableAmount"))){
+                businessFeeDetail.put("receivableAmount", paramInJson.getString("receivableAmount"));
+            }else {
+                businessFeeDetail.put("receivableAmount", receivedAmount.doubleValue());
             }
+        } else if ("-103".equals(paramInJson.getString("cycles"))) { //这里按缴费结束时间缴费
+            String custEndTime = paramInJson.getString("custEndTime");
+            Date endDates = DateUtil.getDateFromStringB(custEndTime);
             Calendar c = Calendar.getInstance();
             c.setTime(endDates);
             c.add(Calendar.DAY_OF_MONTH, 1);
             endDates = c.getTime();//这是明天
             targetEndTime = endDates;
-            BigDecimal receivedAmount1 = new BigDecimal(Double.parseDouble(paramInJson.getString("receivedAmount")));
+            BigDecimal receivedAmount1 =  new BigDecimal(Double.parseDouble(paramInJson.getString("receivedAmount")));
             cycles = receivedAmount1.divide(feePrice, 4, BigDecimal.ROUND_HALF_EVEN);
             paramInJson.put("tmpCycles", cycles.doubleValue());
             businessFeeDetail.put("cycles", cycles.doubleValue());
             BigDecimal receivedAmount = new BigDecimal(Double.parseDouble(paramInJson.getString("receivedAmount")));
-            businessFeeDetail.put("receivableAmount", receivedAmount.doubleValue());
+            //处理 可能还存在 实收手工减免的情况
+            if(paramInJson.containsKey("receivableAmount") && !StringUtil.isEmpty(paramInJson.getString("receivableAmount"))){
+                businessFeeDetail.put("receivableAmount", paramInJson.getString("receivableAmount"));
+            }else {
+                businessFeeDetail.put("receivableAmount", receivedAmount.doubleValue());
+            }
         } else {
             targetEndTime = computeFeeSMOImpl.getFeeEndTimeByCycles(feeDto, paramInJson.getString("cycles"));//根据缴费周期计算 结束时间
             cycles = new BigDecimal(Double.parseDouble(paramInJson.getString("cycles")));
             double tmpReceivableAmount = cycles.multiply(feePrice).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
             businessFeeDetail.put("receivableAmount", tmpReceivableAmount);
+
+            //出租递增问题处理
+            if (FeeConfigDto.COMPUTING_FORMULA_RANT_RATE.equals(feeDto.getComputingFormula())) {
+                computeFeeSMOImpl.dealRentRateCycle(feeDto,cycles.doubleValue());
+                if(feeDto.getOweFee()> 0){
+                    businessFeeDetail.put("receivableAmount", feeDto.getOweFee());
+                }
+            }
         }
         businessFeeDetail.put("endTime", DateUtil.getFormatTimeString(targetEndTime, DateUtil.DATE_FORMATE_STRING_A));
         paramInJson.put("feeInfo", feeDto);

+ 1 - 3
service-store/src/test/java/com/java110/store/BeanTest.java

@@ -27,9 +27,7 @@ public class BeanTest extends TestCase {
 
 
     public void testBean(){
-        Product product = new Product();
 
-        product.setStatus_cd("status_cd");
-        System.out.println(product.getStatus_cd());
+        System.out.println(Math.ceil(0.1));
     }
 }