之前在做还款相关的东西,发现还款没有固定的公式,故此参考了当前有的还款计算逻辑,整理除了一下计算公式。
目的:直接调用此枚举类的接口,并传入相关参数,即可计算出结果。亲测可用
注:目前没有涵盖所有的还款计算方式,可根据需求参考一下代码进行实现。
package com.yao.dd.enums;
import lombok.extern.slf4j.Slf4j;
import java.math.BigDecimal;
/**
* 还款金额计算:
*
* 应还本息
* 应还罚息
* 应还费用
* 应还复利
* 总应还
*
* 已还本息
* 已还罚息
* 已还费用
* 应还复利
* 总已还
*
* 待还本息
* 待还罚息
* 待还费用
* 应还复利
* 总待还
*/
@Slf4j
public enum RepayAmtOperationEnum {
PLUS{
@Override
public BigDecimal principalInterest(BigDecimal x, BigDecimal y, BigDecimal z){
x = x == null ? BigDecimal.ZERO : x;
y = y == null ? BigDecimal.ZERO : y;
z = z == null ? BigDecimal.ZERO : z;
return x.add(y).add(z);
}
@Override
public BigDecimal caclTotalDueAmt(BigDecimal a, BigDecimal b, BigDecimal c, BigDecimal d, BigDecimal e) {
a = a == null ? BigDecimal.ZERO : a;
b = b == null ? BigDecimal.ZERO : b;
c = c == null ? BigDecimal.ZERO : c;
d = d == null ? BigDecimal.ZERO : d;
e = e == null ? BigDecimal.ZERO : e;
return a.add(b).add(c).add(d).add(e);
}
@Override
public BigDecimal caclTotalRepaidAmt(BigDecimal a, BigDecimal b, BigDecimal c, BigDecimal d, BigDecimal e) {
a = a == null ? BigDecimal.ZERO : a;
b = b == null ? BigDecimal.ZERO : b;
c = c == null ? BigDecimal.ZERO : c;
d = d == null ? BigDecimal.ZERO : d;
e = e == null ? BigDecimal.ZERO : e;
return a.add(b).add(c).add(d).add(e);
}
@Override
public BigDecimal caclTotalStayAmt(BigDecimal x, BigDecimal y) {
return null;
}
}
,
MINUS{
@Override
public BigDecimal principalInterest(BigDecimal x, BigDecimal y, BigDecimal z){
return null;
}
@Override
public BigDecimal caclTotalDueAmt(BigDecimal a, BigDecimal b, BigDecimal c, BigDecimal d, BigDecimal e) {
return null;
}
@Override
public BigDecimal caclTotalRepaidAmt(BigDecimal a, BigDecimal b, BigDecimal c, BigDecimal d, BigDecimal e) {
return null;
}
@Override
public BigDecimal caclTotalStayAmt(BigDecimal x, BigDecimal y) {
x = x == null ? BigDecimal.ZERO : x;
y = y == null ? BigDecimal.ZERO : y;
BigDecimal totalAmt = x.subtract(y);
if(totalAmt.compareTo(BigDecimal.ZERO) < 0){
// log.info("总待还金额小于0,默认赋值为0");
System.out.println("总待还金额小于0,默认赋值为0");
totalAmt = BigDecimal.ZERO;
}
return totalAmt;
}
};
/**
* TODO 本息:应还本息/待还本息
* @param x 本金
* @param y 利息
* @param z 罚息
* @return
*/
public abstract BigDecimal principalInterest(BigDecimal x, BigDecimal y, BigDecimal z);
/**
* TODO 总应还=应还本金+应还利息+应还费用+应还罚息+应还复利
* @param a 应还本金
* @param b 应还利息
* @param c 应还费用
* @param d 应还罚息
* @param e 应还复利
* @return
*/
public abstract BigDecimal caclTotalDueAmt(BigDecimal a, BigDecimal b, BigDecimal c, BigDecimal d, BigDecimal e);
/**
* TODO 总已还=已还本金+已还利息+已还费用+已还罚息+已还复利
* @param a 已还本金
* @param b 已还利息
* @param c 已还费用
* @param d 已还罚息
* @param e 已还复利
* @return
*/
public abstract BigDecimal caclTotalRepaidAmt(BigDecimal a, BigDecimal b, BigDecimal c, BigDecimal d, BigDecimal e);
/**
* TODO 总待还=总应还-总已还
* @param x 总应还
* @param y 总已还
* @return
*/
public abstract BigDecimal caclTotalStayAmt(BigDecimal x, BigDecimal y);
public static void main(String[] args) {
System.out.println("应还本息/待还本息:"+RepayAmtOperationEnum.PLUS.principalInterest(new BigDecimal(100), new BigDecimal(10), new BigDecimal(10)));
RepayAmtOperationEnum.MINUS.caclTotalStayAmt(null,new BigDecimal(10));
}
}