package com.hehenian.biz.component.trade.impl; import java.math.BigDecimal; import java.util.Collections; import java.util.Date; import java.util.List; import java.util.Map; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.hehenian.biz.common.exception.BusinessException; import com.hehenian.biz.common.trade.dataobject.RepaymentDo; import com.hehenian.biz.common.trade.dataobject.RepaymentFeeDo; import com.hehenian.biz.common.util.DateUtil; import com.hehenian.biz.common.util.NumberUtil; import com.hehenian.biz.component.trade.IRepaymentComponent; import com.hehenian.biz.dal.trade.IRepaymentDao; import com.hehenian.biz.dal.trade.IRepaymentFeeDao; /** * @author zhangyunhua * @version 1.0 * @since 1.0 */ @Component("repaymentComponent") public class RepaymentComponentImpl implements IRepaymentComponent { public static Logger log = Logger.getLogger(RepaymentComponentImpl.class); @Autowired private IRepaymentDao repaymentDao; @Autowired private IRepaymentFeeDao repaymentFeeDao; /** * 根据ID 查询 * * @parameter id */ public RepaymentDo getById(Long id) { return repaymentDao.getById(id); } /** * 根据条件查询列表 */ public List<RepaymentDo> selectRepayment(Map<String, Object> parameterMap) { return repaymentDao.selectRepayment(parameterMap); } /** * 根据条件查询列表,用于翻页 */ public List<Map> selectRepaymentPage(Map<String, Object> parameterMap) { List<Map> resultList = repaymentDao.selectRepaymentPage(parameterMap); return wrapPage(resultList); } /** * 更新 */ public int updateRepaymentById(RepaymentDo newRepaymentDo) { int result = repaymentDao.updateRepaymentById(newRepaymentDo); if (result < 1) { throw new BusinessException("还款计划更新失败"); } return result; } /** * 新增 */ public int addRepayment(RepaymentDo newRepaymentDo) { return repaymentDao.addRepayment(newRepaymentDo); } /** * 删除 */ public int deleteById(Long id) { int result = repaymentDao.deleteById(id); if (result < 1) { throw new BusinessException("还款计划删除失败"); } return result; } /** * 封装处理翻页查询的结果: 1.计算:datediff(nextDate,preDate) days 2.计算提前还款金额 3. 处理hessian * 不支持的数据类型 */ private List<Map> wrapPage(List<Map> page) { if (page == null) { return Collections.EMPTY_LIST; } // 处理hessian不支持的类型 for (Map<String, Object> map : page) { double principalBalance = map.get("principalBalance") == null ? 0 : ((BigDecimal) map .get("principalBalance")).doubleValue(); double stillInterest = map.get("stillInterest") == null ? 0 : ((BigDecimal) map.get("stillInterest")) .doubleValue(); double fee = map.get("fee") == null ? 0 : ((BigDecimal) map.get("fee")).doubleValue(); map.put("borrowAmount", NumberUtil.formatObject(map.get("borrowAmount"))); map.put("annualRate", NumberUtil.formatObject(map.get("annualRate"))); map.put("stillAmount", NumberUtil.formatObject(map.get("stillAmount"))); map.put("stillInterest", stillInterest); map.put("hasFI", NumberUtil.formatObject(map.get("hasFI"))); map.put("fee", fee); map.put("principalBalance", principalBalance); // nextDate, preDate映射成 byte[] Object oNextDate = map.get("nextDate"); String nDate = ""; if (null == oNextDate) { nDate = ""; } else if (oNextDate instanceof byte[]) { byte[] nextDateBytes = (byte[]) map.get("nextDate"); nDate = new String(nextDateBytes); } else if (oNextDate instanceof Date) { nDate = DateUtil.dateToString((Date) oNextDate); } else { nDate = (String) oNextDate; } Object oPreDate = map.get("preDate"); String preDate = ""; if (null == oPreDate) { preDate = ""; } else if (oPreDate instanceof byte[]) { byte[] preDateBytes = (byte[]) oPreDate; preDate = new String(preDateBytes); } else if (oPreDate instanceof Date) { preDate = DateUtil.dateToString((Date) oPreDate); } else { preDate = (String) oPreDate; } map.put("nextDate", nDate); map.put("preDate", preDate); // double preSum = // getPreSum(nDate,preDate,principalBalance,stillInterest,fee); // map.put("preSum", NumberUtil.formatDouble(preSum));//提前还款金额 } return page; } /** * 计算提前 还款金额 * * @return * @author: zhangyunhmf * @date: 2014年9月23日下午3:12:31 */ public double getPreSum(String nextDate, String preDate, double principalBalance, double stillInterest, double fee) { // 当月天数 int days = DateUtil.getDaysOfMonth(); // 剩余本金×(1+3%)+本期已产生利息+本期咨询费+手续费 long day = 0; try { Date subtrahendDate = DateUtil.strToYYMMDDDate(nextDate); Date minuendDate = DateUtil.strToYYMMDDDate(preDate); day = DateUtil.diffDays(minuendDate, subtrahendDate); if (day <= 0) { return 0; } } catch (Exception e) { return 0; } return 1.03 * principalBalance + stillInterest * day / days + fee; } @Override public boolean upRepaymentVersionById(int newVersion, int status, long repaymentId) { int oldVersion = newVersion - 1; int result = repaymentDao.upRepaymentVersionById(oldVersion, newVersion, status, repaymentId); if (result < 1) { return false; } else { return true; } } /* * (no-Javadoc) <p>Title: updateRepaymentStatusAndAmount</p> <p>Description: * </p> * * @param needPI * * @param lateFI * * @param repayId * * @param version * * @see com.hehenian.biz.component.trade.IRepaymentComponent# * updateRepaymentStatusAndAmount(double, double, long, int) */ @Override public void updateRepaymentStatusAndAmount(double needPI, double lateFI, int newRepayStatus, long repayId, int version) { int result = repaymentDao.updateRepaymentStatusAndAmount(needPI, lateFI, newRepayStatus, repayId, version); if (result < 1) { throw new BusinessException("还款金额和状态更新失败"); } } /* * (no-Javadoc) <p>Title: selectCurrentPeriod</p> <p>Description: </p> * * @return * * @see * com.hehenian.biz.component.trade.IRepaymentComponent#selectCurrentPeriod * () */ @Override public RepaymentDo selectCurrentPeriod(long borrowId) { return repaymentDao.selectCurrentPeriod(borrowId); } /* * (no-Javadoc) <p>Title: updateIsWebRepayById</p> <p>Description: </p> * * @param repaymentId * * @param version * * @return * * @see * com.hehenian.biz.component.trade.IRepaymentComponent#updateIsWebRepayById * (long, int) */ @Override public int updateIsWebRepayById(long repaymentId, int version) { int result = repaymentDao.updateIsWebRepayById(repaymentId, version); if (result < 1) { throw new BusinessException("更新还款的代偿标记失败"); } return result; } /* * (no-Javadoc) <p>Title: selectPreRepayTotalAmountByBorrowId</p> * <p>Description: </p> * * @param borrowId * * @param currentRepayId * * @return * * @see com.hehenian.biz.component.trade.IRepaymentComponent# * selectPreRepayTotalAmountByBorrowId(long, long) */ @Override public RepaymentDo selectPreRepayTotalAmountByBorrowId(long borrowId, long currentRepayId) { return repaymentDao.selectPreRepayTotalAmountByBorrowId(borrowId, currentRepayId); } /* * (no-Javadoc) <p>Title: selectThirdPeriod</p> <p>Description: </p> * * @param borrowId * * @return * * @see * com.hehenian.biz.component.trade.IRepaymentComponent#selectThirdPeriod * (long) */ @Override public RepaymentDo selectThirdPeriod(long borrowId) { return repaymentDao.selectThirdPeriod(borrowId); } /* * (no-Javadoc) <p>Title: updateRepaymentStatusByPreRepay</p> * <p>Description: </p> * * @param currentRepayId * * @param borrowId * * @return * * @see com.hehenian.biz.component.trade.IRepaymentComponent# * updateRepaymentStatusByPreRepay(long, long) */ @Override public int updateRepaymentStatusByPreRepay(long currentRepayId, long borrowId) { return repaymentDao.updateRepaymentStatusByPreRepay(currentRepayId, borrowId); } /* * (no-Javadoc) <p>Title: selectLastPeriod</p> <p>Description: </p> * * @param borrowId * * @see * com.hehenian.biz.component.trade.IRepaymentComponent#selectLastPeriod * (long) */ @Override public RepaymentDo selectLastPeriod(long borrowId) { return repaymentDao.selectLastPeriod(borrowId); } /* * (no-Javadoc) <p>Title: selectOverDueRepayList</p> <p>Description: </p> * * @param currentDate * * @return * * @see * com.hehenian.biz.component.trade.IRepaymentComponent#selectOverDueRepayList * (java.util.Date) */ @Override public List<RepaymentDo> selectOverDueRepayList(Date currentDate) { return repaymentDao.selectOverDueRepayList(currentDate); } /* * (no-Javadoc) <p>Title: addRepaymentFee</p> <p>Description: </p> * * @param newRepaymentFeeDo * * @return * * @see * com.hehenian.biz.component.trade.IRepaymentComponent#addRepaymentFee( * com.hehenian.biz.common.trade.dataobject.RepaymentFeeDo) */ @Override public int addRepaymentFee(RepaymentFeeDo newRepaymentFeeDo) { return repaymentFeeDao.addRepaymentFee(newRepaymentFeeDo); } /* * (no-Javadoc) <p>Title: addRepaymentFee</p> <p>Description: </p> * * @param feeList * * @see * com.hehenian.biz.component.trade.IRepaymentComponent#addRepaymentFee( * java.util.List) */ @Override public void addRepaymentFee(List<RepaymentFeeDo> feeList) { if (null == feeList) { return; } for (RepaymentFeeDo rpf : feeList) { this.addRepaymentFee(rpf); } } /* * (no-Javadoc) <p>Title: getByRepaymentId</p> <p>Description: </p> * * @param id * * @return * * @see * com.hehenian.biz.component.trade.IRepaymentComponent#getByRepaymentId * (int) */ @Override public List<RepaymentFeeDo> getByRepaymentId(Long id) { return repaymentFeeDao.getByRepaymentId(id); } /* * (non-Javadoc) * * @see com.hehenian.biz.component.trade.IRepaymentComponent#unLock(int, * int, java.lang.Long) */ @Override public void unLock(int repayVersion, int status, Long id) { int oldVersion = repayVersion - 1; repaymentDao.unLockById(oldVersion, repayVersion, id); } /* * (no-Javadoc) <p>Title: updateRepaymentHasAmountById</p> <p>Description: * </p> * * @param newRepaymentDo * * @see com.hehenian.biz.component.trade.IRepaymentComponent# * updateRepaymentHasAmountById * (com.hehenian.biz.common.trade.dataobject.RepaymentDo) */ @Override public void updateRepaymentHasAmountById(RepaymentDo newRepaymentDo) { repaymentDao.updateRepaymentHasAmountById(newRepaymentDo); } @Override public List<Map<String, Object>> queryUserRepayments(List<Long> userIdList) { return repaymentDao.queryUserRepayments(userIdList); } @Override public RepaymentDo getByBorrowIdAndRepayPeriod(Long borrowId, String repayPeriod) { return repaymentDao.getByBorrowIdAndRepayPeriod(borrowId, repayPeriod); } }