From 8c066c39b9e5ebc39992f7152bf706acdae00f4a Mon Sep 17 00:00:00 2001
From: wuxw <928255095@qq.com>
Date: 星期五, 31 五月 2024 17:53:10 +0800
Subject: [PATCH] 优化押金退款功能
---
java110-core/src/main/java/com/java110/core/smo/impl/ComputeFeeSMOImpl.java | 433 ++++++++++++++++++++++++++++++++++++-----------------
1 files changed, 290 insertions(+), 143 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 d399c86..9bba66a 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
@@ -117,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 = 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);
+ }
+
/**
* 璁$畻娆犺垂閲戦
@@ -158,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.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()); 娆犺垂鏃ユ湡涓嶅鍏堟敞閲�
- }
-
- }
-
- /**
- * 鏍规嵁鎴垮眿鏉ョ畻鍗曚环
- *
- * @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");
@@ -213,7 +206,7 @@
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.setFeeTotalPrice(price.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
@@ -227,36 +220,8 @@
//feeDto.setDeadlineTime(DateUtil.getCurrentDate()); 娆犺垂鏃ユ湡涓嶅鍏堟敞閲�
}
- //鑰冭檻绉熼噾閫掑
+ //todo 鑰冭檻绉熼噾閫掑
dealRentRate(feeDto);
- }
-
- /**
- * 鏍规嵁鎴垮眿鏉ョ畻鍗曚环
- *
- * @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.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()); 娆犺垂鏃ユ湡涓嶅鍏堟敞閲�
- }
}
@@ -525,7 +490,7 @@
parkingSpaceDto.setCommunityId(feeDto.getCommunityId());
parkingSpaceDto.setPsId(ownerCarDtos.get(0).getPsId());
List<ParkingSpaceDto> parkingSpaceDtos = parkingSpaceInnerServiceSMOImpl.queryParkingSpaces(parkingSpaceDto);
- if (parkingSpaceDtos == null || parkingSpaceDtos.size() < 1) { //鏁版嵁鏈夐棶棰�
+ if (ListUtil.isNull(parkingSpaceDtos)) { //鏁版嵁鏈夐棶棰�
return objName;
}
objName = objName + "-" + parkingSpaceDtos.get(0).getAreaNum() + "鍋滆溅鍦�" + "-" + parkingSpaceDtos.get(0).getNum() + "杞︿綅";
@@ -541,6 +506,19 @@
}
return objName;
+ }
+
+ @Override
+ public OwnerDto getFeeOwnerDto(String feeId) {
+
+ FeeDto feeDto = new FeeDto();
+ feeDto.setFeeId(feeId);
+ List<FeeDto> feeDtos = feeInnerServiceSMOImpl.queryFees(feeDto);
+
+ Assert.listOnlyOne(feeDtos, "璐圭敤涓嶅瓨鍦�");
+ feeDtos.get(0).setFeeAttrDtos(null); // todo 杩欓噷璁剧疆涓虹┖锛屼笉瑕佷粠灞炴�т腑鏌ヤ互闃叉暟鎹湁闂瀵艰嚧鏈夐棶棰�
+
+ return getFeeOwnerDto(feeDtos.get(0));
}
@Override
@@ -594,7 +572,7 @@
private OwnerDto getOwnerDtoByFeeAttr(FeeDto feeDto) {
List<FeeAttrDto> feeAttrDtos = feeDto.getFeeAttrDtos();
- if (feeAttrDtos == null || feeAttrDtos.size() < 1) {
+ if (ListUtil.isNull(feeAttrDtos)) {
return null;
}
@@ -785,9 +763,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 +776,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);
}
}
@@ -1704,7 +1678,10 @@
Date preEndTime = preEndTimeCal.getTime();
//todo 褰撳墠璐圭敤涓轰竴娆℃�ц垂鐢�
- Date maxEndTime = feeDto.getConfigEndTime();
+ Date maxEndTime = feeDto.getDeadlineTime();
+ if (maxEndTime == null) {
+ maxEndTime = feeDto.getConfigEndTime();
+ }
if (FeeDto.FEE_FLAG_ONCE.equals(feeDto.getFeeFlag())) {
//鍏堝彇 deadlineTime
if (feeDto.getDeadlineTime() != null) {
@@ -1717,15 +1694,16 @@
targetEndDate = feeDto.getImportFeeEndTime();
}
//璇存槑娆犺垂
- if (preEndTime.getTime() < DateUtil.getCurrentDate().getTime()) {
+ if (preEndTime.getTime() <= DateUtil.getCurrentDate().getTime()) {
// 鐩爣鍒版湡鏃堕棿 - 鍒版湡鏃堕棿 = 娆犺垂鏈堜唤
oweMonth = 1.0;
}
- } else if (FeeDto.FEE_FLAG_CYCLE_ONCE.equals(feeDto.getFeeFlag())) {
- if (feeDto.getDeadlineTime() != null) {
- maxEndTime = feeDto.getDeadlineTime();
+ //todo 杩欓噷鑰冭檻 璐﹀崟妯″紡鐨勫満鏅�
+ if (StringUtil.isNumber(feeDto.getMonthCycle())) {
+ oweMonth = Integer.parseInt(feeDto.getMonthCycle());
}
+ } else {
Date billEndTime = DateUtil.getCurrentDate();
//寤鸿处鏃堕棿
Date startDate = feeDto.getStartTime();
@@ -1753,7 +1731,6 @@
) {
targetEndDate = getTargetEndTime((round + 1) * paymentCycle, startDate);//鐩爣缁撴潫鏃堕棿
}
-
//todo 璐圭敤椤圭殑缁撴潫鏃堕棿<缂磋垂鐨勭粨鏉熸椂闂� 璐圭敤蹇粨鏉熶簡 鍙栬垂鐢ㄩ」鐨勭粨鏉熸椂闂�
if (maxEndTime.getTime() < targetEndDate.getTime()) {
@@ -1762,50 +1739,7 @@
//璇存槑娆犺垂
if (endDate.getTime() < targetEndDate.getTime()) {
// 鐩爣鍒版湡鏃堕棿 - 鍒版湡鏃堕棿 = 娆犺垂鏈堜唤
- oweMonth = DateUtil.dayCompare(endDate, targetEndDate);
- }
-
- if (feeDto.getEndTime().getTime() > targetEndDate.getTime()) {
- targetEndDate = feeDto.getEndTime();
- }
- } else { // todo 鍛ㄦ湡鎬ц垂鐢�
- //褰撳墠鏃堕棿
- Date billEndTime = DateUtil.getCurrentDate();
- //寤鸿处鏃堕棿
- Date startDate = feeDto.getStartTime();
- //璁¤垂璧峰鏃堕棿
- Date endDate = feeDto.getEndTime();
- //缂磋垂鍛ㄦ湡
- long paymentCycle = Long.parseLong(feeDto.getPaymentCycle());
- // 褰撳墠鏃堕棿 - 寮�濮嬫椂闂� = 鏈堜唤
- double mulMonth = 0.0;
- mulMonth = DateUtil.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);//鐩爣缁撴潫鏃堕棿
-
- //todo 濡傛灉 鍒颁簡 棰勪粯鏈� 浜х敓涓嬩釜鍛ㄦ湡鐨勮垂鐢�
- if (DateUtil.getFormatTimeStringB(targetEndDate).equals(DateUtil.getFormatTimeStringB(endDate))
- && DateUtil.getCurrentDate().getTime() > preEndTime.getTime()
- ) {
- targetEndDate = getTargetEndTime((round + 1) * paymentCycle, startDate);//鐩爣缁撴潫鏃堕棿
- }
-
- //璐圭敤椤圭殑缁撴潫鏃堕棿<缂磋垂鐨勭粨鏉熸椂闂� 璐圭敤蹇粨鏉熶簡 鍙栬垂鐢ㄩ」鐨勭粨鏉熸椂闂�
- if (maxEndTime.getTime() < targetEndDate.getTime()) {
- targetEndDate = maxEndTime;
- }
- //璇存槑娆犺垂
- if (endDate.getTime() < targetEndDate.getTime()) {
- // 鐩爣鍒版湡鏃堕棿 - 鍒版湡鏃堕棿 = 娆犺垂鏈堜唤
- oweMonth = DateUtil.dayCompare(endDate, targetEndDate);
+ oweMonth = DateUtil.dayCompare(endDate, targetEndDate, true);
}
if (feeDto.getEndTime().getTime() > targetEndDate.getTime()) {
@@ -1919,11 +1853,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();
}
@@ -2160,6 +2096,216 @@
feeAttrDto.setCommunityId(feeDto.getCommunityId());
List<FeeAttrDto> feeAttrDtos = feeAttrInnerServiceSMOImpl.queryFeeAttrs(feeAttrDto);
+ if (ListUtil.isNull(feeAttrDtos)) {
+ 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;
+ }
+
+ Date oRateStartTime = rateStartTime;
+ //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 杩欎釜鏄� 鍘熷绉熼噾
+ 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 鏈疆閫掑缁撴潫鏃堕棿
+ Date curCycleRateEneTime = DateUtil.stepMonth(rateStartTime, (cycleIndex + 1) * rateCycle);
+
+ //todo 璇存槑杩欎釜宸茬粡缂磋垂浜�
+ if (curOweStartTime.getTime() > curCycleRateEneTime.getTime()) {
+ continue;
+ }
+ //todo 鏈疆 娆犺垂寮�濮嬫椂闂村ぇ浜� deadlineTime 璺宠繃
+ if (curOweStartTime.getTime() >= feeDto.getDeadlineTime().getTime()) {
+ 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);
+ }
+
+ 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;
+ }
+
+ /**
+ * 淇閫掑 寮�濮嬫椂闂�
+ * 濡傛灉璁剧疆鐨� 閫掑寮�濮嬫椂闂村拰寤鸿处鏃堕棿涓嶆槸鍚屼竴澶� 寮哄埗淇涓�
+ *
+ * @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;
}
@@ -2216,9 +2362,10 @@
}
double rateMonth = DateUtil.dayCompare(rateStartTime, feeDto.getDeadlineTime());
- // todo 鏈�澶у懆鏈�
+ // todo 鏈�澶у懆鏈� 閫掑杞暟
double maxCycle = Math.ceil(rateMonth / rateCycle);
+
// todo 澧為暱鍓嶇殑娆犺垂
BigDecimal addTotalAmount = oweAmountDec;
// todo 閫掑鍛ㄦ湡鍐呯殑 鏈�掑璐圭敤
--
Gitblit v1.8.0