认清现实,放弃幻想,准备斗争
前端整合
投资
pages/lend/_id.vue
//投资 commitInvest() { //校验用户是否登录 let userInfo = cookie.get('userInfo') // console.log(typeof userInfo) // console.log(!userInfo) //true if (!userInfo) { window.location.href = '/login' return } //校验当前用户是否是投资人 let userInfoObj = JSON.parse(userInfo) if (userInfoObj.userType == 2) { //借款人 this.$message.error('借款人无法投资') return } console.log(this.lend.investAmount) console.log(this.invest.investAmount) console.log(this.lend.amount) //判断标的是否超卖:标的已投金额 + 本次投资金额 > 标的总金额 if ( this.lend.investAmount + Number(this.invest.investAmount) > this.lend.amount ) { this.$message.error('标的可投资金额不足') return } //是否是100的整数倍 // console.log(this.invest.investAmount) // console.log(Number(this.invest.investAmount)) // console.log(typeof Number(this.invest.investAmount)) // return if ( Number(this.invest.investAmount) === 0 || this.invest.investAmount % this.lend.lowestAmount != 0 ) { this.$message.error(`投资金额必须是${this.lend.lowestAmount}的整数倍`) return } //余额的判断 if (this.invest.investAmount > this.account) { this.$message.error('余额不足,请充值') return } //数据提交 this.$alert( '<div style="size: 18px;color: red;">您即将前往汇付宝确认标的</div>', '前往汇付宝资金托管平台', { dangerouslyUseHTMLString: true, confirmButtonText: '立即前往', callback: (action) => { console.log('action', action) if (action === 'confirm') { this.invest.lendId = this.lend.id this.$axios .$post('/api/core/lendItem/auth/commitInvest', this.invest) .then((response) => { // console.log(response.data.formStr) // debugger document.write(response.data.formStr) }) } }, } ) }
定义回调接口
1、controller
LendItemController中创建回调方法
@ApiOperation("会员投资异步回调") @PostMapping("/notify") public String notify(HttpServletRequest request) { Map<String, Object> paramMap = RequestHelper.switchMap(request.getParameterMap()); log.info("用户投资异步回调:" + JSON.toJSONString(paramMap)); //校验签名 P2pInvestNotifyVo if(RequestHelper.isSignEquals(paramMap)) { if("0001".equals(paramMap.get("resultCode"))) { lendItemService.notify(paramMap); } else { log.info("用户投资异步回调失败:" + JSON.toJSONString(paramMap)); return "fail"; } } else { log.info("用户投资异步回调签名错误:" + JSON.toJSONString(paramMap)); return "fail"; } return "success"; }
2、Service
实现回调的业务
接口:LendItemService
void notify(Map<String, Object> paramMap);
实现:LendItemServiceImpl
@Resource private TransFlowService transFlowService; @Resource private UserAccountMapper userAccountMapper; @Transactional(rollbackFor = Exception.class) @Override public void notify(Map<String, Object> paramMap) { log.info("投标成功"); //获取投资编号 String agentBillNo = (String)paramMap.get("agentBillNo"); boolean result = transFlowService.isSaveTransFlow(agentBillNo); if(result){ log.warn("幂等性返回"); return; } //获取用户的绑定协议号 String bindCode = (String)paramMap.get("voteBindCode"); String voteAmt = (String)paramMap.get("voteAmt"); //修改商户系统中的用户账户金额:余额、冻结金额 userAccountMapper.updateAccount(bindCode, new BigDecimal("-" + voteAmt), new BigDecimal(voteAmt)); //修改投资记录的投资状态改为已支付 LendItem lendItem = this.getByLendItemNo(agentBillNo); lendItem.setStatus(1);//已支付 baseMapper.updateById(lendItem); //修改标的信息:投资人数、已投金额 Long lendId = lendItem.getLendId(); Lend lend = lendMapper.selectById(lendId); lend.setInvestNum(lend.getInvestNum() + 1); lend.setInvestAmount(lend.getInvestAmount().add(lendItem.getInvestAmount())); lendMapper.updateById(lend); //新增交易流水 TransFlowBO transFlowBO = new TransFlowBO( agentBillNo, bindCode, new BigDecimal(voteAmt), TransTypeEnum.INVEST_LOCK, "投资项目编号:" + lend.getLendNo() + ",项目名称:" + lend.getTitle()); transFlowService.saveTransFlow(transFlowBO); }
3、辅助方法
LendItemServiceImpl
private LendItem getByLendItemNo(String lendItemNo) { QueryWrapper<LendItem> queryWrapper = new QueryWrapper(); queryWrapper.eq("lend_item_no", lendItemNo); return baseMapper.selectOne(queryWrapper); }
今日分享
一、计算机系统的基本组成
1、一个完整的计算机系统都由硬件系统和软件系统组成。
2、硬件是指组成一台计算机的各种物理装置,包括运算器、控制器、存储器、输入设备和输出设备五部分,各部分通过总线连接在一起。
3、软件是指在硬件系统上运行的各种程序和相关资料,包括系统软件和应用软件两部分。
二、计算机硬件系统
仅有硬件而没有任何软件支持的计算机称为裸机。硬件是计算机的躯体,软件是计算机的灵魂,二者缺一不可。
第一台计算机ENIAC诞生至今,计算机硬件结构仍是依据冯·诺依曼提出的存储程序工作原理。