From 05683f2b2bdbdbe21cf17ad523c21ab338bd1c54 Mon Sep 17 00:00:00 2001
From: wuxw <928255095@qq.com>
Date: 星期二, 19 七月 2022 21:49:55 +0800
Subject: [PATCH] 优化添加设备 功能

---
 java110-core/src/main/java/com/java110/core/smo/impl/ComputeFeeSMOImpl.java |  168 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 161 insertions(+), 7 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 5393533..f331270 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
@@ -20,6 +20,7 @@
 import com.java110.intf.community.ICommunityInnerServiceSMO;
 import com.java110.intf.community.IParkingSpaceInnerServiceSMO;
 import com.java110.intf.community.IRoomInnerServiceSMO;
+import com.java110.intf.fee.IFeeAttrInnerServiceSMO;
 import com.java110.intf.fee.IFeeInnerServiceSMO;
 import com.java110.intf.fee.ITempCarFeeConfigAttrInnerServiceSMO;
 import com.java110.intf.fee.ITempCarFeeConfigInnerServiceSMO;
@@ -64,6 +65,9 @@
 
     @Autowired(required = false)
     private IFeeInnerServiceSMO feeInnerServiceSMOImpl;
+
+    @Autowired(required = false)
+    private IFeeAttrInnerServiceSMO feeAttrInnerServiceSMOImpl;
 
     @Autowired(required = false)
     private IRoomInnerServiceSMO roomInnerServiceSMOImpl;
@@ -283,6 +287,9 @@
             } else if ("1101".equals(computingFormula)) { // 绉熼噾
                 feeReceiptDetailPo.setArea("");
                 feeReceiptDetailPo.setSquarePrice(roomDto.getRoomRent());
+            }  else if ("1102".equals(computingFormula)) { // 绉熼噾
+                feeReceiptDetailPo.setArea("");
+                feeReceiptDetailPo.setSquarePrice(roomDto.getRoomRent());
             } else if ("4004".equals(computingFormula)) {
             } else if ("5005".equals(computingFormula)) {
                 if (StringUtil.isEmpty(feeDto.getCurDegrees())) {
@@ -318,7 +325,10 @@
             } else if ("1101".equals(computingFormula)) { //绉熼噾
                 feeReceiptDetailPo.setArea(roomDtos.get(0).getBuiltUpArea());
                 feeReceiptDetailPo.setSquarePrice(roomDtos.get(0).getRoomRent());
-            } else {
+            } else if ("1102".equals(computingFormula)) { //绉熼噾
+                feeReceiptDetailPo.setArea(roomDtos.get(0).getBuiltUpArea());
+                feeReceiptDetailPo.setSquarePrice(roomDtos.get(0).getRoomRent());
+            }else {
             }
         } else if (FeeDto.PAYER_OBJ_TYPE_CAR.equals(feeDto.getPayerObjType())) {//杞︿綅鐩稿叧
             String computingFormula = feeDto.getComputingFormula();
@@ -344,6 +354,9 @@
                 feeReceiptDetailPo.setArea("");
                 feeReceiptDetailPo.setSquarePrice("0");
             } else if ("1101".equals(computingFormula)) { // 绉熼噾
+                feeReceiptDetailPo.setArea("");
+                feeReceiptDetailPo.setSquarePrice("0");
+            } else if ("1102".equals(computingFormula)) { // 绉熼噾锛堥�掑锛�
                 feeReceiptDetailPo.setArea("");
                 feeReceiptDetailPo.setSquarePrice("0");
             } else if ("4004".equals(computingFormula)) {
@@ -421,9 +434,16 @@
                 for (ContractRoomDto tmpContractRoomDto : contractRoomDtos) {
                     builtUpArea = builtUpArea.add(new BigDecimal(Double.parseDouble(tmpContractRoomDto.getRoomRent())));
                 }
-                feeReceiptDetailPo.setArea(builtUpArea.doubleValue() + "");
-                feeReceiptDetailPo.setSquarePrice(feeDto.getSquarePrice() + "/" + feeDto.getAdditionalAmount());
-            } else if ("4004".equals(computingFormula)) {
+                feeReceiptDetailPo.setArea("");
+                feeReceiptDetailPo.setSquarePrice(builtUpArea.doubleValue() + "");
+            } else if ("1102".equals(computingFormula)) { // 绉熼噾
+                BigDecimal builtUpArea = new BigDecimal(0);
+                for (ContractRoomDto tmpContractRoomDto : contractRoomDtos) {
+                    builtUpArea = builtUpArea.add(new BigDecimal(Double.parseDouble(tmpContractRoomDto.getRoomRent())));
+                }
+                feeReceiptDetailPo.setArea("");
+                feeReceiptDetailPo.setSquarePrice(builtUpArea.doubleValue() + "");
+            }else if ("4004".equals(computingFormula)) {
             } else if ("5005".equals(computingFormula)) {
                 if (StringUtil.isEmpty(feeDto.getCurDegrees())) {
                 } else {
@@ -821,6 +841,9 @@
             } else if ("1101".equals(computingFormula)) { // 绉熼噾
                 BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(tmpReportFeeDto.getRoomRent()));
                 feePrice = additionalAmount.setScale(3, BigDecimal.ROUND_HALF_UP);
+            }  else if ("1102".equals(computingFormula)) { // 绉熼噾
+                BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(tmpReportFeeDto.getRoomRent()));
+                feePrice = additionalAmount.setScale(3, BigDecimal.ROUND_HALF_UP);
             } else if ("4004".equals(computingFormula)) {
                 feePrice = new BigDecimal(Double.parseDouble(tmpReportFeeDto.getAmount()));
             } else if ("5005".equals(computingFormula)) {
@@ -873,7 +896,9 @@
                 feePrice = new BigDecimal(0);
             } else if ("1101".equals(computingFormula)) { // 绉熼噾
                 feePrice = new BigDecimal(0);
-            } else if ("4004".equals(computingFormula)) {
+            }  else if ("1102".equals(computingFormula)) { // 绉熼噾
+                feePrice = new BigDecimal(0);
+            }else if ("4004".equals(computingFormula)) {
                 feePrice = new BigDecimal(Double.parseDouble(tmpReportFeeDto.getAmount()));
             } else if ("5005".equals(computingFormula)) {
                 if (StringUtil.isEmpty(tmpReportFeeDto.getCurDegrees())) {
@@ -1011,6 +1036,13 @@
                     BigDecimal cycle1 = new BigDecimal(feeDto.getCycle());
                     feeTotalPrice = additionalAmount.multiply(cycle1).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);
+                if (!StringUtil.isEmpty(feeDto.getCycle())) {
+                    BigDecimal cycle1 = new BigDecimal(feeDto.getCycle());
+                    feeTotalPrice = additionalAmount.multiply(cycle1).setScale(3, BigDecimal.ROUND_HALF_UP);
+                }
             } else if ("4004".equals(computingFormula)) {  //鍔ㄦ�佽垂鐢�
                 feePrice = new BigDecimal(Double.parseDouble(feeDto.getAmount()));
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
@@ -1125,7 +1157,14 @@
                     BigDecimal cycle1 = new BigDecimal(feeDto.getCycle());
                     feeTotalPrice = additionalAmount.multiply(cycle1).setScale(3, BigDecimal.ROUND_HALF_UP);
                 }
-            } else if ("4004".equals(computingFormula)) {
+            }  else if ("1102".equals(computingFormula)) { // 绉熼噾
+                BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(roomDto.getRoomRent()));
+                feePrice = additionalAmount.setScale(3, BigDecimal.ROUND_HALF_UP);
+                if (!StringUtil.isEmpty(feeDto.getCycle())) {
+                    BigDecimal cycle1 = new BigDecimal(feeDto.getCycle());
+                    feeTotalPrice = additionalAmount.multiply(cycle1).setScale(3, BigDecimal.ROUND_HALF_UP);
+                }
+            }else if ("4004".equals(computingFormula)) {
                 feePrice = new BigDecimal(Double.parseDouble(feeDto.getAmount()));
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
                     BigDecimal cycle1 = new BigDecimal(feeDto.getCycle());
@@ -1225,6 +1264,13 @@
                     feeTotalPrice = (squarePrice.multiply(builtUpArea).add(additionalAmount)).multiply(cycle1).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);
+                if (!StringUtil.isEmpty(feeDto.getCycle())) {
+                    BigDecimal cycle1 = new BigDecimal(feeDto.getCycle());
+                    feeTotalPrice = additionalAmount.multiply(cycle1).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);
                 if (!StringUtil.isEmpty(feeDto.getCycle())) {
@@ -1472,7 +1518,9 @@
             //鍒ゆ柇褰撳墠璐圭敤鏄笉鏄鍏ヨ垂鐢�
             oweMonth = 1.0;
         }else if(FeeDto.FEE_FLAG_CYCLE_ONCE.equals(feeDto.getFeeFlag())){
-            maxEndTime = feeDto.getDeadlineTime();
+            if(feeDto.getDeadlineTime() != null) {
+                maxEndTime = feeDto.getDeadlineTime();
+            }
             Date billEndTime = DateUtil.getCurrentDate();
             //寤鸿处鏃堕棿
             Date startDate = feeDto.getStartTime();
@@ -1820,4 +1868,110 @@
         c.set(year, month, 0); //杈撳叆绫诲瀷涓篿nt绫诲瀷
         return c.get(Calendar.DAY_OF_MONTH);
     }
+
+    /**
+     *
+     * @param feeDto
+     * @param cycle
+     */
+    public void dealRentRateCycle(FeeDto feeDto,double cycle){
+        Date endTime = feeDto.getEndTime();
+        Date date = getTargetEndTime(cycle,endTime);
+        feeDto.setDeadlineTime(date);
+        dealRentRate(feeDto);
+
+    }
+
+    /**
+     * 绉熼噾澶勭悊
+     *
+     * @param feeDto
+     */
+    public void dealRentRate(FeeDto feeDto) {
+        if (!FeeConfigDto.COMPUTING_FORMULA_RANT_RATE.equals(feeDto.getComputingFormula())) {
+            return;
+        }
+
+        //鏌ヨ閫掑淇℃伅
+        FeeAttrDto feeAttrDto = new FeeAttrDto();
+        feeAttrDto.setFeeId(feeDto.getFeeId());
+        feeAttrDto.setCommunityId(feeDto.getCommunityId());
+        List<FeeAttrDto> feeAttrDtos = feeAttrInnerServiceSMOImpl.queryFeeAttrs(feeAttrDto);
+
+        if (feeAttrDtos == null || feeAttrDtos.size() < 1) {
+            return;
+        }
+        int rateCycle = 0;
+        double rate = 0.0;
+        Date rateStartTime = null;
+        try {
+            for (FeeAttrDto tmpFeeAttrDto : feeAttrDtos) {
+                if (FeeAttrDto.SPEC_CD_RATE.equals(tmpFeeAttrDto.getSpecCd())) {
+                    feeDto.setRate(tmpFeeAttrDto.getValue());
+                    rate = Double.parseDouble(tmpFeeAttrDto.getValue());
+                }
+                if (FeeAttrDto.SPEC_CD_RATE_CYCLE.equals(tmpFeeAttrDto.getSpecCd())) {
+                    feeDto.setRateCycle(tmpFeeAttrDto.getValue());
+                    rateCycle = Integer.parseInt(tmpFeeAttrDto.getValue());
+                }
+                if (FeeAttrDto.SPEC_CD_RATE_START_TIME.equals(tmpFeeAttrDto.getSpecCd())) {
+                    feeDto.setRateStartTime(tmpFeeAttrDto.getValue());
+                    rateStartTime = DateUtil.getDateFromString(tmpFeeAttrDto.getValue(), DateUtil.DATE_FORMATE_STRING_B);
+                }
+            }
+        } catch (Exception e) {
+            logger.error("绉熼噾閫掑寮傚父", e);
+            return;
+        }
+
+        if (!FeeDto.STATE_DOING.equals(feeDto.getState())) {
+            return;
+        }
+
+        if (rateCycle == 0 || rate == 0) {
+            return;
+        }
+
+        if (feeDto.getDeadlineTime().getTime() <= rateStartTime.getTime()) {
+            return;
+        }
+
+        BigDecimal oweAmountDec = new BigDecimal(0);
+        //璁$畻 璁¤垂璧峰鏃堕棿 鍒� rateStartTime 鏃剁殑璐圭敤
+        double curOweMonth = 0;
+        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);
+        }
+
+        curOweMonth = dayCompare(rateStartTime, feeDto.getDeadlineTime());
+
+        double maxCycle = Math.floor(curOweMonth / rateCycle);
+
+        //鍩哄噯
+        BigDecimal firstAmount = curFeePrice.multiply(new BigDecimal(rateCycle));
+        BigDecimal preCycleAmount = firstAmount;
+        BigDecimal rateDec = null; //閫掑鍛ㄦ湡鎵�鏀惰垂鐢�
+        BigDecimal lastRateAmountDec = null;
+        double curCycle = 0;
+        for (int cycleIndex = 0; cycleIndex < maxCycle; maxCycle++) {
+            rateDec = preCycleAmount.multiply(new BigDecimal(rate)).setScale(2, BigDecimal.ROUND_HALF_UP);
+            //澧為暱鍛ㄦ湡鐨勫�嶆暟
+            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);
+                firstAmount = firstAmount.add(rateDec).add(lastRateAmountDec);
+                continue;
+            }
+            firstAmount = firstAmount.add(rateDec).add(preCycleAmount);
+            preCycleAmount = preCycleAmount.add(rateDec);
+        }
+
+        firstAmount = firstAmount.add(oweAmountDec);
+        feeDto.setAmountOwed(firstAmount.doubleValue() + "");
+        feeDto.setFeeTotalPrice(firstAmount.doubleValue());
+    }
 }
+

--
Gitblit v1.8.0