java110
2022-07-22 4a89f51744230ffb58a4d8236c55980b26de99f7
优化代码
2个文件已修改
1个文件已添加
146 ■■■■■ 已修改文件
java110-core/src/main/java/com/java110/core/smo/impl/ComputeFeeSMOImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-fee/src/main/java/com/java110/fee/cmd/fee/PayFeeCmd.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-fee/src/main/java/com/java110/fee/discount/impl/ReductionMonthFeeRuleIn.java 117 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
java110-core/src/main/java/com/java110/core/smo/impl/ComputeFeeSMOImpl.java
@@ -2247,11 +2247,18 @@
        BigDecimal lastRateAmountDec = null;
        double curCycle = 0;
        BigDecimal curAmount = null; // 当期金额
        Date curEndTime = null;
        for (int cycleIndex = 0; cycleIndex < maxCycle; cycleIndex++) {
            //当期增长部分
            rateDec = preCycleAmount.multiply(new BigDecimal(rate)).setScale(2, BigDecimal.ROUND_HALF_UP);
            //增长周期的倍数
            curCycle = (cycleIndex + 1) * rateCycle;
            // 计算本轮的 计费起始时间
            Calendar curEndTimeCalender = Calendar.getInstance();
            curEndTimeCalender.setTime(rateStartTime);
            curEndTimeCalender.set(Calendar.MONTH,new Double(curCycle).intValue());
            curEndTime = curEndTimeCalender.getTime();
            if (curCycle > curOweMonth) {
                //不足增长周期增长率
                rateDec = new BigDecimal(curOweMonth / rateCycle - Math.floor(curOweMonth / rateCycle)).multiply(rateDec).setScale(2, BigDecimal.ROUND_HALF_UP);
@@ -2261,7 +2268,10 @@
            }
            //本期金额
            curAmount = rateDec.add(preCycleAmount);// 增长部分 + 上本期费用
            addTotalAmount = addTotalAmount.add(curAmount); // 计入总的 费用中
            //如果计费起始时间 大于 递增开始时间 那么本轮 不计入
            if(feeDto.getEndTime().getTime()< curEndTime.getTime()){
                addTotalAmount = addTotalAmount.add(curAmount); // 计入总的 费用中
            }
            preCycleAmount = curAmount;
        }
        feeDto.setAmountOwed(addTotalAmount.doubleValue() + "");
service-fee/src/main/java/com/java110/fee/cmd/fee/PayFeeCmd.java
@@ -625,7 +625,7 @@
            if (FeeConfigDto.COMPUTING_FORMULA_RANT_RATE.equals(feeDto.getComputingFormula())) {
                computeFeeSMOImpl.dealRentRateCycle(feeDto,cycles.doubleValue());
                if(feeDto.getOweFee()> 0){
                    businessFeeDetail.put("receivableAmount", feeDto.getOweFee());
                    businessFeeDetail.put("receivableAmount", feeDto.getAmountOwed());
                }
            }
        }
@@ -649,13 +649,7 @@
            System.out.println(endCalender);
        } else if ("-103".equals(paramInJson.getString("cycles"))) {
            String custEndTime = paramInJson.getString("custEndTime");
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
            Date endDates = null;
            try {
                endDates = format.parse(custEndTime);
            } catch (ParseException e) {
                e.printStackTrace();
            }
            Date endDates = DateUtil.getDateFromStringB(custEndTime);
            Calendar c = Calendar.getInstance();
            c.setTime(endDates);
            c.add(Calendar.DAY_OF_MONTH, 1);
@@ -682,6 +676,11 @@
        if (FeeDto.FEE_FLAG_CYCLE.equals(feeInfo.getFeeFlag())) {
            maxEndTime = feeInfo.getConfigEndTime();
        }
        if(FeeDto.FEE_FLAG_CYCLE_ONCE.equals(feeInfo.getFeeFlag())){
            maxEndTime = feeInfo.getMaxEndTime();
        }
        //判断 结束时间 是否大于 费用项 结束时间,这里 容错一下,如果 费用结束时间大于 费用项结束时间 30天 走报错 属于多缴费
        if (feeInfo.getEndTime().getTime() - maxEndTime.getTime() > 30 * 24 * 60 * 60 * 1000L) {
            throw new IllegalArgumentException("缴费超过了 费用项结束时间");
@@ -705,7 +704,7 @@
            calendar.add(Calendar.DAY_OF_MONTH, -5);
            maxEndTime = calendar.getTime();
            if (feeInfo.getEndTime().after(maxEndTime)) {
                businessFee.put("state", FeeStateConstant.END);
                businessFee.put("state", FeeDto.STATE_FINISH);
                businessFee.put("endTime", maxEndTime);
            }
        }
service-fee/src/main/java/com/java110/fee/discount/impl/ReductionMonthFeeRuleIn.java
New file
@@ -0,0 +1,117 @@
/*
 * Copyright 2017-2020 吴学文 and java110 team.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.java110.fee.discount.impl;
import com.java110.core.smo.IComputeFeeSMO;
import com.java110.dto.fee.FeeDto;
import com.java110.dto.feeDiscount.ComputeDiscountDto;
import com.java110.dto.feeDiscount.FeeDiscountDto;
import com.java110.dto.feeDiscount.FeeDiscountSpecDto;
import com.java110.fee.discount.IComputeDiscount;
import com.java110.intf.fee.IFeeInnerServiceSMO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
/**
 * 缴几个月赠送几个月 规则
 *
 * @desc add by 吴学文 10:27
 */
@Component(value = "reductionMonthFeeRuleIn")
public class ReductionMonthFeeRuleIn implements IComputeDiscount {
    /**
     * 89002020980001    102020001    月份
     * 89002020980002    102020001    打折率
     */
    private static final String SPEC_MONTH = "89002020980016"; //月份
    private static final String SPEC_RATE = "89002020980017"; // 赠送月份
    @Autowired
    private IFeeInnerServiceSMO feeInnerServiceSMOImpl;
    @Autowired
    private IComputeFeeSMO computeFeeSMOImpl;
    @Override
    public ComputeDiscountDto compute(FeeDiscountDto feeDiscountDto) {
        List<FeeDiscountSpecDto> feeDiscountSpecDtos = feeDiscountDto.getFeeDiscountSpecs();
        if (feeDiscountSpecDtos.size() < 1) {
            return null;
        }
        double month = 0.0;
        double reductionMonth = 0.0;
        for (FeeDiscountSpecDto feeDiscountSpecDto : feeDiscountSpecDtos) {
            if (SPEC_MONTH.equals(feeDiscountSpecDto.getSpecId())) {
                month = Double.parseDouble(feeDiscountSpecDto.getSpecValue());
            }
            if (SPEC_RATE.equals(feeDiscountSpecDto.getSpecId())) {
                reductionMonth = Double.parseDouble(feeDiscountSpecDto.getSpecValue());
            }
        }
        if (feeDiscountDto.getCycles() < month) {
            ComputeDiscountDto computeDiscountDto = new ComputeDiscountDto();
            computeDiscountDto.setDiscountId(feeDiscountDto.getDiscountId());
            computeDiscountDto.setDiscountType(FeeDiscountDto.DISCOUNT_TYPE_D);
            computeDiscountDto.setRuleId(feeDiscountDto.getRuleId());
            computeDiscountDto.setRuleName(feeDiscountDto.getRuleName());
            computeDiscountDto.setDiscountName(feeDiscountDto.getDiscountName());
            computeDiscountDto.setDiscountPrice(0.0);
            computeDiscountDto.setFeeDiscountSpecs(feeDiscountSpecDtos);
            return computeDiscountDto;
        }
        //查询费用
        FeeDto feeDto = new FeeDto();
        feeDto.setCommunityId(feeDiscountDto.getCommunityId());
        feeDto.setFeeId(feeDiscountDto.getFeeId());
        List<FeeDto> feeDtos = feeInnerServiceSMOImpl.queryFees(feeDto);
        Map feePriceAll=computeFeeSMOImpl.getFeePrice(feeDtos.get(0));
        BigDecimal priceDec = new BigDecimal(feePriceAll.get("feePrice").toString());
        double cycleRate = Math.floor(feeDiscountDto.getCycles()/month);
        BigDecimal cycleRateDec = new BigDecimal(cycleRate);
        BigDecimal reductionMonthDec = new BigDecimal(reductionMonth);
        double discountPrice = priceDec.multiply(cycleRateDec).multiply(reductionMonthDec).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
        ComputeDiscountDto computeDiscountDto = new ComputeDiscountDto();
        computeDiscountDto.setDiscountId(feeDiscountDto.getDiscountId());
        computeDiscountDto.setDiscountType(FeeDiscountDto.DISCOUNT_TYPE_D);
        computeDiscountDto.setRuleId(feeDiscountDto.getRuleId());
        computeDiscountDto.setRuleName(feeDiscountDto.getRuleName());
        computeDiscountDto.setDiscountName(feeDiscountDto.getDiscountName());
        computeDiscountDto.setDiscountPrice(discountPrice);
        computeDiscountDto.setFeeDiscountSpecs(feeDiscountSpecDtos);
        return computeDiscountDto;
    }
}