Browse Source

金融方案计算

zhanglei
dimengzhe 2 years ago
parent
commit
6bcacb6926
  1. 79
      anrui-portal/anrui-portal-biz/src/test/java/com/yxt/anrui/portal/test/controller/ArithmeticController.java
  2. 8
      anrui-riskcenter/anrui-riskcenter-api/src/main/java/com/yxt/anrui/riskcenter/api/loansolutions/LoanSolutionsFeign.java
  3. 7
      anrui-riskcenter/anrui-riskcenter-api/src/main/java/com/yxt/anrui/riskcenter/api/loansolutions/LoanSolutionsFeignFallback.java
  4. 99
      anrui-riskcenter/anrui-riskcenter-api/src/main/java/com/yxt/anrui/riskcenter/api/loansolutions/calculate/CalculateQuery.java
  5. 61
      anrui-riskcenter/anrui-riskcenter-api/src/main/java/com/yxt/anrui/riskcenter/api/loansolutions/calculate/CalculateVo.java
  6. 9
      anrui-riskcenter/anrui-riskcenter-biz/src/main/java/com/yxt/anrui/riskcenter/biz/loansolutions/LoanSolutionsRest.java
  7. 215
      anrui-riskcenter/anrui-riskcenter-biz/src/main/java/com/yxt/anrui/riskcenter/biz/loansolutions/LoanSolutionsService.java
  8. 12
      anrui-riskcenter/anrui-riskcenter-biz/src/main/java/com/yxt/anrui/riskcenter/biz/loantemplate/LoanTemplateService.java

79
anrui-portal/anrui-portal-biz/src/test/java/com/yxt/anrui/portal/test/controller/ArithmeticController.java

@ -32,9 +32,80 @@ public class ArithmeticController {
// System.out.println("========get");
// get(30000, 0.02, 3);
calculatePMT(0.06, 6, 95000);
calculatePMT(0.06, 6, 95000);
/* System.out.println(simpleCalculateRate(12, 874.52, -10000) * 12);
System.out.println(simpleCalculateRate(24, 454.67, -10000) * 12);
System.out.println(simpleCalculateRate(36, 315.67, -10000) * 12);*/
System.out.println(simpleCalculateRate(12, 852.33, -10000) * 12);
}
/**
* simpleCalculateRate:(这里用一句话描述这个方法的做用). <br/>
*
* @param nper 为总投资期即该项投资的付款期总数
* @param pmt 为各期付款额其数值在整个投资期内保持不变一般 pmt 包括本金和利息但不包括其余费用或税金若是忽略了
* pmt则必须包含 fv 参数
* @param pv 为现值即从该项投资开始计算时已经入账的款项或一系列将来付款当前值的累积和也称为本金
* @return
*/
public static double simpleCalculateRate(double nper, double pmt, double pv) {
double fv = 0;
//0或省略-期末支付
double type = 0;
//若是省略预期利率,则假设该值为 10%。
double guess = 0.1;
return calculateRate(nper, pmt, pv, fv, type, guess);
}
/**
* calculateRate:类excel中的RATE函数计算结果值为月利率年华利率 *12期. <br/>
* rate = calculateRate(periods, payment, present_val, future_val, type,
* estimate) ;
*
* @param nper 为总投资期即该项投资的付款期总数
* @param pmt 为各期付款额其数值在整个投资期内保持不变一般 pmt 包括本金和利息但不包括其余费用或税金若是忽略了
* pmt则必须包含 fv 参数
* @param pv 为现值即从该项投资开始计算时已经入账的款项或一系列将来付款当前值的累积和也称为本金
* @param fv 为将来值或在最后一次付款后但愿获得的现金余额若是省略 fv则假设其值为零也就是一笔贷款的将来值为零
* @param type 数字 0 1用以指定各期的付款时间是在期初仍是期末 0或省略-期末|| 1-期初
* @param guess 预期利率 若是省略预期利率则假设该值为 10%
* @return
*/
public static double calculateRate(double nper, double pmt, double pv, double fv, double type, double guess) {
int FINANCIAL_MAX_ITERATIONS = 20;
double FINANCIAL_PRECISION = 0.0000001;//1.0e-8
double y, y0, y1, x0, x1 = 0, f = 0, i = 0;
double rate = guess;
if (Math.abs(rate) < FINANCIAL_PRECISION) {
y = pv * (1 + nper * rate) + pmt * (1 + rate * type) * nper + fv;
} else {
f = Math.exp(nper * Math.log(1 + rate));
y = pv * f + pmt * (1 / rate + type) * (f - 1) + fv;
}
y0 = pv + pmt * nper + fv;
y1 = pv * f + pmt * (1 / rate + type) * (f - 1) + fv;
i = x0 = 0.0;
x1 = rate;
while ((Math.abs(y0 - y1) > FINANCIAL_PRECISION) && (i < FINANCIAL_MAX_ITERATIONS)) {
rate = (y1 * x0 - y0 * x1) / (y1 - y0);
x0 = x1;
x1 = rate;
if (Math.abs(rate) < FINANCIAL_PRECISION) {
y = pv * (1 + nper * rate) + pmt * (1 + rate * type) * nper + fv;
} else {
f = Math.exp(nper * Math.log(1 + rate));
y = pv * f + pmt * (1 / rate + type) * (f - 1) + fv;
}
y0 = y1;
y1 = y;
++i;
}
return rate;
}
/**
* 计算月还
*
@ -55,10 +126,10 @@ public class ArithmeticController {
double v = (1 + (rate / 12));
double t = (-(nper / nper) * nper);
double result = (pv * (rate / 12)) / (1 - Math.pow(v, t));
System.out.println("result==========="+result);
System.out.println("result===========" + result);
BigDecimal bigDecimal = new BigDecimal(result);
bigDecimal = bigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println("bigDecimal================"+bigDecimal);
bigDecimal = bigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println("bigDecimal================" + bigDecimal);
return result;
}

8
anrui-riskcenter/anrui-riskcenter-api/src/main/java/com/yxt/anrui/riskcenter/api/loansolutions/LoanSolutionsFeign.java

@ -2,6 +2,8 @@ package com.yxt.anrui.riskcenter.api.loansolutions;
import com.yxt.anrui.riskcenter.api.loansolutions.app.SolutionsDetailsVo;
import com.yxt.anrui.riskcenter.api.loansolutions.app.SolutionsDto;
import com.yxt.anrui.riskcenter.api.loansolutions.calculate.CalculateQuery;
import com.yxt.anrui.riskcenter.api.loansolutions.calculate.CalculateVo;
import com.yxt.common.core.result.ResultBean;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@ -94,5 +96,11 @@ public interface LoanSolutionsFeign {
@GetMapping("/getAppSumSolutionsByOrderSid")
public ResultBean<AppLoanSolutionsVo> getAppSumSolutionsByOrderSid(@RequestParam("orderSid") String orderSid);
*/
/*****************************************************************************************/
@ApiOperation("金融方案的计算")
@PostMapping("/calculate")
ResultBean<CalculateVo> calculate(@RequestBody CalculateQuery query);
}

7
anrui-riskcenter/anrui-riskcenter-api/src/main/java/com/yxt/anrui/riskcenter/api/loansolutions/LoanSolutionsFeignFallback.java

@ -2,6 +2,8 @@ package com.yxt.anrui.riskcenter.api.loansolutions;
import com.yxt.anrui.riskcenter.api.loansolutions.app.SolutionsDetailsVo;
import com.yxt.anrui.riskcenter.api.loansolutions.app.SolutionsDto;
import com.yxt.anrui.riskcenter.api.loansolutions.calculate.CalculateQuery;
import com.yxt.anrui.riskcenter.api.loansolutions.calculate.CalculateVo;
import com.yxt.common.core.result.ResultBean;
import org.springframework.stereotype.Component;
@ -62,6 +64,11 @@ public class LoanSolutionsFeignFallback implements LoanSolutionsFeign {
return null;
}
@Override
public ResultBean<CalculateVo> calculate(CalculateQuery query) {
return null;
}
/* @Override
public ResultBean<PagerVo<LoanSolutionsVo>> listPage(PagerQuery<LoanSolutionsQuery> pq) {
ResultBean rb = ResultBean.fireFail();

99
anrui-riskcenter/anrui-riskcenter-api/src/main/java/com/yxt/anrui/riskcenter/api/loansolutions/calculate/CalculateQuery.java

@ -0,0 +1,99 @@
package com.yxt.anrui.riskcenter.api.loansolutions.calculate;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
/**
* @description:
* @author: dimengzhe
* @date: 2023/8/11
**/
@Data
public class CalculateQuery {
@ApiModelProperty("是否打包:1是0否")
private String isPack;
@ApiModelProperty("产品政策sid")
private String policySid;
@ApiModelProperty("主车发票价")
private String mainVehicleAmount;
@ApiModelProperty("配件")
private String accessoriesAmount;
@ApiModelProperty("是否有配件")
private boolean accessoriesAmountCb;
@ApiModelProperty("挂车金额")
private String trailerAmount;
@ApiModelProperty("是否有挂车")
private boolean trailerAmountCb;
@ApiModelProperty("保险金额")
private String premium;
@ApiModelProperty("是否有保险")
private boolean premiumCb;
@ApiModelProperty("购置税")
private String purchaseTax;
@ApiModelProperty("是否有购置税")
private boolean purchaseTaxCb;
@ApiModelProperty("融资项目总额")
private String loanTotal;
/* @ApiModelProperty("首付款比例")
private String downPayRatio;*/
@ApiModelProperty("首付金额")
private String downPayAmount;
@ApiModelProperty("贷款金额")
private String loanAmount;
@ApiModelProperty("贷款期数")
private String loanPeriod;
@ApiModelProperty("贷款保证金比例")
private String bondRatio;
@ApiModelProperty("贷款保证金金额")
private String bondAmount;
@ApiModelProperty("厂家贴息")
private String factoryDiscount;
@ApiModelProperty("是否勾选其它融")
private boolean otherPolicyState;
/*************************其他融和方案汇总*********************************/
@ApiModelProperty("其它融贷款金额")
private String otherPolicyAmount;
@ApiModelProperty("其它融期数")
private String otherPolicyPeriod;
@ApiModelProperty("其它融年利率")
private String otherPolicyYearRatio;
/*********************************金融方案费用明细*****************************/
@ApiModelProperty("贷款保证金")
private String bondAmounts;
@ApiModelProperty("保险保证金")
private String depositPremium;
@ApiModelProperty("落户保证金")
private String depositSettle;
@ApiModelProperty("服务费")
private String serviceAmount;
@ApiModelProperty("代收意外险")
private String proxyAccidentPremium;
@ApiModelProperty("上牌费")
private String registerAmount;
@ApiModelProperty("运管费")
private String operationAmount;
@ApiModelProperty("补车价")
private String vehOtherPrice;
@ApiModelProperty("其它费用")
private String otherAmount;
@ApiModelProperty("其它费用说明")
private String otherAmountRemark;
//01公司办理,02自行办理
@ApiModelProperty("办理方式选择key")
private String dealWayKey;
@ApiModelProperty("代收首年保险费")
private String proxyPremium;
@ApiModelProperty("代收购置费")
private String proxyPurchasetax;
@ApiModelProperty("抵顶首年保险费")
private String offsetPremium;
@ApiModelProperty("抵顶购置税")
private String offsetPurchasetax;
}

61
anrui-riskcenter/anrui-riskcenter-api/src/main/java/com/yxt/anrui/riskcenter/api/loansolutions/calculate/CalculateVo.java

@ -0,0 +1,61 @@
package com.yxt.anrui.riskcenter.api.loansolutions.calculate;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
* @description:
* @author: dimengzhe
* @date: 2023/8/11
**/
@Data
public class CalculateVo {
@ApiModelProperty("主方案年利率")
private String policyYearRatio;
@ApiModelProperty("主方案月还金额")
private String loanPayMoney;
@ApiModelProperty("主方案利息总额")
private String loanInterest;
/************其他融**************/
@ApiModelProperty("其它融月还")
private String otherPolicyMonthlyRepay;
@ApiModelProperty("其它融利息总额")
private String otherPolicyInterest;
/***********方案汇总*************/
@ApiModelProperty("'融资首付")
private String loanDownPay;
@ApiModelProperty("实际首付比例")
private String downPayAmountsRatio;
@ApiModelProperty("总贷款金额")
private String loanAmountTotal;
@ApiModelProperty("期数")
private String period;
@ApiModelProperty("月还金额")
private String monthlyRepay;
@ApiModelProperty("利息总额")
private String interest;
/***************应收明细*******************/
@ApiModelProperty("融资首付")
private String downPayAmounts;
@ApiModelProperty("代收费用合计")
private String proxyTotal;
@ApiModelProperty("应收合计")
private String receivableTotal;
@ApiModelProperty("抵顶费用合计")
private String offsetTotal;
@ApiModelProperty("实收合计")
private String realTotal;
@ApiModelProperty("车辆总价")
private String vehTotalPrice;
}

9
anrui-riskcenter/anrui-riskcenter-biz/src/main/java/com/yxt/anrui/riskcenter/biz/loansolutions/LoanSolutionsRest.java

@ -4,6 +4,8 @@ import com.yxt.anrui.riskcenter.api.loansolutions.LoanSolutions;
import com.yxt.anrui.riskcenter.api.loansolutions.LoanSolutionsFeign;
import com.yxt.anrui.riskcenter.api.loansolutions.app.SolutionsDetailsVo;
import com.yxt.anrui.riskcenter.api.loansolutions.app.SolutionsDto;
import com.yxt.anrui.riskcenter.api.loansolutions.calculate.CalculateQuery;
import com.yxt.anrui.riskcenter.api.loansolutions.calculate.CalculateVo;
import com.yxt.common.core.result.ResultBean;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
@ -64,7 +66,7 @@ public class LoanSolutionsRest implements LoanSolutionsFeign {
}
@Override
public ResultBean<List<LoanSolutions>> selectByOrderSid(String saleOrderSid) {
public ResultBean<List<LoanSolutions>> selectByOrderSid(String saleOrderSid) {
return loanSolutionsService.selectByOrderSid(saleOrderSid);
}
@ -74,6 +76,11 @@ public class LoanSolutionsRest implements LoanSolutionsFeign {
return loanSolutionsService.saveByOrderSid(loanSolutions);
}
@Override
public ResultBean<CalculateVo> calculate(CalculateQuery query) {
return loanSolutionsService.calculate(query);
}
/* @Override
public ResultBean<PagerVo<LoanSolutionsVo>> listPage(@RequestBody PagerQuery<LoanSolutionsQuery> pq) {
ResultBean rb = ResultBean.fireFail();

215
anrui-riskcenter/anrui-riskcenter-biz/src/main/java/com/yxt/anrui/riskcenter/biz/loansolutions/LoanSolutionsService.java

@ -6,12 +6,16 @@ import com.yxt.anrui.buscenter.api.bussalesorder.app.order.AppOrderDetailsVo;
import com.yxt.anrui.buscenter.api.bussalesorder.app.order.AppOrderPriceInfoVo;
import com.yxt.anrui.flowable.api.flowtask.FlowTaskFeign;
import com.yxt.anrui.flowable.api.flowtask.LatestTaskVo;
import com.yxt.anrui.riskcenter.api.loanfinpolicy.LoanFinPolicy;
import com.yxt.anrui.riskcenter.api.loansolutions.LoanSolutions;
import com.yxt.anrui.riskcenter.api.loansolutions.SolutionDetailsDto;
import com.yxt.anrui.riskcenter.api.loansolutions.app.SolutionsDetailsVo;
import com.yxt.anrui.riskcenter.api.loansolutions.app.SolutionsDto;
import com.yxt.anrui.riskcenter.api.loansolutions.calculate.CalculateQuery;
import com.yxt.anrui.riskcenter.api.loansolutions.calculate.CalculateVo;
import com.yxt.anrui.riskcenter.api.loansolutionsdetail.LoanSolutionsDetail;
import com.yxt.anrui.riskcenter.api.loansolutionsotherpolicy.LoanSolutionsOtherpolicy;
import com.yxt.anrui.riskcenter.biz.loanfinpolicy.LoanFinPolicyService;
import com.yxt.anrui.riskcenter.biz.loansolutionsdetail.LoanSolutionsDetailService;
import com.yxt.anrui.riskcenter.biz.loansolutionsotherpolicy.LoanSolutionsOtherpolicyService;
import com.yxt.common.base.service.MybatisBaseService;
@ -51,6 +55,8 @@ public class LoanSolutionsService extends MybatisBaseService<LoanSolutionsMapper
@Autowired
private FlowTaskFeign flowTaskFeign;
@Autowired
private LoanFinPolicyService loanFinPolicyService;
public ResultBean<SolutionsDetailsVo> selectDetails(String saleOrderSid) {
ResultBean<SolutionsDetailsVo> rb = ResultBean.fireFail();
@ -872,7 +878,7 @@ public class LoanSolutionsService extends MybatisBaseService<LoanSolutionsMapper
loanSolutionsDetail.setOffsetPremium(StringUtils.isNotBlank(offsetPremium) ? new BigDecimal(offsetPremium) : BigDecimal.ZERO);
//抵顶购置税
String offsetPurchasetax = dto.getOffsetPurchasetax();
loanSolutionsDetail.setOffsetPurchasetax(StringUtils.isNotBlank(offsetPurchasetax)?new BigDecimal(offsetPurchasetax) : BigDecimal.ZERO);
loanSolutionsDetail.setOffsetPurchasetax(StringUtils.isNotBlank(offsetPurchasetax) ? new BigDecimal(offsetPurchasetax) : BigDecimal.ZERO);
String proxyTotal = dto.getProxyTotal();
loanSolutionsDetail.setProxyTotal(StringUtils.isNotBlank(proxyTotal) ? new BigDecimal(proxyTotal) : BigDecimal.ZERO);
String offsetTotal = dto.getOffsetTotal();
@ -991,6 +997,213 @@ public class LoanSolutionsService extends MybatisBaseService<LoanSolutionsMapper
}
return rb.success().setData(solutionsDetailsVo);
}
public ResultBean<CalculateVo> calculate(CalculateQuery query) {
ResultBean<CalculateVo> rb = ResultBean.fireFail();
/**
* 相关计算公式
* 融资项目总额 = 主车发票价+配件+挂车+保险+购置税只有勾选才相加
* 首付金额 = 融资项目总额 x 首付比例
* 产品贷款金额 = 融资项目总额-首付金额
* 贷款保证金 = 贷款金额 x 贷款保证金比例
*
*/
//是否打包:1是,0否
String isPack = query.getIsPack();
if (StringUtils.isBlank(isPack)) {
return rb.setMsg("请选择是否打包");
}
String policySid = query.getPolicySid();
if (StringUtils.isBlank(policySid)) {
return rb.setMsg("请先选择产品政策");
}
CalculateVo calculateVo = new CalculateVo();
//计算的初始化
BigDecimal loanTotal = BigDecimal.ZERO;//融资项目总额
//产品贷款金额
BigDecimal loanAmount = BigDecimal.ZERO;//贷款金额
/***************相关计算及字段*****************/
//主车发票价
String mainVehicleAmount = query.getMainVehicleAmount();
//配件
String accessoriesAmount = query.getAccessoriesAmount();
//是否有配件
boolean accessoriesAmountCb = query.isAccessoriesAmountCb();
//挂车金额
String trailerAmount = query.getTrailerAmount();
//是否包含挂车
boolean trailerAmountCb = query.isTrailerAmountCb();
//保险金额
String premium = query.getPremium();
//是否包含保险
boolean premiumCb = query.isPremiumCb();
//购置税
String purchaseTax = query.getPurchaseTax();
//是否包含购置税
boolean purchaseTaxCb = query.isPurchaseTaxCb();
//首付金额
String downPayAmount = query.getDownPayAmount();
//产品期数
String loanPeriod = query.getLoanPeriod();
//厂家贴息
String factoryDiscount = query.getFactoryDiscount();
if (StringUtils.isNotBlank(mainVehicleAmount)) {
//主车发票价
loanTotal = loanTotal.add(new BigDecimal(mainVehicleAmount));
}
if (accessoriesAmountCb) {//包含配件
if (StringUtils.isNotBlank(accessoriesAmount)) {
loanTotal = loanTotal.add(new BigDecimal(accessoriesAmount));
}
}
if (trailerAmountCb) {//包含挂车
if (StringUtils.isNotBlank(trailerAmount)) {
loanTotal = loanTotal.add(new BigDecimal(trailerAmount));
}
}
//判断是否打包
if ("1".equals(isPack)) {//打包
if (premiumCb) {//包含保险
if (StringUtils.isNotBlank(premium)) {
loanTotal = loanTotal.add(new BigDecimal(premium));
}
}
if (purchaseTaxCb) {//包含购置税
if (StringUtils.isNotBlank(purchaseTax)) {
loanTotal = loanTotal.add(new BigDecimal(purchaseTax));
}
}
} else {//不打包
}
if (StringUtils.isNotBlank(downPayAmount)) {
loanAmount = loanTotal.subtract(new BigDecimal(downPayAmount));
}
//计算主方案的年利率、月还金额、利息总额
//如果有不是0的厂家贴息,则年利率需要计算。如果厂家贴息空或者0,则年利率需要根据产品政策的sid获取
//根据产品政策查询原利率
LoanFinPolicy loanFinPolicy = loanFinPolicyService.fetchBySid(policySid);
if (StringUtils.isNotBlank(factoryDiscount) && !"0".equals(factoryDiscount)) {
//年利率
BigDecimal policyYearRatio = loanFinPolicy.getYearRatio();
//根据年利率和期数、贷款金额计算旧月还
BigDecimal loanPayMoney = calculatePMT(policyYearRatio.divide(new BigDecimal("100"), 4, BigDecimal.ROUND_CEILING).doubleValue(), new BigDecimal(loanPeriod).doubleValue(), loanAmount.doubleValue());
//根据月还计算旧利息总额=旧月还金额 乘以 期数 减去 本金
BigDecimal loanInterest = loanPayMoney.multiply(new BigDecimal(loanPeriod)).subtract(loanAmount);
//根据旧利息总额和厂家贴息计算新利息总额
BigDecimal loanInterestNew = loanInterest.subtract(new BigDecimal(factoryDiscount));
//再根据厂家贴息、旧月还计算新月还金额 = 旧月还金额 减去 厂家贴息 除以 期数
BigDecimal loanPayMoneyNew = loanPayMoney.subtract(new BigDecimal(factoryDiscount).divide(new BigDecimal(loanPeriod), 4, BigDecimal.ROUND_HALF_UP));
//根据新月还rate计算新年利率。
BigDecimal policyYearRatioNew = simpleCalculateRate(new BigDecimal(loanPeriod).doubleValue(), loanPayMoneyNew.doubleValue(), -loanAmount.doubleValue()).multiply(new BigDecimal("12")).multiply(new BigDecimal("100"));
policyYearRatioNew = policyYearRatioNew.setScale(2,BigDecimal.ROUND_HALF_UP);
loanPayMoneyNew = loanPayMoneyNew.setScale(0,BigDecimal.ROUND_HALF_UP);
loanInterestNew = loanInterestNew.setScale(0,BigDecimal.ROUND_HALF_UP);
calculateVo.setLoanInterest(loanInterestNew.toString());
calculateVo.setPolicyYearRatio(policyYearRatioNew.toString());
calculateVo.setLoanPayMoney(loanPayMoneyNew.toString());
} else {
//年利率
BigDecimal policyYearRatio = loanFinPolicy.getYearRatio();
//根据年利率和期数、贷款金额计算旧月还
BigDecimal loanPayMoney = calculatePMT(policyYearRatio.divide(new BigDecimal("100"), 4, BigDecimal.ROUND_CEILING).doubleValue(), new BigDecimal(loanPeriod).doubleValue(), loanAmount.doubleValue());
//根据月还计算旧利息总额=旧月还金额 乘以 期数 减去 本金
BigDecimal loanInterest = loanPayMoney.multiply(new BigDecimal(loanPeriod)).subtract(loanAmount);
loanPayMoney = loanPayMoney.setScale(0,BigDecimal.ROUND_HALF_UP);
loanInterest = loanInterest.setScale(0,BigDecimal.ROUND_HALF_UP);
calculateVo.setLoanInterest(loanInterest.toString());
calculateVo.setPolicyYearRatio(policyYearRatio.toString());
calculateVo.setLoanPayMoney(loanPayMoney.toString());
}
return rb.success().setData(calculateVo);
}
/**
* 计算月还
*
* @param rate 年利率
* @param nper 总期数
* @param pv 贷款金额
* @return
*/
public static BigDecimal calculatePMT(double rate, double nper, double pv) {
double v = (1 + (rate / 12));
double t = (-(nper / nper) * nper);
double result = (pv * (rate / 12)) / (1 - Math.pow(v, t));
// result = Math.round(result);
return new BigDecimal(result);
}
/**
* simpleCalculateRate:(这里用一句话描述这个方法的做用). <br/>
*
* @param nper 为总投资期即该项投资的付款期总数
* @param pmt 为各期付款额其数值在整个投资期内保持不变一般 pmt 包括本金和利息但不包括其余费用或税金若是忽略了
* pmt则必须包含 fv 参数
* @param pv 为现值即从该项投资开始计算时已经入账的款项或一系列将来付款当前值的累积和也称为本金
* @return
*/
public static BigDecimal simpleCalculateRate(double nper, double pmt, double pv) {
double fv = 0;
//0或省略-期末支付
double type = 0;
//若是省略预期利率,则假设该值为 10%。
double guess = 0.1;
return new BigDecimal(calculateRate(nper, pmt, pv, fv, type, guess));
}
/**
* calculateRate:类excel中的RATE函数计算结果值为月利率年华利率 *12期. <br/>
* rate = calculateRate(periods, payment, present_val, future_val, type,
* estimate) ;
*
* @param nper 为总投资期即该项投资的付款期总数
* @param pmt 为各期付款额其数值在整个投资期内保持不变一般 pmt 包括本金和利息但不包括其余费用或税金若是忽略了
* pmt则必须包含 fv 参数
* @param pv 为现值即从该项投资开始计算时已经入账的款项或一系列将来付款当前值的累积和也称为本金
* @param fv 为将来值或在最后一次付款后但愿获得的现金余额若是省略 fv则假设其值为零也就是一笔贷款的将来值为零
* @param type 数字 0 1用以指定各期的付款时间是在期初仍是期末 0或省略-期末|| 1-期初
* @param guess 预期利率 若是省略预期利率则假设该值为 10%
* @return
*/
public static double calculateRate(double nper, double pmt, double pv, double fv, double type, double guess) {
int FINANCIAL_MAX_ITERATIONS = 20;
double FINANCIAL_PRECISION = 0.0000001;
double y, y0, y1, x0, x1 = 0, f = 0, i = 0;
double rate = guess;
if (Math.abs(rate) < FINANCIAL_PRECISION) {
y = pv * (1 + nper * rate) + pmt * (1 + rate * type) * nper + fv;
} else {
f = Math.exp(nper * Math.log(1 + rate));
y = pv * f + pmt * (1 / rate + type) * (f - 1) + fv;
}
y0 = pv + pmt * nper + fv;
y1 = pv * f + pmt * (1 / rate + type) * (f - 1) + fv;
i = x0 = 0.0;
x1 = rate;
while ((Math.abs(y0 - y1) > FINANCIAL_PRECISION) && (i < FINANCIAL_MAX_ITERATIONS)) {
rate = (y1 * x0 - y0 * x1) / (y1 - y0);
x0 = x1;
x1 = rate;
if (Math.abs(rate) < FINANCIAL_PRECISION) {
y = pv * (1 + nper * rate) + pmt * (1 + rate * type) * nper + fv;
} else {
f = Math.exp(nper * Math.log(1 + rate));
y = pv * f + pmt * (1 / rate + type) * (f - 1) + fv;
}
y0 = y1;
y1 = y;
++i;
}
return rate;
}
/* @Autowired
private LoanSolutionsTopService loanSolutionsTopService;
@Autowired

12
anrui-riskcenter/anrui-riskcenter-biz/src/main/java/com/yxt/anrui/riskcenter/biz/loantemplate/LoanTemplateService.java

@ -179,7 +179,7 @@ public class LoanTemplateService extends MybatisBaseService<LoanTemplateMapper,
BeanUtil.copyProperties(loanTemplateSolutionsDto, solutionsDto, "sid");
solutionsDto.setBusSid(sid);
ResultBean resultBean = loanSolutionsService.saveDtoss(solutionsDto);
if(!resultBean.getSuccess()){
if (!resultBean.getSuccess()) {
return rb.setMsg(resultBean.getMsg());
}
}
@ -230,7 +230,7 @@ public class LoanTemplateService extends MybatisBaseService<LoanTemplateMapper,
fileList = fileList.stream().map(v -> v.replaceAll(fileUploadComponent.getUrlPrefix(), "")).collect(Collectors.toList());
String files = String.join(",", fileList);
loanTemplateTrailer.setVehTrailerCertificateFile(files);
}else{
} else {
loanTemplateTrailer.setVehTrailerCertificateFile("");
}
loanTemplateTrailerService.insert(loanTemplateTrailer);
@ -590,9 +590,9 @@ public class LoanTemplateService extends MybatisBaseService<LoanTemplateMapper,
LoanTemplateInstallVo loanTemplateInstallVo = new LoanTemplateInstallVo();
BeanUtil.copyProperties(installModelDetailsVoResultBean.getData(), loanTemplateInstallVo, "sid");
BeanUtil.copyProperties(loanTemplateInstall, loanTemplateInstallVo);
String wkSize = "长" + baseVehinstallmodelDetailsVo.getWk_long() + "mm,宽" + baseVehinstallmodelDetailsVo.getWk_wide() + "mm,高" + baseVehinstallmodelDetailsVo.getWk_high()+"mm";
String wkSize = "长" + baseVehinstallmodelDetailsVo.getWk_long() + "mm,宽" + baseVehinstallmodelDetailsVo.getWk_wide() + "mm,高" + baseVehinstallmodelDetailsVo.getWk_high() + "mm";
loanTemplateInstallVo.setWkSize(wkSize);
String plateThickness = "底" + baseVehinstallmodelDetailsVo.getPlateThicknessBottom() + "mm,边" + baseVehinstallmodelDetailsVo.getPlateThicknessEdge()+"mm";
String plateThickness = "底" + baseVehinstallmodelDetailsVo.getPlateThicknessBottom() + "mm,边" + baseVehinstallmodelDetailsVo.getPlateThicknessEdge() + "mm";
loanTemplateDetailsVo.setLoanTemplateInstall(loanTemplateInstallVo);
}
@ -616,9 +616,9 @@ public class LoanTemplateService extends MybatisBaseService<LoanTemplateMapper,
loanTemplateTrailerVo.setVehTrailerCertificateFile(fileList);
}
//挂车车型名称:挂车类型(外观尺寸长宽高总高)
String trailerModelName = baseTrailerModelDetailsVo.getTrailerTypeValue() + "(长" + baseTrailerModelDetailsVo.getAppearanceSizeLong() + "mm,宽" + baseTrailerModelDetailsVo.getAppearanceSizeWide() + "mm,高" + baseTrailerModelDetailsVo.getAppearanceSizeHigh() + "mm,总高" + baseTrailerModelDetailsVo.getAppearanceSizeTotalHigh()+"mm";
String trailerModelName = baseTrailerModelDetailsVo.getTrailerTypeValue() + "(长" + baseTrailerModelDetailsVo.getAppearanceSizeLong() + "mm,宽" + baseTrailerModelDetailsVo.getAppearanceSizeWide() + "mm,高" + baseTrailerModelDetailsVo.getAppearanceSizeHigh() + "mm,总高" + baseTrailerModelDetailsVo.getAppearanceSizeTotalHigh() + "mm";
loanTemplateTrailerVo.setModelTrailerName(trailerModelName);
String insideSize = "长" + baseTrailerModelDetailsVo.getInsideSizeLong() + "mm,宽" + baseTrailerModelDetailsVo.getInsideSizeWide() + "mm,高" + baseTrailerModelDetailsVo.getInsideSizeHigh()+"mm";
String insideSize = "长" + baseTrailerModelDetailsVo.getInsideSizeLong() + "mm,宽" + baseTrailerModelDetailsVo.getInsideSizeWide() + "mm,高" + baseTrailerModelDetailsVo.getInsideSizeHigh() + "mm";
loanTemplateTrailerVo.setInsideSize(insideSize);
loanTemplateDetailsVo.setLoanTemplateTrailer(loanTemplateTrailerVo);
}

Loading…
Cancel
Save