package com.tenwa.reckon.help; import java.math.BigDecimal; import java.math.BigInteger; import java.util.HashMap; import java.util.List; import java.util.Map; import com.amarsoft.app.als.sys.tools.Tools; import com.amarsoft.app.util.ProductParamUtil; import com.amarsoft.are.jbo.BizObject; import com.amarsoft.are.jbo.BizObjectManager; import com.amarsoft.are.jbo.JBOFactory; import com.amarsoft.are.jbo.JBOTransaction; import com.amarsoft.are.util.json.JSONObject; import com.amarsoft.awe.util.SqlObject; import com.tenwa.comm.exception.BusinessException; import com.tenwa.comm.util.jboutil.DataOperatorUtil; import com.tenwa.reckon.bean.ConditionBean; import com.tenwa.reckon.bean.FundRentPlanBean; import com.tenwa.reckon.bean.TabCalBean; import com.tenwa.reckon.constant.Scale; public class ConditionHelper { private JBOTransaction tx; public JBOTransaction getTx() { return tx; } public void setTx(JBOTransaction tx) { this.tx = tx; } public void run(JSONObject jsonObject,ConditionBean cb,TabCalBean bean,FundRentPlanBean rentPlan,Boolean flag) throws Exception{ Map params = this.runPre(jsonObject,cb, bean, rentPlan,flag); jsonObject.appendElement("info",params); //项目粗利 } public Map runPre(JSONObject jsonObject,ConditionBean cb,TabCalBean bean,FundRentPlanBean rentPlan,Boolean flag) throws Exception{ this.getGrossProfit(rentPlan, cb,bean); this.getCleancreditmoney(rentPlan, cb,bean); this.getFirstPaymentTotal(rentPlan, cb, bean); Map params = new HashMap(); //irr 计算方式修改 (1+irr/100)^12 -1 /*if ("STAGE_IRR".equals(cb.getIrrType())) { String incomeNumberYear = cb.getIncomeNumberYear() ; int incomeType = incomeNumberYear.contains("_") == true ? Integer.valueOf(incomeNumberYear.split("_")[1]):Integer.valueOf(incomeNumberYear); //Integer.valueOf(incomeNumberYear.split("_")[1]); double irr = new BigDecimal(Double.valueOf(cb.getIrr())/12).setScale(6, BigDecimal.ROUND_HALF_UP).divide(new BigDecimal(100)).add(new BigDecimal(1)).pow(incomeType).subtract(new BigDecimal(1)).multiply(new BigDecimal(100)).setScale(6, BigDecimal.ROUND_HALF_UP).doubleValue(); params.put("irr", String.valueOf(irr)); }else{*/ params.put("irr", cb.getIrr()); //} if((!cb.getSettleMethod().equals("even_interest"))&&(!cb.getRentOrRate().equals("rate"))||flag){ params.put("year_rate", cb.getYearRate()); } if(cb.getSettleMethod().equals("even_interest")&&cb.getRentOrRate().equals("rent")){ if(jsonObject.get("year_rate")!=null) params.put("year_rate", jsonObject.get("year_rate").getValue().toString()); } 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()); params.put("INCOME_NUMBER",cb.getIncomeNumber()+""); } params.put("gross_profit", cb.getGrossProfit().toString()); params.put("clean_credit_money", cb.getCleanCreditMoney().toString()); params.put("clean_credit_ratio", cb.getCleanCreditRatio().toString()); params.put("income_number", cb.getIncomeNumber() + ""); params.put("lease_term", cb.getLeaseTerm()+""); params.put("FIRST_PAYMENT_TOTAL",cb.getFirstPaymentTotal()); //更新保证金抵扣 params.put("CAUTION_DEDUCTION_MONEY",cb.getCautionDeductionMoney()); params.put("CAUTION_MONEY_REMAIN",cb.getCautionMoneyRemain()); if ( "Y".equals( cb.getFlexible() ) ) { // 灵活产品计算其他项 try { Map> productRevenues = bean.getProductRevenues(); String roaValue = productRevenues.get( "StrategyROA" ).get( "StrategyROA" ); //String roaMax = productRevenues.get( "StrategyROA" ).get( "StrategyROA-MAX" ); if(roaValue == null || roaValue.isEmpty()){ throw new BusinessException( "灵活产品ROA必须配置,请联业务人员!" ); } BigDecimal irr = new BigDecimal ( cb.getIrr() ) ; String irrMin = productRevenues.get( "IRR" ).get( "IRR-MIN" ); String irrMan = productRevenues.get( "IRR" ).get( "IRR-MAX" ); if(irrMin == null || irrMin.isEmpty() || irrMan == null || irrMan.isEmpty()){ throw new BusinessException( "灵活产品IRR区间值必须配置,请联业务人员!" ); } if( !( irr.compareTo( new BigDecimal( irrMan ) ) <= 0 && irr.compareTo( new BigDecimal( irrMin ) ) >= 0 ) ){ // throw new BusinessException( "IRR: "+irr.setScale( 2, 4 ).toString()+",不在产品配置区间范围内!" ); throw new BusinessException( "不在产品配置区间范围内!" ); } //修改计算中的税率取值 List> pslData = DataOperatorUtil.getDataBySql("select leasform from prd_specific_library where productid='"+bean.getProductId()+"'"); BigDecimal interestRate =null; // 利息税率 BigDecimal handRate =null; //手续费税率 BigDecimal gpsInstallFee =null;//GPS税率 BigDecimal rentRate =null;// 租金税率 BigDecimal discountInterestRate =null;// 贴息税率 BigDecimal personalInsuranceRate =null;// 个人意外险税率 BigDecimal percentage = new BigDecimal("100"); if( pslData!=null && pslData.size()>0){ String leasform = pslData.get(0).get("leasform"); List> rateData = DataOperatorUtil.getDataBySql("select t.INTEREST_RATE,t.HAND_RATE,t.gps_install_fee,t.rent,t.discount_interest_rate,t.personal_insurance_rate from (select INTEREST_RATE,HAND_RATE,gps_install_fee,rent,CONTRACT_DATE,discount_interest_rate,personal_insurance_rate 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,discount_interest_rate,personal_insurance_rate 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 && rateData.get(0).get("discount_interest_rate") != null && rateData.get(0).get("personal_insurance_rate") != null){ 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 ) ); discountInterestRate = BigDecimal.ONE.add( new BigDecimal ( rateData.get(0).get("discount_interest_rate") ).divide( percentage ) ); personalInsuranceRate = BigDecimal.ONE.add( new BigDecimal ( rateData.get(0).get("personal_insurance_rate") ).divide( percentage ) ); }else{ throw new BusinessException( "未配置对应税率!" ); } } // 1 + 税差 // BigDecimal tax = BigDecimal.ONE.add( new BigDecimal( cb.getRate() ) ); // 利息和 List interestBusinessList = rentPlan.getInterestBusinessList(); BigDecimal allInterest = BigDecimal.ZERO; for ( String interestBusiness : interestBusinessList ) { allInterest = allInterest.add( new BigDecimal( interestBusiness ) ); } // 手续费 BigDecimal handlingChargeMoney = new BigDecimal( cb.getHandlingChargeMoney() ); // GPS差额 // BigDecimal gpsDifference = new BigDecimal( cb.getGPSDifference() ); BigDecimal gpsDifference = new BigDecimal( productRevenues.get( "GPSDifference" ).get( "GPSDifference" ) );//取产品收益中的GPS差额配置 String personalInsuranceDifference = "0" ;//获取产品中的个人意外险差额配置 Map pidMap = productRevenues.get( "personalInsuranceDifference" ); if( pidMap != null && pidMap.size() > 0){ personalInsuranceDifference = pidMap.get("personalInsuranceDifference"); if( personalInsuranceDifference == null || personalInsuranceDifference.isEmpty() ){ personalInsuranceDifference = "0"; } } // 收入 BigDecimal in = allInterest.divide( interestRate , 2, 4 ).add( handlingChargeMoney.divide( handRate, 2, 4 ) ).add( gpsDifference.divide( gpsInstallFee, 2, 4 ) ).add( new BigDecimal( cb.getDiscountInterest() ).divide(discountInterestRate , 2 ,4 ) ).add( new BigDecimal( personalInsuranceDifference ).divide( personalInsuranceRate , 2 ,4 ) ); // 租赁年限 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> 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 map : rentPlanData) { //surplus:当期本金+剩余本金 。 cautionMoney :保证金 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 = costMoney.divide( rentRate, 2, 4 ); // 运营费率 String operatingRate = productRevenues.get( "OperatingRate" ).get( "OperatingRate" ); // 运营费用 BigDecimal operatingExpenses = cleanLeaseMoney.multiply( new BigDecimal( operatingRate ).divide( percentage ) ); // 风险计提比率 String riskAccrualRatio = productRevenues.get( "RiskAccrualRatio" ).get( "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 ) ) .append(",收入:").append(in).append(",成本:").append(cost).append(",运营费用:").append(operatingExpenses).append(",风险计提:").append(withdrawalRisk); System.out.println(sb.toString()); if ( roa.compareTo( new BigDecimal( roaValue ).divide( new BigDecimal("100") ) ) < 0 ) { throw new BusinessException( "ROA小于产品配置!" ); } // 战略系数 String strategicCoefficient = productRevenues.get( "StrategicCoefficient" ).get( "StrategicCoefficient" ); params.put( "OPERATING_RATE", operatingRate ); params.put( "RISK_ACCRUAL_RATIO", riskAccrualRatio ); params.put( "STRATEGIC_COEFFICIENT", strategicCoefficient ); params.put( "STRATEGY_ROA", roa.toString() ); } catch ( Exception e ) { throw new BusinessException( e.getMessage() ); } } this.updateCondition(bean, params); return params; } /** * @throws Exception * * @Title: getGrossProfit * @author zhangc * @Description: 项目粗利:财务利息总和+手续费+管理费+返点收入+利息补贴-保险费(我司)+租前息+名义货价+其他收入-其他支出 * @return * @return BigDecimal * @throws */ private void getGrossProfit(FundRentPlanBean fundRent,ConditionBean cb,TabCalBean bean) throws Exception{ String productId=bean.getProductId(); String formula= ProductParamUtil.getProductParameterValue(productId,"PRD0330","GrossProfit","Formula"); String FinanceInterest=ProductParamUtil.getProductParameterValue(productId,"PRD0330","GrossProfit","FinanceInterest"); BigDecimal money=BigDecimal.ZERO; JBOTransaction jbotx=JBOFactory.createJBOTransaction(); try{ if(formula.length()>0){ String sql="select "+formula+" as total from "+Tools.getTable(bean.getCondition_tb())+" where flowunid='"+bean.getDocId()+"' and "+bean.getPlanCName()+"='"+bean.getPlanCValue()+"'"; List> list=DataOperatorUtil.getDataBySql(jbotx, sql, null); if(list.size()>0){ money=money.add(new BigDecimal(list.get(0).get("TOTAL"))); } } }catch(Exception e){ //e.printStackTrace(); } List interest=fundRent.getInterestBusinessList(); if(FinanceInterest.equals("Y")){ for(int i=0;i计算精授信额。

*

公式:净授信额 = 设备款-首付款-保证金-其他收入+其他支出-期初第1期租金+保险费-厂商返利-手续费 - 管理费。

* @author zhangc * @param rentPlanList 租金计划集合 * @param result 返回前台的MAP集合 * @return * @throws Exception */ private void getCleancreditmoney(FundRentPlanBean rentPlan,ConditionBean cb,TabCalBean bean) throws Exception{ String productId=bean.getProductId(); String formula= ProductParamUtil.getProductParameterValue(productId,"PRD0330","CleanCreditMoney","Formula"); BigDecimal money=BigDecimal.ZERO; JBOTransaction jbotx=JBOFactory.createJBOTransaction(); try{ if(formula.length()>0){ String sql="select "+formula+" as total from "+Tools.getTable(bean.getCondition_tb())+" where flowunid='"+bean.getDocId()+"' and "+bean.getPlanCName()+"='"+bean.getPlanCValue()+"'"; List> list=DataOperatorUtil.getDataBySql(jbotx, sql, null); if(list.size()>0){ money=money.add(new BigDecimal(list.get(0).get("TOTAL"))); } } }catch(Exception e){ //e.printStackTrace(); } /*//期初第1期租金 String periodtype = cb.getPeriodType(); BigDecimal firstRent = BigDecimal.ZERO; if("1".equals(periodtype) || "period_type_1".equals(periodtype)){ if(rentPlan != null && rentPlan.getRentList() != null && 0 < rentPlan.getRentList().size()){ firstRent = new BigDecimal(rentPlan.getRentList().get(0)) ; } } String f= ProductParamUtil.getProductParameterValue(productId,"PRD0330","CleanCreditMoney","FirstRent"); if("Y".equals(f)){ money=money.subtract(firstRent); }*/ cb.setCleanCreditMoney(money); cb.setCleanCreditRatio(money.multiply(new BigDecimal(100)).divide(new BigDecimal(cb.getEquipAmt()), Scale.RATE_SCALE, BigDecimal.ROUND_HALF_UP)); jbotx.commit(); } /** * 计算期初付款总计 * @param rentPlan * @param cb * @param bean * @throws Exception */ private void getFirstPaymentTotal(FundRentPlanBean rentPlan,ConditionBean cb,TabCalBean bean) throws Exception{ String productId=bean.getProductId(); String formula= ProductParamUtil.getProductParameterValue(productId,"PRD0330","PeriodBeginPayMoney","Formula"); BigDecimal money=BigDecimal.ZERO; JBOTransaction jbotx=JBOFactory.createJBOTransaction(); try{ if(formula.length()>0){ String sql="select "+formula+" as total from "+Tools.getTable(bean.getCondition_tb())+" where flowunid='"+bean.getDocId()+"' and "+bean.getPlanCName()+"='"+bean.getPlanCValue()+"'"; List> list=DataOperatorUtil.getDataBySql(jbotx, sql, null); if(list.size()>0){ money=money.add(new BigDecimal(list.get(0).get("TOTAL"))); } } }catch(Exception e){ //e.printStackTrace(); } //期初第1期租金 String periodtype = cb.getPeriodType(); BigDecimal firstRent = BigDecimal.ZERO; if("1".equals(periodtype) || "period_type_1".equals(periodtype)){ if(rentPlan != null && rentPlan.getRentList() != null && 0 < rentPlan.getRentList().size()){ firstRent = new BigDecimal(rentPlan.getRentList().get(0)) ; } } String f= ProductParamUtil.getProductParameterValue(productId,"PRD0330","PeriodBeginPayMoney","FirstRent"); if("Y".equals(f)){ money=money.add(firstRent); } cb.setFirstPaymentTotal(money.toString()); jbotx.commit(); } private void updateCondition(TabCalBean tcb,Map params) throws Exception { BizObjectManager bm=JBOFactory.getBizObjectManager(tcb.getCondition_tb(), tx); BizObject condition=bm.createQuery("flowunid=:flowunid and "+tcb.getPlanCName()+"=:value").setParameter("flowunid", tcb.getDocId()).setParameter("value", tcb.getPlanCValue()).getSingleResult(true); for(Map.Entry entry:params.entrySet()){ condition.setAttributeValue(entry.getKey(), entry.getValue()); } bm.saveObject(condition); } }