|
|
@@ -2164,6 +2164,145 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
|
|
|
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) {
|
|
|
+ int rateDay = DateUtil.getMonthDay(rateStartTime);
|
|
|
+ int day = DateUtil.getMonthDay(startTime);
|
|
|
+ if(rateDay == day){
|
|
|
+ return rateStartTime;
|
|
|
+ }
|
|
|
+
|
|
|
+ Calendar calendar = Calendar.getInstance();
|
|
|
+ calendar.setTime(rateStartTime);
|
|
|
+ calendar.add(Calendar.MONTH,1);
|
|
|
+ calendar.set(Calendar.DAY_OF_MONTH,day);
|
|
|
+ return calendar.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;
|
|
|
@@ -2182,7 +2321,7 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
|
|
|
}
|
|
|
double rateMonth = DateUtil.dayCompare(rateStartTime, feeDto.getDeadlineTime());
|
|
|
|
|
|
- // todo 最大周期
|
|
|
+ // todo 最大周期 递增轮数
|
|
|
double maxCycle = Math.ceil(rateMonth / rateCycle);
|
|
|
|
|
|
|