wuxw
2022-06-28 eff9634e34af84630833a17dcd09d75d98ecfeb2
优化代码
4个文件已修改
231 ■■■■■ 已修改文件
java110-core/src/main/java/com/java110/core/smo/IComputeFeeSMO.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
java110-core/src/main/java/com/java110/core/smo/impl/ComputeFeeSMOImpl.java 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-fee/src/main/java/com/java110/fee/bmo/impl/QueryOweFeeImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-fee/src/main/java/com/java110/fee/cmd/fee/ListFeeCmd.java 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
java110-core/src/main/java/com/java110/core/smo/IComputeFeeSMO.java
@@ -163,4 +163,20 @@
     * @param carInoutDtos
     */
    List<CarInoutDetailDto> computeTempCarInoutDetailStopTimeAndFee(List<CarInoutDetailDto> carInoutDtos);
    /**
     * 租金处理
     *
     * @param feeDto
     */
    void dealRentRate(FeeDto feeDto);
    /**
     * 租金处理
     *
     * @param feeDto
     */
    void dealRentRateCycle(FeeDto feeDto,double cycle);
}
java110-core/src/main/java/com/java110/core/smo/impl/ComputeFeeSMOImpl.java
@@ -20,6 +20,7 @@
import com.java110.intf.community.ICommunityInnerServiceSMO;
import com.java110.intf.community.IParkingSpaceInnerServiceSMO;
import com.java110.intf.community.IRoomInnerServiceSMO;
import com.java110.intf.fee.IFeeAttrInnerServiceSMO;
import com.java110.intf.fee.IFeeInnerServiceSMO;
import com.java110.intf.fee.ITempCarFeeConfigAttrInnerServiceSMO;
import com.java110.intf.fee.ITempCarFeeConfigInnerServiceSMO;
@@ -64,6 +65,9 @@
    @Autowired(required = false)
    private IFeeInnerServiceSMO feeInnerServiceSMOImpl;
    @Autowired(required = false)
    private IFeeAttrInnerServiceSMO feeAttrInnerServiceSMOImpl;
    @Autowired(required = false)
    private IRoomInnerServiceSMO roomInnerServiceSMOImpl;
@@ -1862,4 +1866,108 @@
        c.set(year, month, 0); //输入类型为int类型
        return c.get(Calendar.DAY_OF_MONTH);
    }
    /**
     *
     * @param feeDto
     * @param cycle
     */
    public void dealRentRateCycle(FeeDto feeDto,double cycle){
        Date endTime = feeDto.getEndTime();
        Date date = getTargetEndTime(cycle,endTime);
        feeDto.setDeadlineTime(date);
        dealRentRate(feeDto);
        feeDto.setFeeTotalPrice(Double.parseDouble(feeDto.getAmountOwed()));
    }
    /**
     * 租金处理
     *
     * @param feeDto
     */
    public void dealRentRate(FeeDto feeDto) {
        if (!FeeConfigDto.COMPUTING_FORMULA_RANT_RATE.equals(feeDto.getComputingFormula())) {
            return;
        }
        if (!FeeDto.STATE_DOING.equals(feeDto.getState())) {
            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());
                    rate = Double.parseDouble(tmpFeeAttrDto.getValue());
                }
                if (FeeAttrDto.SPEC_CD_RATE_CYCLE.equals(tmpFeeAttrDto.getSpecCd())) {
                    feeDto.setRateCycle(tmpFeeAttrDto.getValue());
                    rateCycle = Integer.parseInt(tmpFeeAttrDto.getValue());
                }
                if (FeeAttrDto.SPEC_CD_RATE_START_TIME.equals(tmpFeeAttrDto.getSpecCd())) {
                    rateStartTime = DateUtil.getDateFromString(tmpFeeAttrDto.getValue(), DateUtil.DATE_FORMATE_STRING_B);
                }
            }
        } catch (Exception e) {
            logger.error("租金递增异常", e);
            return;
        }
        if (rateCycle == 0 || rate == 0) {
            return;
        }
        if (feeDto.getDeadlineTime().getTime() <= rateStartTime.getTime()) {
            return;
        }
        BigDecimal oweAmountDec = new BigDecimal(0);
        //计算 计费起始时间 到 rateStartTime 时的费用
        double curOweMonth = 0;
        BigDecimal curFeePrice = new BigDecimal(feeDto.getFeePrice());
        if (feeDto.getEndTime().getTime() < rateStartTime.getTime()) {
            curOweMonth = dayCompare(feeDto.getEndTime(), rateStartTime);
            oweAmountDec = curFeePrice.multiply(new BigDecimal(curOweMonth)).setScale(2, BigDecimal.ROUND_HALF_UP);
        }
        curOweMonth = dayCompare(rateStartTime, feeDto.getDeadlineTime());
        double maxCycle = Math.floor(curOweMonth / rateCycle);
        //基准
        BigDecimal firstAmount = curFeePrice.multiply(new BigDecimal(rateCycle));
        BigDecimal preCycleAmount = firstAmount;
        BigDecimal rateDec = null; //递增周期所收费用
        BigDecimal lastRateAmountDec = null;
        double curCycle = 0;
        for (int cycleIndex = 0; cycleIndex < maxCycle; maxCycle++) {
            rateDec = preCycleAmount.multiply(new BigDecimal(rate)).setScale(2, BigDecimal.ROUND_HALF_UP);
            //增长周期的倍数
            curCycle = (cycleIndex + 1) * rateCycle;
            if (curCycle > curOweMonth) {
                rateDec = new BigDecimal(curOweMonth / rateCycle - Math.ceil(curOweMonth / rateCycle)).multiply(rateDec).setScale(2, BigDecimal.ROUND_HALF_UP);
                lastRateAmountDec = new BigDecimal(curOweMonth / rateCycle - Math.ceil(curOweMonth / rateCycle)).multiply(preCycleAmount).setScale(2, BigDecimal.ROUND_HALF_UP);
                firstAmount = firstAmount.add(rateDec).add(lastRateAmountDec);
                continue;
            }
            firstAmount = firstAmount.add(rateDec).add(preCycleAmount);
            preCycleAmount = preCycleAmount.add(rateDec);
        }
        firstAmount = firstAmount.add(oweAmountDec);
        feeDto.setAmountOwed(firstAmount.doubleValue() + "");
    }
}
service-fee/src/main/java/com/java110/fee/bmo/impl/QueryOweFeeImpl.java
@@ -180,6 +180,8 @@
        Map feePriceAll = computeFeeSMOImpl.getFeePrice(feeDto);
        feeDto.setFeePrice(Double.parseDouble(feePriceAll.get("feePrice").toString()));
        feeDto.setFeeTotalPrice(Double.parseDouble(feePriceAll.get("feeTotalPrice").toString()));
        computeFeeSMOImpl.dealRentRateCycle(feeDto,Double.parseDouble(feeDto.getCycle()));
        //应收款取值
        //先取单小区的如果没有配置 取 全局的
        String val = CommunitySettingFactory.getValue(feeDto.getCommunityId(), TOTAL_FEE_PRICE);
service-fee/src/main/java/com/java110/fee/cmd/fee/ListFeeCmd.java
@@ -206,6 +206,9 @@
            feeDto.setAmountOwed(df.format(curFeePrice));
            feeDto.setDeadlineTime(DateUtil.getCurrentDate());
        }
        //考虑租金递增
        computeFeeSMOImpl.dealRentRate(feeDto, oweMonth);
    }
    /**
@@ -231,108 +234,11 @@
        }
        //考虑租金递增
        dealRentRate(feeDto, oweMonth);
        computeFeeSMOImpl.dealRentRate(feeDto, oweMonth);
    }
    /**
     * 租金处理
     *
     * @param feeDto
     * @param oweMonth
     */
    private void dealRentRate(FeeDto feeDto, double oweMonth) {
        if (!FeeConfigDto.COMPUTING_FORMULA_RANT_RATE.equals(feeDto.getComputingFormula())) {
            return;
        }
        if (!FeeDto.STATE_DOING.equals(feeDto.getState())) {
            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());
                    rate = Double.parseDouble(tmpFeeAttrDto.getValue());
                }
                if (FeeAttrDto.SPEC_CD_RATE_CYCLE.equals(tmpFeeAttrDto.getSpecCd())) {
                    feeDto.setRateCycle(tmpFeeAttrDto.getValue());
                    rateCycle = Integer.parseInt(tmpFeeAttrDto.getValue());
                }
                if (FeeAttrDto.SPEC_CD_RATE_START_TIME.equals(tmpFeeAttrDto.getSpecCd())) {
                    rateStartTime = DateUtil.getDateFromString(tmpFeeAttrDto.getValue(), DateUtil.DATE_FORMATE_STRING_B);
                }
            }
        } catch (Exception e) {
            logger.error("租金递增异常", e);
            return;
        }
        if (rateCycle == 0 || rate == 0) {
            return;
        }
        if (feeDto.getDeadlineTime().getTime() <= rateStartTime.getTime()) {
            return;
        }
        BigDecimal oweAmountDec = new BigDecimal(0);
        //计算 计费起始时间 到 rateStartTime 时的费用
        double curOweMonth = 0;
        BigDecimal curFeePrice = new BigDecimal(feeDto.getFeePrice());
        if(feeDto.getEndTime().getTime() < rateStartTime.getTime()){
            curOweMonth = computeFeeSMOImpl.dayCompare(feeDto.getEndTime(),rateStartTime);
            oweAmountDec = curFeePrice.multiply(new BigDecimal(curOweMonth));
        }
         curOweMonth = computeFeeSMOImpl.dayCompare(rateStartTime,feeDto.getDeadlineTime());
        double maxCycle = Math.floor(curOweMonth/rateCycle);
        //基准
        BigDecimal firstAmount = curFeePrice.multiply(new BigDecimal(rateCycle));
        BigDecimal preCycleAmount = firstAmount;
        BigDecimal rateDec = null;
        BigDecimal lastRateAmountDec = null;
        double curCycle = 0;
        for(int cycleIndex = 0; cycleIndex < maxCycle; maxCycle ++){
            rateDec = preCycleAmount.multiply(new BigDecimal(rate));
            //增长周期的倍数
            curCycle = (cycleIndex +1) * rateCycle;
            if(curCycle > curOweMonth){
                rateDec = new BigDecimal(curOweMonth/rateCycle -Math.ceil(curOweMonth/rateCycle)).multiply(rateDec);
                lastRateAmountDec = new BigDecimal(curOweMonth/rateCycle -Math.ceil(curOweMonth/rateCycle)).multiply(rateDec);
                firstAmount = firstAmount.add(rateDec).add(preCycleAmount);
                continue;
            }
            firstAmount = firstAmount.add(rateDec).add(preCycleAmount);
            preCycleAmount = preCycleAmount.add(rateDec);
        }
        // 1.0 还没有到 递增开始时间
        //2.0 5.3 个月 24个月 一个递增周期
        // 200 * 5.3 + 0.03 * (24 * 200) * (5.3/24)
        // 200* 24
    }
    /**
     * 根据合同来算单价
@@ -355,5 +261,8 @@
            feeDto.setAmountOwed(df.format(curFeePrice) + "");
            feeDto.setDeadlineTime(DateUtil.getCurrentDate());
        }
        //考虑租金递增
        computeFeeSMOImpl.dealRentRate(feeDto, oweMonth);
    }
}