From b71f6a5ab914f37d67accc29ca565e9984234e2d Mon Sep 17 00:00:00 2001
From: wuxw <928255095@qq.com>
Date: 星期六, 06 四月 2024 22:35:20 +0800
Subject: [PATCH] 优化临时费用创建bug
---
java110-core/src/main/java/com/java110/core/smo/impl/ComputeFeeSMOImpl.java | 705 +++++++++++++++++++++++++++++-----------------------------
1 files changed, 348 insertions(+), 357 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 084bc8e..265ff18 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
@@ -5,13 +5,13 @@
import com.java110.core.context.Environment;
import com.java110.core.log.LoggerFactory;
import com.java110.core.smo.IComputeFeeSMO;
-import com.java110.dto.RoomAttrDto;
-import com.java110.dto.RoomDto;
+import com.java110.dto.room.RoomAttrDto;
+import com.java110.dto.room.RoomDto;
import com.java110.dto.community.CommunityDto;
import com.java110.dto.contract.ContractDto;
-import com.java110.dto.contractRoom.ContractRoomDto;
+import com.java110.dto.contract.ContractRoomDto;
import com.java110.dto.fee.*;
-import com.java110.dto.integralRuleConfig.IntegralRuleConfigDto;
+import com.java110.dto.integral.IntegralRuleConfigDto;
import com.java110.dto.machine.CarInoutDetailDto;
import com.java110.dto.machine.CarInoutDto;
import com.java110.dto.owner.OwnerCarDto;
@@ -31,14 +31,11 @@
import com.java110.intf.store.IContractRoomInnerServiceSMO;
import com.java110.intf.user.IOwnerCarInnerServiceSMO;
import com.java110.intf.user.IOwnerInnerServiceSMO;
-import com.java110.po.feeReceiptDetail.FeeReceiptDetailPo;
+import com.java110.po.fee.FeeReceiptDetailPo;
import com.java110.utils.constant.FeeConfigConstant;
import com.java110.utils.constant.ResponseConstant;
import com.java110.utils.exception.ListenerExecuteException;
-import com.java110.utils.util.Assert;
-import com.java110.utils.util.BeanConvertUtil;
-import com.java110.utils.util.DateUtil;
-import com.java110.utils.util.StringUtil;
+import com.java110.utils.util.*;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -120,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 = 1.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);
+ }
+
/**
* 璁$畻娆犺垂閲戦
@@ -161,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.setFeePrice(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.getFeePrice() + "");
- //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");
@@ -216,47 +206,22 @@
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.setFeePrice(price.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
+ 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.getFeePrice() + "");
+ feeDto.setAmountOwed(feeDto.getFeeTotalPrice() + "");
//feeDto.setDeadlineTime(DateUtil.getCurrentDate()); 娆犺垂鏃ユ湡涓嶅鍏堟敞閲�
}
- }
- /**
- * 鏍规嵁鎴垮眿鏉ョ畻鍗曚环
- *
- * @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.setFeePrice(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.getFeePrice() + "");
- //feeDto.setDeadlineTime(DateUtil.getCurrentDate()); 娆犺垂鏃ユ湡涓嶅鍏堟敞閲�
- }
+ //todo 鑰冭檻绉熼噾閫掑
+ dealRentRate(feeDto);
}
@@ -785,9 +750,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 +763,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);
}
}
@@ -948,44 +909,7 @@
return getFeePrice(feeDto, null);
}
- /**
- * //璁$畻鍛ㄦ湡
- * // Map<String, Object> cycleResults = dateDiff(feeDto.getEndTime(), feeDto.getCustEndTime());
- * // //鏈堜唤澶т簬0
- * // Integer months = Integer.valueOf(cycleResults.get("months").toString());
- * // Integer days = Integer.valueOf(cycleResults.get("days").toString());
- * // Integer startMonthDays = Integer.valueOf(cycleResults.get("startMonthDays").toString());
- * // Integer endMonthDays = Integer.valueOf(cycleResults.get("endMonthDays").toString());
- * // String isOneMonth = cycleResults.get("isOneMonth").toString();
- * // //鏁存暟鏈�
- * // if (months > 0 && days == 0) {
- * // BigDecimal cycle = new BigDecimal(months);
- * // feeTotalPrice = (squarePrice.multiply(builtUpArea).add(additionalAmount)).multiply(cycle).setScale(3, BigDecimal.ROUND_HALF_UP);
- * // }
- * // //鍑犱釜鏈堝嚑澶� 锛堝崟浠�*闈㈢Н+闄勫姞璐癸級*鏈堜唤+((鍗曚环*闈㈢Н+闄勫姞璐�)/鎬诲ぉ鏁�)*瀹為檯澶╂暟
- * // if (months > 0 && days > 0) {
- * // BigDecimal cycle = new BigDecimal(months);
- * // BigDecimal endMonthDayss = new BigDecimal(endMonthDays);
- * // BigDecimal dayss = new BigDecimal(days);
- * // BigDecimal monthPrice = squarePrice.multiply(builtUpArea).add(additionalAmount);
- * // feeTotalPrice = (monthPrice).multiply(cycle).add(monthPrice.divide(endMonthDayss).multiply(dayss)).setScale(3, BigDecimal.ROUND_HALF_UP);
- * // }
- * // //璺ㄦ湀浠� 涓嶈冻涓�鏈� ((鍗曚环*闈㈢Н+闄勫姞璐�)/寮�濮嬫湀浠芥�诲ぉ鏁�)*瀹為檯澶╂暟+((鍗曚环*闈㈢Н+闄勫姞璐�)/缁撴潫鏈堜唤鎬诲ぉ鏁�)*瀹為檯澶╂暟
- * // if (months == 0 && days > 0 && "true".equals(isOneMonth)) {
- * // BigDecimal startEndOfMonth = new BigDecimal(cycleResults.get("startEndOfMonth").toString());
- * // BigDecimal endBeginningOfMonth = new BigDecimal(cycleResults.get("endBeginningOfMonth").toString());
- * // BigDecimal endMonthDayss = new BigDecimal(endMonthDays);
- * // BigDecimal startMonthDayss = new BigDecimal(startMonthDays);
- * // BigDecimal monthPrice = squarePrice.multiply(builtUpArea).add(additionalAmount);
- * // feeTotalPrice = monthPrice.divide(startMonthDayss, 4, BigDecimal.ROUND_HALF_UP).multiply(startEndOfMonth).add(monthPrice.divide(endMonthDayss, 4, BigDecimal.ROUND_HALF_UP).multiply(endBeginningOfMonth)).setScale(3, BigDecimal.ROUND_HALF_UP);
- * // }
- * // //涓嶈法鏈堜唤 涓嶈冻涓�鏈� (鍗曚环*闈㈢Н+闄勫姞璐�/寮�濮嬫湀浠芥�诲ぉ鏁�)*瀹為檯澶╂暟
- * // if (months == 0 && days > 0 && "false".equals(isOneMonth)) {
- * // BigDecimal cycle = new BigDecimal(days);
- * // BigDecimal startMonthDayss = new BigDecimal(startMonthDays);
- * // BigDecimal monthPrice = squarePrice.multiply(builtUpArea).add(additionalAmount);
- * // feeTotalPrice = monthPrice.divide(startMonthDayss, 4, BigDecimal.ROUND_HALF_UP).multiply(cycle).setScale(3, BigDecimal.ROUND_HALF_UP);
- * // }
+ /*
*
* @param feeDto
* @param roomDto
@@ -999,6 +923,18 @@
if (Environment.isOwnerPhone(java110Properties)) {
return getOwnerPhoneFee(feeAmount);
}
+
+ //todo 濡傛灉 cycle 涓�105 鍒� 鏍规嵁缂磋垂鏃堕棿娈� 鏀瑰啓涓�
+ if ("105".equals(feeDto.getCycle())) {
+ double cycle = DateUtil.dayCompare(DateUtil.getDateFromStringB(feeDto.getCustomStartTime()), DateUtil.getDateFromStringB(feeDto.getCustomEndTime()));
+ feeDto.setCycle(cycle + "");
+ }
+ // todo 鎸夌粨鏉熸椂闂寸即璐�
+ if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
+ double cycle = DateUtil.dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime()));
+ feeDto.setCycle(cycle + "");
+ }
+
if (FeeDto.PAYER_OBJ_TYPE_ROOM.equals(feeDto.getPayerObjType())) { //鎴垮眿鐩稿叧
String computingFormula = feeDto.getComputingFormula();
if (roomDto == null) {
@@ -1021,9 +957,6 @@
if (!StringUtil.isEmpty(feeDto.getCycle())) {
cycle = new BigDecimal(feeDto.getCycle());
}
- if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
- cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
- }
if (cycle == null) {
feeTotalPrice = new BigDecimal(0);
} else {
@@ -1036,9 +969,6 @@
BigDecimal cycle = null;
if (!StringUtil.isEmpty(feeDto.getCycle())) {
cycle = new BigDecimal(feeDto.getCycle());
- }
- if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
- cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
}
if (cycle == null) {
feeTotalPrice = new BigDecimal(0);
@@ -1054,9 +984,6 @@
if (!StringUtil.isEmpty(feeDto.getCycle())) {
cycle = new BigDecimal(feeDto.getCycle());
}
- if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
- cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
- }
if (cycle == null) {
feeTotalPrice = new BigDecimal(0);
} else {
@@ -1068,9 +995,6 @@
BigDecimal cycle = null;
if (!StringUtil.isEmpty(feeDto.getCycle())) {
cycle = new BigDecimal(feeDto.getCycle());
- }
- if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
- cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
}
if (cycle == null) {
feeTotalPrice = new BigDecimal(0);
@@ -1084,9 +1008,6 @@
if (!StringUtil.isEmpty(feeDto.getCycle())) {
cycle = new BigDecimal(feeDto.getCycle());
}
- if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
- cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
- }
if (cycle == null) {
feeTotalPrice = new BigDecimal(0);
} else {
@@ -1097,9 +1018,6 @@
BigDecimal cycle = null;
if (!StringUtil.isEmpty(feeDto.getCycle())) {
cycle = new BigDecimal(feeDto.getCycle());
- }
- if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
- cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
}
if (cycle == null) {
feeTotalPrice = new BigDecimal(0);
@@ -1123,9 +1041,6 @@
if (!StringUtil.isEmpty(feeDto.getCycle())) {
cycle = new BigDecimal(feeDto.getCycle());
}
- if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
- cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
- }
if (cycle == null) {
feeTotalPrice = new BigDecimal(0);
} else {
@@ -1138,9 +1053,6 @@
BigDecimal cycle = null;
if (!StringUtil.isEmpty(feeDto.getCycle())) {
cycle = new BigDecimal(feeDto.getCycle());
- }
- if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
- cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
}
if (cycle == null) {
feeTotalPrice = new BigDecimal(0);
@@ -1163,9 +1075,6 @@
if (!StringUtil.isEmpty(feeDto.getCycle())) {
cycle = new BigDecimal(feeDto.getCycle());
}
- if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
- cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
- }
if (cycle == null) {
feeTotalPrice = new BigDecimal(0);
} else {
@@ -1176,9 +1085,6 @@
BigDecimal cycle = null;
if (!StringUtil.isEmpty(feeDto.getCycle())) {
cycle = new BigDecimal(feeDto.getCycle());
- }
- if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
- cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
}
if (cycle == null) {
feeTotalPrice = new BigDecimal(0);
@@ -1200,9 +1106,6 @@
BigDecimal cycle = null;
if (!StringUtil.isEmpty(feeDto.getCycle())) {
cycle = new BigDecimal(feeDto.getCycle());
- }
- if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
- cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
}
if (cycle == null) {
feeTotalPrice = new BigDecimal(0);
@@ -1238,9 +1141,6 @@
if (!StringUtil.isEmpty(feeDto.getCycle())) {
cycle = new BigDecimal(feeDto.getCycle());
}
- if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
- cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
- }
if (cycle == null) {
feeTotalPrice = new BigDecimal(0);
} else {
@@ -1254,9 +1154,6 @@
BigDecimal cycle = null;
if (!StringUtil.isEmpty(feeDto.getCycle())) {
cycle = new BigDecimal(feeDto.getCycle());
- }
- if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
- cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
}
if (cycle == null) {
feeTotalPrice = new BigDecimal(0);
@@ -1273,9 +1170,6 @@
if (!StringUtil.isEmpty(feeDto.getCycle())) {
cycle = new BigDecimal(feeDto.getCycle());
}
- if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
- cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
- }
if (cycle == null) {
feeTotalPrice = new BigDecimal(0);
} else {
@@ -1288,9 +1182,6 @@
BigDecimal cycle = null;
if (!StringUtil.isEmpty(feeDto.getCycle())) {
cycle = new BigDecimal(feeDto.getCycle());
- }
- if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
- cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
}
if (cycle == null) {
feeTotalPrice = new BigDecimal(0);
@@ -1305,9 +1196,6 @@
if (!StringUtil.isEmpty(feeDto.getCycle())) {
cycle = new BigDecimal(feeDto.getCycle());
}
- if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
- cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
- }
if (cycle == null) {
feeTotalPrice = new BigDecimal(0);
} else {
@@ -1318,9 +1206,6 @@
BigDecimal cycle = null;
if (!StringUtil.isEmpty(feeDto.getCycle())) {
cycle = new BigDecimal(feeDto.getCycle());
- }
- if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
- cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
}
if (cycle == null) {
feeTotalPrice = new BigDecimal(0);
@@ -1344,9 +1229,6 @@
if (!StringUtil.isEmpty(feeDto.getCycle())) {
cycle = new BigDecimal(feeDto.getCycle());
}
- if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
- cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
- }
if (cycle == null) {
feeTotalPrice = new BigDecimal(0);
} else {
@@ -1360,9 +1242,6 @@
if (!StringUtil.isEmpty(feeDto.getCycle())) {
cycle = new BigDecimal(feeDto.getCycle());
}
- if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
- cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
- }
if (cycle == null) {
feeTotalPrice = new BigDecimal(0);
} else {
@@ -1374,9 +1253,6 @@
BigDecimal cycle = null;
if (!StringUtil.isEmpty(feeDto.getCycle())) {
cycle = new BigDecimal(feeDto.getCycle());
- }
- if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
- cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
}
if (cycle == null) {
feeTotalPrice = new BigDecimal(0);
@@ -1399,9 +1275,6 @@
BigDecimal cycle = null;
if (!StringUtil.isEmpty(feeDto.getCycle())) {
cycle = new BigDecimal(feeDto.getCycle());
- }
- if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
- cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
}
if (cycle == null) {
feeTotalPrice = new BigDecimal(0);
@@ -1435,9 +1308,6 @@
if (!StringUtil.isEmpty(feeDto.getCycle())) {
cycle = new BigDecimal(feeDto.getCycle());
}
- if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
- cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
- }
if (cycle == null) {
feeTotalPrice = new BigDecimal(0);
} else {
@@ -1454,9 +1324,6 @@
if (!StringUtil.isEmpty(feeDto.getCycle())) {
cycle = new BigDecimal(feeDto.getCycle());
}
- if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
- cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
- }
if (cycle == null) {
feeTotalPrice = new BigDecimal(0);
} else {
@@ -1472,9 +1339,6 @@
if (!StringUtil.isEmpty(feeDto.getCycle())) {
cycle = new BigDecimal(feeDto.getCycle());
}
- if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
- cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
- }
if (cycle == null) {
feeTotalPrice = new BigDecimal(0);
} else {
@@ -1487,9 +1351,6 @@
BigDecimal cycle = null;
if (!StringUtil.isEmpty(feeDto.getCycle())) {
cycle = new BigDecimal(feeDto.getCycle());
- }
- if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
- cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
}
if (cycle == null) {
feeTotalPrice = new BigDecimal(0);
@@ -1504,9 +1365,6 @@
if (!StringUtil.isEmpty(feeDto.getCycle())) {
cycle = new BigDecimal(feeDto.getCycle());
}
- if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
- cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
- }
if (cycle == null) {
feeTotalPrice = new BigDecimal(0);
} else {
@@ -1518,9 +1376,6 @@
BigDecimal cycle = null;
if (!StringUtil.isEmpty(feeDto.getCycle())) {
cycle = new BigDecimal(feeDto.getCycle());
- }
- if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
- cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
}
if (cycle == null) {
feeTotalPrice = new BigDecimal(0);
@@ -1545,9 +1400,6 @@
if (!StringUtil.isEmpty(feeDto.getCycle())) {
cycle = new BigDecimal(feeDto.getCycle());
}
- if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
- cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
- }
if (cycle == null) {
feeTotalPrice = new BigDecimal(0);
} else {
@@ -1561,9 +1413,6 @@
if (!StringUtil.isEmpty(feeDto.getCycle())) {
cycle = new BigDecimal(feeDto.getCycle());
}
- if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
- cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
- }
if (cycle == null) {
feeTotalPrice = new BigDecimal(0);
} else {
@@ -1576,9 +1425,6 @@
if (!StringUtil.isEmpty(feeDto.getCycle())) {
cycle = new BigDecimal(feeDto.getCycle());
}
- if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
- cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
- }
if (cycle == null) {
feeTotalPrice = new BigDecimal(0);
} else {
@@ -1590,9 +1436,6 @@
BigDecimal cycle = null;
if (!StringUtil.isEmpty(feeDto.getCycle())) {
cycle = new BigDecimal(feeDto.getCycle());
- }
- if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
- cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
}
if (cycle == null) {
feeTotalPrice = new BigDecimal(0);
@@ -1615,9 +1458,6 @@
BigDecimal cycle = null;
if (!StringUtil.isEmpty(feeDto.getCycle())) {
cycle = new BigDecimal(feeDto.getCycle());
- }
- if (!StringUtil.isEmpty(feeDto.getCustEndTime())) {
- cycle = new BigDecimal(dayCompare(feeDto.getEndTime(), DateUtil.getDateFromStringB(feeDto.getCustEndTime())));
}
if (cycle == null) {
feeTotalPrice = new BigDecimal(0);
@@ -1772,13 +1612,13 @@
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
BigDecimal valueObj = null;
- logger.debug("璁$畻鍏紡涓猴細{}",value);
+ logger.debug("璁$畻鍏紡涓猴細{}", value);
try {
value = engine.eval(value).toString();
valueObj = new BigDecimal(Double.parseDouble(value));
} catch (Exception e) {
//throw new IllegalArgumentException("鍏紡璁$畻寮傚父锛屽叕寮忎负銆�" + feeDto.getComputingFormulaText() + "銆�,璁$畻 銆�" + value + "銆戝紓甯�");
- logger.error("鍏紡璁$畻寮傚父锛屽叕寮忎负銆�" + feeDto.getComputingFormulaText() + "銆�,璁$畻 銆�" + value + "銆戝紓甯�",e);
+ logger.error("鍏紡璁$畻寮傚父锛屽叕寮忎负銆�" + feeDto.getComputingFormulaText() + "銆�,璁$畻 銆�" + value + "銆戝紓甯�", e);
valueObj = new BigDecimal(0);
}
@@ -1788,6 +1628,12 @@
return valueObj;
+ }
+
+ @Override
+ public Date getDeadlineTime(FeeDto feeDto) {
+ Map info = getTargetEndDateAndOweMonth(feeDto);
+ return (Date) info.get("targetEndDate");
}
/**
@@ -1802,15 +1648,27 @@
double oweMonth = 0.0;
Map<String, Object> targetEndDateAndOweMonth = new HashMap<>();
- //鍒ゆ柇褰撳墠璐圭敤鏄惁宸茬粨鏉�
+ //todo 鍒ゆ柇褰撳墠璐圭敤鏄惁宸茬粨鏉�
if (FeeDto.STATE_FINISH.equals(feeDto.getState())) {
targetEndDate = feeDto.getEndTime();
targetEndDateAndOweMonth.put("oweMonth", oweMonth);
targetEndDateAndOweMonth.put("targetEndDate", targetEndDate);
return targetEndDateAndOweMonth;
}
- //褰撳墠璐圭敤涓轰竴娆℃�ц垂鐢�
- Date maxEndTime = feeDto.getConfigEndTime();
+
+ //todo 鑰冭檻璐圭敤椤� 璐圭敤鎻愬墠鐢熸垚
+ Calendar preEndTimeCal = Calendar.getInstance();
+ preEndTimeCal.setTime(feeDto.getEndTime());
+ if (StringUtil.isNumber(feeDto.getPrepaymentPeriod())) {
+ preEndTimeCal.add(Calendar.DAY_OF_MONTH, Integer.parseInt(feeDto.getPrepaymentPeriod()) * -1);
+ }
+ Date preEndTime = preEndTimeCal.getTime();
+
+ //todo 褰撳墠璐圭敤涓轰竴娆℃�ц垂鐢�
+ Date maxEndTime = feeDto.getDeadlineTime();
+ if (maxEndTime == null) {
+ maxEndTime = feeDto.getConfigEndTime();
+ }
if (FeeDto.FEE_FLAG_ONCE.equals(feeDto.getFeeFlag())) {
//鍏堝彇 deadlineTime
if (feeDto.getDeadlineTime() != null) {
@@ -1822,12 +1680,17 @@
} else {
targetEndDate = feeDto.getImportFeeEndTime();
}
- //鍒ゆ柇褰撳墠璐圭敤鏄笉鏄鍏ヨ垂鐢�
- oweMonth = 1.0;
- } else if (FeeDto.FEE_FLAG_CYCLE_ONCE.equals(feeDto.getFeeFlag())) {
- if (feeDto.getDeadlineTime() != null) {
- maxEndTime = feeDto.getDeadlineTime();
+ //璇存槑娆犺垂
+ if (preEndTime.getTime() <= DateUtil.getCurrentDate().getTime()) {
+ // 鐩爣鍒版湡鏃堕棿 - 鍒版湡鏃堕棿 = 娆犺垂鏈堜唤
+ oweMonth = 1.0;
}
+
+ //todo 杩欓噷鑰冭檻 璐﹀崟妯″紡鐨勫満鏅�
+ if (StringUtil.isNumber(feeDto.getMonthCycle())) {
+ oweMonth = Integer.parseInt(feeDto.getMonthCycle());
+ }
+ } else {
Date billEndTime = DateUtil.getCurrentDate();
//寤鸿处鏃堕棿
Date startDate = feeDto.getStartTime();
@@ -1837,7 +1700,7 @@
long paymentCycle = Long.parseLong(feeDto.getPaymentCycle());
// 褰撳墠鏃堕棿 - 寮�濮嬫椂闂� = 鏈堜唤
double mulMonth = 0.0;
- mulMonth = dayCompare(startDate, billEndTime);
+ mulMonth = DateUtil.dayCompare(startDate, billEndTime);
// 鏈堜唤/ 鍛ㄦ湡 = 杞暟锛堝悜涓婂彇鏁达級
double round = 0.0;
@@ -1848,49 +1711,25 @@
}
// 杞暟 * 鍛ㄦ湡 * 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);//鐩爣缁撴潫鏃堕棿
+ }
+
+ //todo 鍑忓幓涓�绉�
+ targetEndDate = DateUtil.getDateFromStringA(DateUtil.getPreSecTime(targetEndDate));
+
+ //todo 璐圭敤椤圭殑缁撴潫鏃堕棿<缂磋垂鐨勭粨鏉熸椂闂� 璐圭敤蹇粨鏉熶簡 鍙栬垂鐢ㄩ」鐨勭粨鏉熸椂闂�
if (maxEndTime.getTime() < targetEndDate.getTime()) {
targetEndDate = maxEndTime;
}
//璇存槑娆犺垂
if (endDate.getTime() < targetEndDate.getTime()) {
// 鐩爣鍒版湡鏃堕棿 - 鍒版湡鏃堕棿 = 娆犺垂鏈堜唤
- oweMonth = dayCompare(endDate, targetEndDate);
- }
-
- if (feeDto.getEndTime().getTime() > targetEndDate.getTime()) {
- targetEndDate = feeDto.getEndTime();
- }
- } else { //鍛ㄦ湡鎬ц垂鐢�
- //褰撳墠鏃堕棿
- Date billEndTime = DateUtil.getCurrentDate();
- //寤鸿处鏃堕棿
- Date startDate = feeDto.getStartTime();
- //璁¤垂璧峰鏃堕棿
- Date endDate = feeDto.getEndTime();
- //缂磋垂鍛ㄦ湡
- long paymentCycle = Long.parseLong(feeDto.getPaymentCycle());
- // 褰撳墠鏃堕棿 - 寮�濮嬫椂闂� = 鏈堜唤
- double mulMonth = 0.0;
- mulMonth = 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);//鐩爣缁撴潫鏃堕棿
- //璐圭敤椤圭殑缁撴潫鏃堕棿<缂磋垂鐨勭粨鏉熸椂闂� 璐圭敤蹇粨鏉熶簡 鍙栬垂鐢ㄩ」鐨勭粨鏉熸椂闂�
- if (maxEndTime.getTime() < targetEndDate.getTime()) {
- targetEndDate = maxEndTime;
- }
- //璇存槑娆犺垂
- if (endDate.getTime() < targetEndDate.getTime()) {
- // 鐩爣鍒版湡鏃堕棿 - 鍒版湡鏃堕棿 = 娆犺垂鏈堜唤
- oweMonth = dayCompare(endDate, targetEndDate);
+ oweMonth = DateUtil.dayCompare(endDate, targetEndDate, true);
}
if (feeDto.getEndTime().getTime() > targetEndDate.getTime()) {
@@ -1904,79 +1743,72 @@
}
public Map getTargetEndDateAndOweMonth(FeeDto feeDto) {
-
-// 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);
-// return getTargetEndDateAndOweMonth(feeDto, ownerCarDtos == null || ownerCarDtos.size() < 1 ? null : ownerCarDtos.get(0));
-// }
return getTargetEndDateAndOweMonth(feeDto, null);
}
- /**
- * 璁$畻 涓や釜鏃堕棿鐐规湀浠�
- *
- * @param fromDate 寮�濮嬫椂闂�
- * @param toDate 缁撴潫鏃堕棿
- * @return
- */
- @Override
- public double dayCompare(Date fromDate, Date toDate) {
- double resMonth = 0.0;
- Calendar from = Calendar.getInstance();
- 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;
- //鐪熷疄 鐩稿樊鏈堜唤
- result = result + month;
-
- //寮�濮嬫椂闂� 2021-06-01 2021-08-05 result = 2 2021-08-01
- Calendar newFrom = Calendar.getInstance();
- newFrom.setTime(fromDate);
- newFrom.add(Calendar.MONTH, result);
- //濡傛灉鍔犳湀浠藉悗 澶т簬浜嗗綋鍓嶆椂闂� 榛樿鍔� 鏈堜唤 -1 鎯呭喌 12-19 21-01-10
- //杩欎釜鏄鐨勯�昏緫涓�瀹氬ソ濂界悊瑙�
- if (newFrom.getTime().getTime() > toDate.getTime()) {
- newFrom.setTime(fromDate);
- result = result - 1;
- newFrom.add(Calendar.MONTH, result);
- }
-
- // t1 2021-08-01 t2 2021-08-05
- long t1 = newFrom.getTime().getTime();
- long t2 = to.getTime().getTime();
- //鐩稿樊姣
- double days = (t2 - t1) * 1.00 / (24 * 60 * 60 * 1000);
- BigDecimal tmpDays = new BigDecimal(days); //鐩稿樊澶╂暟
- BigDecimal monthDay = null;
- Calendar newFromMaxDay = Calendar.getInstance();
- newFromMaxDay.set(newFrom.get(Calendar.YEAR), newFrom.get(Calendar.MONTH), 1, 0, 0, 0);
- newFromMaxDay.add(Calendar.MONTH, 1); //涓嬩釜鏈�1鍙�
- //鍦ㄥ綋鍓嶆湀涓� 杩欏潡鏈夐棶棰�
- if (toDate.getTime() < newFromMaxDay.getTime().getTime()) {
- monthDay = new BigDecimal(newFrom.getActualMaximum(Calendar.DAY_OF_MONTH));
- return tmpDays.divide(monthDay, 4, BigDecimal.ROUND_HALF_UP).add(new BigDecimal(result)).doubleValue();
- }
- // 涓婃湀澶╂暟
- days = (newFromMaxDay.getTimeInMillis() - t1) * 1.00 / (24 * 60 * 60 * 1000);
- tmpDays = new BigDecimal(days);
- monthDay = new BigDecimal(newFrom.getActualMaximum(Calendar.DAY_OF_MONTH));
- BigDecimal preRresMonth = tmpDays.divide(monthDay, 4, BigDecimal.ROUND_HALF_UP);
-
- //涓嬫湀澶╂暟
- days = (t2 - newFromMaxDay.getTimeInMillis()) * 1.00 / (24 * 60 * 60 * 1000);
- tmpDays = new BigDecimal(days);
- monthDay = new BigDecimal(newFromMaxDay.getActualMaximum(Calendar.DAY_OF_MONTH));
- resMonth = tmpDays.divide(monthDay, 4, BigDecimal.ROUND_HALF_UP).add(new BigDecimal(result)).add(preRresMonth).doubleValue();
- return resMonth;
- }
+// /**
+// * 璁$畻 涓や釜鏃堕棿鐐规湀浠�
+// *
+// * @param fromDate 寮�濮嬫椂闂�
+// * @param toDate 缁撴潫鏃堕棿
+// * @return
+// */
+//
+// public double dayCompareOld(Date fromDate, Date toDate) {
+// double resMonth = 0.0;
+// Calendar from = Calendar.getInstance();
+// 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;
+//
+// //鐪熷疄 鐩稿樊鏈堜唤
+// result = result + month;
+//
+// //寮�濮嬫椂闂� 2021-06-01 2021-08-05 result = 2 2021-08-01
+// Calendar newFrom = Calendar.getInstance();
+// newFrom.setTime(fromDate);
+// newFrom.add(Calendar.MONTH, result);
+// //濡傛灉鍔犳湀浠藉悗 澶т簬浜嗗綋鍓嶆椂闂� 榛樿鍔� 鏈堜唤 -1 鎯呭喌 12-19 21-01-10
+// //杩欎釜鏄鐨勯�昏緫涓�瀹氬ソ濂界悊瑙�
+// if (newFrom.getTime().getTime() > toDate.getTime()) {
+// newFrom.setTime(fromDate);
+// result = result - 1;
+// newFrom.add(Calendar.MONTH, result);
+// }
+//
+// // t1 2021-08-01 t2 2021-08-05
+// long t1 = newFrom.getTime().getTime();
+// long t2 = to.getTime().getTime();
+// //鐩稿樊姣
+// double days = (t2 - t1) * 1.00 / (24 * 60 * 60 * 1000);
+// BigDecimal tmpDays = new BigDecimal(days); //鐩稿樊澶╂暟
+// BigDecimal monthDay = null;
+// Calendar newFromMaxDay = Calendar.getInstance();
+// newFromMaxDay.set(newFrom.get(Calendar.YEAR), newFrom.get(Calendar.MONTH), 1, 0, 0, 0);
+// newFromMaxDay.add(Calendar.MONTH, 1); //涓嬩釜鏈�1鍙�
+// //鍦ㄥ綋鍓嶆湀涓� 杩欏潡鏈夐棶棰�
+// if (toDate.getTime() < newFromMaxDay.getTime().getTime()) {
+// monthDay = new BigDecimal(newFrom.getActualMaximum(Calendar.DAY_OF_MONTH));
+// return tmpDays.divide(monthDay, 4, BigDecimal.ROUND_HALF_UP).add(new BigDecimal(result)).doubleValue();
+// }
+// // 涓婃湀澶╂暟
+// days = (newFromMaxDay.getTimeInMillis() - t1) * 1.00 / (24 * 60 * 60 * 1000);
+// tmpDays = new BigDecimal(days);
+// monthDay = new BigDecimal(newFrom.getActualMaximum(Calendar.DAY_OF_MONTH));
+// BigDecimal preRresMonth = tmpDays.divide(monthDay, 4, BigDecimal.ROUND_HALF_UP);
+//
+// //涓嬫湀澶╂暟
+// days = (t2 - newFromMaxDay.getTimeInMillis()) * 1.00 / (24 * 60 * 60 * 1000);
+// tmpDays = new BigDecimal(days);
+// monthDay = new BigDecimal(newFromMaxDay.getActualMaximum(Calendar.DAY_OF_MONTH));
+// resMonth = tmpDays.divide(monthDay, 4, BigDecimal.ROUND_HALF_UP).add(new BigDecimal(result)).add(preRresMonth).doubleValue();
+// return resMonth;
+// }
//鎵嬫満绔即璐瑰鐞�
@@ -2011,11 +1843,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();
}
@@ -2290,21 +2124,176 @@
return;
}
+ //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 杩欎釜鏄� 鍘熷绉熼噾
+ for (int cycleIndex = 0; cycleIndex < maxCycle; cycleIndex++) {
+ //todo 閫掑鏈堝崟浠�
+ 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;
+ }
+
+ //todo 鏈疆閫掑鏃堕棿鏈埌 璐圭敤deadlineTime
+ if (curCycleRateEneTime.getTime() < feeDto.getDeadlineTime().getTime()) {
+ curOweMonth = DateUtil.dayCompare(curOweStartTime, curCycleRateEneTime);
+ curOweStartTime = curCycleRateEneTime;
+ } else {
+ curOweMonth = DateUtil.dayCompare(curOweStartTime, feeDto.getDeadlineTime());
+ curOweStartTime = feeDto.getDeadlineTime();
+ }
+
+ oweAmountDec = curFeePrice.multiply(new BigDecimal(curOweMonth)).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
+
+ addTotalAmount = addTotalAmount.add(oweAmountDec);
+ }
+
+ Double amountOwed = MoneyUtil.computePriceScale(addTotalAmount.doubleValue(), feeDto.getScale(), Integer.parseInt(feeDto.getDecimalPlace()));
+ feeDto.setAmountOwed(amountOwed + "");
+ feeDto.setFeeTotalPrice(amountOwed);
+ }
+
+ /**
+ * 淇閫掑 寮�濮嬫椂闂�
+ * 濡傛灉璁剧疆鐨� 閫掑寮�濮嬫椂闂村拰寤鸿处鏃堕棿涓嶆槸鍚屼竴澶� 寮哄埗淇涓�
+ *
+ * @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;
+ }
+ 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;
+ }
+
BigDecimal oweAmountDec = new BigDecimal(0);
//璁$畻 璁¤垂璧峰鏃堕棿 鍒� rateStartTime 鏃剁殑璐圭敤
double curOweMonth = 0;
BigDecimal curFeePrice = new BigDecimal(feeDto.getFeePrice());
+
+ // todo 濡傛灉璁¤垂璧峰鏃堕棿 灏忓尯 閫掑寮�濮嬫椂闂�
if (feeDto.getEndTime().getTime() < rateStartTime.getTime()) {
- curOweMonth = dayCompare(feeDto.getEndTime(), rateStartTime);
+ //todo 閫掑鍓嶇殑娆犺垂
+ curOweMonth = DateUtil.dayCompare(feeDto.getEndTime(), rateStartTime);
oweAmountDec = curFeePrice.multiply(new BigDecimal(curOweMonth)).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
+ // todo 閫掑
+ curOweMonth = DateUtil.dayCompare(rateStartTime, feeDto.getDeadlineTime());
+ } else {
+ // todo 閫掑
+ curOweMonth = DateUtil.dayCompare(feeDto.getEndTime(), feeDto.getDeadlineTime());
}
+ double rateMonth = DateUtil.dayCompare(rateStartTime, feeDto.getDeadlineTime());
- curOweMonth = dayCompare(rateStartTime, feeDto.getDeadlineTime());
+ // todo 鏈�澶у懆鏈� 閫掑杞暟
+ double maxCycle = Math.ceil(rateMonth / rateCycle);
- double maxCycle = Math.ceil(curOweMonth / rateCycle);
- // 澧為暱鍓嶇殑娆犺垂
+ // todo 澧為暱鍓嶇殑娆犺垂
BigDecimal addTotalAmount = oweAmountDec;
+ // todo 閫掑鍛ㄦ湡鍐呯殑 鏈�掑璐圭敤
BigDecimal preCycleAmount = curFeePrice.multiply(new BigDecimal(rateCycle));
BigDecimal rateDec = null; //閫掑鍛ㄦ湡鎵�鏀惰垂鐢�
BigDecimal lastRateAmountDec = null;
@@ -2322,7 +2311,7 @@
curEndTimeCalender.setTime(rateStartTime);
curEndTimeCalender.add(Calendar.MONTH, new Double(curCycle).intValue());
curEndTime = curEndTimeCalender.getTime();
- if (curCycle > curOweMonth) {
+ if (curCycle > rateMonth) {
//涓嶈冻澧為暱鍛ㄦ湡澧為暱鐜�
rateDec = new BigDecimal(curOweMonth / rateCycle - Math.floor(curOweMonth / rateCycle)).multiply(rateDec).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
lastRateAmountDec = new BigDecimal(curOweMonth / rateCycle - Math.floor(curOweMonth / rateCycle)).multiply(preCycleAmount).setScale(FeeConfigConstant.FEE_SCALE, BigDecimal.ROUND_HALF_UP);
@@ -2337,8 +2326,10 @@
}
preCycleAmount = curAmount;
}
- feeDto.setAmountOwed(addTotalAmount.doubleValue() + "");
- feeDto.setFeeTotalPrice(addTotalAmount.doubleValue());
+
+ Double amountOwed = MoneyUtil.computePriceScale(addTotalAmount.doubleValue(), feeDto.getScale(), Integer.parseInt(feeDto.getDecimalPlace()));
+ feeDto.setAmountOwed(amountOwed + "");
+ feeDto.setFeeTotalPrice(amountOwed);
}
}
--
Gitblit v1.8.0