修改灵活产品的IRR和ROA的计算规则

This commit is contained in:
tangfutang 2021-01-28 22:27:39 +08:00
parent 813a127998
commit 99323a4f2c
3 changed files with 73 additions and 14 deletions

View File

@ -196,4 +196,4 @@
<Parameter CODESCRIPT="caution_money_method" CODESOURCE="Code" COMPONENTTYPE="PRD0315" DATATYPE="4" METHODTYPE="Nothing" OPERATOR="VALUE" PARAMETERID="DepositStyle" PARAMETERNAME="保证金计算方式(汽车专用)" SELECTTYPE="05" STATUS="1"/>
<Parameter COMPONENTTYPE="PRD0315" DATATYPE="6" METHODTYPE="Nothing" OPERATOR="VALUE" PARAMETERID="FINAL_PAYMENT_RATIO" PARAMETERNAME="尾款比例" STATUS="1"/>
<Parameter COMPONENTTYPE="PRD0315" DATATYPE="6" METHODTYPE="Nothing" OPERATOR="VALUE" PARAMETERID="FIRST_PAYMENT_RATIO" PARAMETERNAME="首付款比例" STATUS="1"/>
<Parameter COMPONENTTYPE="PRD0315" DATATYPE="2" METHODTYPE="Nothing" OPERATOR="VALUE" PARAMETERID="DISCOUNT_ALL" PARAMETERNAME="总贴息金额" STATUS="1" UNIT="&lt;font&gt;元&lt;/font&gt;"/><Parameter CODESCRIPT="period_type" CODESOURCE="Code" COMPONENTTYPE="PRD0350" DATATYPE="4" METHODTYPE="Nothing" OPERATOR="VALUE" PARAMETERID="begin_end" PARAMETERNAME="先付/后付" SELECTTYPE="05" STATUS="1"/><Parameter CODESCRIPT="oneOrMore" CODESOURCE="Code" COMPONENTTYPE="PRD0315" DATATYPE="4" METHODTYPE="Nothing" OPERATOR="VALUE" PARAMETERID="oneOrMore" PARAMETERNAME="分摊方式(汽车专用)" SELECTTYPE="04" STATUS="1"/><Parameter COMPONENTTYPE="PRD0350" DATATYPE="6" METHODTYPE="Nothing" OPERATOR="MINIMUMVALUE,MAXIMUMVALUE" PARAMETERID="LeaseMoneyRatio" PARAMETERNAME="融资比例" STATUS="1" UNIT="%"/><Parameter COMPONENTTYPE="PRD0350" DATATYPE="6" METHODTYPE="Nothing" OPERATOR="VALUE" PARAMETERID="splitting_ratio" PARAMETERNAME="分润利率" STATUS="2" UNIT="%"/><Parameter CODESCRIPT="TermType" CODESOURCE="Code" COMPONENTTYPE="PRD0350" DATATYPE="4" METHODTYPE="Nothing" OPERATOR="VALUE" PARAMETERID="TermType" PARAMETERNAME="期限类型" SELECTTYPE="04" STATUS="1"/><Parameter COMPONENTTYPE="PRD0350" DATATYPE="5" METHODTYPE="Nothing" OPERATOR="MINIMUMVALUE,MAXIMUMVALUE" PARAMETERID="TermScope" PARAMETERNAME="期限范围" STATUS="1"/><Parameter CODESCRIPT="YesNo" CODESOURCE="Code" COMPONENTTYPE="PRD0350" DATATYPE="4" METHODTYPE="Nothing" OPERATOR="VALUE" PARAMETERID="isFixedRate" PARAMETERNAME="是否固定利率" SELECTTYPE="05" STATUS="1"/><Parameter COMPONENTTYPE="PRD0350" DATATYPE="6" METHODTYPE="Nothing" OPERATOR="MINIMUMVALUE,MAXIMUMVALUE" PARAMETERID="RateTermScope" PARAMETERNAME="利率取值范围" STATUS="1" UNIT="&lt;font&gt;%&lt;/font&gt;"/><Parameter CODESCRIPT="A,A级,B,B级,C,C级,D,D级,E,E级,F,F级" CODESOURCE="CodeTable" COMPONENTTYPE="PRD0390" DATATYPE="4" METHODTYPE="Nothing" OPERATOR="VALUE" PARAMETERID="ChannelRating" PARAMETERNAME="渠道评级" SELECTTYPE="06" STATUS="1"/><Parameter CODESCRIPT="A,A级,B,B级,C,C级,D,D级,E,E级,F,F级" CODESOURCE="CodeTable" COMPONENTTYPE="PRD0390" DATATYPE="4" METHODTYPE="Nothing" OPERATOR="VALUE" PARAMETERID="CustomerRating" PARAMETERNAME="客户评级" SELECTTYPE="06" STATUS="1"/><Parameter COMPONENTTYPE="PRD0390" DATATYPE="7" METHODTYPE="Nothing" OPERATOR="MINIMUMVALUE,MAXIMUMVALUE" PARAMETERID="CostInterestRate" PARAMETERNAME="成本利率" STATUS="1" UNIT="%"/><Parameter COMPONENTTYPE="PRD0390" DATATYPE="7" METHODTYPE="Nothing" OPERATOR="VALUE" PARAMETERID="OperatingRate" PARAMETERNAME="运营费率" STATUS="1" UNIT="%"/><Parameter COMPONENTTYPE="PRD0390" DATATYPE="2" METHODTYPE="Nothing" OPERATOR="VALUE" PARAMETERID="GPSDifference" PARAMETERNAME="GPS差额" STATUS="1"/><Parameter COMPONENTTYPE="PRD0390" DATATYPE="7" METHODTYPE="Nothing" OPERATOR="VALUE" PARAMETERID="RiskAccrualRatio" PARAMETERNAME="风险计提比率" STATUS="1" UNIT="%"/><Parameter COMPONENTTYPE="PRD0390" DATATYPE="7" METHODTYPE="Nothing" OPERATOR="VALUE" PARAMETERID="StrategicCoefficient" PARAMETERNAME="战略系数" STATUS="1" UNIT="%"/><Parameter COMPONENTTYPE="PRD0390" DATATYPE="7" METHODTYPE="Nothing" OPERATOR="VALUE" PARAMETERID="StrategyROA" PARAMETERNAME="战略ROA" STATUS="1" UNIT="%"/></Parameters>
<Parameter COMPONENTTYPE="PRD0315" DATATYPE="2" METHODTYPE="Nothing" OPERATOR="VALUE" PARAMETERID="DISCOUNT_ALL" PARAMETERNAME="总贴息金额" STATUS="1" UNIT="&lt;font&gt;元&lt;/font&gt;"/><Parameter CODESCRIPT="period_type" CODESOURCE="Code" COMPONENTTYPE="PRD0350" DATATYPE="4" METHODTYPE="Nothing" OPERATOR="VALUE" PARAMETERID="begin_end" PARAMETERNAME="先付/后付" SELECTTYPE="05" STATUS="1"/><Parameter CODESCRIPT="oneOrMore" CODESOURCE="Code" COMPONENTTYPE="PRD0315" DATATYPE="4" METHODTYPE="Nothing" OPERATOR="VALUE" PARAMETERID="oneOrMore" PARAMETERNAME="分摊方式(汽车专用)" SELECTTYPE="04" STATUS="1"/><Parameter COMPONENTTYPE="PRD0350" DATATYPE="6" METHODTYPE="Nothing" OPERATOR="MINIMUMVALUE,MAXIMUMVALUE" PARAMETERID="LeaseMoneyRatio" PARAMETERNAME="融资比例" STATUS="1" UNIT="%"/><Parameter COMPONENTTYPE="PRD0350" DATATYPE="6" METHODTYPE="Nothing" OPERATOR="VALUE" PARAMETERID="splitting_ratio" PARAMETERNAME="分润利率" STATUS="2" UNIT="%"/><Parameter CODESCRIPT="TermType" CODESOURCE="Code" COMPONENTTYPE="PRD0350" DATATYPE="4" METHODTYPE="Nothing" OPERATOR="VALUE" PARAMETERID="TermType" PARAMETERNAME="期限类型" SELECTTYPE="04" STATUS="1"/><Parameter COMPONENTTYPE="PRD0350" DATATYPE="5" METHODTYPE="Nothing" OPERATOR="MINIMUMVALUE,MAXIMUMVALUE" PARAMETERID="TermScope" PARAMETERNAME="期限范围" STATUS="1"/><Parameter CODESCRIPT="YesNo" CODESOURCE="Code" COMPONENTTYPE="PRD0350" DATATYPE="4" METHODTYPE="Nothing" OPERATOR="VALUE" PARAMETERID="isFixedRate" PARAMETERNAME="是否固定利率" SELECTTYPE="05" STATUS="1"/><Parameter COMPONENTTYPE="PRD0350" DATATYPE="6" METHODTYPE="Nothing" OPERATOR="MINIMUMVALUE,MAXIMUMVALUE" PARAMETERID="RateTermScope" PARAMETERNAME="利率取值范围" STATUS="1" UNIT="&lt;font&gt;%&lt;/font&gt;"/><Parameter CODESCRIPT="A,A级,B,B级,C,C级,D,D级,E,E级,F,F级" CODESOURCE="CodeTable" COMPONENTTYPE="PRD0390" DATATYPE="4" METHODTYPE="Nothing" OPERATOR="VALUE" PARAMETERID="ChannelRating" PARAMETERNAME="渠道评级" SELECTTYPE="06" STATUS="1"/><Parameter CODESCRIPT="A,A级,B,B级,C,C级,D,D级,E,E级,F,F级" CODESOURCE="CodeTable" COMPONENTTYPE="PRD0390" DATATYPE="4" METHODTYPE="Nothing" OPERATOR="VALUE" PARAMETERID="CustomerRating" PARAMETERNAME="客户评级" SELECTTYPE="06" STATUS="1"/><Parameter COMPONENTTYPE="PRD0390" DATATYPE="7" METHODTYPE="Nothing" OPERATOR="VALUE" PARAMETERID="CostInterestRate" PARAMETERNAME="成本利率" STATUS="1" UNIT="%"/><Parameter COMPONENTTYPE="PRD0390" DATATYPE="7" METHODTYPE="Nothing" OPERATOR="VALUE" PARAMETERID="OperatingRate" PARAMETERNAME="运营费率" STATUS="1" UNIT="%"/><Parameter COMPONENTTYPE="PRD0390" DATATYPE="2" METHODTYPE="Nothing" OPERATOR="VALUE" PARAMETERID="GPSDifference" PARAMETERNAME="GPS差额" STATUS="1"/><Parameter COMPONENTTYPE="PRD0390" DATATYPE="7" METHODTYPE="Nothing" OPERATOR="VALUE" PARAMETERID="RiskAccrualRatio" PARAMETERNAME="风险计提比率" STATUS="1" UNIT="%"/><Parameter COMPONENTTYPE="PRD0390" DATATYPE="7" METHODTYPE="Nothing" OPERATOR="VALUE" PARAMETERID="StrategicCoefficient" PARAMETERNAME="战略系数" STATUS="1" UNIT="%"/><Parameter COMPONENTTYPE="PRD0390" DATATYPE="7" METHODTYPE="Nothing" OPERATOR="VALUE" PARAMETERID="StrategyROA" PARAMETERNAME="战略ROA" STATUS="1" UNIT="%"/></Parameters>

View File

@ -95,6 +95,8 @@ public class CashFlowExecutor {
}
private void add(ConditionBean cb,TabCalBean tcb) throws Exception{
Map<String, Map<String, String>> productRevenues = tcb.getProductRevenues();
String sql = "";
if("MYSQL".equals(InitDBType.DBTYPE)){
sql += "INSERT INTO " +Tools.getTable(tcb.getContractCashTb())+ " (id," + tcb.getPlanCName() + "";
@ -124,8 +126,14 @@ public class CashFlowExecutor {
}
sql +=" if(fundplan.pay_type='pay_type_in',fundplan.plan_money,-fundplan.plan_money) cleanfow " ;
sql +=" from "+Tools.getTable(tcb.getFundFundPlan_tb())+" fundplan " ;
sql +=" left join code_library tdd on fundplan.fee_type = tdd.itemno " ;
sql +=" where fundplan.flowunid = '"+ tcb.getDocId()+"' and fundplan."+tcb.getPlanCName()+"='"+tcb.getPlanCValue()+"'";
sql +=" left join code_library tdd on fundplan.fee_type = tdd.itemno and tdd.codeno='FeeType' " ;
sql +=" where fundplan.flowunid = '"+ tcb.getDocId()+"' and fundplan."+tcb.getPlanCName()+"='"+tcb.getPlanCValue()+"' and fundplan.fee_type in ('feetype2','feetype1','feetype10','feetype16','feetype17') ";
//如果是灵活产品减去产品中配置的GPS差额
if("Y".equals( cb.getFlexible() ) ){
Map<String, Map<String, String>> productRevenue = tcb.getProductRevenues();
String GPSDifference = productRevenues.get( "GPSDifference" ).get( "GPSDifference" );
sql += "union all select DATE_FORMAT(CURDATE(),'%Y/%m/%d') plan_date,'"+GPSDifference+"' flowin,'GPS差额:"+GPSDifference+"' flowindetail,'' flowout,'' flowoutdetil,'"+GPSDifference+"' cleanfow from dual ";
}
}else if("ORACLE".equals(InitDBType.DBTYPE)){
sql += "INSERT INTO " +Tools.getTable(tcb.getContractCashTb())+ " (id," + tcb.getPlanCName() + "";
sql += ",plan_date";
@ -176,8 +184,38 @@ public class CashFlowExecutor {
sql +=" )t group by t.plan_date ";
Transaction Sqlca =null;
Sqlca = Transaction.createTransaction(tx);
SqlObject asql = new SqlObject(sql);
SqlObject asql = new SqlObject("");
asql.setOriginalSql(sql);
Sqlca.executeSQL(asql);
//由于安鹏目前没有从最后一期一直往前抵扣这里临时处理下灵活产品的
if( "Y".equals( cb.getFlexible() ) ){
String lcftSql = "select ID,PLAN_DATE,FUND_IN,FUND_OUT from lc_cash_flow_temp where flowunid ='"+tcb.getDocId()+"' and "+tcb.getPlanCName()+"='"+tcb.getPlanCValue()+"' order by plan_date desc";
List<Map<String, String>> lcftDate =DataOperatorUtil.getDataBySql(tx, lcftSql, null);
BigDecimal outMoney = null ;
BigDecimal inMoney = null ;
String updateSql = "" ;
for (int i=0 ; i < lcftDate.size() ; i++ ) {
if(i==0){
outMoney = new BigDecimal(lcftDate.get(i).get("FUND_OUT") );
inMoney = new BigDecimal(lcftDate.get(i).get("FUND_IN") );
}else{
inMoney = new BigDecimal(lcftDate.get(i).get("FUND_IN") );
}
if(outMoney.compareTo(inMoney)>=0){
updateSql = " update lc_cash_flow_temp set FUND_OUT='"+inMoney+"',FUND_OUT_DETAILS='抵扣保证金:"+inMoney+"',NET_FLOW='0.00' where id='"+lcftDate.get(i).get("ID")+"' ";
asql.setOriginalSql(updateSql);
Sqlca.executeSQL(asql);
outMoney = outMoney.subtract(inMoney);
}else{
updateSql = " update lc_cash_flow_temp set FUND_OUT='"+inMoney.subtract(outMoney)+"',FUND_OUT_DETAILS='抵扣保证金:"+inMoney.subtract(outMoney)+"',NET_FLOW='"+inMoney.subtract(outMoney)+"' where id='"+lcftDate.get(i).get("ID")+"' ";
asql.setOriginalSql(updateSql);
Sqlca.executeSQL(asql);
break;
}
}
}
}

View File

@ -66,7 +66,6 @@ public class ConditionHelper {
if(cb.getSettleMethod().equals("irregular_rent")){
params.put("INCOME_NUMBER",cb.getIncomeNumber()+"");
}
if((cb.getSettleMethod().equals("even_corpus")&&cb.getRentOrRate().equals("corpus_period"))||cb.getSettleMethod().equals("irregular_rent")||cb.getSettleMethod().equals("even_subsection")||(cb.getSettleMethod().equals("even_rent_day")&&(cb.getRentOrRate().equals("rent_period")||cb.getRentOrRate().equals("rent_period_360")))){
params.put("FIRST_PLAN_DATE", cb.getFirstPlanDate());
params.put("SECOND_PLAN_DATE", cb.getSecondPlanDate());
@ -108,14 +107,15 @@ public class ConditionHelper {
BigDecimal handRate =null; //手续费税率
BigDecimal gpsInstallFee =null;//GPS税率
BigDecimal rentRate =null;// 租金税率
BigDecimal percentage = new BigDecimal("100");
if( pslData!=null && pslData.size()>0){
String leasform = pslData.get(0).get("leasform");
List<Map<String, String>> rateData = DataOperatorUtil.getDataBySql("select t.INTEREST_RATE,t.HAND_RATE,t.gps_install_fee,t.rent from (select INTEREST_RATE,HAND_RATE,gps_install_fee,rent,CONTRACT_DATE from TAX_INFO where CONTRACT_DATE<= DATE_FORMAT(NOW(),'%Y/%m/%d') and BEFORE_AFTER='after' and lease_form='"+leasform+"' union all select INTEREST_RATE,HAND_RATE,gps_install_fee,rent,CONTRACT_DATE from TAX_INFO where CONTRACT_DATE>=DATE_FORMAT(NOW(),'%Y/%m/%d') and BEFORE_AFTER='before' and lease_form='"+leasform+"' ) t order by t.CONTRACT_DATE desc limit 1");
if( rateData!=null && rateData.size()>0 ){
interestRate =new BigDecimal ( rateData.get(0).get("INTEREST_RATE") ).divide(new BigDecimal("100")) ;
handRate =new BigDecimal (rateData.get(0).get("HAND_RATE") ).divide(new BigDecimal("100")) ;;
gpsInstallFee =new BigDecimal (rateData.get(0).get("gps_install_fee") ).divide(new BigDecimal("100")) ;
rentRate =new BigDecimal ( rateData.get(0).get("rent") ).divide(new BigDecimal("100")) ;
interestRate = BigDecimal.ONE.add( new BigDecimal ( rateData.get(0).get("INTEREST_RATE") ).divide(percentage) );
handRate = BigDecimal.ONE.add( new BigDecimal (rateData.get(0).get("HAND_RATE") ).divide(percentage) );
gpsInstallFee = BigDecimal.ONE.add( new BigDecimal (rateData.get(0).get("gps_install_fee") ).divide( percentage ) );
rentRate = BigDecimal.ONE.add( new BigDecimal ( rateData.get(0).get("rent") ).divide( percentage ) );
}else{
throw new BusinessException( "未配置对应税率!" );
}
@ -131,25 +131,46 @@ public class ConditionHelper {
// 手续费
BigDecimal handlingChargeMoney = new BigDecimal( cb.getHandlingChargeMoney() );
// GPS差额
BigDecimal gpsDifference = new BigDecimal( cb.getGPSDifference() );
// BigDecimal gpsDifference = new BigDecimal( cb.getGPSDifference() );
BigDecimal gpsDifference = new BigDecimal( productRevenues.get( "GPSDifference" ).get( "GPSDifference" ) );//取产品收益中的GPS差额配置
// 收入
BigDecimal in = allInterest.divide( interestRate , 2, 4 ).add( handlingChargeMoney.divide( handRate, 2, 4 ) ).add( gpsDifference.divide( gpsInstallFee, 2, 4 ) );
// 租赁年限
int leaseTerm = cb.getLeaseTerm();
int leaseTerm = cb.getLeaseTerm()/12;
// 融资额
BigDecimal cleanLeaseMoney = new BigDecimal( cb.getCleanLeaseMoney() );
String rentSql = "select corpus,ALL_REMAIN_CORPUS from LC_RENT_PLAN_TEMP where flowunid ='"+cb.getDocId()+"' order by plan_date";
List<Map<String, String>> rentPlanData =DataOperatorUtil.getDataBySql(tx, rentSql, null);
BigDecimal cautionMoney = new BigDecimal( cb.getCautionMoney() );
BigDecimal costMoney = BigDecimal.ZERO;
BigDecimal CostInterestRate = new BigDecimal (productRevenues.get( "CostInterestRate" ).get( "CostInterestRate" ) ).divide( percentage ) ;//产品中的成本利率
for (Map<String, String> map : rentPlanData) {
BigDecimal surplus = new BigDecimal(map.get("corpus") ).add(new BigDecimal(map.get("ALL_REMAIN_CORPUS")));
if(surplus.compareTo(cautionMoney)>0){
costMoney = costMoney.add( surplus.subtract(cautionMoney).multiply( CostInterestRate).divide( new BigDecimal("12"), 2 , 4 ) );
}
}
System.out.println(costMoney);
// 成本
BigDecimal cost = cleanLeaseMoney.add( new BigDecimal( cb.getCautionMoney() ).multiply( new BigDecimal( leaseTerm ) ) ).divide( rentRate, 2, 4 );
BigDecimal cost = costMoney.add( new BigDecimal( cb.getCautionMoney() ).multiply( new BigDecimal( leaseTerm ) ).multiply(CostInterestRate) ).divide( rentRate, 2, 4 );
// 运营费率
String operatingRate = productRevenues.get( "OperatingRate" ).get( "OperatingRate" );
// 运营费用
BigDecimal operatingExpenses = cleanLeaseMoney.multiply( new BigDecimal( operatingRate ) );
BigDecimal operatingExpenses = cleanLeaseMoney.multiply( new BigDecimal( operatingRate ).divide( percentage ) );
// 风险计提比率
String riskAccrualRatio = productRevenues.get( "RiskAccrualRatio" ).get( "RiskAccrualRatio" );
// 风险计提
BigDecimal withdrawalRisk = cleanLeaseMoney.multiply( new BigDecimal( riskAccrualRatio ) );
BigDecimal withdrawalRisk = cleanLeaseMoney.multiply( new BigDecimal( riskAccrualRatio ).divide( percentage ) );
// ROA
BigDecimal roa = in.subtract( cost ).subtract( operatingExpenses ).subtract( withdrawalRisk ).multiply( new BigDecimal( 0.75 ) ).divide( cleanLeaseMoney, 2, 4 ).multiply( new BigDecimal( 2 ) );
StringBuilder sb = new StringBuilder();
sb.append(cb.getDocId()).append("的ROA计算参数=利息和:").append(allInterest).append(",利息税率:").append(interestRate).append(",手续费:").append(handlingChargeMoney)
.append(",手续费税率:").append(handRate).append(",GPS差额:").append(gpsDifference).append(",GPS差额税率:").append(gpsInstallFee)
.append(",租金表里成本和:").append(costMoney).append(",保证金金额:").append(cb.getCautionMoney()).append(",租赁年限:").append(leaseTerm)
.append(",成本利率:").append(CostInterestRate).append(",租金税率:").append(rentRate).append(",融资金额:").append(cleanLeaseMoney)
.append(",运营费率:").append(new BigDecimal( operatingRate ).divide( percentage ) ).append(",风险计提比率:").append( new BigDecimal( riskAccrualRatio ).divide( percentage ) );
System.out.println(sb.toString());
if ( roa.compareTo( new BigDecimal( roaValue ).divide( new BigDecimal("100") ) ) < 0 ) {
throw new BusinessException( "ROA小于产品配置" );
}