From 188d1158534a811e963270bdb0afe5939dcfc049 Mon Sep 17 00:00:00 2001
From: java110 <928255095@qq.com>
Date: 星期四, 03 九月 2020 18:19:06 +0800
Subject: [PATCH] 优化代码

---
 service-job/src/main/java/com/java110/job/task/fee/GenerateBillProTemplate.java |  157 +++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 112 insertions(+), 45 deletions(-)

diff --git a/service-job/src/main/java/com/java110/job/task/fee/GenerateBillProTemplate.java b/service-job/src/main/java/com/java110/job/task/fee/GenerateBillProTemplate.java
index 038339f..aa2a4fe 100644
--- a/service-job/src/main/java/com/java110/job/task/fee/GenerateBillProTemplate.java
+++ b/service-job/src/main/java/com/java110/job/task/fee/GenerateBillProTemplate.java
@@ -25,9 +25,7 @@
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 
 /**
  * @ClassName GenerateOwnerBillTemplate
@@ -198,34 +196,21 @@
         // 鐩爣鍒版湡鏃堕棿 - 鍒版湡鏃堕棿 = 娆犺垂鏈堜唤
         // 鏈堜唤 * 姣忔湀鍗曚环 = 娆犺垂閲戦
 
+        Map<String, Object> targetEndDateAndOweMonth = getTargetEndDateAndOweMonth(feeDto);
+        Date targetEndDate = (Date) targetEndDateAndOweMonth.get("targetEndDate");
+        double oweMonth = (double) targetEndDateAndOweMonth.get("oweMonth");
+
         //褰撳墠鏃堕棿
         Date billEndTime = DateUtil.getCurrentDate();
-        //寮�濮嬫椂闂�
-        Date startDate = feeDto.getStartTime();
-        //鍒版湡鏃堕棿
-        Date endDate = feeDto.getEndTime();
+
         //缂磋垂鍛ㄦ湡
         long paymentCycle = Long.parseLong(feeConfigDto.getPaymentCycle());
-        // 褰撳墠鏃堕棿 - 寮�濮嬫椂闂�  = 鏈堜唤
-        double mulMonth = dayCompare(startDate, billEndTime);
-        // 鏈堜唤/ 鍛ㄦ湡 = 杞暟锛堝悜涓婂彇鏁达級
-        double round = 0.0;
-        if ("1200".equals(feeConfigDto.getPaymentCd())) { // 棰勪粯璐�
-            round = Math.floor(mulMonth / paymentCycle) + 1;
-        } else { //鍚庝粯璐�
-            round = Math.floor(mulMonth / paymentCycle);
-        }
-        // 杞暟 * 鍛ㄦ湡 * 30 + 寮�濮嬫椂闂� = 鐩爣 鍒版湡鏃堕棿
-        Date targetEndDate = getTargetEndTime(round * paymentCycle * 30, startDate);
+
 
         //璇存槑娌℃湁娆犺垂
-        if (endDate.getTime() > targetEndDate.getTime()) {
+        if (oweMonth <= 0.0) {
             return;
         }
-
-        // 鐩爣鍒版湡鏃堕棿 - 鍒版湡鏃堕棿 = 娆犺垂鏈堜唤
-        double oweMonth = dayCompare(endDate, targetEndDate);
-
 
         if (FeeDto.PAYER_OBJ_TYPE_ROOM.equals(feeDto.getPayerObjType())) {
             computeFeePriceByRoom(feeDto);
@@ -255,7 +240,7 @@
         billOweFeeDto.setCommunityId(feeDto.getCommunityId());
         billOweFeeDto.setPayerObjType(feeDto.getPayerObjType());
         billOweFeeDto.setState("1000");
-
+        billOweFeeDto.setDeadlineTime(DateUtil.getFormatTimeString(targetEndDate, DateUtil.DATE_FORMATE_STRING_A));
         if ("3333".equals(feeDto.getPayerObjType())) {
             getRoomInfo(billOweFeeDto, feeDto);
         } else {
@@ -293,16 +278,96 @@
                 curReceipts = recAmount.add(curReceipts);
             }
         }
-
         billDto.setReceipts(curReceipts.doubleValue() + "");
+    }
 
+    private Map getTargetEndDateAndOweMonth(FeeDto feeDto) {
+        Date targetEndDate = null;
+        double oweMonth = 0.0;
 
+        Map<String, Object> targetEndDateAndOweMonth = new HashMap<>();
+
+        if (FeeDto.STATE_FINISH.equals(feeDto.getState())) {
+            targetEndDate = feeDto.getEndTime();
+            targetEndDateAndOweMonth.put("oweMonth", oweMonth);
+            targetEndDateAndOweMonth.put("targetEndDate", targetEndDate);
+            return targetEndDateAndOweMonth;
+        }
+        if (FeeDto.FEE_FLAG_ONCE.equals(feeDto.getFeeFlag())) {
+            if (feeDto.getImportFeeEndTime() == null) {
+                targetEndDate = feeDto.getConfigEndTime();
+            } else {
+                targetEndDate = feeDto.getImportFeeEndTime();
+            }
+            //鍒ゆ柇褰撳墠璐圭敤鏄笉鏄鍏ヨ垂鐢�
+            oweMonth = 1.0;
+
+        } else {
+            //褰撳墠鏃堕棿
+            Date billEndTime = DateUtil.getCurrentDate();
+            //寮�濮嬫椂闂�
+            Date startDate = feeDto.getStartTime();
+            //鍒版湡鏃堕棿
+            Date endDate = feeDto.getEndTime();
+            if (FeeDto.PAYER_OBJ_TYPE_CAR.equals(feeDto.getPayerObjType())) {
+                OwnerCarDto ownerCarDto = new OwnerCarDto();
+                ownerCarDto.setCommunityId(feeDto.getCommunityId());
+                ownerCarDto.setCarId(feeDto.getPayerObjId());
+                List<OwnerCarDto> ownerCarDtos = ownerCarInnerServiceSMOImpl.queryOwnerCars(ownerCarDto);
+
+                if (ownerCarDtos == null || ownerCarDtos.size() != 1) {
+                    targetEndDateAndOweMonth.put("oweMonth", 0);
+                    targetEndDateAndOweMonth.put("targetEndDate", "");
+                    return targetEndDateAndOweMonth;
+                }
+
+                targetEndDate = ownerCarDtos.get(0).getEndTime();
+                //璇存槑娌℃湁娆犺垂
+                if (endDate.getTime() < targetEndDate.getTime()) {
+                    // 鐩爣鍒版湡鏃堕棿 - 鍒版湡鏃堕棿 = 娆犺垂鏈堜唤
+                    oweMonth = dayCompare(endDate, targetEndDate);
+                }
+                targetEndDateAndOweMonth.put("oweMonth", oweMonth);
+                targetEndDateAndOweMonth.put("targetEndDate", targetEndDate);
+                return targetEndDateAndOweMonth;
+            }
+            //缂磋垂鍛ㄦ湡
+            long paymentCycle = Long.parseLong(feeDto.getPaymentCycle());
+            // 褰撳墠鏃堕棿 - 寮�濮嬫椂闂�  = 鏈堜唤
+            double mulMonth = dayCompare(startDate, billEndTime);
+            // 鏈堜唤/ 鍛ㄦ湡 = 杞暟锛堝悜涓婂彇鏁达級
+            double round = 0.0;
+            if ("1200".equals(feeDto.getPaymentCd())) { // 棰勪粯璐�
+                round = Math.floor(mulMonth / paymentCycle) + 1;
+            } else { //鍚庝粯璐�
+                round = Math.floor(mulMonth / paymentCycle);
+            }
+            // 杞暟 * 鍛ㄦ湡 * 30 + 寮�濮嬫椂闂� = 鐩爣 鍒版湡鏃堕棿
+            targetEndDate = getTargetEndTime(round * paymentCycle, startDate);
+            //璐圭敤 蹇粨鏉熶簡
+            if (feeDto.getConfigEndTime().getTime() < targetEndDate.getTime()) {
+                targetEndDate = feeDto.getConfigEndTime();
+            }
+            //璇存槑娌℃湁娆犺垂
+            if (endDate.getTime() < targetEndDate.getTime()) {
+                // 鐩爣鍒版湡鏃堕棿 - 鍒版湡鏃堕棿 = 娆犺垂鏈堜唤
+                oweMonth = dayCompare(endDate, targetEndDate);
+            }
+
+            if (feeDto.getEndTime().getTime() > targetEndDate.getTime()) {
+                targetEndDate = feeDto.getEndTime();
+            }
+        }
+
+        targetEndDateAndOweMonth.put("oweMonth", oweMonth);
+        targetEndDateAndOweMonth.put("targetEndDate", targetEndDate);
+        return targetEndDateAndOweMonth;
     }
 
     private Date getTargetEndTime(double v, Date startDate) {
         Calendar endDate = Calendar.getInstance();
         endDate.setTime(startDate);
-        endDate.add(Calendar.DATE, (int) v);
+        endDate.add(Calendar.MONTH, (int) v);
         return endDate.getTime();
     }
 
@@ -315,25 +380,10 @@
      */
     private void getParkingSpaceInfo(BillOweFeeDto billOweFeeDto, FeeDto feeDto) {
 
-        ParkingSpaceDto parkingSpaceDto = new ParkingSpaceDto();
-        parkingSpaceDto.setPsId(feeDto.getPayerObjId());
-        parkingSpaceDto.setCommunityId(feeDto.getCommunityId());
-        List<ParkingSpaceDto> parkingSpaceDtos = parkingSpaceInnerServiceSMOImpl.queryParkingSpaces(parkingSpaceDto);
-        if (parkingSpaceDtos == null || parkingSpaceDtos.size() < 1) {
-            //杞︿綅鍙兘琚垹闄や簡
-            billOweFeeDto.setOwnerId("1");
-            billOweFeeDto.setOwnerName("鏈煡");
-            billOweFeeDto.setOwnerTel("19999999999");
-            billOweFeeDto.setPayerObjName("鏈煡");
-            return;
-        }
-
-        billOweFeeDto.setPayerObjName(parkingSpaceDtos.get(0).getAreaNum() + "鍋滆溅鍦�" + parkingSpaceDtos.get(0).getNum() + "杞︿綅");
-
 
         OwnerCarDto ownerCarDto = new OwnerCarDto();
         ownerCarDto.setWithOwner(true);
-        ownerCarDto.setPsId(parkingSpaceDtos.get(0).getPsId());
+        ownerCarDto.setCarId(feeDto.getPayerObjId());
         ownerCarDto.setCommunityId(feeDto.getCommunityId());
 
         List<OwnerCarDto> ownerCarDtos = ownerCarInnerServiceSMOImpl.queryOwnerCars(ownerCarDto);
@@ -347,6 +397,7 @@
             return;
         }
 
+        billOweFeeDto.setPayerObjName(ownerCarDtos.get(0).getCarNum());
         billOweFeeDto.setOwnerId(ownerCarDtos.get(0).getOwnerId());
         billOweFeeDto.setOwnerName(ownerCarDtos.get(0).getOwnerName());
         billOweFeeDto.setOwnerTel(ownerCarDtos.get(0).getLink());
@@ -465,9 +516,18 @@
      * @param feeDto
      */
     private void computeFeePriceByParkingSpace(FeeDto feeDto) {
+
+        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;
+        }
+
         ParkingSpaceDto parkingSpaceDto = new ParkingSpaceDto();
         parkingSpaceDto.setCommunityId(feeDto.getCommunityId());
-        parkingSpaceDto.setPsId(feeDto.getPayerObjId());
+        parkingSpaceDto.setPsId(ownerCarDtos.get(0).getPsId());
         List<ParkingSpaceDto> parkingSpaceDtos = parkingSpaceInnerServiceSMOImpl.queryParkingSpaces(parkingSpaceDto);
 
         if (parkingSpaceDtos == null || parkingSpaceDtos.size() < 1) { //鏁版嵁鏈夐棶棰�
@@ -532,15 +592,22 @@
         from.setTime(fromDate);
         Calendar to = Calendar.getInstance();
         to.setTime(toDate);
+        int result = to.get(Calendar.MONTH) - from.get(Calendar.MONTH);
+        int month = (to.get(Calendar.YEAR) - from.get(Calendar.YEAR)) * 12;
 
-        long t1 = from.getTimeInMillis();
+        result = result + month;
+        Calendar newFrom = Calendar.getInstance();
+        newFrom.setTime(fromDate);
+        newFrom.add(Calendar.MONTH, result);
+
+        long t1 = newFrom.getTimeInMillis();
         long t2 = to.getTimeInMillis();
         long days = (t2 - t1) / (24 * 60 * 60 * 1000);
 
         BigDecimal tmpDays = new BigDecimal(days);
         BigDecimal monthDay = new BigDecimal(30);
 
-        return tmpDays.divide(monthDay, 2, RoundingMode.HALF_UP).doubleValue();
+        return tmpDays.divide(monthDay, 2, RoundingMode.HALF_UP).doubleValue() + result;
     }
 
 

--
Gitblit v1.8.0