wuxw
2022-11-13 07c8670778fa167082bb6cfc2f35f51de193eb69
java110-core/src/main/java/com/java110/core/smo/impl/ComputeFeeSMOImpl.java
@@ -4,6 +4,7 @@
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;
@@ -29,6 +30,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;
@@ -799,6 +801,9 @@
                endCalender.setTime(feeDto.getImportFeeEndTime());
            }
        } 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(4, 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(4, 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(4, 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);
                feePrice = additionalAmount.setScale(4, 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(4, 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(4, 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(4, BigDecimal.ROUND_HALF_UP);
                }
            } else {
                throw new IllegalArgumentException("暂不支持该类公式");
@@ -886,11 +891,11 @@
                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(4, 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(4, BigDecimal.ROUND_HALF_UP);
            } else if ("3003".equals(computingFormula)) { // 固定费用
                //feePrice = Double.parseDouble(feeDto.getAdditionalAmount());
                feePrice = new BigDecimal(0);
@@ -911,7 +916,7 @@
                    BigDecimal sub = curDegree.subtract(preDegree);
                    feePrice = sub.multiply(squarePrice)
                            .add(additionalAmount)
                            .setScale(2, BigDecimal.ROUND_HALF_UP);
                            .setScale(4, 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(4, BigDecimal.ROUND_HALF_UP);
                }
            } else {
                throw new IllegalArgumentException("暂不支持该类公式");
            }
        }
        return feePrice.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
        return feePrice.setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue();
    }
    @Override
@@ -1009,7 +1014,7 @@
                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);
                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());
@@ -1020,12 +1025,12 @@
                if(cycle == null){
                    feeTotalPrice = new BigDecimal(0);
                }else {
                    feeTotalPrice = (squarePrice.multiply(builtUpArea).add(additionalAmount)).multiply(cycle).setScale(3, BigDecimal.ROUND_HALF_UP);
                    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())) {
                    cycle = new BigDecimal(feeDto.getCycle());
@@ -1036,13 +1041,13 @@
                if(cycle == null){
                    feeTotalPrice = new BigDecimal(0);
                }else {
                    feeTotalPrice = additionalAmount.multiply(cycle).setScale(3, BigDecimal.ROUND_HALF_UP);
                    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())) {
                    cycle = new BigDecimal(feeDto.getCycle());
@@ -1053,11 +1058,11 @@
                if(cycle == null){
                    feeTotalPrice = new BigDecimal(0);
                }else {
                    feeTotalPrice = (squarePrice.multiply(builtUpArea).add(additionalAmount)).multiply(cycle).setScale(3, BigDecimal.ROUND_HALF_UP);
                    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())) {
                    cycle = new BigDecimal(feeDto.getCycle());
@@ -1068,11 +1073,11 @@
                if(cycle == null){
                    feeTotalPrice = new BigDecimal(0);
                }else {
                    feeTotalPrice = additionalAmount.multiply(cycle).setScale(3, BigDecimal.ROUND_HALF_UP);
                    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())) {
                    cycle = new BigDecimal(feeDto.getCycle());
@@ -1083,7 +1088,7 @@
                if(cycle == null){
                    feeTotalPrice = new BigDecimal(0);
                }else {
                    feeTotalPrice = additionalAmount.multiply(cycle).setScale(3, BigDecimal.ROUND_HALF_UP);
                    feeTotalPrice = additionalAmount.multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                }
            } else if ("4004".equals(computingFormula)) {  //动态费用
                feePrice = new BigDecimal(Double.parseDouble(feeDto.getAmount()));
@@ -1097,7 +1102,7 @@
                if(cycle == null){
                    feeTotalPrice = new BigDecimal(0);
                }else {
                    feeTotalPrice = feePrice.multiply(cycle).setScale(3, BigDecimal.ROUND_HALF_UP);
                    feeTotalPrice = feePrice.multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                }
            } else if ("5005".equals(computingFormula)) {  //(本期度数-上期度数)*单价+附加费
                if (StringUtil.isEmpty(feeDto.getCurDegrees())) {
@@ -1110,7 +1115,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);
                    BigDecimal cycle = null;
                    if (!StringUtil.isEmpty(feeDto.getCycle())) {
@@ -1122,7 +1127,7 @@
                    if(cycle == null){
                        feeTotalPrice = new BigDecimal(0);
                    }else {
                        feeTotalPrice = (sub.multiply(squarePrice).add(additionalAmount)).multiply(cycle).setScale(3, BigDecimal.ROUND_HALF_UP);
                        feeTotalPrice = (sub.multiply(squarePrice).add(additionalAmount)).multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                    }
                }
            } else if ("6006".equals(computingFormula)) {
@@ -1138,9 +1143,19 @@
                if(cycle == null){
                    feeTotalPrice = new BigDecimal(0);
                }else {
                    feeTotalPrice = feePrice.multiply(cycle).setScale(3, BigDecimal.ROUND_HALF_UP);
                    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())) {
@@ -1152,7 +1167,7 @@
                if(cycle == null){
                    feeTotalPrice = new BigDecimal(0);
                }else {
                    feeTotalPrice = feePrice.multiply(cycle).setScale(3, BigDecimal.ROUND_HALF_UP);
                    feeTotalPrice = feePrice.multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                }
            } else if ("8008".equals(computingFormula)) {  //手动动态费用
                feePrice = new BigDecimal(Double.parseDouble(feeDto.getAmount()));
@@ -1166,7 +1181,7 @@
                if(cycle == null){
                    feeTotalPrice = new BigDecimal(0);
                }else {
                    feeTotalPrice = feePrice.multiply(cycle).setScale(3, BigDecimal.ROUND_HALF_UP);
                    feeTotalPrice = feePrice.multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                }
            } else if ("9009".equals(computingFormula)) {  //(本期度数-上期度数)*动态单价+附加费
                if (StringUtil.isEmpty(feeDto.getCurDegrees())) {
@@ -1190,7 +1205,7 @@
                    if(cycle == null){
                        feeTotalPrice = new BigDecimal(0);
                    }else {
                        feeTotalPrice = (sub.multiply(squarePrice).add(additionalAmount)).multiply(cycle).setScale(3, BigDecimal.ROUND_HALF_UP);
                        feeTotalPrice = (sub.multiply(squarePrice).add(additionalAmount)).multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                    }
                }
            } else {
@@ -1216,7 +1231,7 @@
                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())) {
                    cycle = new BigDecimal(feeDto.getCycle());
@@ -1227,12 +1242,12 @@
                if(cycle == null){
                    feeTotalPrice = new BigDecimal(0);
                }else {
                    feeTotalPrice = (squarePrice.multiply(builtUpArea).add(additionalAmount)).multiply(cycle).setScale(3, BigDecimal.ROUND_HALF_UP);
                    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())) {
@@ -1244,13 +1259,13 @@
                if(cycle == null){
                    feeTotalPrice = new BigDecimal(0);
                }else {
                    feeTotalPrice = additionalAmount.multiply(cycle).setScale(3, BigDecimal.ROUND_HALF_UP);
                    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())) {
@@ -1262,11 +1277,11 @@
                if(cycle == null){
                    feeTotalPrice = new BigDecimal(0);
                }else {
                    feeTotalPrice = (squarePrice.multiply(builtUpArea).add(additionalAmount)).multiply(cycle).setScale(3, BigDecimal.ROUND_HALF_UP);
                    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())) {
@@ -1278,11 +1293,11 @@
                if(cycle == null){
                    feeTotalPrice = new BigDecimal(0);
                }else {
                    feeTotalPrice = additionalAmount.multiply(cycle).setScale(3, BigDecimal.ROUND_HALF_UP);
                    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())) {
@@ -1294,7 +1309,7 @@
                if(cycle == null){
                    feeTotalPrice = new BigDecimal(0);
                }else {
                    feeTotalPrice = additionalAmount.multiply(cycle).setScale(3, BigDecimal.ROUND_HALF_UP);
                    feeTotalPrice = additionalAmount.multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                }
            }else if ("4004".equals(computingFormula)) {
                feePrice = new BigDecimal(Double.parseDouble(feeDto.getAmount()));
@@ -1308,7 +1323,7 @@
                if(cycle == null){
                    feeTotalPrice = new BigDecimal(0);
                }else {
                    feeTotalPrice = feePrice.multiply(cycle).setScale(3, BigDecimal.ROUND_HALF_UP);
                    feeTotalPrice = feePrice.multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                }
            } else if ("5005".equals(computingFormula)) {
                if (StringUtil.isEmpty(feeDto.getCurDegrees())) {
@@ -1321,7 +1336,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);
                    BigDecimal cycle = null;
                    if (!StringUtil.isEmpty(feeDto.getCycle())) {
@@ -1333,7 +1348,7 @@
                    if(cycle == null){
                        feeTotalPrice = new BigDecimal(0);
                    }else {
                        feeTotalPrice = (sub.multiply(squarePrice).add(additionalAmount)).multiply(cycle).setScale(3, BigDecimal.ROUND_HALF_UP);
                        feeTotalPrice = (sub.multiply(squarePrice).add(additionalAmount)).multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                    }
                }
            } else if ("6006".equals(computingFormula)) {
@@ -1349,7 +1364,7 @@
                if(cycle == null){
                    feeTotalPrice = new BigDecimal(0);
                }else {
                    feeTotalPrice = feePrice.multiply(cycle).setScale(3, BigDecimal.ROUND_HALF_UP);
                    feeTotalPrice = feePrice.multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                }
            } else if ("7007".equals(computingFormula)) { //自定义公式
                feePrice = computeCarCustomizeFormula(feeDto, ownerCarDtos.get(0));
@@ -1364,7 +1379,7 @@
                if(cycle == null){
                    feeTotalPrice = new BigDecimal(0);
                }else {
                    feeTotalPrice = feePrice.multiply(cycle).setScale(3, BigDecimal.ROUND_HALF_UP);
                    feeTotalPrice = feePrice.multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                }
            } else if ("9009".equals(computingFormula)) {  //(本期度数-上期度数)*动态单价+附加费
                if (StringUtil.isEmpty(feeDto.getCurDegrees())) {
@@ -1377,7 +1392,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);
                    BigDecimal cycle = null;
                    if (!StringUtil.isEmpty(feeDto.getCycle())) {
@@ -1389,7 +1404,7 @@
                    if(cycle == null){
                        feeTotalPrice = new BigDecimal(0);
                    }else {
                        feeTotalPrice = (sub.multiply(squarePrice).add(additionalAmount)).multiply(cycle).setScale(3, BigDecimal.ROUND_HALF_UP);
                        feeTotalPrice = (sub.multiply(squarePrice).add(additionalAmount)).multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                    }
                }
            } else {
@@ -1413,7 +1428,7 @@
                }
                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())) {
                    cycle = new BigDecimal(feeDto.getCycle());
@@ -1424,14 +1439,14 @@
                if(cycle == null){
                    feeTotalPrice = new BigDecimal(0);
                }else {
                    feeTotalPrice = (squarePrice.multiply(builtUpArea).add(additionalAmount)).multiply(cycle).setScale(3, BigDecimal.ROUND_HALF_UP);
                    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())) {
@@ -1443,13 +1458,13 @@
                if(cycle == null){
                    feeTotalPrice = new BigDecimal(0);
                }else {
                    feeTotalPrice = additionalAmount.multiply(cycle).setScale(3, BigDecimal.ROUND_HALF_UP);
                    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())) {
@@ -1461,11 +1476,11 @@
                if(cycle == null){
                    feeTotalPrice = new BigDecimal(0);
                }else {
                    feeTotalPrice = (squarePrice.multiply(builtUpArea).add(additionalAmount)).multiply(cycle).setScale(3, BigDecimal.ROUND_HALF_UP);
                    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())) {
@@ -1477,11 +1492,11 @@
                if(cycle == null){
                    feeTotalPrice = new BigDecimal(0);
                }else {
                    feeTotalPrice = additionalAmount.multiply(cycle).setScale(3, BigDecimal.ROUND_HALF_UP);
                    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())) {
@@ -1493,7 +1508,7 @@
                if(cycle == null){
                    feeTotalPrice = new BigDecimal(0);
                }else {
                    feeTotalPrice = additionalAmount.multiply(cycle).setScale(3, BigDecimal.ROUND_HALF_UP);
                    feeTotalPrice = additionalAmount.multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                }
            } else if ("4004".equals(computingFormula)) {  //动态费用
                feePrice = new BigDecimal(Double.parseDouble(feeDto.getAmount()));
@@ -1508,7 +1523,7 @@
                if(cycle == null){
                    feeTotalPrice = new BigDecimal(0);
                }else {
                    feeTotalPrice = feePrice.multiply(cycle).setScale(3, BigDecimal.ROUND_HALF_UP);
                    feeTotalPrice = feePrice.multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                }
            } else if ("5005".equals(computingFormula)) {  //(本期度数-上期度数)*单价+附加费
                if (StringUtil.isEmpty(feeDto.getCurDegrees())) {
@@ -1521,7 +1536,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);
                    BigDecimal cycle = null;
@@ -1534,7 +1549,7 @@
                    if(cycle == null){
                        feeTotalPrice = new BigDecimal(0);
                    }else {
                        feeTotalPrice = (sub.multiply(squarePrice).add(additionalAmount)).multiply(cycle).setScale(3, BigDecimal.ROUND_HALF_UP);
                        feeTotalPrice = (sub.multiply(squarePrice).add(additionalAmount)).multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                    }
                }
            } else if ("6006".equals(computingFormula)) {
@@ -1550,7 +1565,7 @@
                if(cycle == null){
                    feeTotalPrice = new BigDecimal(0);
                }else {
                    feeTotalPrice = feePrice.multiply(cycle).setScale(3, BigDecimal.ROUND_HALF_UP);
                    feeTotalPrice = feePrice.multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                }
            } else if ("7007".equals(computingFormula)) { //自定义公式
                feePrice = computeContractCustomizeFormula(feeDto, contractRoomDtos);
@@ -1565,7 +1580,7 @@
                if(cycle == null){
                    feeTotalPrice = new BigDecimal(0);
                }else {
                    feeTotalPrice = feePrice.multiply(cycle).setScale(3, BigDecimal.ROUND_HALF_UP);
                    feeTotalPrice = feePrice.multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                }
            } else if ("8008".equals(computingFormula)) {  //手动动态费用
                feePrice = new BigDecimal(Double.parseDouble(feeDto.getAmount()));
@@ -1580,7 +1595,7 @@
                if(cycle == null){
                    feeTotalPrice = new BigDecimal(0);
                }else {
                    feeTotalPrice = feePrice.multiply(cycle).setScale(3, BigDecimal.ROUND_HALF_UP);
                    feeTotalPrice = feePrice.multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                }
            } else if ("9009".equals(computingFormula)) {  //(本期度数-上期度数)*动态单价+附加费
                if (StringUtil.isEmpty(feeDto.getCurDegrees())) {
@@ -1593,7 +1608,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);
                    BigDecimal cycle = null;
                    if (!StringUtil.isEmpty(feeDto.getCycle())) {
@@ -1605,7 +1620,7 @@
                    if(cycle == null){
                        feeTotalPrice = new BigDecimal(0);
                    }else {
                        feeTotalPrice = sub.multiply(squarePrice).add(additionalAmount).multiply(cycle).setScale(3, BigDecimal.ROUND_HALF_UP);
                        feeTotalPrice = sub.multiply(squarePrice).add(additionalAmount).multiply(cycle).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
                    }
                }
            } else {
@@ -1613,7 +1628,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;
@@ -1709,6 +1724,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();
@@ -1726,6 +1746,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")) {// 处理 房屋系数
@@ -1925,19 +1952,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;
    }
@@ -2198,16 +2225,16 @@
        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())) {
                    feeDto.setRateStartTime(tmpFeeAttrDto.getValue());
                    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) {
@@ -2233,7 +2260,7 @@
        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());
@@ -2247,21 +2274,31 @@
        BigDecimal lastRateAmountDec = null;
        double curCycle = 0;
        BigDecimal curAmount = null; // 当期金额
        Date curEndTime = null;
        for (int cycleIndex = 0; cycleIndex < maxCycle; cycleIndex++) {
            //当期增长部分
            rateDec = preCycleAmount.multiply(new BigDecimal(rate)).setScale(2, BigDecimal.ROUND_HALF_UP);
            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.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);
                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;
            }
            //本期金额
            curAmount = rateDec.add(preCycleAmount);// 增长部分 + 上本期费用
            addTotalAmount = addTotalAmount.add(curAmount); // 计入总的 费用中
            //如果计费起始时间 大于 递增开始时间 那么本轮 不计入
            if(feeDto.getEndTime().getTime()< curEndTime.getTime()){
                addTotalAmount = addTotalAmount.add(curAmount); // 计入总的 费用中
            }
            preCycleAmount = curAmount;
        }
        feeDto.setAmountOwed(addTotalAmount.doubleValue() + "");