wuxw hace 2 años
padre
commit
774d48e554

+ 67 - 3
java110-core/src/main/java/com/java110/core/smo/impl/ComputeFeeSMOImpl.java

@@ -133,7 +133,7 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
         }
         if (feeDto.getEndTime().getTime() < targetEndDate.getTime()) {
             // 目标到期时间 - 到期时间 = 欠费月份
-            oweMonth = DateUtil.dayCompare(feeDto.getEndTime(), targetEndDate,true);
+            oweMonth = DateUtil.dayCompare(feeDto.getEndTime(), targetEndDate, true);
 
         }
 
@@ -2083,7 +2083,7 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
         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 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
             return;
         }
 
+        Date oRateStartTime = rateStartTime;
         //todo 递增时间 不是 费用建账时间的倍数时,修正一下
         rateStartTime = correctByFeeStartTime(rateStartTime, feeDto.getStartTime());
 
@@ -2150,8 +2151,10 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
         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,17 +2169,28 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
                 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 递增月如果建账时间和递增日期不一致,那么减去建账时间日至 递增日的递增部分
+                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);
         }
 
@@ -2185,6 +2199,56 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
         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 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
 
         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();
     }

+ 2 - 1
service-acct/src/main/java/com/java110/acct/cmd/invoice/SaveInvoiceApplyCmd.java

@@ -219,7 +219,8 @@ public class SaveInvoiceApplyCmd extends Cmd {
             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())
                     + "~"

+ 1 - 1
service-fee/src/main/java/com/java110/fee/cmd/fee/ListFeeCmd.java

@@ -115,7 +115,7 @@ public class ListFeeCmd extends Cmd {
             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")));