Explorar el Código

优化递增代码

wuxw hace 2 años
padre
commit
b0dac6dd90

+ 140 - 1
java110-core/src/main/java/com/java110/core/smo/impl/ComputeFeeSMOImpl.java

@@ -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);