From 1bea36acb582b5b403ffd4b48a1d3794eb67d794 Mon Sep 17 00:00:00 2001
From: Helius <wangdoubleone@gmail.com>
Date: Sat, 27 Aug 2022 20:52:41 +0800
Subject: [PATCH] fix

---
 src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java |   77 ++++++++++++++++++++++----------------
 1 files changed, 45 insertions(+), 32 deletions(-)

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 89f2928..c0258d4 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
@@ -64,6 +64,7 @@
         WalletInfoVo walletInfo = new WalletInfoVo();
         List<DappMemberEntity> direct = dappMemberDao.selectChildMemberDirectOrNot(member.getInviteId(), 1);
         DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(member.getId());
+        DappWalletMineEntity walletMine = dappWalletMineDao.selectByMemberId(member.getId());
 
         walletInfo.setDirectCnt(direct.size());
         walletInfo.setInviteId(member.getInviteId());
@@ -71,6 +72,8 @@
         walletInfo.setHasBuy(memberInfo.getActiveStatus());
         walletInfo.setOutCnt(memberInfo.getOutCnt());
         walletInfo.setProfit(dappFundFlowDao.selectProfitAmountByMemberId(member.getId()));
+        walletInfo.setTFCbalance(walletMine.getAvailableAmount());
+
         return walletInfo;
     }
 
@@ -108,36 +111,6 @@
         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);
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public void withdraw(WalletOperateDto walletOperateDto) {
-        DappMemberEntity member = LoginUserUtil.getAppUser();
-
-        List<DappFundFlowEntity> fundFlows = dappFundFlowDao.selectListForMemberAndDay(member.getId(), 2);
-        if (CollUtil.isNotEmpty(fundFlows)) {
-            throw new FebsException("一天只能提现一次");
-        }
-
-        DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(member.getId());
-        if (walletOperateDto.getAmount().compareTo(walletCoin.getAvailableAmount()) > 0) {
-            throw new FebsException("可用金额不足");
-        }
-
-        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().add(walletOperateDto.getAmount()));
-        dappWalletCoinDao.updateById(walletCoin);
-
-        DappFundFlowEntity fund = new DappFundFlowEntity(member.getId(), walletOperateDto.getAmount(), AppContants.MONEY_TYPE_WITHDRAWAL, 1, new BigDecimal(fee));
-        dappFundFlowDao.insert(fund);
-
-        DappAccountMoneyChangeEntity usdtChange = new DappAccountMoneyChangeEntity(member.getId(), preAmount, walletOperateDto.getAmount(), walletCoin.getAvailableAmount(), "USDT申请提现", AppContants.MONEY_TYPE_WITHDRAWAL);
         dappAccountMoneyChangeDao.insert(usdtChange);
     }
 
@@ -234,8 +207,13 @@
 
             chainProducer.sendAchieveTreeMsg(member.getId());
         } else {
+            int type = 1;
+            // 1-认购 2-充值tfc
+            if (transferDto.getType() == 2) {
+                type = 6;
+            }
             if (transferDto.getId() == null) {
-                DappFundFlowEntity fundFlow = new DappFundFlowEntity(member.getId(), transferDto.getAmount(), 1, 1, transferDto.getFee(), transferDto.getTxHash());
+                DappFundFlowEntity fundFlow = new DappFundFlowEntity(member.getId(), transferDto.getAmount(), type, 1, transferDto.getFee(), transferDto.getTxHash());
                 dappFundFlowDao.insert(fundFlow);
                 return fundFlow.getId();
             }
@@ -256,7 +234,11 @@
 
     @Override
     public Map<String, BigDecimal> calPrice(PriceDto priceDto) {
-        return null;
+        String priceStr = redisUtils.getString(AppContants.REDIS_KEY_TFC_NEW_PRICE);
+
+        Map<String, BigDecimal> data = new HashMap<>();
+        data.put("fee", new BigDecimal(priceStr));
+        return data;
     }
 
     @Override
@@ -377,7 +359,22 @@
 
     @Override
     public void withdraw(WithdrawDto withdrawDto) {
+        DappMemberEntity member = LoginUserUtil.getAppUser();
 
+        updateWalletCoinWithLock(withdrawDto.getAmount().negate(), member.getId());
+        updateWalletMineWithLock(withdrawDto.getFee(), member.getId());
+
+        DappFundFlowEntity feeFlow = new DappFundFlowEntity(member.getId(), withdrawDto.getFee().negate(), 7, 2, null, null);
+        dappFundFlowDao.insert(feeFlow);
+
+        DappFundFlowEntity fundFlow = new DappFundFlowEntity(member.getId(), withdrawDto.getAmount().negate(), 5, 2, withdrawDto.getFee(), null);
+        dappFundFlowDao.insert(fundFlow);
+
+        String hash = ChainService.getInstance(ChainEnum.BSC_USDT.name()).transfer(member.getAddress(), withdrawDto.getAmount());
+        fundFlow.setToHash(hash);
+        dappFundFlowDao.updateById(fundFlow);
+
+        chainProducer.sendTfcFee(withdrawDto.getFee().toPlainString());
     }
 
     @Override
@@ -395,4 +392,20 @@
             }
         }
     }
+
+    @Override
+    public void updateWalletMineWithLock(BigDecimal amount, Long memberId) {
+        boolean isSuccess = false;
+        while(!isSuccess) {
+            DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(memberId);
+
+            walletCoin.setTotalAmount(walletCoin.getTotalAmount().add(amount));
+            walletCoin.setAvailableAmount(walletCoin.getAvailableAmount().add(amount));
+
+            int i = dappWalletCoinDao.updateWithLock(walletCoin);
+            if (i > 0) {
+                isSuccess = true;
+            }
+        }
+    }
 }

--
Gitblit v1.9.1