package com.java110.fee.tempCar; import com.java110.core.factory.TempCarFeeFactory; import com.java110.dto.fee.TempCarFeeResult; import com.java110.dto.machine.CarInoutDto; import com.java110.dto.tempCarFeeConfig.TempCarFeeConfigAttrDto; import com.java110.dto.tempCarFeeConfig.TempCarFeeConfigDto; import org.springframework.stereotype.Component; import java.math.BigDecimal; import java.util.List; /** * 标准临时车费用计算 */ @Component(value = "6700012001") public class BasicComputeTempCarFeeImpl extends BaseComputeTempCarFee { //5600012001 免费时间(分钟) //5600012002 首段时长(分钟) //5600012003 首段时长收费 //5600012004 超过首段(分钟) //5600012005 超过首段收费 //5600012006 停车超过(分钟) //5600012007 每多少分钟 //5600012008 停车超过收费 //5600012009 最高收费 public static final String SPEC_CD_5600012001 = "5600012001"; public static final String SPEC_CD_5600012002 = "5600012002"; public static final String SPEC_CD_5600012003 = "5600012003"; public static final String SPEC_CD_5600012004 = "5600012004"; public static final String SPEC_CD_5600012005 = "5600012005"; public static final String SPEC_CD_5600012006 = "5600012006"; public static final String SPEC_CD_5600012007 = "5600012007"; public static final String SPEC_CD_5600012008 = "5600012006"; public static final String SPEC_CD_5600012009 = "5600012009"; @Override public TempCarFeeResult doCompute(CarInoutDto carInoutDto, TempCarFeeConfigDto tempCarFeeConfigDto, List tempCarFeeConfigAttrDtos) { //获取停车时间 long min = TempCarFeeFactory.getTempCarMin(carInoutDto); int freeMin = TempCarFeeFactory.getAttrValueInt(tempCarFeeConfigAttrDtos, SPEC_CD_5600012001); //最大收费 double maxFeeMoney = TempCarFeeFactory.getAttrValueDouble(tempCarFeeConfigAttrDtos, SPEC_CD_5600012009); //判断 时间是否超过24小时 double baseMoney = 0.0; //免费时间中 if (min < freeMin && !TempCarFeeFactory.judgeFinishPayTempCarFee(carInoutDto)) { return new TempCarFeeResult(carInoutDto.getCarNum(), 0.0, maxFeeMoney, baseMoney); } BigDecimal minDeci = new BigDecimal(min); //处理超过 一天的数据 if (min > 24 * 60) { BigDecimal dayDeci = minDeci.divide(new BigDecimal(24 * 60),0, BigDecimal.ROUND_DOWN); baseMoney = dayDeci.multiply(new BigDecimal(maxFeeMoney)).doubleValue(); minDeci = minDeci.subtract(dayDeci.multiply(new BigDecimal(24 * 60))).setScale(0, BigDecimal.ROUND_DOWN); min = minDeci.intValue(); } // 特殊情况 好几天后刚好 min为0 if (min == 0) { return new TempCarFeeResult(carInoutDto.getCarNum(), 0.0, maxFeeMoney, baseMoney); } int firstMin = TempCarFeeFactory.getAttrValueInt(tempCarFeeConfigAttrDtos, SPEC_CD_5600012002); double firstMoney = TempCarFeeFactory.getAttrValueDouble(tempCarFeeConfigAttrDtos, SPEC_CD_5600012003); //在首段时长(分钟)中 if (min < firstMin) { return new TempCarFeeResult(carInoutDto.getCarNum(), firstMoney, maxFeeMoney, baseMoney); } //超过手段 int afterMin = TempCarFeeFactory.getAttrValueInt(tempCarFeeConfigAttrDtos, SPEC_CD_5600012004); double afterByMoney = TempCarFeeFactory.getAttrValueDouble(tempCarFeeConfigAttrDtos, SPEC_CD_5600012005); //超过多少分钟 int maxMin = TempCarFeeFactory.getAttrValueInt(tempCarFeeConfigAttrDtos, SPEC_CD_5600012006); //判断是否超过最大 停车时间 if (min < maxMin) { //最大停车时间内 //超过的时间 BigDecimal afterFirstMin = minDeci.subtract(new BigDecimal(firstMin)); //时间差 除以 没多少分钟 向上取整 double money = afterFirstMin.divide(new BigDecimal(afterMin),0, BigDecimal.ROUND_UP) .multiply(new BigDecimal(afterByMoney)) .setScale(2, BigDecimal.ROUND_HALF_UP).add(new BigDecimal(firstMoney)).doubleValue(); return new TempCarFeeResult(carInoutDto.getCarNum(), money, maxFeeMoney, baseMoney); } //最大停车时间 BigDecimal maxMinDeci = new BigDecimal(maxMin); int afterMaxMin = TempCarFeeFactory.getAttrValueInt(tempCarFeeConfigAttrDtos, SPEC_CD_5600012007); double afterMaxByMoney = TempCarFeeFactory.getAttrValueDouble(tempCarFeeConfigAttrDtos, SPEC_CD_5600012008); //最大时间减去 首段时间 BigDecimal afterFirstMin = maxMinDeci.subtract(new BigDecimal(firstMin)); //时间差 除以 没多少分钟 向上取整 BigDecimal firstToMaxMoney = afterFirstMin.divide(new BigDecimal(afterMin),0, BigDecimal.ROUND_UP) .multiply(new BigDecimal(afterByMoney)) .setScale(2, BigDecimal.ROUND_HALF_UP).add(new BigDecimal(firstMoney)); double money = minDeci.subtract(maxMinDeci) .divide(new BigDecimal(afterMaxMin),0,BigDecimal.ROUND_UP) .multiply(new BigDecimal(afterMaxByMoney)) .setScale(2, BigDecimal.ROUND_HALF_UP) .add(firstToMaxMoney).doubleValue(); return new TempCarFeeResult(carInoutDto.getCarNum(), money, maxFeeMoney, baseMoney); } }