From 48731a1c7023dc75fe7357fac5736adcf084e0c2 Mon Sep 17 00:00:00 2001
From: wzy <wzy19931122ai@163.com>
Date: Sat, 27 Aug 2022 15:02:10 +0800
Subject: [PATCH] fix

---
 src/main/java/cc/mrbird/febs/dapp/service/DappWalletService.java          |    2 
 src/main/java/cc/mrbird/febs/dapp/service/impl/DappSystemServiceImpl.java |    5 +
 src/main/java/cc/mrbird/febs/rabbit/consumer/ChainConsumer.java           |    6 +
 src/main/java/cc/mrbird/febs/dapp/controller/ApiDappMemberController.java |    9 +
 src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java |   47 +++++++++
 src/main/java/cc/mrbird/febs/dapp/mapper/DappWalletMineDao.java           |    2 
 src/main/java/cc/mrbird/febs/rabbit/QueueConstants.java                   |    1 
 src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java |    4 
 src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java          |    2 
 src/main/java/cc/mrbird/febs/rabbit/RabbitConfiguration.java              |   19 +++
 src/main/java/cc/mrbird/febs/dapp/service/impl/BscUsdtContractEvent.java  |   12 -
 src/main/java/cc/mrbird/febs/job/ChainListenerJob.java                    |   12 ++
 src/main/java/cc/mrbird/febs/dapp/service/DappSystemService.java          |    2 
 src/main/java/cc/mrbird/febs/dapp/service/impl/BscCoinContractEvent.java  |  122 +++++------------------
 src/main/java/cc/mrbird/febs/common/contants/AppContants.java             |    2 
 src/main/java/cc/mrbird/febs/dapp/vo/WalletInfoVo.java                    |    3 
 src/main/java/cc/mrbird/febs/rabbit/QueueEnum.java                        |    3 
 src/main/java/cc/mrbird/febs/dapp/dto/RecordInPageDto.java                |    2 
 src/main/resources/mapper/dapp/DappWalletMineDao.xml                      |   10 ++
 19 files changed, 156 insertions(+), 109 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/common/contants/AppContants.java b/src/main/java/cc/mrbird/febs/common/contants/AppContants.java
index f99f537..7223dc3 100644
--- a/src/main/java/cc/mrbird/febs/common/contants/AppContants.java
+++ b/src/main/java/cc/mrbird/febs/common/contants/AppContants.java
@@ -180,4 +180,6 @@
     public static final String REDIS_KEY_SYMBOL_DAILY_PRICE = "SYMBOL_DAILY_PRICE";
 
     public static final BigDecimal NFT_ACTIVE_PRICE = new BigDecimal("10");
+
+    public static final String REDIS_KEY_TFC_NEW_PRICE = "TFC_NEW_PRICE";
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/controller/ApiDappMemberController.java b/src/main/java/cc/mrbird/febs/dapp/controller/ApiDappMemberController.java
index 7e00ba7..9638145 100644
--- a/src/main/java/cc/mrbird/febs/dapp/controller/ApiDappMemberController.java
+++ b/src/main/java/cc/mrbird/febs/dapp/controller/ApiDappMemberController.java
@@ -67,7 +67,8 @@
     @ApiOperation(value = "提现", notes = "提现")
     @PostMapping(value = "/withdraw")
     public FebsResponse withdraw(@RequestBody WithdrawDto withdrawDto) {
-        return new FebsResponse().success();
+        dappWalletService.withdraw(withdrawDto);
+        return new FebsResponse().success().message("success");
     }
 
     @ApiOperation(value = "我的团队", notes = "我的团队")
@@ -85,4 +86,10 @@
         redisUtils.hdel(AppContants.REDIS_KEY_SIGN, member.getAddress());
         return new FebsResponse().success();
     }
+
+    @ApiOperation(value = "计算手续费", notes = "计算手续费")
+    @PostMapping(value = "/calPrice")
+    public FebsResponse calPrice(@RequestBody PriceDto priceDto) {
+        return new FebsResponse().success().data(dappWalletService.calPrice(priceDto));
+    }
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/dto/RecordInPageDto.java b/src/main/java/cc/mrbird/febs/dapp/dto/RecordInPageDto.java
index 74f2dcd..691235b 100644
--- a/src/main/java/cc/mrbird/febs/dapp/dto/RecordInPageDto.java
+++ b/src/main/java/cc/mrbird/febs/dapp/dto/RecordInPageDto.java
@@ -18,6 +18,6 @@
     @ApiModelProperty(value = "每页数量")
     private Integer pageSize = 10;
 
-    @ApiModelProperty(value = "类型", example = "1-买入 2-矩阵收益 3-直推收益 4-保险池 5-提现")
+    @ApiModelProperty(value = "类型", example = "1-买入 2-矩阵收益 3-直推收益 4-保险池 5-提现 6-手续费充值 7-手续费扣除")
     private Integer type;
 }
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 0251663..128a766 100644
--- a/src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java
+++ b/src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java
@@ -47,7 +47,7 @@
     private BigDecimal amount;
 
     /**
-     * 类型 1-买入 2-矩阵收益 3-直推收益 4-保险池 5-提现
+     * 类型 1-买入 2-矩阵收益 3-直推收益 4-保险池 5-提现 6-手续费充值 7-手续费扣除
      */
     private Integer type;
 
diff --git a/src/main/java/cc/mrbird/febs/dapp/mapper/DappWalletMineDao.java b/src/main/java/cc/mrbird/febs/dapp/mapper/DappWalletMineDao.java
index 9f15730..4b4cf24 100644
--- a/src/main/java/cc/mrbird/febs/dapp/mapper/DappWalletMineDao.java
+++ b/src/main/java/cc/mrbird/febs/dapp/mapper/DappWalletMineDao.java
@@ -15,4 +15,6 @@
     IPage<DappWalletMineEntity> selectInPage(@Param("record") DappWalletMineEntity walletMine, Page<DappWalletMineEntity> page);
 
     int updateBalance(@Param("totalAmount") BigDecimal totalAmount, @Param("availableAmount") BigDecimal availableAmount, @Param("memberId") Long memberId);
+
+    int updateWithLock(@Param("record") DappWalletMineEntity dappWalletMineEntity);
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/service/DappSystemService.java b/src/main/java/cc/mrbird/febs/dapp/service/DappSystemService.java
index 77f3653..19feb62 100644
--- a/src/main/java/cc/mrbird/febs/dapp/service/DappSystemService.java
+++ b/src/main/java/cc/mrbird/febs/dapp/service/DappSystemService.java
@@ -64,4 +64,6 @@
      * @param isReIn
      */
     void putIntoProfit(Long memberId, int isReIn);
+
+    void tfcNewPrice(String data);
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/service/DappWalletService.java b/src/main/java/cc/mrbird/febs/dapp/service/DappWalletService.java
index 250f2e9..9fc61f3 100644
--- a/src/main/java/cc/mrbird/febs/dapp/service/DappWalletService.java
+++ b/src/main/java/cc/mrbird/febs/dapp/service/DappWalletService.java
@@ -47,4 +47,6 @@
 
     void updateWalletCoinWithLock(BigDecimal amount, Long memberId);
 
+    void updateWalletMineWithLock(BigDecimal amount, Long memberId);
+
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/service/impl/BscCoinContractEvent.java b/src/main/java/cc/mrbird/febs/dapp/service/impl/BscCoinContractEvent.java
index 4578ecc..968c301 100644
--- a/src/main/java/cc/mrbird/febs/dapp/service/impl/BscCoinContractEvent.java
+++ b/src/main/java/cc/mrbird/febs/dapp/service/impl/BscCoinContractEvent.java
@@ -16,6 +16,7 @@
 import cc.mrbird.febs.dapp.mapper.DappOnlineTransferDao;
 import cc.mrbird.febs.dapp.service.DappMemberService;
 import cc.mrbird.febs.dapp.service.DappSystemService;
+import cc.mrbird.febs.dapp.service.DappWalletService;
 import cc.mrbird.febs.dapp.utils.OnlineTransferUtil;
 import cc.mrbird.febs.rabbit.producer.ChainProducer;
 import cn.hutool.core.collection.CollUtil;
@@ -41,9 +42,6 @@
 public class BscCoinContractEvent implements ContractEventService {
 
     @Resource
-    private DappMemberDao dappMemberDao;
-
-    @Resource
     private DappMemberService dappMemberService;
 
     @Resource
@@ -52,14 +50,8 @@
     @Resource
     private RedisUtils redisUtils;
 
-    @Autowired
-    private DappSystemService dappSystemService;
-
     @Resource
-    private DappOnlineTransferDao dappOnlineTransferDao;
-
-    @Resource
-    private ChainProducer chainProducer;
+    private DappWalletService dappWalletService;
 
     public static void main(String[] args) {
         System.out.println(Numeric.toBigInt("0x12e4e85"));
@@ -68,7 +60,7 @@
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void compile(EthUsdtContract.TransferEventResponse e) {
-        if (e.to != null) {
+        if (e.to != null && e.to.equals(ChainEnum.BSC_TFC.getAddress().toLowerCase())) {
             log.info("触发TFC监听");
 
             try {
@@ -80,105 +72,49 @@
             redisUtils.set(AppContants.REDIS_KEY_BLOCK_ETH_INCREMENT_NUM, e.log.getBlockNumber());
             int decimals = ChainService.getInstance(ChainEnum.BSC_TFC.name()).decimals();
 
-            // 合约创建时,同时创建地址
-            if ("0x0000000000000000000000000000000000000000".equals(e.from)) {
-                DappMemberEntity toMember = dappMemberDao.selectByAddress(e.to, null);
-                if (toMember == null) {
-                    toMember = dappMemberService.insertMember(e.to, "0", "BSC", "admin");
-                }
-                return;
-            }
-
             // 更新余额
             DappMemberEntity fromMember = dappMemberService.findByAddress(e.from, null);
-            if (fromMember != null) {
-                BigDecimal balance = ChainService.getInstance(ChainEnum.BSC_TFC.name()).balanceOf(e.from);
-                fromMember.setBalance(balance);
-                dappMemberService.updateById(fromMember);
-            } else {
-                fromMember = dappMemberService.insertMember(e.from, null);
+            if (fromMember == null) {
+                return;
             }
 
             BigInteger tokens = e.tokens;
             BigDecimal amount = new BigDecimal(tokens.toString()).divide(BigDecimal.TEN.pow(decimals), decimals, RoundingMode.HALF_DOWN);
 
-            // 如果转账对象地址不为源池地址,注册该用户并绑定上下级关系
-            if (!e.to.equals(ChainEnum.BSC_TFC_SOURCE.getAddress().toLowerCase())) {
-                DappMemberEntity toMember = dappMemberDao.selectByAddress(e.to, null);
-                if (toMember == null) {
-                    toMember = dappMemberService.insertMember(e.to, fromMember.getInviteId());
-                }
-
-//                if (toMember.getActiveStatus() == 2) {
-//                    toMember.setActiveStatus(1);
-//                }
-                // 更新余额
-                BigDecimal balance = ChainService.getInstance(ChainEnum.BSC_TFC.name()).balanceOf(e.to);
-                toMember.setBalance(balance);
-                dappMemberService.updateById(toMember);
-
-                OnlineTransferUtil.addTransferRecord(e.from, e.to, amount, e.log.getTransactionHash(), DappTransferRecordEntity.TRANSFER_SOURCE_FLAG_ONLINE, AppContants.SYMBOL_COIN);
+            // 卖币
+            DappFundFlowEntity fundFlow = dappFundFlowDao.selectByFromHash(e.log.getTransactionHash(), null);
+            if (fundFlow != null && fundFlow.getStatus() != 1) {
+                return;
             }
 
-            // 卖币
-            if (e.to.equals(ChainEnum.BSC_TFC_SOURCE.getAddress().toLowerCase())) {
-                DappFundFlowEntity fundFlow = dappFundFlowDao.selectByFromHash(e.log.getTransactionHash(), null);
-                if (fundFlow != null && fundFlow.getStatus() != 1) {
+            if (fundFlow == null) {
+                List<DappFundFlowEntity> flows = dappFundFlowDao.selectFundFlowListByAddress(e.from, 1);
+                if (CollUtil.isEmpty(flows)) {
+                    OnlineTransferUtil.addTransferRecord(e.from, e.to, amount, e.log.getTransactionHash(), DappTransferRecordEntity.TRANSFER_SOURCE_FLAG_ONLINE, AppContants.SYMBOL_COIN);
+                    log.info("本地无交易:{}", e.log.getTransactionHash());
                     return;
                 }
 
-                if (fundFlow == null) {
-                    List<DappFundFlowEntity> flows = dappFundFlowDao.selectFundFlowListByAddress(e.from, 1);
-                    if (CollUtil.isEmpty(flows)) {
-                        OnlineTransferUtil.addTransferRecord(e.from, e.to, amount, e.log.getTransactionHash(), DappTransferRecordEntity.TRANSFER_SOURCE_FLAG_ONLINE, AppContants.SYMBOL_COIN);
-                        log.info("本地无交易:{}", e.log.getTransactionHash());
-                        return;
-                    }
-
-                    boolean hasFlow = false;
-                    for (DappFundFlowEntity flow : flows) {
-                        if (flow.getStatus() == 1) {
-                            if (amount.compareTo(flow.getAmount()) == 0) {
-                                hasFlow = true;
-                                fundFlow = flow;
-                                fundFlow.setFromHash(e.log.getTransactionHash());
-                                break;
-                            }
+                for (DappFundFlowEntity flow : flows) {
+                    if (flow.getStatus() == 1) {
+                        if (amount.compareTo(flow.getAmount()) == 0) {
+                            fundFlow = flow;
+                            fundFlow.setFromHash(e.log.getTransactionHash());
+                            break;
                         }
                     }
-
-                    if (!hasFlow) {
-                        OnlineTransferUtil.addTransferRecord(e.from, e.to, amount, e.log.getTransactionHash(), DappTransferRecordEntity.TRANSFER_SOURCE_FLAG_ONLINE, AppContants.SYMBOL_COIN);
-                        return;
-                    }
                 }
-                OnlineTransferUtil.addTransferRecord(e.from, e.to, amount, e.log.getTransactionHash(), DappTransferRecordEntity.TRANSFER_SOURCE_FLAG_APPLICATION, AppContants.SYMBOL_COIN);
-
-                if (fundFlow.getAmount().add(fundFlow.getFee()).compareTo(amount) != 0) {
-                    return;
-                }
-
-                BigDecimal newPrice = fundFlow.getNewestPrice();
-                BigDecimal transferAmount = amount.multiply(newPrice);
-
-                // 更改状态为已同步
-                fundFlow.setStatus(2);
-                fundFlow.setTargetAmount(transferAmount);
-                dappFundFlowDao.updateById(fundFlow);
-
-                // 划点分配
-                chainProducer.sendDitribProfit(fundFlow.getId());
-
-                OnlineTransferUtil.addTransfer(e.from, transferAmount, fundFlow.getType(), 1, ChainEnum.BSC_USDT_SOURCE.name(), AppContants.SYMBOL_USDT, fundFlow.getId().toString());
-
-                Map<String, String> map = new HashMap<>();
-                map.put("batchNo", fundFlow.getId().toString());
-                map.put("type", "flow");
-
-                // 发送转账消息
-                chainProducer.sendOnlineTransfer(JSONObject.toJSONString(map));
             }
 
+            if (fundFlow == null) {
+                return;
+            }
+
+            // 更改状态为已同步
+            fundFlow.setStatus(2);
+            dappFundFlowDao.updateById(fundFlow);
+
+            dappWalletService.updateWalletMineWithLock(amount, fromMember.getId());
         }
     }
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/service/impl/BscUsdtContractEvent.java b/src/main/java/cc/mrbird/febs/dapp/service/impl/BscUsdtContractEvent.java
index 0e79963..58bfcb8 100644
--- a/src/main/java/cc/mrbird/febs/dapp/service/impl/BscUsdtContractEvent.java
+++ b/src/main/java/cc/mrbird/febs/dapp/service/impl/BscUsdtContractEvent.java
@@ -81,24 +81,20 @@
                     return;
                 }
 
-                boolean hasFlow = false;
                 for (DappFundFlowEntity flow : flows) {
                     if (flow.getStatus() == 1) {
                         if (amount.compareTo(flow.getAmount().multiply(flow.getNewestPrice()).setScale(4, RoundingMode.HALF_UP)) == 0) {
-                            hasFlow = true;
                             fundFlow = flow;
                             fundFlow.setFromHash(e.log.getTransactionHash());
                             break;
                         }
                     }
                 }
-
-                if (!hasFlow) {
-                    OnlineTransferUtil.addTransferRecord(e.from, e.to, amount, e.log.getTransactionHash(), DappTransferRecordEntity.TRANSFER_SOURCE_FLAG_ONLINE, "USDT");
-                    return;
-                }
             }
-            OnlineTransferUtil.addTransferRecord(e.from, e.to, amount, e.log.getTransactionHash(), DappTransferRecordEntity.TRANSFER_SOURCE_FLAG_APPLICATION, "USDT");
+
+            if (fundFlow == null) {
+                return;
+            }
 
             fundFlow.setAmount(fundFlow.getAmount().negate());
             // 更改状态为已同步
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 d10d5ee..c4cb2bf 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
@@ -291,6 +291,10 @@
         walletCoin.setMemberId(member.getId());
         dappWalletCoinDao.insert(walletCoin);
 
+        DappWalletMineEntity walletMine = new DappWalletMineEntity();
+        walletMine.setMemberId(member.getId());
+        dappWalletMineDao.insert(walletMine);
+
         if (StrUtil.isEmpty(refererId)) {
             refererId = "0";
             // 若没有推荐人,则直接激活
diff --git a/src/main/java/cc/mrbird/febs/dapp/service/impl/DappSystemServiceImpl.java b/src/main/java/cc/mrbird/febs/dapp/service/impl/DappSystemServiceImpl.java
index b3c5f88..3b48b4b 100644
--- a/src/main/java/cc/mrbird/febs/dapp/service/impl/DappSystemServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/dapp/service/impl/DappSystemServiceImpl.java
@@ -782,4 +782,9 @@
             dappSystemDao.updateMineData(mineData);
         }
     }
+
+    @Override
+    public void tfcNewPrice(String data) {
+        redisUtils.set(AppContants.REDIS_KEY_TFC_NEW_PRICE, new BigDecimal(data));
+    }
 }
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 8552798..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;
     }
 
@@ -204,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();
             }
@@ -226,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
@@ -347,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
@@ -365,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;
+            }
+        }
+    }
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/vo/WalletInfoVo.java b/src/main/java/cc/mrbird/febs/dapp/vo/WalletInfoVo.java
index 8f5b1d1..c0514fc 100644
--- a/src/main/java/cc/mrbird/febs/dapp/vo/WalletInfoVo.java
+++ b/src/main/java/cc/mrbird/febs/dapp/vo/WalletInfoVo.java
@@ -31,4 +31,7 @@
 
     @ApiModelProperty(value = "是否购买")
     private Integer hasBuy;
+
+    @ApiModelProperty(value = "手续费")
+    private BigDecimal TFCbalance;
 }
diff --git a/src/main/java/cc/mrbird/febs/job/ChainListenerJob.java b/src/main/java/cc/mrbird/febs/job/ChainListenerJob.java
index 8f56980..4171b84 100644
--- a/src/main/java/cc/mrbird/febs/job/ChainListenerJob.java
+++ b/src/main/java/cc/mrbird/febs/job/ChainListenerJob.java
@@ -24,6 +24,8 @@
 
     @Autowired
     private ContractEventService bscUsdtContractEvent;
+    @Autowired
+    private ContractEventService bscCoinContractEvent;
 
     @Autowired
     private RedisUtils redisUtils;
@@ -78,8 +80,13 @@
         BigInteger section = BigInteger.valueOf(5000);
         while (newest.subtract(block).compareTo(section) > -1) {
             BigInteger end = block.add(section);
-            log.info("监听:[{} - {}]", block, end);
-            ChainService.contractEventListener(block, end, bscUsdtContractEvent, ChainEnum.BSC_USDT_LISTENER.name());
+
+            BigInteger finalBlock = block;
+            new Thread(() -> {
+                log.info("监听:[{} - {}]", finalBlock, end);
+                ChainService.contractEventListener(finalBlock, end, bscUsdtContractEvent, ChainEnum.BSC_USDT_LISTENER.name());
+                ChainService.contractEventListener(finalBlock, bscCoinContractEvent, ChainEnum.BSC_TFC_LISTENER.name());
+            }).start();
 
             block = block.add(section);
             if (block.compareTo(newest) > 0) {
@@ -87,6 +94,7 @@
             }
         }
         ChainService.contractEventListener(block, bscUsdtContractEvent, ChainEnum.BSC_USDT_LISTENER.name());
+        ChainService.contractEventListener(block, bscCoinContractEvent, ChainEnum.BSC_TFC_LISTENER.name());
 
         long end = System.currentTimeMillis();
         log.info("区块链监听启动完成, 消耗时间{}", end - start);
diff --git a/src/main/java/cc/mrbird/febs/rabbit/QueueConstants.java b/src/main/java/cc/mrbird/febs/rabbit/QueueConstants.java
index fbddd0c..de49ff2 100644
--- a/src/main/java/cc/mrbird/febs/rabbit/QueueConstants.java
+++ b/src/main/java/cc/mrbird/febs/rabbit/QueueConstants.java
@@ -10,4 +10,5 @@
     public static final String USER_BUY_REWARD = "queue_sdm_user_buy_reward";
     public static final String NFT_BOX = "queue_sdm_nft_box";
     public static final String ACHIEVE_TREE = "queue_sdm_achieve_tree";
+    public static final String TFC_NEW_PRICE = "queue_tfc_new_price";
 }
diff --git a/src/main/java/cc/mrbird/febs/rabbit/QueueEnum.java b/src/main/java/cc/mrbird/febs/rabbit/QueueEnum.java
index f155ab8..e22cbdb 100644
--- a/src/main/java/cc/mrbird/febs/rabbit/QueueEnum.java
+++ b/src/main/java/cc/mrbird/febs/rabbit/QueueEnum.java
@@ -11,7 +11,8 @@
     USER_BUY_REWARD("exchange_sdm_user_buy_reward", "route_key_sdm_user_buy_reward", "queue_sdm_user_buy_reward"),
     NFT_BOX("exchange_sdm_nft_box", "route_key_sdm_nft_box", "queue_sdm_nft_box"),
     ACHIEVE_TREE("exchange_sdm_achieve_tree", "route_key_sdm_achieve_tree", "queue_sdm_achieve_tree"),
-    WITHDRAW_FEE("exchange_withdraw_fee", "route_key_withdraw_fee", "queue_withdraw_fee");
+    WITHDRAW_FEE("exchange_withdraw_fee", "route_key_withdraw_fee", "queue_withdraw_fee"),
+    TFC_NEW_PRICE("exchange_tfc_new_price", "route_key_tfc_new_price", "queue_tfc_new_price");
 
     private String exchange;
 
diff --git a/src/main/java/cc/mrbird/febs/rabbit/RabbitConfiguration.java b/src/main/java/cc/mrbird/febs/rabbit/RabbitConfiguration.java
index f3a3461..7501014 100644
--- a/src/main/java/cc/mrbird/febs/rabbit/RabbitConfiguration.java
+++ b/src/main/java/cc/mrbird/febs/rabbit/RabbitConfiguration.java
@@ -129,4 +129,23 @@
         return BindingBuilder.bind(withdrawFeeQueue()).to(withdrawFeeExchange()).with(QueueEnum.WITHDRAW_FEE.getRoute());
     }
     // === 提现手续费 end ===
+
+
+
+    // === tfc最新价 start ===
+    @Bean
+    public DirectExchange tfcNewPriceExchange() {
+        return new DirectExchange(QueueEnum.TFC_NEW_PRICE.getExchange());
+    }
+
+    @Bean
+    public Queue tfcNewPriceQueue() {
+        return new Queue(QueueEnum.TFC_NEW_PRICE.getQueue());
+    }
+
+    @Bean
+    public Binding tfcNewPriceBind() {
+        return BindingBuilder.bind(tfcNewPriceQueue()).to(tfcNewPriceExchange()).with(QueueEnum.TFC_NEW_PRICE.getRoute());
+    }
+    // === tfc最新价 end ===
 }
diff --git a/src/main/java/cc/mrbird/febs/rabbit/consumer/ChainConsumer.java b/src/main/java/cc/mrbird/febs/rabbit/consumer/ChainConsumer.java
index 6af3e87..6201b1d 100644
--- a/src/main/java/cc/mrbird/febs/rabbit/consumer/ChainConsumer.java
+++ b/src/main/java/cc/mrbird/febs/rabbit/consumer/ChainConsumer.java
@@ -51,4 +51,10 @@
         log.info("收到业绩树消息");
         dappSystemService.achieveTree(Long.parseLong(id));
     }
+
+    @RabbitListener(queues = QueueConstants.TFC_NEW_PRICE)
+    public void tfcNewPrice(String data) {
+        log.info("收到最新价消息");
+
+    }
 }
diff --git a/src/main/resources/mapper/dapp/DappWalletMineDao.xml b/src/main/resources/mapper/dapp/DappWalletMineDao.xml
index 6f103bb..4aebd21 100644
--- a/src/main/resources/mapper/dapp/DappWalletMineDao.xml
+++ b/src/main/resources/mapper/dapp/DappWalletMineDao.xml
@@ -19,10 +19,20 @@
         </where>
     </select>
 
+
+
     <update id="updateBalance">
         update dapp_wallet_mine
         set total_amount = total_amount + #{totalAmount},
             available_amount = available_amount + #{availableAmount}
         where member_id=#{memberId}
     </update>
+
+    <update id="updateWithLock">
+        update dapp_wallet_mine
+        set total_amount=#{record.totalAmount},
+            available_amount=#{record.availableAmount},
+            version=version+1
+        where id=#{record.id} and version=#{record.version}
+    </update>
 </mapper>
\ No newline at end of file

--
Gitblit v1.9.1