Files
AG-ONE/feeCalc/src/main/java/com/ag/account/feeUtil/ReductionUtil.java
2024-07-02 11:40:01 +08:00

136 lines
5.6 KiB
Java

package com.ag.account.feeUtil;
import com.ag.entity.account.FeeDetail;
import com.ag.entity.fee.TariffMultistep;
import com.ag.entity.fee.face.ICondition;
import com.ag.entity.fee.face.SourceProperty;
import com.ag.entity.fee.vo.TariffVO;
import com.ag.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.BeanUtils;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
/**
* Created by yangxh on 2019/8/21.
*/
public class ReductionUtil {
/**
* 金额打折
*/
public static void calcByDiscount(JSONObject json, FeeDetail detail){
//减免金额
if (!StrUtil.isEmpty(json.getString(ICondition.DERATE_MONEY)) && json.getDouble(ICondition.DERATE_MONEY) > 0){
detail.setDerateMoney(json.getDouble(ICondition.DERATE_MONEY));
detail.setFinalMoney(detail.getCalcMoney() - json.getDouble(ICondition.DERATE_MONEY));
detail.setDiscount(detail.getCalcMoney() / detail.getStMoney() * 100);//最终折扣
}
//折扣
if (!StrUtil.isEmpty(json.getString(ICondition.DISCOUNT)) && json.getDouble(ICondition.DISCOUNT) > 0){
detail.setDiscount(json.getDouble(ICondition.DISCOUNT));
detail.setFinalMoney(detail.getCalcMoney() * json.getDouble(ICondition.DISCOUNT) / 100);
detail.setDiscount(detail.getFinalMoney() / detail.getStMoney() * 100);//最终折扣
}
if (detail.getActualRate() >= 0 && detail.getFinalMoney() < 0){
detail.setFinalMoney(0d);
}
/*if (detail.getActualMoney() < 0){
detail.setActualMoney(0d);
}*/
}
/**
* 重置减免天数
*/
public static void calcByDerateDay(SourceProperty source, FeeDetail detail){
JSONObject json = source.getProperty();
if (StrUtil.isEmpty(json.getString(ICondition.DERATE_TYPE))){
return;
}
if (StrUtil.isEmpty(json.getString(ICondition.DERATE_DAY))){
return;
}
if (json.getInteger(ICondition.DERATE_DAY) < 0){
return;
}
//获取标准阶梯费率
TariffVO tariffVO = source.getTariffVO();
List<TariffMultistep> stepList = tariffVO.getStepList();
//减免类型(前免)
if (json.getInteger(ICondition.DERATE_TYPE) == 0){
//创建新费率
TariffVO derateTariff = new TariffVO();
source.setDerateTariff(derateTariff);
BeanUtils.copyProperties(tariffVO, derateTariff);
//构建前免天后的阶梯
List<TariffMultistep> stepListNew = new ArrayList<>();
derateTariff.setStepList(stepListNew);
TariffMultistep stepNewFirst = new TariffMultistep();
stepNewFirst.setStartVal(1);
stepNewFirst.setEndVal(json.getInteger(ICondition.DERATE_DAY));
stepNewFirst.setStepRate(0d);
stepListNew.add(stepNewFirst);
//无阶梯费率
if (CollectionUtils.isEmpty(stepList)){
TariffMultistep stepNewSecond = new TariffMultistep();
stepNewSecond.setStartVal(json.getInteger(ICondition.DERATE_DAY) + 1);
stepNewSecond.setEndVal(9999);
stepNewFirst.setStepRate(tariffVO.getRate());
stepListNew.add(stepNewSecond);
}
stepList.sort(Comparator.comparingInt(TariffMultistep::getStartVal));
double minPrice = 0d;//最小阶梯金额
for (TariffMultistep step : stepList){
if (step.getStepRate() > 0){
minPrice = step.getStepRate();
break;
}
}
//循环标准阶梯
for (TariffMultistep step : stepList){
//开始天大于减免天, 加入新阶梯
if (step.getStartVal() > json.getInteger(ICondition.DERATE_DAY)){
TariffMultistep stepNew = new TariffMultistep();
BeanUtils.copyProperties(step, stepNew);
stepListNew.add(stepNew);
continue;
}
//结束天小于等于减免天, 跳过
if (step.getEndVal() <= json.getInteger(ICondition.DERATE_DAY)){
continue;
}
//剩下的是免费天在开始天与结束天之间的
TariffMultistep stepNew = new TariffMultistep();
BeanUtils.copyProperties(step, stepNew);
stepNew.setStartVal(json.getInteger(ICondition.DERATE_DAY) + 1);
if (stepNew.getStepRate() == 0d){
stepNew.setStepRate(minPrice);
}
stepListNew.add(stepNew);
}
MultiStepUtil.calcAmount(derateTariff, detail);
detail.setDerateDays(json.getInteger(ICondition.DERATE_DAY));//重置减免天
}
//减免类型(后免)
if (json.getInteger(ICondition.DERATE_TYPE) == 2){
Integer settleDays = detail.getSettleDays();
detail.setSettleDays(detail.getSettleDays() - json.getInteger(ICondition.DERATE_DAY));//后免要计算的天数
MultiStepUtil.calcAmount(tariffVO, detail);
detail.setDerateDays(detail.getDerateDays() + json.getInteger(ICondition.DERATE_DAY));//重置减免天
detail.setSettleDays(settleDays);//还原堆存天
}
detail.setCalcDays(detail.getSettleDays() - detail.getDerateDays());
detail.setDiscount(detail.getFinalMoney() / detail.getStMoney() * 100);//最终折扣
}
}