From 8c066c39b9e5ebc39992f7152bf706acdae00f4a Mon Sep 17 00:00:00 2001
From: wuxw <928255095@qq.com>
Date: 星期五, 31 五月 2024 17:53:10 +0800
Subject: [PATCH] 优化押金退款功能

---
 java110-core/src/main/java/com/java110/core/smo/impl/ComputeFeeSMOImpl.java |  433 ++++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 290 insertions(+), 143 deletions(-)

diff --git a/java110-core/src/main/java/com/java110/core/smo/impl/ComputeFeeSMOImpl.java b/java110-core/src/main/java/com/java110/core/smo/impl/ComputeFeeSMOImpl.java
index d399c86..9bba66a 100755
--- a/java110-core/src/main/java/com/java110/core/smo/impl/ComputeFeeSMOImpl.java
+++ b/java110-core/src/main/java/com/java110/core/smo/impl/ComputeFeeSMOImpl.java
@@ -117,6 +117,47 @@
         computeFeePrice(tmpFeeDto, roomDto);
     }
 
+    /**
+     * 璁惧畾缁撴潫鏃堕棿
+     *
+     * @param feeDto
+     * @param targetEndTime
+     */
+    @Override
+    public void computeEveryOweFeeByTargetEndTime(FeeDto feeDto, String targetEndTime) {
+
+        Date targetEndDate = DateUtil.getDateFromStringB(targetEndTime);
+        double oweMonth = 0;
+        if (feeDto.getEndTime().getTime() > targetEndDate.getTime()) {
+            targetEndDate = feeDto.getEndTime();
+        }
+        if (feeDto.getEndTime().getTime() < targetEndDate.getTime()) {
+            // 鐩爣鍒版湡鏃堕棿 - 鍒版湡鏃堕棿 = 娆犺垂鏈堜唤
+            oweMonth = DateUtil.dayCompare(feeDto.getEndTime(), targetEndDate, true);
+
+        }
+
+        String computingFormula = feeDto.getComputingFormula();
+        Map feePriceAll = getFeePrice(feeDto, null);
+        feeDto.setFeePrice(Double.parseDouble(feePriceAll.get("feePrice").toString()));
+
+        BigDecimal price = new BigDecimal(feeDto.getFeePrice());
+        price = price.multiply(new BigDecimal(oweMonth));
+        feeDto.setFeeTotalPrice(price.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
+        feeDto.setDeadlineTime(targetEndDate);
+
+        //鍔ㄦ�佽垂鐢�
+        if ("4004".equals(computingFormula)
+                && FeeDto.FEE_FLAG_ONCE.equals(feeDto.getFeeFlag())
+                && !FeeDto.STATE_FINISH.equals(feeDto.getState())) {
+            feeDto.setAmountOwed(feeDto.getFeeTotalPrice() + "");
+            //feeDto.setDeadlineTime(DateUtil.getCurrentDate()); 娆犺垂鏃ユ湡涓嶅鍏堟敞閲�
+        }
+
+        //todo 鑰冭檻绉熼噾閫掑
+        dealRentRate(feeDto);
+    }
+
 
     /**
      * 璁$畻娆犺垂閲戦
@@ -158,54 +199,6 @@
     }
 
     private void computeFeePrice(FeeDto feeDto, RoomDto roomDto) {
-
-        if (FeeDto.PAYER_OBJ_TYPE_ROOM.equals(feeDto.getPayerObjType())) { //鎴垮眿鐩稿叧
-            computeFeePriceByRoom(feeDto, roomDto);
-        } else if (FeeDto.PAYER_OBJ_TYPE_CAR.equals(feeDto.getPayerObjType())) {//杞︿綅鐩稿叧
-            computeFeePriceByParkingSpace(feeDto);
-        } else if (FeeDto.PAYER_OBJ_TYPE_CONTRACT.equals(feeDto.getPayerObjType())) { //鎴垮眿鐩稿叧
-            computeFeePriceByContract(feeDto, roomDto);
-        }
-    }
-
-    private void computeFeePriceByParkingSpace(FeeDto feeDto) {
-        Map<String, Object> targetEndDateAndOweMonth = getTargetEndDateAndOweMonth(feeDto);
-        Date targetEndDate = (Date) targetEndDateAndOweMonth.get("targetEndDate");
-        double oweMonth = (double) targetEndDateAndOweMonth.get("oweMonth");
-        OwnerCarDto ownerCarDto = new OwnerCarDto();
-        ownerCarDto.setCommunityId(feeDto.getCommunityId());
-        ownerCarDto.setCarId(feeDto.getPayerObjId());
-        List<OwnerCarDto> ownerCarDtos = ownerCarInnerServiceSMOImpl.queryOwnerCars(ownerCarDto);
-
-        if (ownerCarDtos == null || ownerCarDtos.size() < 1) { //鏁版嵁鏈夐棶棰�
-            return;
-        }
-
-        String computingFormula = feeDto.getComputingFormula();
-        Map feePriceAll = getFeePrice(feeDto);
-
-        feeDto.setFeePrice(Double.parseDouble(feePriceAll.get("feePrice").toString()));
-        BigDecimal price = new BigDecimal(feeDto.getFeePrice());
-        price = price.multiply(new BigDecimal(oweMonth));
-        feeDto.setFeeTotalPrice(price.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
-        feeDto.setDeadlineTime(targetEndDate);
-
-        //鍔ㄦ�佽垂鐢�
-        if ("4004".equals(computingFormula)
-                && FeeDto.FEE_FLAG_ONCE.equals(feeDto.getFeeFlag())
-                && !FeeDto.STATE_FINISH.equals(feeDto.getState())) {
-            feeDto.setAmountOwed(feeDto.getFeeTotalPrice() + "");
-            //feeDto.setDeadlineTime(DateUtil.getCurrentDate()); 娆犺垂鏃ユ湡涓嶅鍏堟敞閲�
-        }
-
-    }
-
-    /**
-     * 鏍规嵁鎴垮眿鏉ョ畻鍗曚环
-     *
-     * @param feeDto
-     */
-    private void computeFeePriceByRoom(FeeDto feeDto, RoomDto roomDto) {
         Map<String, Object> targetEndDateAndOweMonth = getTargetEndDateAndOweMonth(feeDto);
         Date targetEndDate = (Date) targetEndDateAndOweMonth.get("targetEndDate");
         double oweMonth = (double) targetEndDateAndOweMonth.get("oweMonth");
@@ -213,7 +206,7 @@
         String computingFormula = feeDto.getComputingFormula();
         Map feePriceAll = getFeePrice(feeDto, roomDto);
         feeDto.setFeePrice(Double.parseDouble(feePriceAll.get("feePrice").toString()));
-        //double month = dayCompare(feeDto.getEndTime(), DateUtil.getCurrentDate());
+
         BigDecimal price = new BigDecimal(feeDto.getFeePrice());
         price = price.multiply(new BigDecimal(oweMonth));
         feeDto.setFeeTotalPrice(price.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
@@ -227,36 +220,8 @@
             //feeDto.setDeadlineTime(DateUtil.getCurrentDate()); 娆犺垂鏃ユ湡涓嶅鍏堟敞閲�
         }
 
-        //鑰冭檻绉熼噾閫掑
+        //todo 鑰冭檻绉熼噾閫掑
         dealRentRate(feeDto);
-    }
-
-    /**
-     * 鏍规嵁鎴垮眿鏉ョ畻鍗曚环
-     *
-     * @param feeDto
-     */
-    private void computeFeePriceByContract(FeeDto feeDto, RoomDto roomDto) {
-        Map<String, Object> targetEndDateAndOweMonth = getTargetEndDateAndOweMonth(feeDto);
-        Date targetEndDate = (Date) targetEndDateAndOweMonth.get("targetEndDate");
-        double oweMonth = (double) targetEndDateAndOweMonth.get("oweMonth");
-
-        String computingFormula = feeDto.getComputingFormula();
-        Map feePriceAll = getFeePrice(feeDto, roomDto);
-        feeDto.setFeePrice(Double.parseDouble(feePriceAll.get("feePrice").toString()));
-        //double month = dayCompare(feeDto.getEndTime(), DateUtil.getCurrentDate());
-        BigDecimal price = new BigDecimal(feeDto.getFeePrice());
-        price = price.multiply(new BigDecimal(oweMonth));
-        feeDto.setFeeTotalPrice(price.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
-        feeDto.setDeadlineTime(targetEndDate);
-
-        //鍔ㄦ�佽垂鐢�
-        if ("4004".equals(computingFormula)
-                && FeeDto.FEE_FLAG_ONCE.equals(feeDto.getFeeFlag())
-                && !FeeDto.STATE_FINISH.equals(feeDto.getState())) {
-            feeDto.setAmountOwed(feeDto.getFeeTotalPrice() + "");
-            //feeDto.setDeadlineTime(DateUtil.getCurrentDate()); 娆犺垂鏃ユ湡涓嶅鍏堟敞閲�
-        }
     }
 
 
@@ -525,7 +490,7 @@
             parkingSpaceDto.setCommunityId(feeDto.getCommunityId());
             parkingSpaceDto.setPsId(ownerCarDtos.get(0).getPsId());
             List<ParkingSpaceDto> parkingSpaceDtos = parkingSpaceInnerServiceSMOImpl.queryParkingSpaces(parkingSpaceDto);
-            if (parkingSpaceDtos == null || parkingSpaceDtos.size() < 1) { //鏁版嵁鏈夐棶棰�
+            if (ListUtil.isNull(parkingSpaceDtos)) { //鏁版嵁鏈夐棶棰�
                 return objName;
             }
             objName = objName + "-" + parkingSpaceDtos.get(0).getAreaNum() + "鍋滆溅鍦�" + "-" + parkingSpaceDtos.get(0).getNum() + "杞︿綅";
@@ -541,6 +506,19 @@
 
         }
         return objName;
+    }
+
+    @Override
+    public OwnerDto getFeeOwnerDto(String feeId) {
+
+        FeeDto feeDto = new FeeDto();
+        feeDto.setFeeId(feeId);
+        List<FeeDto> feeDtos = feeInnerServiceSMOImpl.queryFees(feeDto);
+
+        Assert.listOnlyOne(feeDtos, "璐圭敤涓嶅瓨鍦�");
+        feeDtos.get(0).setFeeAttrDtos(null); // todo 杩欓噷璁剧疆涓虹┖锛屼笉瑕佷粠灞炴�т腑鏌ヤ互闃叉暟鎹湁闂瀵艰嚧鏈夐棶棰�
+
+        return getFeeOwnerDto(feeDtos.get(0));
     }
 
     @Override
@@ -594,7 +572,7 @@
     private OwnerDto getOwnerDtoByFeeAttr(FeeDto feeDto) {
         List<FeeAttrDto> feeAttrDtos = feeDto.getFeeAttrDtos();
 
-        if (feeAttrDtos == null || feeAttrDtos.size() < 1) {
+        if (ListUtil.isNull(feeAttrDtos)) {
             return null;
         }
 
@@ -785,9 +763,6 @@
         Calendar endCalender = Calendar.getInstance();
         endCalender.setTime(endTime);
         endCalender.add(Calendar.MONTH, new Double(Math.floor(cycle)).intValue());
-//        Calendar futureDate = Calendar.getInstance();
-//        futureDate.setTime(endCalender.getTime());
-//        futureDate.add(Calendar.MONTH, 1);
         int futureDay = endCalender.getActualMaximum(Calendar.DAY_OF_MONTH);
         int hours = new Double((cycle - Math.floor(cycle)) * futureDay * 24).intValue();
         endCalender.add(Calendar.HOUR, hours);
@@ -801,16 +776,15 @@
             } else {
                 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());
-            }
         } else {
-            if ((endCalender.getTime()).after(feeDto.getConfigEndTime())) {
-                endCalender.setTime(feeDto.getConfigEndTime());
+            Date deadLineTime = feeDto.getDeadlineTime();
+            if (deadLineTime == null) {
+                deadLineTime = feeDto.getConfigEndTime();
+            }
+            if ((endCalender.getTime()).after(deadLineTime)) {
+                endCalender.setTime(feeDto.getDeadlineTime());
+            } else {
+                endCalender.add(Calendar.SECOND, -1);
             }
         }
 
@@ -1704,7 +1678,10 @@
         Date preEndTime = preEndTimeCal.getTime();
 
         //todo 褰撳墠璐圭敤涓轰竴娆℃�ц垂鐢�
-        Date maxEndTime = feeDto.getConfigEndTime();
+        Date maxEndTime = feeDto.getDeadlineTime();
+        if (maxEndTime == null) {
+            maxEndTime = feeDto.getConfigEndTime();
+        }
         if (FeeDto.FEE_FLAG_ONCE.equals(feeDto.getFeeFlag())) {
             //鍏堝彇 deadlineTime
             if (feeDto.getDeadlineTime() != null) {
@@ -1717,15 +1694,16 @@
                 targetEndDate = feeDto.getImportFeeEndTime();
             }
             //璇存槑娆犺垂
-            if (preEndTime.getTime() < DateUtil.getCurrentDate().getTime()) {
+            if (preEndTime.getTime() <= DateUtil.getCurrentDate().getTime()) {
                 // 鐩爣鍒版湡鏃堕棿 - 鍒版湡鏃堕棿 = 娆犺垂鏈堜唤
                 oweMonth = 1.0;
             }
 
-        } else if (FeeDto.FEE_FLAG_CYCLE_ONCE.equals(feeDto.getFeeFlag())) {
-            if (feeDto.getDeadlineTime() != null) {
-                maxEndTime = feeDto.getDeadlineTime();
+            //todo 杩欓噷鑰冭檻 璐﹀崟妯″紡鐨勫満鏅�
+            if (StringUtil.isNumber(feeDto.getMonthCycle())) {
+                oweMonth = Integer.parseInt(feeDto.getMonthCycle());
             }
+        } else {
             Date billEndTime = DateUtil.getCurrentDate();
             //寤鸿处鏃堕棿
             Date startDate = feeDto.getStartTime();
@@ -1753,7 +1731,6 @@
             ) {
                 targetEndDate = getTargetEndTime((round + 1) * paymentCycle, startDate);//鐩爣缁撴潫鏃堕棿
             }
-
 
             //todo 璐圭敤椤圭殑缁撴潫鏃堕棿<缂磋垂鐨勭粨鏉熸椂闂�  璐圭敤蹇粨鏉熶簡   鍙栬垂鐢ㄩ」鐨勭粨鏉熸椂闂�
             if (maxEndTime.getTime() < targetEndDate.getTime()) {
@@ -1762,50 +1739,7 @@
             //璇存槑娆犺垂
             if (endDate.getTime() < targetEndDate.getTime()) {
                 // 鐩爣鍒版湡鏃堕棿 - 鍒版湡鏃堕棿 = 娆犺垂鏈堜唤
-                oweMonth = DateUtil.dayCompare(endDate, targetEndDate);
-            }
-
-            if (feeDto.getEndTime().getTime() > targetEndDate.getTime()) {
-                targetEndDate = feeDto.getEndTime();
-            }
-        } else { // todo 鍛ㄦ湡鎬ц垂鐢�
-            //褰撳墠鏃堕棿
-            Date billEndTime = DateUtil.getCurrentDate();
-            //寤鸿处鏃堕棿
-            Date startDate = feeDto.getStartTime();
-            //璁¤垂璧峰鏃堕棿
-            Date endDate = feeDto.getEndTime();
-            //缂磋垂鍛ㄦ湡
-            long paymentCycle = Long.parseLong(feeDto.getPaymentCycle());
-            // 褰撳墠鏃堕棿 - 寮�濮嬫椂闂�  = 鏈堜唤
-            double mulMonth = 0.0;
-            mulMonth = DateUtil.dayCompare(startDate, billEndTime);
-
-            // 鏈堜唤/ 鍛ㄦ湡 = 杞暟锛堝悜涓婂彇鏁达級
-            double round = 0.0;
-            if ("1200".equals(feeDto.getPaymentCd())) { // 1200棰勪粯璐�
-                round = Math.floor(mulMonth / paymentCycle) + 1;
-            } else { //2100鍚庝粯璐�
-                round = Math.floor(mulMonth / paymentCycle);
-            }
-            // 杞暟 * 鍛ㄦ湡 * 30 + 寮�濮嬫椂闂� = 鐩爣 鍒版湡鏃堕棿
-            targetEndDate = getTargetEndTime(round * paymentCycle, startDate);//鐩爣缁撴潫鏃堕棿
-
-            //todo 濡傛灉 鍒颁簡 棰勪粯鏈� 浜х敓涓嬩釜鍛ㄦ湡鐨勮垂鐢�
-            if (DateUtil.getFormatTimeStringB(targetEndDate).equals(DateUtil.getFormatTimeStringB(endDate))
-                    && DateUtil.getCurrentDate().getTime() > preEndTime.getTime()
-            ) {
-                targetEndDate = getTargetEndTime((round + 1) * paymentCycle, startDate);//鐩爣缁撴潫鏃堕棿
-            }
-
-            //璐圭敤椤圭殑缁撴潫鏃堕棿<缂磋垂鐨勭粨鏉熸椂闂�  璐圭敤蹇粨鏉熶簡   鍙栬垂鐢ㄩ」鐨勭粨鏉熸椂闂�
-            if (maxEndTime.getTime() < targetEndDate.getTime()) {
-                targetEndDate = maxEndTime;
-            }
-            //璇存槑娆犺垂
-            if (endDate.getTime() < targetEndDate.getTime()) {
-                // 鐩爣鍒版湡鏃堕棿 - 鍒版湡鏃堕棿 = 娆犺垂鏈堜唤
-                oweMonth = DateUtil.dayCompare(endDate, targetEndDate);
+                oweMonth = DateUtil.dayCompare(endDate, targetEndDate, true);
             }
 
             if (feeDto.getEndTime().getTime() > targetEndDate.getTime()) {
@@ -1919,11 +1853,13 @@
         endDate.add(Calendar.MONTH, intMonth.intValue());
         double doubleMonth = month - intMonth;
         if (doubleMonth <= 0) {
+            endDate.add(Calendar.SECOND, -1);
             return endDate.getTime();
         }
         int futureDay = endDate.getActualMaximum(Calendar.DAY_OF_MONTH);
         Double hour = doubleMonth * futureDay * 24;
         endDate.add(Calendar.HOUR_OF_DAY, hour.intValue());
+        endDate.add(Calendar.SECOND, -1);
         return endDate.getTime();
     }
 
@@ -2160,6 +2096,216 @@
         feeAttrDto.setCommunityId(feeDto.getCommunityId());
         List<FeeAttrDto> feeAttrDtos = feeAttrInnerServiceSMOImpl.queryFeeAttrs(feeAttrDto);
 
+        if (ListUtil.isNull(feeAttrDtos)) {
+            return;
+        }
+        int rateCycle = 0;
+        double rate = 0.0;
+        Date rateStartTime = null;
+        try {
+            for (FeeAttrDto tmpFeeAttrDto : feeAttrDtos) {
+                if (FeeAttrDto.SPEC_CD_RATE.equals(tmpFeeAttrDto.getSpecCd())) {
+                    feeDto.setRate(tmpFeeAttrDto.getValue().trim());
+                    rate = Double.parseDouble(tmpFeeAttrDto.getValue().trim());
+                }
+                if (FeeAttrDto.SPEC_CD_RATE_CYCLE.equals(tmpFeeAttrDto.getSpecCd())) {
+                    feeDto.setRateCycle(tmpFeeAttrDto.getValue().trim());
+                    rateCycle = Integer.parseInt(tmpFeeAttrDto.getValue().trim());
+                }
+                if (FeeAttrDto.SPEC_CD_RATE_START_TIME.equals(tmpFeeAttrDto.getSpecCd())) {
+                    feeDto.setRateStartTime(tmpFeeAttrDto.getValue().trim());
+                    rateStartTime = DateUtil.getDateFromString(tmpFeeAttrDto.getValue().trim(), DateUtil.DATE_FORMATE_STRING_B);
+                }
+            }
+        } catch (Exception e) {
+            logger.error("绉熼噾閫掑寮傚父", e);
+            return;
+        }
+
+        if (!FeeDto.STATE_DOING.equals(feeDto.getState())) {
+            return;
+        }
+
+        if (rateCycle == 0 || rate == 0) {
+            return;
+        }
+
+        if (feeDto.getDeadlineTime().getTime() <= rateStartTime.getTime()) {
+            return;
+        }
+
+        Date oRateStartTime = rateStartTime;
+        //todo 閫掑鏃堕棿 涓嶆槸 璐圭敤寤鸿处鏃堕棿鐨勫�嶆暟鏃讹紝淇涓�涓�
+        rateStartTime = correctByFeeStartTime(rateStartTime, feeDto.getStartTime());
+
+        BigDecimal addTotalAmount = new BigDecimal("0");
+        double curOweMonth = 0;
+        BigDecimal curFeePrice = new BigDecimal(feeDto.getFeePrice());
+
+        //todo 閫掑鏈疆娆犺垂寮�濮嬫椂闂�
+        Date curOweStartTime = null;
+        // todo 濡傛灉璁¤垂璧峰鏃堕棿 灏忎簬 閫掑寮�濮嬫椂闂�
+        if (feeDto.getEndTime().getTime() < rateStartTime.getTime()) {
+            //todo 閫掑鍓嶇殑娆犺垂
+            curOweMonth = DateUtil.dayCompare(feeDto.getEndTime(), rateStartTime);
+            addTotalAmount = curFeePrice.multiply(new BigDecimal(curOweMonth)).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
+            // todo 閫掑
+            curOweStartTime = rateStartTime;
+        } else {
+            // todo 閫掑
+            curOweStartTime = feeDto.getEndTime();
+        }
+        double rateMonth = DateUtil.dayCompare(rateStartTime, feeDto.getDeadlineTime());
+
+        // todo 鏈�澶у懆鏈� 閫掑杞暟
+        double maxCycle = Math.ceil(rateMonth / rateCycle);
+
+        // todo 澧為暱鍓嶇殑娆犺垂
+        BigDecimal rateDec = new BigDecimal(rate + "");
+        BigDecimal oweAmountDec = null;
+        //todo 閫掑杞暟 寰幆 curFeePrice 杩欎釜鏄� 鍘熷绉熼噾
+        BigDecimal oldFeePrice = null;
+        for (int cycleIndex = 0; cycleIndex < maxCycle; cycleIndex++) {
+            //todo 閫掑鏈堝崟浠�
+            oldFeePrice = curFeePrice;
+            curFeePrice = new BigDecimal("1").add(rateDec).multiply(curFeePrice).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
+
+            //todo 璁$畻 curCycleRateEneTime 鏈疆閫掑缁撴潫鏃堕棿
+            Date curCycleRateEneTime = DateUtil.stepMonth(rateStartTime, (cycleIndex + 1) * rateCycle);
+
+            //todo 璇存槑杩欎釜宸茬粡缂磋垂浜�
+            if (curOweStartTime.getTime() > curCycleRateEneTime.getTime()) {
+                continue;
+            }
+            //todo 鏈疆 娆犺垂寮�濮嬫椂闂村ぇ浜� deadlineTime 璺宠繃
+            if (curOweStartTime.getTime() >= feeDto.getDeadlineTime().getTime()) {
+                continue;
+            }
+
+            boolean hasInRateMonth = false;
+            //todo 鏈疆閫掑鏃堕棿鏈埌 璐圭敤deadlineTime
+            if (curCycleRateEneTime.getTime() < feeDto.getDeadlineTime().getTime()) {
+                curOweMonth = DateUtil.dayCompare(curOweStartTime, curCycleRateEneTime);
+                hasInRateMonth = rateStartMonthIn(oRateStartTime, curOweStartTime, curCycleRateEneTime);
+                curOweStartTime = curCycleRateEneTime;
+            } else {
+                curOweMonth = DateUtil.dayCompare(curOweStartTime, feeDto.getDeadlineTime());
+                hasInRateMonth = rateStartMonthIn(oRateStartTime, curOweStartTime, feeDto.getDeadlineTime());
+
+                curOweStartTime = feeDto.getDeadlineTime();
+            }
+
+            oweAmountDec = curFeePrice.multiply(new BigDecimal(curOweMonth)).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
+
+            if (hasInRateMonth) {
+                //todo 閫掑鏈堝鏋滃缓璐︽椂闂村拰閫掑鏃ユ湡涓嶄竴鑷达紝閭d箞鍑忓幓寤鸿处鏃堕棿鏃ヨ嚦 閫掑鏃ョ殑閫掑閮ㄥ垎
+                int moreComputeDay = getRateDay(feeDto.getStartTime(), oRateStartTime);
+                BigDecimal moreComputeAmountDec = oldFeePrice.multiply(rateDec).divide(new BigDecimal(DateUtil.getMonthDay(oRateStartTime)), FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(moreComputeDay));
+                oweAmountDec = oweAmountDec.subtract(moreComputeAmountDec);
+            }
+
+            addTotalAmount = addTotalAmount.add(oweAmountDec);
+        }
+
+        Double amountOwed = MoneyUtil.computePriceScale(addTotalAmount.doubleValue(), feeDto.getScale(), Integer.parseInt(feeDto.getDecimalPlace()));
+        feeDto.setAmountOwed(amountOwed + "");
+        feeDto.setFeeTotalPrice(amountOwed);
+    }
+
+    /**
+     * 閫掑鏈堝湪杩欎釜涔嬮棿
+     *
+     * @param oRateStartTime
+     * @param startTime
+     * @param endTime
+     * @return
+     */
+    private boolean rateStartMonthIn(Date oRateStartTime, Date startTime, Date endTime) {
+
+        Calendar calendarStartTime = Calendar.getInstance();
+        calendarStartTime.setTime(startTime);
+        calendarStartTime.set(Calendar.DAY_OF_MONTH, 1);
+
+        Calendar calendarEndTime = Calendar.getInstance();
+        calendarEndTime.setTime(endTime);
+        //calendarEndTime.set(Calendar.DAY_OF_MONTH,1);
+
+
+        Calendar calendarOrate = Calendar.getInstance();
+        calendarOrate.setTime(oRateStartTime);
+        calendarOrate.set(Calendar.YEAR, calendarStartTime.get(Calendar.YEAR));
+
+        if (calendarStartTime.getTime().before(calendarOrate.getTime()) && calendarEndTime.getTime().after(calendarOrate.getTime())) {
+            return true;
+        }
+
+        calendarOrate.set(Calendar.YEAR, calendarEndTime.get(Calendar.YEAR));
+
+        if (calendarStartTime.getTime().before(calendarOrate.getTime()) && calendarEndTime.getTime().after(calendarOrate.getTime())) {
+            return true;
+        }
+
+
+        return false;
+
+    }
+
+    private int getRateDay(Date startTime, Date rateStartTime) {
+        Calendar rateCalendar = Calendar.getInstance();
+        rateCalendar.setTime(rateStartTime);
+        int rateDay = rateCalendar.get(Calendar.DAY_OF_MONTH);
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(startTime);
+        int day = calendar.get(Calendar.DAY_OF_MONTH);
+        if (rateDay == day || rateDay < day) {
+            return 0;
+        }
+        return rateDay - day;
+    }
+
+    /**
+     * 淇閫掑 寮�濮嬫椂闂�
+     * 濡傛灉璁剧疆鐨� 閫掑寮�濮嬫椂闂村拰寤鸿处鏃堕棿涓嶆槸鍚屼竴澶� 寮哄埗淇涓�
+     *
+     * @param rateStartTime
+     * @param startTime
+     * @return
+     */
+    private Date correctByFeeStartTime(Date rateStartTime, Date startTime) {
+        Calendar rateCalendar = Calendar.getInstance();
+        rateCalendar.setTime(rateStartTime);
+        int rateDay = rateCalendar.get(Calendar.DAY_OF_MONTH);
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(startTime);
+        int day = calendar.get(Calendar.DAY_OF_MONTH);
+        if (rateDay == day) {
+            return rateStartTime;
+        }
+
+        rateCalendar = Calendar.getInstance();
+        rateCalendar.setTime(rateStartTime);
+        //rateCalendar.add(Calendar.MONTH, 1);
+        rateCalendar.set(Calendar.DAY_OF_MONTH, day);
+        return rateCalendar.getTime();
+    }
+
+
+    /**
+     * 绉熼噾澶勭悊
+     *
+     * @param feeDto
+     */
+    public void dealRentRateOLd(FeeDto feeDto) {
+        if (!FeeConfigDto.COMPUTING_FORMULA_RANT_RATE.equals(feeDto.getComputingFormula())) {
+            return;
+        }
+
+        //鏌ヨ閫掑淇℃伅
+        FeeAttrDto feeAttrDto = new FeeAttrDto();
+        feeAttrDto.setFeeId(feeDto.getFeeId());
+        feeAttrDto.setCommunityId(feeDto.getCommunityId());
+        List<FeeAttrDto> feeAttrDtos = feeAttrInnerServiceSMOImpl.queryFeeAttrs(feeAttrDto);
+
         if (feeAttrDtos == null || feeAttrDtos.size() < 1) {
             return;
         }
@@ -2216,9 +2362,10 @@
         }
         double rateMonth = DateUtil.dayCompare(rateStartTime, feeDto.getDeadlineTime());
 
-        // todo 鏈�澶у懆鏈�
+        // todo 鏈�澶у懆鏈� 閫掑杞暟
         double maxCycle = Math.ceil(rateMonth / rateCycle);
 
+
         // todo 澧為暱鍓嶇殑娆犺垂
         BigDecimal addTotalAmount = oweAmountDec;
         // todo 閫掑鍛ㄦ湡鍐呯殑 鏈�掑璐圭敤

--
Gitblit v1.8.0