/** * @Project: hehenian-biz-service * @Package com.hehenian.biz.common.settle * @Title: ELSettleCalculator.java * @Description: TODO * @author: liuzgmf * @date 2015年4月21日 下午5:27:15 * @Copyright: HEHENIAN Co.,Ltd. All rights reserved. * @version V1.0 */ package com.hehenian.biz.common.settle; import java.math.BigDecimal; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.apache.commons.lang.time.DateUtils; import com.hehenian.biz.common.system.dataobject.SettDetailDo; import com.hehenian.biz.common.util.CalculateUtils; /** * * @author: liuzgmf * @date 2015年4月21日 下午5:27:15 */ public class ELSettleCalculator extends SettleCalculator { @Override public List<SettDetailDo> calSettDetail(Double loanAmount, Integer loanPeriod, Double annualRate,Date startDate) { // 第一期,管理费 SettDetailDo settDetailDo = new SettDetailDo(); settDetailDo.setPeriod(0);// 期数 settDetailDo.setPrincipal(0d);// 本金 settDetailDo.setInterest(0d);// 利息 settDetailDo.setServFee(0d); settDetailDo.setRemainingPrincipal(loanAmount);// 剩余本金 // 管理费=借款金额*管理费利率*期数,24期为1.2%,36期为0.8% if (loanPeriod == 24) { settDetailDo.setConsultFee(CalculateUtils.round( CalculateUtils.mul(CalculateUtils.mul(loanAmount, 0.012), loanPeriod), 2)); } else { settDetailDo.setConsultFee(CalculateUtils.round( CalculateUtils.mul(CalculateUtils.mul(loanAmount, 0.008), loanPeriod), 2)); } settDetailDo.setRepayDate(startDate);// 还款日期 List<SettDetailDo> settDetailDoList = new ArrayList<SettDetailDo>(); settDetailDoList.add(settDetailDo); // 本金和利息 Double remainPrincipal = loanAmount;// 剩余待还本金 for (int i = 1; i <= loanPeriod; i++) { settDetailDo = new SettDetailDo(); settDetailDo.setServFee(0d); settDetailDo.setConsultFee(0d); settDetailDo.setPeriod(i);// 期数 Double principal = CalculateUtils.div(loanAmount, loanPeriod, 2, BigDecimal.ROUND_DOWN); if (i >= loanPeriod) { principal = remainPrincipal; } settDetailDo.setPrincipal(principal); settDetailDo.setInterest(CalculateUtils.round(CalculateUtils.mul(loanAmount, getMonthRate(annualRate)), 2)); settDetailDo.setRemainingPrincipal(remainPrincipal);// 剩余本金 remainPrincipal = CalculateUtils.sub(remainPrincipal, principal); settDetailDo.setRepayDate(DateUtils.addMonths(startDate, i));// 还款日期 // 第一期附加上50元的咨询费 if (i == 1) { settDetailDo.setServFee(CalculateUtils.add(settDetailDo.getServFee(), 50)); } settDetailDoList.add(settDetailDo); } return settDetailDoList; } public static void main(String[] args) { // ELSettleCalculator elSettleCalculator = new ELSettleCalculator(); // List<SettDetailDo> settDetailDoList = // elSettleCalculator.calSettDetail(57000d, 36, 9.96d); // for (SettDetailDo settDetailDo : settDetailDoList) { // System.out.println(settDetailDo); // } // // System.out.println(); // // elSettleCalculator = new ELSettleCalculator(); // settDetailDoList = elSettleCalculator.calSettDetail(29000d, 24, // 5.16d); // for (SettDetailDo settDetailDo : settDetailDoList) { // System.out.println(settDetailDo); // } ELSettleCalculator elSettleCalculator = new ELSettleCalculator(); List<SettDetailDo> settDetailDoList = elSettleCalculator.calSettDetail(43000d, 24, 5.16d); //List<SettDetailDo> settDetailDoList = elSettleCalculator.calSettDetail(36000d, 36, 9.96d); DecimalFormat df = new DecimalFormat("##0.00"); for (SettDetailDo settDetailDo : settDetailDoList) { String sql = "UPDATE td_fund_pre_repayment SET pre_capital = #pre_capital#,pre_interest=#pre_interest#,pre_service_fee=#pre_service_fee#,pre_consult_fee=#pre_consult_fee#,pre_repay_amount=#pre_repay_amount# WHERE loan_id = #loan_id# AND repay_times = #repay_times#;"; sql = sql.replace("#pre_capital#", df.format(settDetailDo.getPrincipal())); sql = sql.replace("#pre_interest#", df.format(settDetailDo.getInterest())); sql = sql.replace("#pre_consult_fee#", df.format(settDetailDo.getConsultFee())); sql = sql.replace("#pre_service_fee#", df.format(settDetailDo.getServFee())); double totalRepayAmt = CalculateUtils.add(CalculateUtils.add( CalculateUtils.add(settDetailDo.getPrincipal(), settDetailDo.getInterest()), settDetailDo.getConsultFee()), settDetailDo.getServFee()); sql = sql.replace("#pre_repay_amount#", df.format(totalRepayAmt)); sql = sql.replace("#loan_id#", "837"); sql = sql.replace("#repay_times#", "'" + settDetailDo.getPeriod() + "'"); System.out.println(sql); } } }