前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >微服务项目:尚融宝(52)(核心业务流程:投标(3))

微服务项目:尚融宝(52)(核心业务流程:投标(3))

作者头像
一个风轻云淡
发布2022-11-15 15:14:13
2070
发布2022-11-15 15:14:13
举报
文章被收录于专栏:java学习java

一、后端接口

1、实现思路

投标时要在服务器端校验数据:

  • 标的状态必须为募资中
  • 标的不能超卖
  • 账户可用余额充足

2、创建VO

创建InvestVO

@Data @ApiModel(description = "投标信息") public class InvestVO {   private Long lendId;     //投标金额   private String investAmount;     //用户id   private Long investUserId;     //用户姓名     private String investName; }

3、Controller

LendItemController

代码语言:javascript
复制
@Api(tags = "标的的投资")
@RestController
@RequestMapping("/api/core/lendItem")
@Slf4j
public class LendItemController {
    
    @Resource
    LendItemService lendItemService;

    @ApiOperation("会员投资提交数据")
    @PostMapping("/auth/commitInvest")
    public R commitInvest(@RequestBody InvestVO investVO, HttpServletRequest request) {

        String token = request.getHeader("token");
        Long userId = JwtUtils.getUserId(token);
        String userName = JwtUtils.getUserName(token);
        investVO.setInvestUserId(userId);
        investVO.setInvestName(userName);

        //构建充值自动提交表单
        String formStr = lendItemService.commitInvest(investVO);
        return R.ok().data("formStr", formStr);
    }
}

4、Service

接口:LendItemService

代码语言:javascript
复制
String commitInvest(InvestVO investVO);

实现:LendItemServiceImpl

代码语言:javascript
复制
@Resource
private LendMapper lendMapper;

@Resource
private LendService lendService;

@Resource
private UserAccountService userAccountService;

@Resource
private UserBindService userBindService;


@Override
public String commitInvest(InvestVO investVO) {

    //输入校验==========================================
    Long lendId = investVO.getLendId();
    //获取标的信息
    Lend lend = lendMapper.selectById(lendId);

    //标的状态必须为募资中
    Assert.isTrue(
        lend.getStatus().intValue() == LendStatusEnum.INVEST_RUN.getStatus().intValue(),
        ResponseEnum.LEND_INVEST_ERROR);

    //标的不能超卖:(已投金额 + 本次投资金额 )>=标的金额(超卖)
    BigDecimal sum = lend.getInvestAmount().add(new BigDecimal(investVO.getInvestAmount()));
    Assert.isTrue(sum.doubleValue() <= lend.getAmount().doubleValue(),
                  ResponseEnum.LEND_FULL_SCALE_ERROR);

    //账户可用余额充足:当前用户的余额 >= 当前用户的投资金额(可以投资)
    Long investUserId = investVO.getInvestUserId();
    BigDecimal amount = userAccountService.getAccount(investUserId);//获取当前用户的账户余额
    Assert.isTrue(amount.doubleValue() >= Double.parseDouble(investVO.getInvestAmount()),
                  ResponseEnum.NOT_SUFFICIENT_FUNDS_ERROR);

    //在商户平台中生成投资信息==========================================
    //标的下的投资信息
    LendItem lendItem = new LendItem();
    lendItem.setInvestUserId(investUserId);//投资人id
    lendItem.setInvestName(investVO.getInvestName());//投资人名字
    String lendItemNo = LendNoUtils.getLendItemNo();
    lendItem.setLendItemNo(lendItemNo); //投资条目编号(一个Lend对应一个或多个LendItem)
    lendItem.setLendId(investVO.getLendId());//对应的标的id
    lendItem.setInvestAmount(new BigDecimal(investVO.getInvestAmount())); //此笔投资金额
    lendItem.setLendYearRate(lend.getLendYearRate());//年化
    lendItem.setInvestTime(LocalDateTime.now()); //投资时间
    lendItem.setLendStartDate(lend.getLendStartDate()); //开始时间
    lendItem.setLendEndDate(lend.getLendEndDate()); //结束时间

    //预期收益
    BigDecimal expectAmount = lendService.getInterestCount(
        lendItem.getInvestAmount(),
        lendItem.getLendYearRate(),
        lend.getPeriod(),
        lend.getReturnMethod());
    lendItem.setExpectAmount(expectAmount);

    //实际收益
    lendItem.setRealAmount(new BigDecimal(0));

    lendItem.setStatus(0);//默认状态:刚刚创建
    baseMapper.insert(lendItem);


    //组装投资相关的参数,提交到汇付宝资金托管平台==========================================
    //在托管平台同步用户的投资信息,修改用户的账户资金信息==========================================
    //获取投资人的绑定协议号
    String bindCode = userBindService.getBindCodeByUserId(investUserId);
    //获取借款人的绑定协议号
    String benefitBindCode = userBindService.getBindCodeByUserId(lend.getUserId());

    //封装提交至汇付宝的参数
    Map<String, Object> paramMap = new HashMap<>();
    paramMap.put("agentId", HfbConst.AGENT_ID);
    paramMap.put("voteBindCode", bindCode);
    paramMap.put("benefitBindCode",benefitBindCode);
    paramMap.put("agentProjectCode", lend.getLendNo());//项目标号
    paramMap.put("agentProjectName", lend.getTitle());

    //在资金托管平台上的投资订单的唯一编号,要和lendItemNo保持一致。
    paramMap.put("agentBillNo", lendItemNo);//订单编号
    paramMap.put("voteAmt", investVO.getInvestAmount());
    paramMap.put("votePrizeAmt", "0");
    paramMap.put("voteFeeAmt", "0");
    paramMap.put("projectAmt", lend.getAmount()); //标的总金额
    paramMap.put("note", "");
    paramMap.put("notifyUrl", HfbConst.INVEST_NOTIFY_URL); //检查常量是否正确
    paramMap.put("returnUrl", HfbConst.INVEST_RETURN_URL);
    paramMap.put("timestamp", RequestHelper.getTimestamp());
    String sign = RequestHelper.getSign(paramMap);
    paramMap.put("sign", sign);

    //构建充值自动提交表单
    String formStr = FormHelper.buildForm(HfbConst.INVEST_URL, paramMap);
    return formStr;
}

5、UserBindService

创建一个通用的Service方法,以方便调用,根据userId获取用户绑定账号

接口:UserBindService

代码语言:javascript
复制
String getBindCodeByUserId(Long userId);

实现:UserBindServiceImpl 

代码语言:javascript
复制
@Override
public String getBindCodeByUserId(Long userId){
    QueryWrapper<UserBind> userBindQueryWrapper = new QueryWrapper<>();
    userBindQueryWrapper.eq("user_id", userId);
    UserBind userBind = baseMapper.selectOne(userBindQueryWrapper);
    String bindCode = userBind.getBindCode();
    return bindCode;
}

今日分享 

计算机发展的四个阶段和计算机时代的开始 ⑴计算机发展的分代按照不同的规范有不同的分法。 通常是按计算机中硬件所采用的电子逻辑器件划分成电子管、晶体管、中小规模集成电路、大规模超大规模集成电路四个阶段; 也有一种观点把计算机的发展大致分为四个时期,即大型机时期、小型机时期、 PC 时期(或客户 / 服务器、 PC/ 服务器)时期和 Internet 或以网络为中心)时期。 ⑵通常 所说的计算机时代 ” 从何时开始? 认为 1951 年,世界上第一台商品化批量生产的计算机 UNIVA C-I 投产,计算机从此从实验室走向社会,由单纯为军事服务进入为社会公众服务,被认为是计算机时代的真正开始。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-09-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、后端接口
    • 1、实现思路
      • 2、创建VO
        • 3、Controller
          • 4、Service
            • 5、UserBindService
              • 今日分享 
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档