package com.hehenian.biz.service.trade.impl; import com.hehenian.biz.common.account.dataobject.AccountUserDo; import com.hehenian.biz.common.trade.IInvestRepaymentService; import com.hehenian.biz.common.trade.dataobject.InvestRepaymentDo; import com.hehenian.biz.common.util.CalculateUtils; import com.hehenian.biz.common.util.DateUtil; import com.hehenian.biz.component.account.IUserComponent; import com.hehenian.biz.component.trade.IFundrecordComponent; import com.hehenian.biz.component.trade.IInvestRepaymentComponent; import com.ibm.icu.util.Calendar; import org.apache.commons.lang.time.DateUtils; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; /** * @author zhangyunhua * @version 1.0 * @since 1.0 */ @Service("investRepaymentService") public class InvestRepaymentServiceImpl implements IInvestRepaymentService { private final Logger logger = Logger.getLogger(this.getClass()); @Autowired private IInvestRepaymentComponent investRepaymentComponent; @Autowired private IFundrecordComponent fundrecordComponent; @Autowired private IUserComponent userComponent; /** * 根据ID 查询 * * @parameter id */ public InvestRepaymentDo getById(Long id) { return investRepaymentComponent.getById(id); } /** * 根据条件查询列表 */ public List<InvestRepaymentDo> selectInvestRepayment(Map<String, Object> parameterMap) { return investRepaymentComponent.selectInvestRepayment(parameterMap); } /** * 更新 */ public int updateInvestRepaymentById(InvestRepaymentDo newInvestRepaymentDo) { return investRepaymentComponent.updateInvestRepaymentById(newInvestRepaymentDo); } /** * 新增 */ public int addInvestRepayment(InvestRepaymentDo newInvestRepaymentDo) { return investRepaymentComponent.addInvestRepayment(newInvestRepaymentDo); } /** * 删除 */ public int deleteById(int id) { return investRepaymentComponent.deleteById(id); } @Override public Double getDailyIncome(Long userId) { Date yesterday = DateUtils.truncate(DateUtils.addDays(new Date(), -1), Calendar.DATE);// 昨天 Date endDate = DateUtils.truncate(DateUtils.addMonths(yesterday, 1), Calendar.DATE); List<InvestRepaymentDo> repaymentDoList = investRepaymentComponent.queryByUserIdAndRepayDate(userId, yesterday, endDate); if (repaymentDoList == null || repaymentDoList.size() == 0) { return 0.00; } Double totalDailyIncome = 0.00; List<Long> investIdList = new ArrayList<Long>(); for (InvestRepaymentDo repaymentDo : repaymentDoList) { if (investIdList.contains(repaymentDo.getInvestId())) { continue; } investIdList.add(repaymentDo.getInvestId()); Date startDate = DateUtils.addMonths(repaymentDo.getRepayDate(), -1); long days = DateUtil.diffDays(startDate, repaymentDo.getRepayDate()); Double dailyIncome = 0.00; if (repaymentDo.getRealRepayDate() != null && repaymentDo.getRealRepayDate().before(repaymentDo.getRepayDate()) && repaymentDo.getRealRepayDate().equals(yesterday)) {// 提前还款时,计算当日收益 long prepaymentDays = DateUtil.diffDays(repaymentDo.getRealRepayDate(), repaymentDo.getRepayDate()); dailyIncome = CalculateUtils.mul(CalculateUtils.div(repaymentDo.getRecivedInterest(), days), prepaymentDays); } else { dailyIncome = CalculateUtils.div(repaymentDo.getRecivedInterest(), days); } totalDailyIncome = CalculateUtils.add(totalDailyIncome, dailyIncome); } // 奖励金额 Double incentiveAmt = fundrecordComponent.getDailyIncentiveAmount(userId, yesterday); if (incentiveAmt != null && CalculateUtils.gt(incentiveAmt, 0.00)) { totalDailyIncome = CalculateUtils.add(totalDailyIncome, incentiveAmt); } // 最后返回结果两位小数四舍五入 return CalculateUtils.round(totalDailyIncome, 2); } @Override public Double getAssetValue(Long userId) { AccountUserDo userDo = userComponent.getById(userId); if (userDo == null) { return 0.00; } Double recivedPrincipal = getRecivedPrincipal(userId); Double assetValue = CalculateUtils.add(CalculateUtils.add(userDo.getUsableSum(), userDo.getFreezeSum()), recivedPrincipal); Double totalIncome = getTotalIncome(userId); return CalculateUtils.round(CalculateUtils.add(assetValue, totalIncome), 2); } @Override public Double getRecivedPrincipal(Long userId) { Double recivedPrincipal = investRepaymentComponent.getRecivedPrincipal(userId); recivedPrincipal = (recivedPrincipal == null ? 0.00 : recivedPrincipal); return CalculateUtils.round(recivedPrincipal, 2); } private Double getTotalIncome(Long userId) { // 获取待收收益(只包括上一期到今天收益) List<InvestRepaymentDo> repaymentDoList = investRepaymentComponent.queryNoRepayRecordsRecently(userId); if (repaymentDoList == null || repaymentDoList.size() == 0) { return 0.00; } Double totalRecivedInterest = 0.00; List<Long> investIdList = new ArrayList<Long>(); for (InvestRepaymentDo repaymentDo : repaymentDoList) { if (investIdList.contains(repaymentDo.getInvestId())) { continue; } investIdList.add(repaymentDo.getInvestId()); Date startDate = DateUtils.addMonths(repaymentDo.getRepayDate(), -1); long days1 = DateUtil.diffDays(startDate, repaymentDo.getRepayDate());// 两期相差天数 long days2 = DateUtil.diffDays(startDate, new Date());// 上一期到今天的天数 if (days2 <= 0) { continue; } // 收益 = 回款利息 / 两期相差天数 * 上一期到今天的天数 Double income = CalculateUtils.mul(CalculateUtils.div(repaymentDo.getRecivedInterest(), days1), days2); totalRecivedInterest = CalculateUtils.add(totalRecivedInterest, income); } // 最后返回结果两位小数四舍五入 return CalculateUtils.round(totalRecivedInterest, 2); } }