当前位置: 首页 > news >正文

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

认清现实,放弃幻想,准备斗争

1、生成还款计划

LendServiceImpl

@Resource
private LendReturnService lendReturnService;

@Resource
private LendItemReturnService lendItemReturnService;

 

 

/**
     * 还款计划
     *
     * @param lend
     */
private void repaymentPlan(Lend lend) {

    //还款计划列表
    List<LendReturn> lendReturnList = new ArrayList<>();

    //按还款时间生成还款计划
    int len = lend.getPeriod().intValue();
    for (int i = 1; i <= len; i++) {

        //创建还款计划对象
        LendReturn lendReturn = new LendReturn();
        lendReturn.setReturnNo(LendNoUtils.getReturnNo());
        lendReturn.setLendId(lend.getId());
        lendReturn.setBorrowInfoId(lend.getBorrowInfoId());
        lendReturn.setUserId(lend.getUserId());
        lendReturn.setAmount(lend.getAmount());
        lendReturn.setBaseAmount(lend.getInvestAmount());
        lendReturn.setLendYearRate(lend.getLendYearRate());
        lendReturn.setCurrentPeriod(i);//当前期数
        lendReturn.setReturnMethod(lend.getReturnMethod());

        //说明:还款计划中的这三项 = 回款计划中对应的这三项和:因此需要先生成对应的回款计划
        //			lendReturn.setPrincipal();
        //			lendReturn.setInterest();
        //			lendReturn.setTotal();

        lendReturn.setFee(new BigDecimal(0));
        lendReturn.setReturnDate(lend.getLendStartDate().plusMonths(i)); //第二个月开始还款
        lendReturn.setOverdue(false);
        if (i == len) { //最后一个月
            //标识为最后一次还款
            lendReturn.setLast(true);
        } else {
            lendReturn.setLast(false);
        }
        lendReturn.setStatus(0);
        lendReturnList.add(lendReturn);
    }
    //批量保存
    lendReturnService.saveBatch(lendReturnList);

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

            //最后一期应还本金 = 用当前投资人的总投资金额 - 除了最后一期前面期数计算出来的所有的应还本金
            BigDecimal lastPrincipal = lendItem.getInvestAmount().subtract(sumPrincipal);
            lendItemReturn.setPrincipal(lastPrincipal);

        } else {
            lendItemReturn.setPrincipal(mapPrincipal.get(currentPeriod));
            lendItemReturn.setInterest(mapInterest.get(currentPeriod));
        }

3、在makeLoan中调用

LendServiceImpl

//放款成功生成借款人还款计划和投资人回款计划
this.repaymentPlan(lend);

 

 

相关文章:

  • 第七:Fiddler抓包教程(7)-Fiddler状态面板-QuickExec命令行
  • C++标准语言day02
  • 1456. 定长子串中元音的最大数目-前缀和算法应用
  • Spartan Labs研报:基础SBT以及隐私性SBT的实现
  • 【英语:基础进阶_语法进阶提升】F7.非谓语动词
  • jenkins教程
  • 《Java并发编程的艺术》——Java并发的前置知识(笔记)
  • 解决vs2022运行控制台项目提示:不知道如何运行名为xxxx和命令为Project的配置文件
  • 【SpringBoot2】02-SpringBoot中如何修改依赖的版本
  • Java Byte byteValue()方法的功能说明
  • 解决本地项目连接虚拟机redis进程失败【Failed connecting to host 6379】
  • EWM /SCWM/CL_DLV_MANAGEMENT_PRD 类的QUERY方法查找 outbound delivery status
  • 动作捕捉系统在仿生足式/多足机器人中的应用
  • SpringBoot整合Spring Security
  • jsp药品销售管理系统myeclipse开发sql数据库BS模式java编程网页结构
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • axios 和 cookie 的那些事
  • canvas 五子棋游戏
  • emacs初体验
  • es6要点
  • JavaScript设计模式系列一:工厂模式
  • jquery ajax学习笔记
  • JS笔记四:作用域、变量(函数)提升
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • node学习系列之简单文件上传
  • PAT A1120
  • springboot_database项目介绍
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 多线程 start 和 run 方法到底有什么区别?
  • 手机端车牌号码键盘的vue组件
  • 一份游戏开发学习路线
  • 06-01 点餐小程序前台界面搭建
  • Hibernate主键生成策略及选择
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • #etcd#安装时出错
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • (10)ATF MMU转换表
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (万字长文)Spring的核心知识尽揽其中
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • ***监测系统的构建(chkrootkit )
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .java 9 找不到符号_java找不到符号
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .net生成的类,跨工程调用显示注释
  • .pings勒索病毒的威胁:如何应对.pings勒索病毒的突袭?
  • /dev/sda2 is mounted; will not make a filesystem here!
  • @ComponentScan比较
  • [《百万宝贝》观后]To be or not to be?
  • [2019.2.28]BZOJ4033 [HAOI2015]树上染色
  • [Arduino学习] ESP8266读取DHT11数字温湿度传感器数据