//获取lendReturnList中还款期数与还款计划id对应map
Map<Integer, Long> lendReturnMap = lendReturnList.stream().collect(
Collectors.toMap(LendReturn::getCurrentPeriod, LendReturn::getId)
);
//======================================================
//=============获取所有投资者,生成回款计划===================
//======================================================
//回款计划列表
List<LendItemReturn> lendItemReturnAllList = new ArrayList<>();
//获取投资成功的投资记录
List<LendItem> lendItemList = lendItemService.selectByLendId(lend.getId(), 1);
for (LendItem lendItem : lendItemList) {
//创建回款计划列表
List<LendItemReturn> lendItemReturnList = this.returnInvest(lendItem.getId(), lendReturnMap, lend);
lendItemReturnAllList.addAll(lendItemReturnList);
}
//更新还款计划中的相关金额数据
for (LendReturn lendReturn : lendReturnList) {
BigDecimal sumPrincipal = lendItemReturnAllList.stream()
//过滤条件:当回款计划中的还款计划id == 当前还款计划id的时候
.filter(item -> item.getLendReturnId().longValue() == lendReturn.getId().longValue())
//将所有回款计划中计算的每月应收本金相加
.map(LendItemReturn::getPrincipal)
.reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal sumInterest = lendItemReturnAllList.stream()
.filter(item -> item.getLendReturnId().longValue() == lendReturn.getId().longValue())
.map(LendItemReturn::getInterest)
.reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal sumTotal = lendItemReturnAllList.stream()
.filter(item -> item.getLendReturnId().longValue() == lendReturn.getId().longValue())
.map(LendItemReturn::getTotal)
.reduce(BigDecimal.ZERO, BigDecimal::add);
lendReturn.setPrincipal(sumPrincipal); //每期还款本金
lendReturn.setInterest(sumInterest); //每期还款利息
lendReturn.setTotal(sumTotal); //每期还款本息
}
lendReturnService.updateBatchById(lendReturnList);
}
>
> **//说明:还款计划中的这三项 = 回款计划中对应的这三项和:因此需要先生成对应的回款计划
> // lendReturn.setPrincipal();
> // lendReturn.setInterest();
> // lendReturn.setTotal();**
>
>
>
>
> **BigDecimal sumPrincipal = lendItemReturnAllList.stream()** **//过滤条件:当回款计划中的还款计划id == 当前还款计划id的时候**
> **.filter(item -> item.getLendReturnId().longValue() == lendReturn.getId().longValue())** **//将所有回款计划中计算的每月应收本金相加**
> **.map(LendItemReturn::getPrincipal)
> .reduce(BigDecimal.ZERO, BigDecimal::add);**
>
>
>
### 2、生成回款计划
**LendServiceImpl**
**\* @param lendItemId**
**\* @param lendReturnMap 还款期数与还款计划id对应map
\* @param lend**
**\* @return**
public List returnInvest(Long lendItemId, Map<Integer, Long> lendReturnMap, Lend lend) {
//投标信息
LendItem lendItem = lendItemService.getById(lendItemId);
//投资金额
BigDecimal amount = lendItem.getInvestAmount();
//年化利率
BigDecimal yearRate = lendItem.getLendYearRate();
//投资期数
int totalMonth = lend.getPeriod();
Map<Integer, BigDecimal> mapInterest = null; //还款期数 -> 利息
Map<Integer, BigDecimal> mapPrincipal = null; //还款期数 -> 本金
//根据还款方式计算本金和利息
if (lend.getReturnMethod().intValue() == ReturnMethodEnum.ONE.getMethod()) {
//利息
mapInterest = Amount1Helper.getPerMonthInterest(amount, yearRate, totalMonth);
//本金
mapPrincipal = Amount1Helper.getPerMonthPrincipal(amount, yearRate, totalMonth);
} else if (lend.getReturnMethod().intValue() == ReturnMethodEnum.TWO.getMethod()) {
mapInterest = Amount2Helper.getPerMonthInterest(amount, yearRate, totalMonth);
mapPrincipal = Amount2Helper.getPerMonthPrincipal(amount, yearRate, totalMonth);
} else if (lend.getReturnMethod().intValue() == ReturnMethodEnum.THREE.getMethod()) {
mapInterest = Amount3Helper.getPerMonthInterest(amount, yearRate, totalMonth);
mapPrincipal = Amount3Helper.getPerMonthPrincipal(amount, yearRate, totalMonth);
} else {
mapInterest = Amount4Helper.getPerMonthInterest(amount, yearRate, totalMonth);
mapPrincipal = Amount4Helper.getPerMonthPrincipal(amount, yearRate, totalMonth);
}
//创建回款计划列表
List<LendItemReturn> lendItemReturnList = new ArrayList<>();
for (Map.Entry<Integer, BigDecimal> entry : mapInterest.entrySet()) {
Integer currentPeriod = entry.getKey();
//根据还款期数获取还款计划的id
Long lendReturnId = lendReturnMap.get(currentPeriod);
LendItemReturn lendItemReturn = new LendItemReturn();
lendItemReturn.setLendReturnId(lendReturnId);
lendItemReturn.setLendItemId(lendItemId);
lendItemReturn.setInvestUserId(lendItem.getInvestUserId());
lendItemReturn.setLendId(lendItem.getLendId());
lendItemReturn.setInvestAmount(lendItem.getInvestAmount());
lendItemReturn.setLendYearRate(lend.getLendYearRate());
lendItemReturn.setCurrentPeriod(currentPeriod);
lendItemReturn.setReturnMethod(lend.getReturnMethod());
//最后一次本金计算
if (lendItemReturnList.size() > 0 && currentPeriod.intValue() == lend.getPeriod().intValue()) {
//最后一期本金 = 本金 - 前几次之和
BigDecimal sumPrincipal = lendItemReturnList.stream()
.map(LendItemReturn::getPrincipal)
.reduce(BigDecimal.ZERO, BigDecimal::add);
//最后一期应还本金 = 用当前投资人的总投资金额 - 除了最后一期前面期数计算出来的所有的应还本金
BigDecimal lastPrincipal = lendItem.getInvestAmount().subtract(sumPrincipal);
lendItemReturn.setPrincipal(lastPrincipal);
} else {
lendItemReturn.setPrincipal(mapPrincipal.get(currentPeriod));
lendItemReturn.setInterest(mapInterest.get(currentPeriod));
}
lendItemReturn.setTotal(lendItemReturn.getPrincipal().add(lendItemReturn.getInterest()));
lendItemReturn.setFee(new BigDecimal("0"));
lendItemReturn.setReturnDate(lend.getLendStartDate().plusMonths(currentPeriod));
//是否逾期,默认未逾期
lendItemReturn.setOverdue(false);
lendItemReturn.setStatus(0);
lendItemReturnList.add(lendItemReturn);
}
lendItemReturnService.saveBatch(lendItemReturnList);
return lendItemReturnList;
}
>
> **//最后一次本金计算
> if (lendItemReturnList.size() > 0 && currentPeriod.intValue() == lend.getPeriod().intValue()) {
> //最后一期本金 = 本金 - 前几次之和
> BigDecimal sumPrincipal = lendItemReturnList.stream()
> .map(LendItemReturn::getPrincipal)
> .reduce(BigDecimal.ZERO, BigDecimal::add);
> //最后一期应还本金 = 用当前投资人的总投资金额 - 除了最后一期前面期数计算出来的所有的应还本金
![img](https://img-blog.csdnimg.cn/img_convert/3dedf248f0f71b64bbf1f521179cc237.png)
![img](https://img-blog.csdnimg.cn/img_convert/aa353dc37cf4155232ed5fc3b7618927.png)
![img](https://img-blog.csdnimg.cn/img_convert/13c3839dd6b6f7f6201676549f5e3f00.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**
伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**