From 1ac2a95fb9b47319c4a81076d6efc3e73cc86ca6 Mon Sep 17 00:00:00 2001
From: java110 <928255095@qq.com>
Date: 星期二, 22 九月 2020 11:00:30 +0800
Subject: [PATCH] 优化费用信息
---
service-fee/src/main/java/com/java110/fee/bmo/impl/QueryOweFeeImpl.java | 163 +++++++++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 154 insertions(+), 9 deletions(-)
diff --git a/service-fee/src/main/java/com/java110/fee/bmo/impl/QueryOweFeeImpl.java b/service-fee/src/main/java/com/java110/fee/bmo/impl/QueryOweFeeImpl.java
index 0d7143b..50773ec 100644
--- a/service-fee/src/main/java/com/java110/fee/bmo/impl/QueryOweFeeImpl.java
+++ b/service-fee/src/main/java/com/java110/fee/bmo/impl/QueryOweFeeImpl.java
@@ -6,6 +6,7 @@
import com.java110.dto.fee.BillOweFeeDto;
import com.java110.dto.fee.FeeConfigDto;
import com.java110.dto.fee.FeeDto;
+import com.java110.dto.owner.OwnerCarDto;
import com.java110.dto.owner.OwnerDto;
import com.java110.dto.parking.ParkingSpaceDto;
import com.java110.fee.bmo.IQueryOweFee;
@@ -13,6 +14,7 @@
import com.java110.intf.community.IRoomInnerServiceSMO;
import com.java110.intf.fee.IFeeConfigInnerServiceSMO;
import com.java110.intf.fee.IFeeInnerServiceSMO;
+import com.java110.intf.user.IOwnerCarInnerServiceSMO;
import com.java110.intf.user.IOwnerInnerServiceSMO;
import com.java110.utils.util.DateUtil;
import com.java110.utils.util.StringUtil;
@@ -26,10 +28,7 @@
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
@Service
public class QueryOweFeeImpl implements IQueryOweFee {
@@ -40,6 +39,9 @@
@Autowired
private IFeeInnerServiceSMO feeInnerServiceSMOImpl;
+
+ @Autowired
+ private IOwnerCarInnerServiceSMO ownerCarInnerServiceSMOImpl;
@Autowired
private IFeeConfigInnerServiceSMO feeConfigInnerServiceSMOImpl;
@@ -187,6 +189,7 @@
List<String> psIds = new ArrayList<>();
for (FeeDto fee : feeDtos) {
+ // 杞暟 * 鍛ㄦ湡 * 30 + 寮�濮嬫椂闂� = 鐩爣 鍒版湡鏃堕棿
if ("3333".equals(fee.getPayerObjType())) { //鎴垮眿鐩稿叧
roomFees.add(fee);
roomIds.add(fee.getPayerObjId());
@@ -238,6 +241,10 @@
}
private void dealFeePs(ParkingSpaceDto tmpParkingSpaceDto, FeeDto feeDto) {
+ // 杞暟 * 鍛ㄦ湡 * 30 + 寮�濮嬫椂闂� = 鐩爣 鍒版湡鏃堕棿
+ Map<String, Object> targetEndDateAndOweMonth = getTargetEndDateAndOweMonth(feeDto);
+ Date targetEndDate = (Date) targetEndDateAndOweMonth.get("targetEndDate");
+ double oweMonth = (double) targetEndDateAndOweMonth.get("oweMonth");
if (!tmpParkingSpaceDto.getPsId().equals(feeDto.getPayerObjId())) {
return;
}
@@ -256,15 +263,34 @@
feePrice = additionalAmount.setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
} else if ("4004".equals(computingFormula)) {
feePrice = Double.parseDouble(feeDto.getAmount());
+ } else if ("5005".equals(computingFormula)) {
+ if (StringUtil.isEmpty(feeDto.getCurDegrees())) {
+ feePrice = -1.00;
+ } else {
+ BigDecimal curDegree = new BigDecimal(Double.parseDouble(feeDto.getCurDegrees()));
+ BigDecimal preDegree = new BigDecimal(Double.parseDouble(feeDto.getPreDegrees()));
+ BigDecimal squarePrice = new BigDecimal(Double.parseDouble(feeDto.getSquarePrice()));
+ BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
+ BigDecimal sub = curDegree.subtract(preDegree);
+ feePrice = sub.multiply(squarePrice)
+ .add(additionalAmount)
+ .setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
+ }
} else {
feePrice = 0.00;
}
feeDto.setFeePrice(feePrice);
- double month = dayCompare(feeDto.getEndTime(), DateUtil.getCurrentDate());
+ // double month = dayCompare(feeDto.getEndTime(), DateUtil.getCurrentDate());
BigDecimal price = new BigDecimal(feeDto.getFeePrice());
- price = price.multiply(new BigDecimal(month));
+ price = price.multiply(new BigDecimal(oweMonth));
feeDto.setAmountOwed(price.setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue() + "");
+ feeDto.setDeadlineTime(targetEndDate);
+ //鍔ㄦ�佽垂鐢�
+ if ("4004".equals(computingFormula)) {
+ feeDto.setAmountOwed(feeDto.getFeePrice() + "");
+ feeDto.setDeadlineTime(DateUtil.getCurrentDate());
+ }
}
/**
@@ -281,6 +307,7 @@
if (roomDtos == null || roomDtos.size() < 1) { //鏁版嵁鏈夐棶棰�
return;
}
+
for (RoomDto tmpRoomDto : roomDtos) {
for (FeeDto feeDto : roomFees) {
@@ -312,7 +339,9 @@
}
private void dealFeeRoom(RoomDto tmpRoomDto, FeeDto feeDto) {
-
+ Map<String, Object> targetEndDateAndOweMonth = getTargetEndDateAndOweMonth(feeDto);
+ Date targetEndDate = (Date) targetEndDateAndOweMonth.get("targetEndDate");
+ double oweMonth = (double) targetEndDateAndOweMonth.get("oweMonth");
if (!tmpRoomDto.getRoomId().equals(feeDto.getPayerObjId())) {
return;
}
@@ -330,15 +359,36 @@
feePrice = additionalAmount.setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
} else if ("4004".equals(computingFormula)) {
feePrice = Double.parseDouble(feeDto.getAmount());
+ } else if ("5005".equals(computingFormula)) {
+
+ if (StringUtil.isEmpty(feeDto.getCurDegrees())) {
+ feePrice = -1.00;
+ } else {
+ BigDecimal curDegree = new BigDecimal(Double.parseDouble(feeDto.getCurDegrees()));
+ BigDecimal preDegree = new BigDecimal(Double.parseDouble(feeDto.getPreDegrees()));
+ BigDecimal squarePrice = new BigDecimal(Double.parseDouble(feeDto.getSquarePrice()));
+ BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
+ BigDecimal sub = curDegree.subtract(preDegree);
+ feePrice = sub.multiply(squarePrice)
+ .add(additionalAmount)
+ .setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
+ }
} else {
feePrice = 0.00;
}
feeDto.setFeePrice(feePrice);
- double month = dayCompare(feeDto.getEndTime(), DateUtil.getCurrentDate());
+ //double month = dayCompare(feeDto.getEndTime(), DateUtil.getCurrentDate());
BigDecimal price = new BigDecimal(feeDto.getFeePrice());
- price = price.multiply(new BigDecimal(month));
+ price = price.multiply(new BigDecimal(oweMonth));
feeDto.setAmountOwed(price.setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue() + "");
+ feeDto.setDeadlineTime(targetEndDate);
+
+ //鍔ㄦ�佽垂鐢�
+ if ("4004".equals(computingFormula)) {
+ feeDto.setAmountOwed(feeDto.getFeePrice() + "");
+ feeDto.setDeadlineTime(DateUtil.getCurrentDate());
+ }
}
@@ -493,4 +543,99 @@
return tmpDays.divide(monthDay, 2, RoundingMode.HALF_UP).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 (!StringUtil.isEmpty(feeDto.getCurDegrees())) {
+ targetEndDate = feeDto.getCurReadingTime();
+ } else 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 = 0;
+ targetEndDateAndOweMonth.put("oweMonth", oweMonth);
+ targetEndDateAndOweMonth.put("targetEndDate", targetEndDate);
+ return targetEndDateAndOweMonth;
+ }
+ }
+
+ //缂磋垂鍛ㄦ湡
+ long paymentCycle = Long.parseLong(feeDto.getPaymentCycle());
+ // 褰撳墠鏃堕棿 - 寮�濮嬫椂闂� = 鏈堜唤
+ double mulMonth = 0.0;
+ 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.MONTH, (int) v);
+ return endDate.getTime();
+ }
+
}
--
Gitblit v1.8.0