package com.tenwa.reckon.executor; import java.math.BigDecimal; import java.sql.Connection; import java.sql.PreparedStatement; import java.util.ArrayList; import java.util.List; 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.tenwa.comm.exception.BusinessException; import com.tenwa.reckon.bean.ConditionBean; import com.tenwa.reckon.bean.FundRentPlanBean; import com.tenwa.reckon.bean.TabCalBean; import com.tenwa.reckon.help.PlanDateServiceImpl; import com.tenwa.reckon.help.RentPlanContrCalDAOImpl; import com.tenwa.reckon.util.NumberUtils; import com.tenwa.reckon.util.UUIDUtil; public abstract class FundRentPlanExecutor { public JBOTransaction tx; public FundRentPlanExecutor(JBOTransaction tx){ this.tx=tx; } //租金含税算法 public void addRentRate(ConditionBean cb,FundRentPlanBean fpb){ // 0.17 税 0.13 附加税 //租金=(测算租金*0.17*0.13/(1-0.17*0.13)+测算租金)*1.17 利息=租金-本金 List rentList=fpb.getRentList();//租金 List corpusList=fpb.getCorpusBusinessList();//本金 List c1=fpb.getColumn_1(); List rentListNew=new ArrayList();//新的租金 List interestListNew=new ArrayList();//新的利息 List c2New=new ArrayList(); BigDecimal rate=new BigDecimal(NumberUtils.nullToZero( cb.getRate())); BigDecimal additionalRate=new BigDecimal(NumberUtils.nullToZero(cb.getAdditionalRate())); for(int i=0;i 0) { List rent_list = fpb.getRentList();// 租金列表 List planDate_list = fpb.getPlanDateList();// 日期列表 List interestDateList=fpb.getInterestDateList();//计息日期列表 List corpus_list = fpb.getCorpusBusinessList();// 本金列表 List corpusOverage_list = fpb.getCorpusOverageBusinessList();// 本金余额列表 List interest_list = fpb.getInterestBusinessList();// 利息列表 List year_rate_list = new ArrayList(); List rent_adjust = fpb.getRentAdjustList();// 租金调整列 if(interestDateList.size()==0){ interestDateList=planDate_list; } int flag = 1;// 是否添加租金调整列 if (null == rent_adjust || (null != rent_adjust && rent_adjust.size() == 0) || rent_adjust.get(0) == null) { flag = 0; } if (fpb.getYearRateList() == null || (null != fpb.getYearRateList() && fpb.getYearRateList().size() == 0)) { for (int i = 0; i < fpb.getRentList().size(); i++) { year_rate_list.add(fpb.getYearRate()); } } else { if (fpb.getYearRateList().size() != fpb.getRentList().size()) { for (int i = fpb.getYearRateList().size() - 1; i >= startList - 1; i--) { year_rate_list.add(0, fpb.getYearRateList().get(i)); } } else { year_rate_list = fpb.getYearRateList(); } } // Column_1和Column_2 是均息法下的均息法本息,暂时只有在均息法的测算中会处理, // 所以其他的地方直接赋值本息 if (fpb.getColumn_1() == null || fpb.getColumn_1().size() == 0) { fpb.setColumn_1(fpb.getCorpusBusinessList()); fpb.setColumn_2(fpb.getInterestBusinessList()); } com.amarsoft.awe.util.Transaction tran = com.amarsoft.awe.util.Transaction.createTransaction(tx); Connection conn = tran.getConnection(tran); //利用批处理解决测算速度 String Sql = "INSERT INTO " + tcb.getRentPlan_tb().substring(tcb.getRentPlan_tb().lastIndexOf(".") + 1) + " (" + "id, flowunid, " + tcb.getPlanCName() + ", plan_list, " + "plan_date, INTEREST_DATE, plan_status, rent, corpus, " + "year_rate, interest, all_remain_corpus, CORPUS_BUSINESS, INTEREST_BUSINESS) " + " VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; PreparedStatement ps = null; try { ps = conn.prepareStatement(Sql); for(int i = 0; i < rent_list.size(); i ++) { ps.setString(1, UUIDUtil.getUUID()); ps.setString(2, tcb.getDocId()); ps.setString(3, tcb.getPlanCValue()); ps.setInt(4, startList); ps.setString(5, planDate_list.get(i)); ps.setString(6, interestDateList.get(i)); ps.setString(7, "未回笼"); ps.setString(8, NumberUtils.nullToZero(rent_list.get(i))); ps.setString(9, NumberUtils.nullToZero(corpus_list.get(i))); ps.setString(10, NumberUtils.nullToZero(year_rate_list.get(i))); ps.setString(11, NumberUtils.nullToZero(interest_list.get(i))); ps.setString(12, NumberUtils.nullToZero(corpusOverage_list.get(i))); ps.setString(13, fpb.getColumn_1().get(i)); ps.setString(14, fpb.getColumn_2().get(i)); ps.addBatch(); startList++; } ps.executeBatch(); } catch(Exception e) { e.printStackTrace(); throw new BusinessException("insert rent_plan error"); } finally { if(ps != null) ps.close(); } /*BizObjectManager bm=JBOFactory.getBizObjectManager(tcb.getRentPlan_tb(), tx); for (int i = 0; i < rent_list.size(); i++) { BizObject rent=bm.newObject(); rent.setAttributeValue("flowunid",tcb.getDocId()); rent.setAttributeValue(tcb.getPlanCName(), tcb.getPlanCValue()); rent.setAttributeValue("plan_list",startList); rent.setAttributeValue("plan_date",planDate_list.get(i)); rent.setAttributeValue("INTEREST_DATE", interestDateList.get(i)); rent.setAttributeValue("plan_status","未回笼"); rent.setAttributeValue("rent",NumberUtils.nullToZero( rent_list.get(i) )); rent.setAttributeValue("corpus",NumberUtils.nullToZero( corpus_list.get(i) )); rent.setAttributeValue("year_rate",NumberUtils.nullToZero( year_rate_list.get(i) )); rent.setAttributeValue("interest",NumberUtils.nullToZero( interest_list.get(i) )); rent.setAttributeValue("all_remain_corpus",NumberUtils.nullToZero( corpusOverage_list.get(i) )); rent.setAttributeValue("CORPUS_BUSINESS",fpb.getColumn_1().get(i)); rent.setAttributeValue("INTEREST_BUSINESS",fpb.getColumn_2().get(i)); if(flag >0){ rent.setAttributeValue("rent_adjust",rent_adjust.get(i).equals("") ? "null" : rent_adjust.get(i)); } startList++; bm.saveObject(rent); }*/ } } public void deleteRentPlan(String tbName, TabCalBean tcb, int startList) throws Exception{ BizObjectManager bm=JBOFactory.getBizObjectManager(tcb.getRentPlan_tb(), tx); String sql = " delete from O where flowunid='" + tcb.getDocId() + "' and "+tcb.getPlanCName()+"='"+tcb.getPlanCValue()+"' and plan_list>=" + startList; bm.createQuery(sql).executeUpdate(); } public abstract FundRentPlanBean create(TabCalBean tcb,Integer startList) throws Exception ; public FundRentPlanBean createOnhire(TabCalBean tcb ) throws Exception { ConditionBean cb = tcb.getCb(); // 查询他的租金计划 RentPlanContrCalDAOImpl rpccdi = new RentPlanContrCalDAOImpl(); FundRentPlanBean frpb = rpccdi.getRentAndDateByTcb(tcb, 1,tx); frpb.setRentAdjustList(new ArrayList());// 租金调整值 // 根据交易结构重新算出的租金计划日期 // 日期类返回租金列表 PlanDateServiceImpl pdsi = new PlanDateServiceImpl(tx); frpb.setPlanDateList(pdsi.getPlanDateList(cb, String.valueOf(frpb.getRentList().size()))); // 更新租金计划 的时间 pdsi.updateRentPlanDate(tcb.getRentPlan_tb(), tcb, 1, frpb.getPlanDateList()); return frpb; } /** * 车辆均息:分摊本金=车辆款*产品配置一年内本金比例+参与融资并选择分摊费用项 * 尾款 = 车辆款-首付款-(车辆款*产品配置一年内本金比例)+参与融资并选择尾款费用项 */ public void initShareAndRetainage(TabCalBean tcb, ConditionBean cb) throws Exception{ //获取车辆款 BigDecimal equipAmt = new BigDecimal(cb.getEquipAmt()); //获取首付款 BigDecimal firstPayment = new BigDecimal(cb.getFirstPayment()); //或者产品配置一年内本金比例(在设备款的限定比例) //String corpusRatio = ProductParamUtil.getProductParameterValue(tcb.getProductId(), "PRD0315", "EQUIP_AMT", "CostType09"); //获得分摊本金 //BigDecimal share = equipAmt.multiply(new BigDecimal(corpusRatio).divide(new BigDecimal("100"),20,BigDecimal.ROUND_HALF_UP)).setScale(2, BigDecimal.ROUND_HALF_UP); BigDecimal share = new BigDecimal(cb.getCorpus()); //获得尾款本金 BigDecimal retainage = equipAmt.subtract(firstPayment).subtract(share); //计算参与融资费用 if("finatype02".equals(cb.getPurchaseTaxFina())){//购置税 share = share.add(new BigDecimal(cb.getPurchaseTax())); }else if("finatype03".equals(cb.getPurchaseTaxFina())){ retainage = retainage.add(new BigDecimal(cb.getPurchaseTax())); } if("finatype02".equals(cb.getInsurancePremiumFina())){//保险费 share = share.add(new BigDecimal(cb.getInsurancePremium())); }else if("finatype03".equals(cb.getInsurancePremiumFina())){ retainage = retainage.add(new BigDecimal(cb.getInsurancePremium())); } if("finatype02".equals(cb.getIncidentalFina())){//杂费 share = share.add(new BigDecimal(cb.getIncidental())); }else if("finatype03".equals(cb.getIncidentalFina())){ retainage = retainage.add(new BigDecimal(cb.getIncidental())); } if("finatype02".equals(cb.getFactoryAccessoriesFina())){//原厂配置费 share = share.add(new BigDecimal(cb.getFactoryAccessories())); }else if("finatype03".equals(cb.getFactoryAccessoriesFina())){ retainage = retainage.add(new BigDecimal(cb.getFactoryAccessories())); } cb.setShare(share); //cb.setRetainage(retainage); } }