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

本文涉及的产品
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
简介: 标的募资时间到,平台会操作放款或撤标,如果达到放款条件则操作放款说明:撤标过程与放款过程一致,处理业务相对简单,只是将出借金额返回给出借人即可,可以自行完成

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


一、平台放款



1、需求描述


标的募资时间到,平台会操作放款或撤标,如果达到放款条件则操作放款

说明:撤标过程与放款过程一致,处理业务相对简单,只是将出借金额返回给出借人即可,可以自行完成


2、相关数据库表


还款人还款记录:lend_return

投资人回款记录:lend_item_return


3、参考文档


参考《汇付宝商户账户技术文档》3.11满标放款


二、具体步骤



step1:放款

放款是一个同步接口,如果放款返回成功,那么我们要处理平台业务


step2:处理业务如下

(1)标的状态和标的平台收益

(2)给借款账号转入金额

(3)增加借款交易流水

(4)解冻并扣除投资人资金

(5)增加投资人交易流水

(6)生成借款人还款计划和出借人回款计划


aa3da4965b7b447eb701cb69a616cd5a.png


管理平台放款


1、Controller


AdminLendController


@ApiOperation("放款")
@GetMapping("/makeLoan/{id}")
public R makeLoan(
    @ApiParam(value = "标的id", required = true)
    @PathVariable("id") Long id) {
    lendService.makeLoan(id);
    return R.ok().message("放款成功");
}



2、满标放款


接口:LendService


/**
     * 满标放款
     * @param lendId
     */
void makeLoan(Long lendId);


实现:LendServiceImpl


@Resource
private UserInfoMapper userInfoMapper;
@Resource
private UserAccountMapper userAccountMapper;
@Resource
private LendItemService lendItemService;
@Resource
private TransFlowService transFlowService;
@Transactional(rollbackFor = Exception.class)
@Override
public void makeLoan(Long lendId) {
    //获取标的信息
    Lend lend = baseMapper.selectById(lendId);
    //放款接口调用
    Map<String, Object> paramMap = new HashMap<>();
    paramMap.put("agentId", HfbConst.AGENT_ID);
    paramMap.put("agentProjectCode", lend.getLendNo());//标的编号
    String agentBillNo = LendNoUtils.getLoanNo();//放款编号
    paramMap.put("agentBillNo", agentBillNo);
    //平台收益,放款扣除,借款人借款实际金额=借款金额-平台收益
    //月年化
    BigDecimal monthRate = lend.getServiceRate().divide(new BigDecimal(12), 8, BigDecimal.ROUND_DOWN);
    //平台实际收益 = 已投金额 * 月年化 * 标的期数
    BigDecimal realAmount = lend.getInvestAmount().multiply(monthRate).multiply(new BigDecimal(lend.getPeriod()));
    paramMap.put("mchFee", realAmount); //商户手续费(平台实际收益)
    paramMap.put("timestamp", RequestHelper.getTimestamp());
    String sign = RequestHelper.getSign(paramMap);
    paramMap.put("sign", sign);
    log.info("放款参数:" + JSONObject.toJSONString(paramMap));
    //发送同步远程调用
    JSONObject result = RequestHelper.sendRequest(paramMap, HfbConst.MAKE_LOAD_URL);
    log.info("放款结果:" + result.toJSONString());
    //放款失败
    if (!"0000".equals(result.getString("resultCode"))) {
        throw new BusinessException(result.getString("resultMsg"));
    }
    //更新标的信息
    lend.setRealAmount(realAmount);
    lend.setStatus(LendStatusEnum.PAY_RUN.getStatus());
    lend.setPaymentTime(LocalDateTime.now());
    baseMapper.updateById(lend);
    //获取借款人信息
    Long userId = lend.getUserId();
    UserInfo userInfo = userInfoMapper.selectById(userId);
    String bindCode = userInfo.getBindCode();
    //给借款账号转入金额
    BigDecimal total = new BigDecimal(result.getString("voteAmt"));
    userAccountMapper.updateAccount(bindCode, total, new BigDecimal(0));
    //新增借款人交易流水
    TransFlowBO transFlowBO = new TransFlowBO(
        agentBillNo,
        bindCode,
        total,
        TransTypeEnum.BORROW_BACK,
        "借款放款到账,编号:" + lend.getLendNo());//项目编号
    transFlowService.saveTransFlow(transFlowBO);
    //获取投资列表信息
    List<LendItem> lendItemList = lendItemService.selectByLendId(lendId, 1);
    lendItemList.stream().forEach(item -> {
        //获取投资人信息
        Long investUserId = item.getInvestUserId();
        UserInfo investUserInfo = userInfoMapper.selectById(investUserId);
        String investBindCode = investUserInfo.getBindCode();
        //投资人账号冻结金额转出
        BigDecimal investAmount = item.getInvestAmount(); //投资金额
        userAccountMapper.updateAccount(investBindCode, new BigDecimal(0), investAmount.negate());
        //新增投资人交易流水
        TransFlowBO investTransFlowBO = new TransFlowBO(
            LendNoUtils.getTransNo(),
            investBindCode,
            investAmount,
            TransTypeEnum.INVEST_UNLOCK,
            "冻结资金转出,出借放款,编号:" + lend.getLendNo());//项目编号
        transFlowService.saveTransFlow(investTransFlowBO);
    });
    //放款成功生成借款人还款计划和投资人回款计划
    // TODO
}



3、根据lendId获取投资记录


接口:LendItemService


List<LendItem> selectByLendId(Long lendId, Integer status);


实现:LendItemServiceImpl


@Override
public List<LendItem> selectByLendId(Long lendId, Integer status) {
    QueryWrapper<LendItem> queryWrapper = new QueryWrapper();
    queryWrapper.eq("lend_id", lendId);
    queryWrapper.eq("status", status);
    List<LendItem> lendItemList = baseMapper.selectList(queryWrapper);
    return lendItemList;
}


前端整合



srb-admin


1、定义api


创建 src/api/core/lend.js


  makeLoan(id) {
    return request({
      url: `/admin/core/lend/makeLoan/${id}`,
      method: 'get'
    })
  }



2、页面模板


src/views/core/lend/list.vue


<el-button v-if="scope.row.status == 1" type="warning" size="mini" @click="makeLoan(scope.row.id)">
    放款
</el-button>



3、页面脚本


src/views/core/lend/list.vue


makeLoan(id) {
  this.$confirm('确定放款吗?', '提示', {
    confirmButtonText: '确定',
    cancelButtonText: '取消',
    type: 'warning'
  })
    .then(() => {
      return lendApi.makeLoan(id)
    })
    .then(response => {
      //放款成功则重新获取数据列表
      this.fetchData()
      this.$message({
        type: 'success',
        message: response.message
      })
    })
    .catch(error => {
      console.log('取消', error)
      if (error === 'cancel') {
        this.$message({
          type: 'info',
          message: '已取消放款'
        })
      }
    })
}



相关文章
|
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项目的初始化和运行准备。
123 0
微服务——SpringBoot使用归纳——Spring Boot开发环境搭建和项目启动
|
1月前
|
Java 测试技术 微服务
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——少量配置信息的情形
本课主要讲解Spring Boot项目中的属性配置方法。在实际开发中,测试与生产环境的配置往往不同,因此不应将配置信息硬编码在代码中,而应使用配置文件管理,如`application.yml`。例如,在微服务架构下,可通过配置文件设置调用其他服务的地址(如订单服务端口8002),并利用`@Value`注解在代码中读取这些配置值。这种方式使项目更灵活,便于后续修改和维护。
31 0
|
1月前
|
Java 微服务 Spring
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录——使用Logger在项目中打印日志
本文介绍了如何在项目中使用Logger打印日志。通过SLF4J和Logback,可设置不同日志级别(如DEBUG、INFO、WARN、ERROR)并支持占位符输出动态信息。示例代码展示了日志在控制器中的应用,说明了日志配置对问题排查的重要性。附课程源码下载链接供实践参考。
76 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) 下载。
56 0
|
1月前
|
Java 微服务 Spring
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——少量配置信息的情形
在微服务架构中,随着业务复杂度增加,项目可能需要调用多个微服务。为避免使用`@Value`注解逐一引入配置的繁琐,可通过定义配置类(如`MicroServiceUrl`)并结合`@ConfigurationProperties`注解实现批量管理。此方法需在配置文件中设置微服务地址(如订单、用户、购物车服务),并通过`@Component`将配置类纳入Spring容器。最后,在Controller中通过`@Resource`注入配置类即可便捷使用,提升代码可维护性。
37 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
环境实时数据、动态监测报警,实时监控施工环境状态,有针对性地预防施工过程中的环境污染问题,打造文明生态施工,创造绿色的生态环境。
121 0
智慧工地SaaS可视化平台源码,PC端+APP端,支持二开,项目使用,微服务+Java++vue+mysql
|
11月前
|
Java Maven 微服务
微服务项目-将普通文件夹设为模块与添加services窗口
微服务项目-将普通文件夹设为模块与添加services窗口
75 0
下一篇
oss创建bucket