微服务项目:尚融宝(55)(核心业务流程:放款

//获取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)**

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值