认清现实,放弃幻想,准备斗争
一、后端接口
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
@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
String commitInvest(InvestVO investVO);
实现:LendItemServiceImpl
@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
String getBindCodeByUserId(Long userId);
实现:UserBindServiceImpl
@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 投产,计算机从此从实验室走向社会,由单纯为军事服务进入为社会公众服务,被认为是计算机时代的真正开始。