wuxw
2024-03-11 b0dac6dd90dba209d69191005042f5078bd1cf3e
优化递增代码
1个文件已修改
141 ■■■■■ 已修改文件
java110-core/src/main/java/com/java110/core/smo/impl/ComputeFeeSMOImpl.java 141 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
java110-core/src/main/java/com/java110/core/smo/impl/ComputeFeeSMOImpl.java
@@ -2164,6 +2164,145 @@
            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 @@
        }
        double rateMonth = DateUtil.dayCompare(rateStartTime, feeDto.getDeadlineTime());
        // todo 最大周期
        // todo 最大周期 递增轮数
        double maxCycle = Math.ceil(rateMonth / rateCycle);