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

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
简介: 微服务项目:尚融宝(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);


aab85b641bc6482dab5262c8d3d01648.png

相关文章
|
1月前
|
Java Maven Android开发
微服务——SpringBoot使用归纳——Spring Boot开发环境搭建和项目启动
本文介绍了Spring Boot开发环境的搭建和项目启动流程。主要内容包括:jdk的配置(IDEA、STS/eclipse设置方法)、Spring Boot工程的构建方式(IDEA快速构建、官方构建工具start.spring.io使用)、maven配置(本地maven路径与阿里云镜像设置)以及编码配置(IDEA和eclipse中的编码设置)。通过这些步骤,帮助开发者顺利完成Spring Boot项目的初始化和运行准备。
139 0
微服务——SpringBoot使用归纳——Spring Boot开发环境搭建和项目启动
|
1月前
|
Java 测试技术 微服务
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——少量配置信息的情形
本课主要讲解Spring Boot项目中的属性配置方法。在实际开发中,测试与生产环境的配置往往不同,因此不应将配置信息硬编码在代码中,而应使用配置文件管理,如`application.yml`。例如,在微服务架构下,可通过配置文件设置调用其他服务的地址(如订单服务端口8002),并利用`@Value`注解在代码中读取这些配置值。这种方式使项目更灵活,便于后续修改和维护。
35 0
|
1月前
|
Java 微服务 Spring
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录——使用Logger在项目中打印日志
本文介绍了如何在项目中使用Logger打印日志。通过SLF4J和Logback,可设置不同日志级别(如DEBUG、INFO、WARN、ERROR)并支持占位符输出动态信息。示例代码展示了日志在控制器中的应用,说明了日志配置对问题排查的重要性。附课程源码下载链接供实践参考。
78 0
|
1月前
|
Java 数据库 微服务
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——指定项目配置文件
在实际项目中,开发环境和生产环境的配置往往不同。为简化配置切换,可通过创建 `application-dev.yml` 和 `application-pro.yml` 分别管理开发与生产环境配置,如设置不同端口(8001/8002)。在 `application.yml` 中使用 `spring.profiles.active` 指定加载的配置文件,实现环境快速切换。本节还介绍了通过配置类读取参数的方法,适用于微服务场景,提升代码可维护性。课程源码可从 [Gitee](https://gitee.com/eson15/springboot_study) 下载。
57 0
|
1月前
|
Java 微服务 Spring
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——少量配置信息的情形
在微服务架构中,随着业务复杂度增加,项目可能需要调用多个微服务。为避免使用`@Value`注解逐一引入配置的繁琐,可通过定义配置类(如`MicroServiceUrl`)并结合`@ConfigurationProperties`注解实现批量管理。此方法需在配置文件中设置微服务地址(如订单、用户、购物车服务),并通过`@Component`将配置类纳入Spring容器。最后,在Controller中通过`@Resource`注入配置类即可便捷使用,提升代码可维护性。
38 0
|
7月前
|
消息中间件 监控 开发工具
微服务(三)-实现自动刷新配置(不重启项目情况下)
微服务(三)-实现自动刷新配置(不重启项目情况下)
|
9月前
|
负载均衡 Java 开发者
如何在Spring Boot项目中实现微服务架构?
如何在Spring Boot项目中实现微服务架构?
|
9月前
|
消息中间件 负载均衡 Java
最容易学会的springboot gralde spring cloud 多模块微服务项目
最容易学会的springboot gralde spring cloud 多模块微服务项目
|
11月前
|
监控 数据可视化 安全
智慧工地SaaS可视化平台源码,PC端+APP端,支持二开,项目使用,微服务+Java++vue+mysql
环境实时数据、动态监测报警,实时监控施工环境状态,有针对性地预防施工过程中的环境污染问题,打造文明生态施工,创造绿色的生态环境。
124 0
智慧工地SaaS可视化平台源码,PC端+APP端,支持二开,项目使用,微服务+Java++vue+mysql
|
11月前
|
Java Maven 微服务
微服务项目-将普通文件夹设为模块与添加services窗口
微服务项目-将普通文件夹设为模块与添加services窗口
75 0
下一篇
oss创建bucket