package com.sp2p.service; import java.sql.Connection; import java.sql.SQLException; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.shove.Convert; import com.shove.base.BaseService; import com.shove.data.DataException; import com.shove.util.ExcelRateUtil; import com.sp2p.dao.PhoneInfoDao; /** * @ClassName: FinanceToolsService.java * @Author: li.hou * @Descrb: 我要理财,工具箱 */ public class FinanceToolsService extends BaseService { public static Log log = LogFactory.getLog(FinanceService.class); private PhoneInfoDao phoneInfoDao = null; @SuppressWarnings("unused") private int[] dn = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; /** * 收益计算器,按月还款 * * @param borrowSum * @param yearRate * @param borrowTime * 以月为单位 */ public List<Map<String, Object>> rateIncome2Month(double borrowSum, double yearRate, int borrowTime, double bidReward, double bidRewardMoney) { if (borrowSum < 0 || yearRate < 0 || borrowTime < 0) { return null; } List<Map<String, Object>> lists = new ArrayList<Map<String, Object>>(); DecimalFormat df = new DecimalFormat("0.00"); double monRate = yearRate / 12;// 月利率 int monTime = borrowTime; double val1 = borrowSum * monRate * Math.pow((1 + monRate), monTime); double val2 = Math.pow((1 + monRate), monTime) - 1; double monRepay = val1 / val2;// 每月偿还金额 double allSum = Double.valueOf(df.format(monRepay)) * monTime;// 还款本息总额 bidRewardMoney = Double.parseDouble(df.format(bidRewardMoney)); double rewardSum = Double.parseDouble(df.format(borrowSum * bidReward / 100)) + bidRewardMoney; Map<String, Object> map = new HashMap<String, Object>(); map.put("reward", String.format("%.2f", rewardSum)); double netIncome = allSum - Double.valueOf(df.format(Double.valueOf(df.format(allSum - borrowSum)) * 0.1)); map.put("allSum", String.format("%.2f", allSum)); map.put("monPay", String.format("%.2f", monRepay)); map.put("netIncome", String.format("%.2f", netIncome));// map.put("netIncome", // df.format(allSum*0.9f)); map.put("rateSum", String.format("%.2f", allSum - borrowSum)); /** * 年化收益 */ double rateVal = ExcelRateUtil.excelRate((borrowSum - rewardSum), Double.parseDouble(df.format(monRepay)), monTime, 200, 10); map.put("income2year", df.format(rateVal * 12 * 100)); lists.add(map); return lists; } /** * 天标计算 * * @param borrowSum * @param yearRate * @param borrowTime * @return */ public Map<String, Object> rateCalculateDay(double borrowSum, double yearRate, int borrowTime) { if (borrowSum < 0 || yearRate < 0 || borrowTime < 0) { return null; } DecimalFormat df = new DecimalFormat("0.00"); // 月利率 double i = yearRate * 1f / 12; // 所借本金 double sum = Double.valueOf(df.format(borrowSum)); // 所还利息 double monForRate = Convert.strToDouble(df.format(sum * i * borrowTime / 30), 0); double val = borrowSum + monForRate; Map<String, Object> map = addToMap(borrowTime, val, borrowSum, monForRate, 0, i, val); return map; } /** * 按月还款。等额本息计算 */ public List<Map<String, Object>> rateCalculate2Month(double borrowSum, double yearRate, int borrowTime) { if (borrowSum < 0 || yearRate < 0 || borrowTime < 0) { return null; } DecimalFormat df = new DecimalFormat("0.00"); // 月利率 double i = yearRate * 1f / 12; double val1 = borrowSum * i * Math.pow((1 + i), borrowTime); double val2 = Math.pow((1 + i), borrowTime) - 1; // 每月还款 double monPay = val1 / val2; // 所借本金 double sum = Double.valueOf(df.format(borrowSum)); // 月还利息 = 剩余本金*月利率 double monForRate = 0; // 月还本金=每月还款-月还利息 double monForA = 0; // 每月还款,保留两位小数 double monPay2 = Convert.strToDouble(df.format(monPay), 0); double allSum = monPay2 * borrowTime;// monPay * borrowTime;//还款本息总额 double payA = 0; // add 2013-04-19 // 本息余额 double payRemain = Double.parseDouble(df.format(allSum)); List<Map<String, Object>> lists = new ArrayList<Map<String, Object>>(); Map<String, Object> map = null; double val = 0; try { for (int j = 1; j <= borrowTime; j++) { monForRate = Convert.strToDouble(df.format(sum * i), 0); monForA = Convert.strToDouble(df.format(monPay2 - monForRate), 0); val = Convert.strToDouble(df.format(monPay2 - monForRate), 0); sum = Convert.strToDouble(df.format(sum - val), 0); if (j == borrowTime) { monPay2 = payRemain; // 最后一个月要还的本金(总借款本金 - 已还的本金) add 2013-04-19 monForA = borrowSum - payA;// Convert.strToDouble(df.format(monPay2 // - monForRate),0); monForRate = monPay2 - monForA; } payA += monForA; payRemain = Convert.strToDouble(df.format(payRemain - monPay2), 0); if (j == borrowTime) { payRemain = 0; } // i*100 月利率以百分比显示 map = addToMap(j, monPay2, monForA, monForRate, payRemain, Convert.strToDouble(df.format(i * 100), 0), Convert.strToDouble(df.format(allSum), 0)); lists.add(map); } } catch (Exception e) { e.printStackTrace(); } return lists; } /** * 按月还款,每月付息,到期还本 * * @param borrowSum * @param yearRate * @param borrowTime * @return */ public List<Map<String, Object>> rateCalculate2Sum(double borrowSum, double yearRate, int borrowTime) { if (borrowSum < 0 || yearRate < 0 || borrowTime < 0) { return null; } DecimalFormat df = new DecimalFormat("0.00"); int mon = borrowTime; // 月利率 double i = yearRate * 1.0f / 12; borrowSum = Double.parseDouble(df.format(borrowSum)); // 每月还息 = 借款金额*月利率 double monPayRate = Double.parseDouble(df.format(borrowSum * i));// borrowSum // * // i;// double allSum = monPayRate * mon + borrowSum;// 还款本息总额 // 本息余额 double payRemain = Double.parseDouble(df.format(allSum)); double monForA = 0; double monForRateA = 0; List<Map<String, Object>> lists = new ArrayList<Map<String, Object>>(); Map<String, Object> map = null; try { for (int j = 1; j <= mon; j++) { payRemain = Convert.strToDouble(df.format(payRemain - monPayRate), 0); // 除了最后一个月,其余月份还的本息就是月还的利息 monForRateA = monPayRate; if (j == mon) { // 最后一个月还本金 monForRateA = Convert.strToDouble(df.format(borrowSum + monPayRate), 0); monForA = Convert.strToDouble(df.format(borrowSum), 0); payRemain = 0; } // i*100 月利率以百分比显示 map = addToMap(j, monForRateA, monForA, monPayRate, payRemain, Convert.strToDouble((df.format(i * 100)), 0), Convert.strToDouble((df.format(allSum)), 0)); lists.add(map); } } catch (Exception e) { e.printStackTrace(); } return lists; } /** * * @param mon * 月份 * @param monPay * 月还本息 * @param monForA * 月还本金 * @param monForRate * 月还利息 * @param payRemain * 本息余额 * @param monRate * 月利率 * @param allPay * 总还本息 * @return */ private Map<String, Object> addToMap(int mon, double monPay, double monForA, double monForRate, double payRemain, double monRate, double allPay) { Map<String, Object> map = new HashMap<String, Object>(); map.put("mon", mon); // 保留两位小数,不够两位小数的以0补齐 map.put("monForRateA", String.format("%.2f", monPay)); map.put("monForA", String.format("%.2f", monForA)); map.put("monForRate", String.format("%.2f", monForRate)); map.put("rateARemain", String.format("%.2f", payRemain)); map.put("monRate", String.format("%.2f", monRate)); map.put("allPay", String.format("%.2f", allPay)); return map; } /** * 收益计算器 先息后本 * * @param borrowSum * @param yearRate * @param borrowTime * @return */ public List<Map<String, Object>> rateIncome2Sum(double borrowSum, double yearRate, int borrowTime, double bidReward, double bidRewardMoney) { if (borrowSum < 0 || yearRate < 0 || borrowTime < 0) { return null; } List<Map<String, Object>> lists = new ArrayList<Map<String, Object>>(); DecimalFormat df = new DecimalFormat("0.00"); double monRate = yearRate / 12;// 月利率 int monTime = borrowTime;// * 12;借款期限填月 borrowSum = Double.parseDouble(df.format(borrowSum)); double monRepay = Double.parseDouble(df.format(borrowSum * monRate));// 每月偿还金额 double allSum = Double.parseDouble(df.format((monRepay * monTime))) + borrowSum;// 还款本息总额 bidRewardMoney = Double.parseDouble(df.format(bidRewardMoney)); double rewardSum = Double.parseDouble(df.format(borrowSum * bidReward / 100)) + bidRewardMoney; // 扣除10%的管理费 double netIncome = allSum - Double.valueOf(df.format(Double.valueOf(df.format(allSum - borrowSum)) * 0.1)); Map<String, Object> map = new HashMap<String, Object>(); map.put("reward", String.format("%.2f", rewardSum)); map.put("allSum", String.format("%.2f", allSum)); map.put("monPay", String.format("%.2f", monRepay)); map.put("netIncome", String.format("%.2f", netIncome)); map.put("rateSum", String.format("%.2f", allSum - borrowSum)); /** * 年化收益 */ double rateVal = ExcelRateUtil.rateTotal(allSum, (borrowSum - rewardSum), borrowTime); map.put("income2year", String.format("%.2f", rateVal * 100)); lists.add(map); return lists; } /** * 一次还款 */ public List<Map<String, Object>> rateCalculate2SumOne(double borrowSum, double yearRate, int borrowTime) { if (borrowSum < 0 || yearRate < 0 || borrowTime < 0) { return null; } DecimalFormat df = new DecimalFormat("0.00"); int mon = borrowTime; // 月利率 double i = yearRate / 12; borrowSum = Double.parseDouble(df.format(borrowSum)); // 每月还息 = 借款金额*月利率 double monPayRate = Double.parseDouble(df.format(borrowSum * i * 0.01));// borrowSum // * // i;// double monPayRateOne = monPayRate; double allSum = monPayRate * mon + borrowSum;// 还款本息总额 // 本息余额 double payRemain = Double.parseDouble(df.format(allSum)); double monForA = 0; double monForRateA = 0; List<Map<String, Object>> lists = new ArrayList<Map<String, Object>>(); Map<String, Object> map = null; try { for (int j = 1; j <= mon; j++) { // payRemain = Convert.strToDouble(df.format(payRemain - // monPayRate),0); payRemain = Convert.strToDouble(df.format(payRemain), 0); // 除了最后一个月,其余月份还的本息就是月还的利息 // monForRateA = monPayRate; monForRateA = 0; monPayRate = 0; if (j == mon) { // 最后一个月还本金 monForRateA = Convert.strToDouble(df.format(borrowSum + monPayRateOne * mon), 0); monForA = Convert.strToDouble(df.format(borrowSum), 0); payRemain = 0; monPayRate = Double.parseDouble(df.format(borrowSum * i * 0.01)) * mon; } // i*100 月利率以百分比显示 map = addToMap(j, monForRateA, monForA, monPayRate, payRemain, Convert.strToDouble((df.format(i)), 0), Convert.strToDouble((df.format(allSum)), 0)); lists.add(map); } } catch (Exception e) { e.printStackTrace(); } return lists; } /** * 根据手机号码查询手机信息 * * @param phoneNum * @return * @throws SQLException * @throws DataException */ public Map<String, String> getPhoneNumInfo(String phoneNum) throws SQLException, DataException { Connection conn = connectionManager.getConnection(); Map<String, String> map = null; try { map = phoneInfoDao.queryPhoneInfoByNum(conn, phoneNum); } catch (SQLException e) { log.error(e); e.printStackTrace(); throw e; } catch (DataException e) { log.error(e); e.printStackTrace(); throw e; } finally { conn.close(); } return map; } /** * 获得bt_config配置表中的静态信息 * * @return * @throws SQLException * @throws DataException */ public List<Map<String, Object>> queryConfigList() throws SQLException, DataException { Connection conn = connectionManager.getConnection(); try { return phoneInfoDao.queryConfigList(conn, -1, -1); } catch (SQLException e) { log.error(e); e.printStackTrace(); throw e; } catch (DataException e) { log.error(e); e.printStackTrace(); throw e; } finally { conn.close(); } } public PhoneInfoDao getPhoneInfoDao() { return phoneInfoDao; } public void setPhoneInfoDao(PhoneInfoDao phoneInfoDao) { this.phoneInfoDao = phoneInfoDao; } public List<Map<String, Object>> rateCalculateHHN(double borrowSum, double yearRate, int borrowTime) { if (borrowSum < 0 || yearRate < 0 || borrowTime < 0) { return null; } DecimalFormat df = new DecimalFormat("0.00"); borrowSum = Double.valueOf(df.format(borrowSum)); double monthP = Double.valueOf(df.format(borrowSum / borrowTime));// 月还本金 double blanceP = borrowSum;// 剩余本金 double monthI = 0;// 月还利息 double rate = yearRate / 12;// 月利率 double allPay = 0;// 利息总额 List<Map<String, Object>> lists = new ArrayList<Map<String, Object>>(); Map<String, Object> map = null; for (int i = 0; i < borrowTime; i++) { map = new HashMap<String, Object>(); monthI = Double.valueOf(df.format(blanceP * rate));// 月还利息=剩余本金*月利率 map.put("mon", i + 1);// 期数 map.put("monForRateA", df.format(monthP + monthI));// 月还本息 map.put("monForA", df.format(monthP));// 月还本金 map.put("monForRate", df.format(monthI));// 月还利息 lists.add(map); allPay += monthI; blanceP -= monthP; } lists.get(0).put("monRate", df.format(rate * 100));// 月利率 lists.get(0).put("allPay", df.format(borrowSum + allPay));// 还款本息总额 if (borrowSum != monthP * borrowTime) {// 缺失的本金加到最后一次还款中 map = lists.get(lists.size() - 1); double temp = Double.valueOf(df.format(borrowSum - monthP * borrowTime)); map.put("monForA", df.format(temp + Double.valueOf(map.get("monForA") + ""))); map.put("monForRateA", df.format(temp + Double.valueOf(map.get("monForRateA") + ""))); } double allPays = borrowSum + allPay; for (int i = 0; i < borrowTime; i++) {// 计算本息余额 lists.get(i).put("rateARemain", df.format(allPays)); allPays = allPays - Double.valueOf(lists.get(i).get("monForRateA") + ""); } return lists; } }