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 roaMin = productRevenues.get( "StrategyROA" ).get( "StrategyROA-MIN" ); String roaMax = productRevenues.get( "StrategyROA" ).get( "StrategyROA-MAX" ); //修改计算中的税率取值 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;// 租金税率 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 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")) ; }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 in = allInterest.divide( interestRate , 2, 4 ).add( handlingChargeMoney.divide( handRate, 2, 4 ) ).add( gpsDifference.divide( gpsInstallFee, 2, 4 ) ); // 租赁年限 int leaseTerm = cb.getLeaseTerm(); // 融资额 BigDecimal cleanLeaseMoney = new BigDecimal( cb.getCleanLeaseMoney() ); // 成本 BigDecimal cost = cleanLeaseMoney.add( new BigDecimal( cb.getCautionMoney() ).multiply( new BigDecimal( leaseTerm ) ) ).divide( rentRate, 2, 4 ); // 运营费率 String operatingRate = productRevenues.get( "OperatingRate" ).get( "OperatingRate" ); // 运营费用 BigDecimal operatingExpenses = cleanLeaseMoney.multiply( new BigDecimal( operatingRate ) ); // 风险计提比率 String riskAccrualRatio = productRevenues.get( "RiskAccrualRatio" ).get( "RiskAccrualRatio" ); // 风险计提 BigDecimal withdrawalRisk = cleanLeaseMoney.multiply( new BigDecimal( riskAccrualRatio ) ); // ROA BigDecimal roa = in.subtract( cost ).subtract( operatingExpenses ).subtract( withdrawalRisk ).multiply( new BigDecimal( 0.75 ) ).divide( cleanLeaseMoney, 2, 4 ).multiply( new BigDecimal( 2 ) ); if ( !( roa.compareTo( new BigDecimal( roaMin ) ) >= 0 && roa.compareTo( new BigDecimal( roaMax ) ) <= 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); } }