From 8f090c91e2e2b0536d0900b935948e77a5f0979d Mon Sep 17 00:00:00 2001
From: Helius <wangdoubleone@gmail.com>
Date: Thu, 09 Jun 2022 15:08:43 +0800
Subject: [PATCH] fix some problem

---
 src/main/java/cc/mrbird/febs/dapp/service/impl/DappSystemServiceImpl.java |   50 +++++++++
 src/main/java/cc/mrbird/febs/dapp/chain/ChainService.java                 |   22 ++--
 src/main/java/cc/mrbird/febs/rabbit/consumer/ChainConsumer.java           |    6 +
 src/main/java/cc/mrbird/febs/job/SystemInit.java                          |   29 +++++
 src/main/java/cc/mrbird/febs/dapp/chain/ContractChainService.java         |    2 
 src/main/java/cc/mrbird/febs/rabbit/QueueConstants.java                   |    1 
 src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java          |    6 +
 src/main/java/cc/mrbird/febs/rabbit/producer/ChainProducer.java           |    6 +
 src/main/java/cc/mrbird/febs/rabbit/RabbitConfiguration.java              |   17 +++
 src/main/java/cc/mrbird/febs/dapp/chain/ChainEnum.java                    |   14 +-
 src/main/java/cc/mrbird/febs/dapp/chain/EthService.java                   |   28 +++++
 src/main/java/cc/mrbird/febs/dapp/service/impl/BscUsdtContractEvent.java  |    7 
 src/main/resources/mapper/dapp/DappMemberDao.xml                          |    7 +
 src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberDao.java               |    2 
 src/main/java/cc/mrbird/febs/dapp/service/DappSystemService.java          |    7 +
 src/main/java/cc/mrbird/febs/dapp/service/impl/BscCoinContractEvent.java  |   18 ++-
 src/main/java/cc/mrbird/febs/common/contants/AppContants.java             |    2 
 src/main/java/cc/mrbird/febs/job/MineProfitJob.java                       |    2 
 src/main/java/cc/mrbird/febs/job/SystemTradeJob.java                      |    1 
 src/test/java/cc/mrbird/febs/ChainTest.java                               |   26 +++++
 src/main/java/cc/mrbird/febs/dapp/utils/OnlineTransferUtil.java           |    5 
 src/main/java/cc/mrbird/febs/rabbit/QueueEnum.java                        |    3 
 src/main/java/cc/mrbird/febs/dapp/chain/TrxService.java                   |    5 +
 23 files changed, 231 insertions(+), 35 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 77dc48d..37d5efd 100644
--- a/src/main/java/cc/mrbird/febs/common/contants/AppContants.java
+++ b/src/main/java/cc/mrbird/febs/common/contants/AppContants.java
@@ -153,6 +153,8 @@
     public static final String DIC_VALUE_SYSTEM_START_TARGET = "SYSTEM_START_TARGET";
     public static final String DIC_VALUE_SYSTEM_SOURCE_POOL_VOL = "SYSTEM_SOURCE_POOL_VOL";
     public static final String DIC_VALUE_SYSTEM_NODE_CNT_LIMIT = "SYSTEM_NODE_CNT_LIMIT";
+    // 用户购买奖励比例(给上级)
+    public static final String DIC_VALUE_USER_BUY_REWARD = "USER_BUY_REWARD";
 
     public static final String DESTROY_ADDRESS = "0x0000000000000000000000000000000000000001";
 
diff --git a/src/main/java/cc/mrbird/febs/dapp/chain/ChainEnum.java b/src/main/java/cc/mrbird/febs/dapp/chain/ChainEnum.java
index 6c8c566..33a2a8c 100644
--- a/src/main/java/cc/mrbird/febs/dapp/chain/ChainEnum.java
+++ b/src/main/java/cc/mrbird/febs/dapp/chain/ChainEnum.java
@@ -31,7 +31,7 @@
      */
     BSC_USDT("BSC", "0x977a9ddfb965a9a3416fa72ca7f91c4949c18f25",
             "0xefe98e00cd227b6322e892c82fcbd8eadf119c3188b7e574bc624f65405d61bf",
-            "https://data-seed-prebsc-2-s2.binance.org:8545",
+            "https://data-seed-prebsc-2-s1.binance.org:8545",
             "0x337610d27c682E347C9cD60BD4b3b107C9d34dDd",
             ""),
 
@@ -43,7 +43,7 @@
      */
     BSC_TFC("BSC", "0x977a9ddfb965a9a3416fa72ca7f91c4949c18f25",
             "0xefe98e00cd227b6322e892c82fcbd8eadf119c3188b7e574bc624f65405d61bf",
-            "https://data-seed-prebsc-2-s2.binance.org:8545",
+            "https://data-seed-prebsc-2-s1.binance.org:8545",
             "0xdd92ea2f41d807a60b29004bf7db807d8ac09212",
             ""),
 
@@ -52,7 +52,7 @@
      */
     BSC_TFC_SOURCE("BSC", "0x4EbDCA102623b46a47042D580dddAdE2a53D057F",
             "0x81c2c02d0c106c1e32ab060a37f6eb279c0649c30ea5cc1c4951e6a8dd4e963c",
-            "https://data-seed-prebsc-2-s2.binance.org:8545",
+            "https://data-seed-prebsc-2-s1.binance.org:8545",
             "0xdd92ea2f41d807a60b29004bf7db807d8ac09212",
             ""),
 
@@ -61,7 +61,7 @@
      */
     BSC_USDT_SOURCE("BSC", "0x4EbDCA102623b46a47042D580dddAdE2a53D057F",
             "0x81c2c02d0c106c1e32ab060a37f6eb279c0649c30ea5cc1c4951e6a8dd4e963c",
-            "https://data-seed-prebsc-2-s2.binance.org:8545",
+            "https://data-seed-prebsc-2-s1.binance.org:8545",
             "0x337610d27c682E347C9cD60BD4b3b107C9d34dDd",
             ""),
 
@@ -70,7 +70,7 @@
      */
     BSC_TFC_MAKE("BSC", "0xBae24dAa3aB94cfF8114a16A4267D769b3a651F8",
             "0xc0cabaf5f1fce227e5f1b8a7f83a5dc28972389ffc59559d7852ce8d27c3bec4",
-            "https://data-seed-prebsc-2-s2.binance.org:8545",
+            "https://data-seed-prebsc-2-s1.binance.org:8545",
             "0xdd92ea2f41d807a60b29004bf7db807d8ac09212",
             ""),
 
@@ -79,7 +79,7 @@
      */
     BSC_TFC_TECH("BSC", "0xD998DA7362360eFC6daDFEd6E9a32E70640d7600",
             "",
-            "https://data-seed-prebsc-2-s2.binance.org:8545",
+            "https://data-seed-prebsc-2-s1.binance.org:8545",
             "0xdd92ea2f41d807a60b29004bf7db807d8ac09212",
             ""),
 
@@ -88,7 +88,7 @@
      */
     BSC_TFC_REWARD("BSC", "0xBae24dAa3aB94cfF8114a16A4267D769b3a651F8",
             "0xc0cabaf5f1fce227e5f1b8a7f83a5dc28972389ffc59559d7852ce8d27c3bec4",
-            "https://data-seed-prebsc-2-s2.binance.org:8545",
+            "https://data-seed-prebsc-2-s1.binance.org:8545",
             "0xdd92ea2f41d807a60b29004bf7db807d8ac09212",
             "");
 
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 641d88b..e83c1f0 100644
--- a/src/main/java/cc/mrbird/febs/dapp/chain/ChainService.java
+++ b/src/main/java/cc/mrbird/febs/dapp/chain/ChainService.java
@@ -108,17 +108,19 @@
     }
 
     public static void main(String[] args) {
-        ChainEnum chain = ChainEnum.getValueByName(ChainEnum.BSC_TFC.name());
-        assert chain != null;
+//        ChainEnum chain = ChainEnum.getValueByName(ChainEnum.BSC_TFC.name());
+//        assert chain != null;
+//
+//        EthUsdtContract contract = contract(chain.getPrivateKey(), chain.getContractAddress(), chain.getUrl());
+//        EthFilter filter = getFilter(new BigInteger("18097238"), chain.getContractAddress());
+//
+//        contract.transferEventFlowable(filter).subscribe(e -> {
+//            System.out.println(1);
+//        }, error -> {
+//            log.error("--->", error);
+//        });
 
-        EthUsdtContract contract = contract(chain.getPrivateKey(), chain.getContractAddress(), chain.getUrl());
-        EthFilter filter = getFilter(new BigInteger("18097238"), chain.getContractAddress());
-
-        contract.transferEventFlowable(filter).subscribe(e -> {
-            System.out.println(1);
-        }, error -> {
-            log.error("--->", error);
-        });
+        System.out.println(ChainService.getInstance(ChainEnum.BSC_TFC.name()).totalSupply());
     }
 
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/chain/ContractChainService.java b/src/main/java/cc/mrbird/febs/dapp/chain/ContractChainService.java
index 67af948..1602c42 100644
--- a/src/main/java/cc/mrbird/febs/dapp/chain/ContractChainService.java
+++ b/src/main/java/cc/mrbird/febs/dapp/chain/ContractChainService.java
@@ -22,4 +22,6 @@
     int decimals();
 
     BigInteger blockNumber();
+
+    BigInteger totalSupply();
 }
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 1b043f1..66f037d 100644
--- a/src/main/java/cc/mrbird/febs/dapp/chain/EthService.java
+++ b/src/main/java/cc/mrbird/febs/dapp/chain/EthService.java
@@ -332,4 +332,32 @@
         }
     }
 
+    @Override
+    public BigInteger totalSupply() {
+        try {
+            String methodName = "totalSupply";
+            List<Type> inputParameters = new ArrayList<>();
+            List<TypeReference<?>> outputParameters = new ArrayList<>();
+            TypeReference<Uint256> typeReference = new TypeReference<Uint256>() {
+            };
+            outputParameters.add(typeReference);
+            Function function = new Function(methodName, inputParameters, outputParameters);
+            String data = FunctionEncoder.encode(function);
+            Transaction transaction = Transaction.createEthCallTransaction(null, contractAddress, data);
+
+            EthCall ethCall;
+            BigInteger totalSupply = BigInteger.ZERO;
+            try {
+                ethCall = web3j.ethCall(transaction, DefaultBlockParameterName.LATEST).send();
+                List<Type> results = FunctionReturnDecoder.decode(ethCall.getValue(), function.getOutputParameters());
+                totalSupply = (BigInteger) results.get(0).getValue();
+                return totalSupply.divide(BigInteger.TEN.pow(decimals()));
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return BigInteger.ZERO;
+    }
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/chain/TrxService.java b/src/main/java/cc/mrbird/febs/dapp/chain/TrxService.java
index f75b057..d8c8e99 100644
--- a/src/main/java/cc/mrbird/febs/dapp/chain/TrxService.java
+++ b/src/main/java/cc/mrbird/febs/dapp/chain/TrxService.java
@@ -108,4 +108,9 @@
     public BigInteger blockNumber() {
         return null;
     }
+
+    @Override
+    public BigInteger totalSupply() {
+        return null;
+    }
 }
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 b57d48b..4db4774 100644
--- a/src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java
+++ b/src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java
@@ -26,7 +26,11 @@
     public DappFundFlowEntity() {}
 
     public DappFundFlowEntity(Long memberId, BigDecimal amount, Integer type, Integer status, BigDecimal fee) {
-        new DappFundFlowEntity(memberId, amount, type, status, fee, null);
+        this.memberId = memberId;
+        this.amount = amount;
+        this.type = type;
+        this.status = status;
+        this.fee = fee;
     }
 
     public DappFundFlowEntity(Long memberId, BigDecimal amount, Integer type, Integer status, BigDecimal fee, String fromHash) {
diff --git a/src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberDao.java b/src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberDao.java
index d233533..6351920 100644
--- a/src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberDao.java
+++ b/src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberDao.java
@@ -28,4 +28,6 @@
     List<DappMemberEntity> selectParentsList(@Param("list") List<String> inviteIds, @Param("size") Integer size);
 
     BigDecimal selectAllBalance(@Param("accountType") String accountType);
+
+    List<DappMemberEntity> selectMemberByAccountType(@Param("accountType") String accountType);
 }
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 e7826e6..cd88680 100644
--- a/src/main/java/cc/mrbird/febs/dapp/service/DappSystemService.java
+++ b/src/main/java/cc/mrbird/febs/dapp/service/DappSystemService.java
@@ -26,4 +26,11 @@
     void mining();
 
     void onlineTransfer(String batchNo);
+
+    /**
+     * 用户购买奖励
+     *
+     * @param id
+     */
+    void userBuyReward(Long id);
 }
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 0831463..60988b2 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
@@ -89,12 +89,13 @@
                 return;
             }
 
-//            DappMemberEntity fromMember = dappMemberService.findByAddress(e.from, null);
-//            if (fromMember == null) {
-//                DappMemberEntity sourceAddress = dappMemberDao.selectByAddress(ChainEnum.BSC_TFC.getAddress(), null);
-//                fromMember = dappMemberService.insertMember(e.from, sourceAddress.getInviteId());
-//                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);
+            }
 
             BigInteger tokens = e.tokens;
             BigDecimal amount = BigDecimal.valueOf(tokens.intValue()).divide(BigDecimal.TEN.pow(decimals), decimals, RoundingMode.HALF_DOWN);
@@ -109,8 +110,11 @@
 
                 if (toMember.getActiveStatus() == 2) {
                     toMember.setActiveStatus(1);
-                    dappMemberService.updateById(toMember);
                 }
+                // 更新余额
+                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);
             }
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 365e962..be83b99 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
@@ -64,15 +64,13 @@
 
             // 如果得到触发,则休眠10秒。 因为此处监听器触发可能优先于前端调用transfer接口
             try {
-                Thread.sleep(5000);
+                Thread.sleep(10000);
             } catch (InterruptedException ex) {
                 ex.printStackTrace();
             }
 
             ContractChainService sourceUsdtInstance = ChainService.getInstance(ChainEnum.BSC_USDT.name());
             int decimals = sourceUsdtInstance.decimals();
-            int tfcDecimals = ChainService.getInstance(ChainEnum.BSC_TFC.name()).decimals();
-
             if (e.from.equals("0xaa25aa7a19f9c426e07dee59b12f944f4d9f1dd3")) {
                 return;
             }
@@ -155,6 +153,9 @@
 
                 // 发送转账消息
                 chainProducer.sendOnlineTransfer(JSONObject.toJSONString(map));
+
+                // 发送购买奖励消息
+                chainProducer.sendUserBuyReward(fundFlow.getId());
             }
         }
     }
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 580de8f..5e64ebc 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
@@ -24,6 +24,7 @@
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
+import java.math.BigInteger;
 import java.math.RoundingMode;
 import java.util.*;
 
@@ -207,15 +208,21 @@
     @Override
     public void mining() {
         log.info("挖矿");
+        ContractChainService contract = ChainService.getInstance(ChainEnum.BSC_TFC.name());
+        // 发行量
+        BigInteger totalSupply = contract.totalSupply();
 
-        Object o = redisUtils.get(AppContants.REDIS_KEY_MINE_ALL_INTERNET_CNT);
-        if (o == null) {
-            return;
+        BigDecimal totalUnHold = contract.balanceOf(AppContants.DESTROY_ADDRESS);
+        List<DappMemberEntity> admin = dappMemberDao.selectMemberByAccountType("admin");
+        for (DappMemberEntity member : admin) {
+            totalUnHold = totalUnHold.add(contract.balanceOf(member.getAddress()));
         }
 
         Object transferPoolObj = redisUtils.get(AppContants.REDIS_KEY_MINE_TRANSFER_POOL_TRADE_CNT);
 
-        BigDecimal allInternet = (BigDecimal) o;
+        // 全网持币量
+        BigDecimal allInternet = new BigDecimal(totalSupply).subtract(totalUnHold);
+        // 中转池交易量
         BigDecimal transferPoll = (BigDecimal) transferPoolObj;
 
         List<DappMemberEntity> allMembers = dappMemberDao.selectList(null);
@@ -242,7 +249,12 @@
                 continue;
             }
 
+            DappFundFlowEntity fundFlow = new DappFundFlowEntity(member.getId(), mine, 3, 2, BigDecimal.ZERO);
+            dappFundFlowDao.insert(fundFlow);
             OnlineTransferUtil.addTransfer(member.getAddress(), mine, 3, 1, ChainEnum.BSC_TFC.name(), AppContants.SYMBOL_COIN, batchNo);
+
+            member.setBalance(balance);
+            dappMemberDao.updateById(member);
         }
 
         Map<String, String> map = new HashMap<>();
@@ -291,4 +303,34 @@
             }
         }
     }
+
+    @Override
+    public void userBuyReward(Long id) {
+        DappFundFlowEntity fundFlow = dappFundFlowDao.selectById(id);
+
+        DappMemberEntity member = dappMemberDao.selectById(fundFlow.getMemberId());
+        DappMemberEntity referer = dappMemberDao.selectMemberInfoByInviteId(member.getRefererId());
+        if (referer == null || "admin".equals(referer.getAccountType())) {
+            return;
+        }
+
+        DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(AppContants.DIC_TYPE_SYSTEM_SETTING, AppContants.DIC_VALUE_USER_BUY_REWARD);
+        BigDecimal prop = new BigDecimal(dic.getValue()).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
+        BigDecimal reward = fundFlow.getAmount().multiply(prop);
+
+        BigDecimal balance = ChainService.getInstance(ChainEnum.BSC_TFC_REWARD.name()).balanceOf(ChainEnum.BSC_TFC_REWARD.getAddress());
+        if (balance.compareTo(reward) < 1) {
+            return;
+        }
+
+        DappFundFlowEntity rewardFlow = new DappFundFlowEntity(referer.getId(), reward, 4, 2, BigDecimal.ZERO);
+        dappFundFlowDao.insert(rewardFlow);
+
+        OnlineTransferUtil.addTransfer(referer.getAddress(), reward, 4, 1, ChainEnum.BSC_TFC_REWARD.name(), AppContants.SYMBOL_COIN, rewardFlow.getId().toString());
+
+        Map<String, String> map = new HashMap<>();
+        map.put("batchNo", rewardFlow.getId().toString());
+        map.put("type", "batch");
+        chainProducer.sendOnlineTransfer(JSONObject.toJSONString(map));
+    }
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/utils/OnlineTransferUtil.java b/src/main/java/cc/mrbird/febs/dapp/utils/OnlineTransferUtil.java
index b97a967..c38fec3 100644
--- a/src/main/java/cc/mrbird/febs/dapp/utils/OnlineTransferUtil.java
+++ b/src/main/java/cc/mrbird/febs/dapp/utils/OnlineTransferUtil.java
@@ -1,8 +1,10 @@
 package cc.mrbird.febs.dapp.utils;
 
 import cc.mrbird.febs.common.utils.SpringContextUtil;
+import cc.mrbird.febs.dapp.entity.DappFundFlowEntity;
 import cc.mrbird.febs.dapp.entity.DappOnlineTransferEntity;
 import cc.mrbird.febs.dapp.entity.DappTransferRecordEntity;
+import cc.mrbird.febs.dapp.mapper.DappFundFlowDao;
 import cc.mrbird.febs.dapp.mapper.DappOnlineTransferDao;
 import cc.mrbird.febs.dapp.mapper.DappTransferRecordDao;
 
@@ -14,7 +16,7 @@
     private static final DappTransferRecordDao dappTransferRecordDao = SpringContextUtil.getBean(DappTransferRecordDao.class);
 
     public static void addTransfer(String address, BigDecimal amount, Integer type, Integer targetType, String fromType, String symbol, String batchNo) {
-         addTransfer(address, amount, type, targetType, fromType, symbol, "BSC", batchNo);
+        addTransfer(address, amount, type, targetType, fromType, symbol, "BSC", batchNo);
     }
 
     public static void addTransfer(String address, BigDecimal amount, Integer type, Integer targetType, String fromType, String symbol, String chain, String batchNo) {
@@ -51,4 +53,5 @@
     public static void addTransferRecord(String fromAddress, String toAddress, BigDecimal amount, String hash, String sourceFlag, String symbol) {
         addTransferRecord(fromAddress, toAddress, amount, hash, "BSC", sourceFlag, symbol);
     }
+
 }
diff --git a/src/main/java/cc/mrbird/febs/job/MineProfitJob.java b/src/main/java/cc/mrbird/febs/job/MineProfitJob.java
index 684400f..ac996a8 100644
--- a/src/main/java/cc/mrbird/febs/job/MineProfitJob.java
+++ b/src/main/java/cc/mrbird/febs/job/MineProfitJob.java
@@ -42,7 +42,7 @@
     @Autowired
     private RedisUtils redisUtils;
 
-    @Scheduled(cron = "0 0 2 * * ? ")
+//    @Scheduled(cron = "0 0 2 * * ? ")
     @Transactional(rollbackFor = Exception.class)
     public void start() {
         log.info("返利执行");
diff --git a/src/main/java/cc/mrbird/febs/job/SystemInit.java b/src/main/java/cc/mrbird/febs/job/SystemInit.java
new file mode 100644
index 0000000..9a55dd6
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/job/SystemInit.java
@@ -0,0 +1,29 @@
+package cc.mrbird.febs.job;
+
+import cc.mrbird.febs.common.contants.AppContants;
+import cc.mrbird.febs.common.utils.RedisUtils;
+import cc.mrbird.febs.dapp.chain.ChainEnum;
+import cc.mrbird.febs.dapp.chain.ChainService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import java.math.BigDecimal;
+
+/**
+ * @author wzy
+ * @date 2022-06-09
+ **/
+@Slf4j
+@Component
+public class SystemInit {
+
+    @Autowired
+    private RedisUtils redisUtils;
+
+    @PostConstruct
+    public void init() {
+        log.info("系统参数初始化");
+    }
+}
diff --git a/src/main/java/cc/mrbird/febs/job/SystemTradeJob.java b/src/main/java/cc/mrbird/febs/job/SystemTradeJob.java
index 95ec77f..9acd570 100644
--- a/src/main/java/cc/mrbird/febs/job/SystemTradeJob.java
+++ b/src/main/java/cc/mrbird/febs/job/SystemTradeJob.java
@@ -132,6 +132,7 @@
      */
     @Scheduled(cron = "0 0 2 * * ?")
     public void mineJob() {
+        log.info("挖矿");
         systemService.mining();
     }
 }
diff --git a/src/main/java/cc/mrbird/febs/rabbit/QueueConstants.java b/src/main/java/cc/mrbird/febs/rabbit/QueueConstants.java
index 50777ac..ab42222 100644
--- a/src/main/java/cc/mrbird/febs/rabbit/QueueConstants.java
+++ b/src/main/java/cc/mrbird/febs/rabbit/QueueConstants.java
@@ -8,4 +8,5 @@
 
     public static final String ONLINE_TRANSFER = "queue_online_transfer";
     public static final String DISTRIB_PROFIT = "queue_distrib_profit";
+    public static final String USER_BUY_REWARD = "queue_user_buy_reward";
 }
diff --git a/src/main/java/cc/mrbird/febs/rabbit/QueueEnum.java b/src/main/java/cc/mrbird/febs/rabbit/QueueEnum.java
index e5d603e..de125f9 100644
--- a/src/main/java/cc/mrbird/febs/rabbit/QueueEnum.java
+++ b/src/main/java/cc/mrbird/febs/rabbit/QueueEnum.java
@@ -7,7 +7,8 @@
 public enum QueueEnum {
 
     ONLINE_TRANSFER("exchange_online_transfer", "route_key_online_transfer", "queue_online_transfer"),
-    DISTRIB_PROFIT("exchange_distrib_profit", "route_key_distrib_profit", "queue_distrib_profit");
+    DISTRIB_PROFIT("exchange_distrib_profit", "route_key_distrib_profit", "queue_distrib_profit"),
+    USER_BUY_REWARD("exchange_user_buy_reward", "route_key_user_buy_reward", "queue_user_buy_reward");
 
     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 2843548..0b28eb2 100644
--- a/src/main/java/cc/mrbird/febs/rabbit/RabbitConfiguration.java
+++ b/src/main/java/cc/mrbird/febs/rabbit/RabbitConfiguration.java
@@ -58,4 +58,21 @@
     public Binding distribProfitBind() {
         return BindingBuilder.bind(distribProfitQueue()).to(distribProfitExchange()).with(QueueEnum.DISTRIB_PROFIT.getRoute());
     }
+
+    // === 用户购买奖励 start ===
+    @Bean
+    public DirectExchange userBuyRewardExchange() {
+        return new DirectExchange(QueueEnum.USER_BUY_REWARD.getExchange());
+    }
+
+    @Bean
+    public Queue userBuyRewardQueue() {
+        return new Queue(QueueEnum.USER_BUY_REWARD.getQueue());
+    }
+
+    @Bean
+    public Binding userBuyRewardBind() {
+        return BindingBuilder.bind(userBuyRewardQueue()).to(userBuyRewardExchange()).with(QueueEnum.USER_BUY_REWARD.getRoute());
+    }
+    // === 用户购买奖励 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 ab0857a..11dc7db 100644
--- a/src/main/java/cc/mrbird/febs/rabbit/consumer/ChainConsumer.java
+++ b/src/main/java/cc/mrbird/febs/rabbit/consumer/ChainConsumer.java
@@ -33,4 +33,10 @@
         log.info("收到滑点分配消息:{}", id);
         dappSystemService.tradeProfitDistribute(Long.parseLong(id));
     }
+
+    @RabbitListener(queues = QueueConstants.USER_BUY_REWARD)
+    public void userBuyReward(String id) {
+        log.info("收到用户购买奖励消息:{}", id);
+        dappSystemService.userBuyReward(Long.parseLong(id));
+    }
 }
diff --git a/src/main/java/cc/mrbird/febs/rabbit/producer/ChainProducer.java b/src/main/java/cc/mrbird/febs/rabbit/producer/ChainProducer.java
index 1efe71f..f6a225e 100644
--- a/src/main/java/cc/mrbird/febs/rabbit/producer/ChainProducer.java
+++ b/src/main/java/cc/mrbird/febs/rabbit/producer/ChainProducer.java
@@ -44,4 +44,10 @@
         CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
         rabbitTemplate.convertAndSend(QueueEnum.DISTRIB_PROFIT.getExchange(), QueueEnum.DISTRIB_PROFIT.getRoute(), id, correlationData);
     }
+
+    public void sendUserBuyReward(Long id) {
+        log.info("发送用户购买奖励消息:{}", id);
+        CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
+        rabbitTemplate.convertAndSend(QueueEnum.USER_BUY_REWARD.getExchange(), QueueEnum.USER_BUY_REWARD.getRoute(), id, correlationData);
+    }
 }
diff --git a/src/main/resources/mapper/dapp/DappMemberDao.xml b/src/main/resources/mapper/dapp/DappMemberDao.xml
index 7e97645..42c8b0a 100644
--- a/src/main/resources/mapper/dapp/DappMemberDao.xml
+++ b/src/main/resources/mapper/dapp/DappMemberDao.xml
@@ -85,4 +85,11 @@
             </if>
         </where>
     </select>
+
+    <select id="selectMemberByAccountType" resultType="cc.mrbird.febs.dapp.entity.DappMemberEntity">
+        select * from dapp_member
+        <where>
+            account_type=#{accountType}
+        </where>
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/src/test/java/cc/mrbird/febs/ChainTest.java b/src/test/java/cc/mrbird/febs/ChainTest.java
index 53a7d5e..4c04dd1 100644
--- a/src/test/java/cc/mrbird/febs/ChainTest.java
+++ b/src/test/java/cc/mrbird/febs/ChainTest.java
@@ -3,7 +3,9 @@
 import cc.mrbird.febs.dapp.chain.ChainEnum;
 import cc.mrbird.febs.dapp.chain.ChainService;
 import cc.mrbird.febs.dapp.chain.ContractChainService;
+import cc.mrbird.febs.dapp.entity.DappFundFlowEntity;
 import cc.mrbird.febs.dapp.entity.DappOnlineTransferEntity;
+import cc.mrbird.febs.dapp.mapper.DappFundFlowDao;
 import cc.mrbird.febs.dapp.mapper.DappOnlineTransferDao;
 import cc.mrbird.febs.job.SystemTradeJob;
 import cc.mrbird.febs.rabbit.producer.ChainProducer;
@@ -69,4 +71,28 @@
         chainProducer.sendOnlineTransfer(JSONObject.toJSONString(map));
     }
 
+    @Test
+    public void totalSupplyTest() {
+        System.out.println(ChainService.getInstance(ChainEnum.BSC_TFC.getChain()).totalSupply());
+    }
+
+    @Test
+    public void mineTest() {
+        systemTradeJob.mineJob();
+    }
+
+    @Autowired
+    private DappFundFlowDao dappFundFlowDao;
+
+    @Test
+    public void fundFlowInsertTest() {
+        DappFundFlowEntity rewardFlow = new DappFundFlowEntity(11L, BigDecimal.valueOf(1L), 4, 2, BigDecimal.ZERO);
+        rewardFlow.setFromHash("1");
+        dappFundFlowDao.insert(rewardFlow);
+    }
+
+    @Test
+    public void userBuyRewardTest() {
+        chainProducer.sendUserBuyReward(56L);
+    }
 }

--
Gitblit v1.9.1