From 774d48e554ba2b654b28ea89996da34d84e3c1f6 Mon Sep 17 00:00:00 2001
From: wuxw <928255095@qq.com>
Date: 星期一, 08 四月 2024 11:51:36 +0800
Subject: [PATCH] 优化代码

---
 service-fee/src/main/java/com/java110/fee/cmd/fee/ListFeeCmd.java                |    2 
 java110-core/src/main/java/com/java110/core/smo/impl/ComputeFeeSMOImpl.java      |   70 +++++++++++++++++++++++++++++++++-
 service-acct/src/main/java/com/java110/acct/cmd/invoice/SaveInvoiceApplyCmd.java |    3 +
 3 files changed, 70 insertions(+), 5 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 b811281..be4a08d 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
@@ -133,7 +133,7 @@
         }
         if (feeDto.getEndTime().getTime() < targetEndDate.getTime()) {
             // 鐩爣鍒版湡鏃堕棿 - 鍒版湡鏃堕棿 = 娆犺垂鏈堜唤
-            oweMonth = DateUtil.dayCompare(feeDto.getEndTime(), targetEndDate,true);
+            oweMonth = DateUtil.dayCompare(feeDto.getEndTime(), targetEndDate, true);
 
         }
 
@@ -2083,7 +2083,7 @@
         feeAttrDto.setCommunityId(feeDto.getCommunityId());
         List<FeeAttrDto> feeAttrDtos = feeAttrInnerServiceSMOImpl.queryFeeAttrs(feeAttrDto);
 
-        if (feeAttrDtos == null || feeAttrDtos.size() < 1) {
+        if (ListUtil.isNull(feeAttrDtos)) {
             return;
         }
         int rateCycle = 0;
@@ -2121,6 +2121,7 @@
             return;
         }
 
+        Date oRateStartTime = rateStartTime;
         //todo 閫掑鏃堕棿 涓嶆槸 璐圭敤寤鸿处鏃堕棿鐨勫�嶆暟鏃讹紝淇涓�涓�
         rateStartTime = correctByFeeStartTime(rateStartTime, feeDto.getStartTime());
 
@@ -2150,8 +2151,10 @@
         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 鏈疆閫掑缁撴潫鏃堕棿
@@ -2166,16 +2169,27 @@
                 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);
         }
@@ -2183,6 +2197,56 @@
         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;
     }
 
     /**
@@ -2206,7 +2270,7 @@
 
         rateCalendar = Calendar.getInstance();
         rateCalendar.setTime(rateStartTime);
-        rateCalendar.add(Calendar.MONTH, 1);
+        //rateCalendar.add(Calendar.MONTH, 1);
         rateCalendar.set(Calendar.DAY_OF_MONTH, day);
         return rateCalendar.getTime();
     }
diff --git a/service-acct/src/main/java/com/java110/acct/cmd/invoice/SaveInvoiceApplyCmd.java b/service-acct/src/main/java/com/java110/acct/cmd/invoice/SaveInvoiceApplyCmd.java
index c6693e8..ef8110d 100644
--- a/service-acct/src/main/java/com/java110/acct/cmd/invoice/SaveInvoiceApplyCmd.java
+++ b/service-acct/src/main/java/com/java110/acct/cmd/invoice/SaveInvoiceApplyCmd.java
@@ -219,7 +219,8 @@
             invoiceApplyItemPo.setCommunityId(invoiceApplyPo.getCommunityId());
             invoiceApplyItemPo.setItemAmount(tmpFeeDetailDto.getReceivedAmount());
             invoiceApplyItemPo.setItemId(GenerateCodeFactory.getGeneratorId("11"));
-            invoiceApplyItemPo.setItemName(tmpFeeDetailDto.getFeeName()
+            invoiceApplyItemPo.setItemName(tmpFeeDetailDto.getFeeName());
+            invoiceApplyItemPo.setRemark(tmpFeeDetailDto.getFeeName()
                     + "("
                     + DateUtil.getFormatTimeStringB(tmpFeeDetailDto.getStartTime())
                     + "~"
diff --git a/service-fee/src/main/java/com/java110/fee/cmd/fee/ListFeeCmd.java b/service-fee/src/main/java/com/java110/fee/cmd/fee/ListFeeCmd.java
index 6bb345e..876382e 100644
--- a/service-fee/src/main/java/com/java110/fee/cmd/fee/ListFeeCmd.java
+++ b/service-fee/src/main/java/com/java110/fee/cmd/fee/ListFeeCmd.java
@@ -115,7 +115,7 @@
             ownerRoomRelDto.setRoomId(reqJson.getString("payerObjId"));
             ownerRoomRelDto.setOwnerId(reqJson.getString("ownerId"));
             List<OwnerRoomRelDto> ownerRoomRelDtos = ownerRoomRelV1InnerServiceSMOImpl.queryOwnerRoomRels(ownerRoomRelDto);
-            if (ownerRoomRelDtos == null || ownerRoomRelDtos.size() < 1) {
+            if (ListUtil.isNull(ownerRoomRelDtos)) {
                 ApiFeeVo apiFeeVo = new ApiFeeVo();
                 apiFeeVo.setTotal(0);
                 apiFeeVo.setRecords((int) Math.ceil((double) 0 / (double) reqJson.getInteger("row")));

--
Gitblit v1.8.0