From 6e9b8d075daa84b374552f136dc62f0c078d13f8 Mon Sep 17 00:00:00 2001
From: Helius <wangdoubleone@gmail.com>
Date: Sat, 27 Aug 2022 17:49:38 +0800
Subject: [PATCH] fix

---
 src/main/java/cc/mrbird/febs/dapp/service/impl/DappSystemServiceImpl.java |  124 ++++++++++++++++++++++++++++++++--------
 src/main/java/cc/mrbird/febs/rabbit/consumer/ChainConsumer.java           |    1 
 src/main/java/cc/mrbird/febs/dapp/entity/DappOnlineTransferEntity.java    |    2 
 src/main/java/cc/mrbird/febs/dapp/chain/ChainEnum.java                    |    9 +++
 4 files changed, 109 insertions(+), 27 deletions(-)

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 4396c83..387db89 100644
--- a/src/main/java/cc/mrbird/febs/dapp/chain/ChainEnum.java
+++ b/src/main/java/cc/mrbird/febs/dapp/chain/ChainEnum.java
@@ -107,6 +107,15 @@
             "0x86bd3ad3ffd055b27dd7685d494074982fe96d6cc9dde0e42e85a85036e8abe9",
             "https://bsc-mainnet.blockvision.org/v1/2D3n5NXWVLnIBsdBKZDlDFAC76x",
             "0xb27e44f98543e480dbd071b6605005e3d99b3dd4",
+            ""),
+
+    /**
+     * 多余手续费收集地址
+     */
+    BSC_TFC_FEE("BSC", "0x8084Cf691B69c70De8A7c345E63CaA740B730FA5",
+            "0x7bee8cf9441800655376ba95729c0807231367cf75702dd3b17fa5290196bb87",
+            "https://bsc-dataseed1.ninicoin.io",
+            "0xb27e44f98543e480dbd071b6605005e3d99b3dd4",
             "");
 
     private String chain;
diff --git a/src/main/java/cc/mrbird/febs/dapp/entity/DappOnlineTransferEntity.java b/src/main/java/cc/mrbird/febs/dapp/entity/DappOnlineTransferEntity.java
index 025ebc4..140182f 100644
--- a/src/main/java/cc/mrbird/febs/dapp/entity/DappOnlineTransferEntity.java
+++ b/src/main/java/cc/mrbird/febs/dapp/entity/DappOnlineTransferEntity.java
@@ -33,7 +33,7 @@
     private BigDecimal amount;
 
     /**
-     * 流水类型 1-买入 2-卖出 3-挖矿 4-奖励
+     * 流水类型 1-买入 2-卖出 3-挖矿 4-奖励 5-影子生态提现
      */
     private Integer type;
 
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 ad2e486..1c7517e 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
@@ -288,46 +288,65 @@
         DappFundFlowEntity fundFlow = dappFundFlowDao.selectById(id);
         String batchNo = RandomUtil.randomString(16) + id.toString();
 
+        Map<String, Integer> cardCntMap = nfcCardMap();
+
         ContractChainService instance = ChainService.getInstance(ChainEnum.BSC_TFC.name());
-        BigDecimal preNFTAmount;
-        BigDecimal distribAmount = fundFlow.getFee();
         if (fundFlow.getType() == 1) {
-            preNFTAmount = distribAmount.divide(new BigDecimal("5000"), 2, RoundingMode.HALF_UP);
+            BigDecimal totalBalance = BigDecimal.ZERO;
+
+            Map<String, BigDecimal> balanceMap = new HashMap<>();
+            for (Map.Entry<String, Integer> entry : cardCntMap.entrySet()) {
+                BigDecimal balance = instance.balanceOf(entry.getKey());
+
+                balanceMap.put(entry.getKey(), balance);
+                totalBalance = totalBalance.add(balance);
+            }
+
+            BigDecimal finalTotalBalance = totalBalance;
+            balanceMap.forEach((key, value) -> {
+                DappMemberEntity member = dappMemberDao.selectByAddress(key, "BSC");
+
+                BigDecimal rate = value.divide(finalTotalBalance, 2, RoundingMode.HALF_UP);
+                BigDecimal memberProfit = fundFlow.getFee().multiply(rate);
+                DappFundFlowEntity distribFlow = new DappFundFlowEntity(member.getId(), memberProfit, 4, 2, BigDecimal.ZERO);
+                dappFundFlowDao.insert(distribFlow);
+
+                OnlineTransferUtil.addTransfer(key, memberProfit, 4, 1, ChainEnum.BSC_TFC_SOURCE.name(), AppContants.SYMBOL_COIN, batchNo);
+            });
 
         } else if (fundFlow.getType() == 2) {
             BigDecimal destroyAmount = fundFlow.getFee().multiply(new BigDecimal("2").divide(new BigDecimal("7"), instance.decimals(), RoundingMode.HALF_UP));
             // 销毁
             OnlineTransferUtil.addTransfer(AppContants.DESTROY_ADDRESS, destroyAmount, fundFlow.getType(), 3, ChainEnum.BSC_TFC_SOURCE.name(), AppContants.SYMBOL_COIN, batchNo);
-            distribAmount = fundFlow.getFee().subtract(destroyAmount);
 
-            preNFTAmount = distribAmount.divide(new BigDecimal("5000"), 2, RoundingMode.HALF_UP);
+            BigDecimal remain = fundFlow.getFee().subtract(destroyAmount);
+            BigDecimal preNftAmount = remain.divide(new BigDecimal(5000),2 ,RoundingMode.HALF_UP);
+
+            BigDecimal total = BigDecimal.ZERO;
+            for (Map.Entry<String, Integer> entry : cardCntMap.entrySet()) {
+                DappMemberEntity member = dappMemberDao.selectByAddress(entry.getKey(), "BSC");
+                BigDecimal profit = new BigDecimal(entry.getValue()).multiply(preNftAmount);
+
+                DappFundFlowEntity distribFlow = new DappFundFlowEntity(member.getId(), profit, 4, 2, BigDecimal.ZERO);
+                dappFundFlowDao.insert(distribFlow);
+                OnlineTransferUtil.addTransfer(entry.getKey(), profit, 4, 1, ChainEnum.BSC_TFC_SOURCE.name(), AppContants.SYMBOL_COIN, batchNo);
+
+                total = total.add(profit);
+            };
+
+            if (remain.subtract(total).compareTo(BigDecimal.ZERO) > 0) {
+                OnlineTransferUtil.addTransfer(ChainEnum.BSC_TFC_FEE.getAddress(), remain.subtract(total), 4, 3, ChainEnum.BSC_TFC_SOURCE.name(), AppContants.SYMBOL_COIN, batchNo);
+            }
 
         } else {
             return;
         }
 
-        List<DappMemberEntity> allMembers = dappMemberDao.selectList(null);
-        if (CollUtil.isEmpty(allMembers)) {
-            return;
-        }
+        Map<String, String> map = new HashMap<>();
+        map.put("batchNo", batchNo);
 
-        BigDecimal total = BigDecimal.ZERO;
-        for (DappMemberEntity member : allMembers) {
-            BigDecimal balance = instance.balanceOf(member.getAddress());
-            BigDecimal memberProfit = balance.multiply(preNFTAmount);
-
-            // 返利
-            OnlineTransferUtil.addTransfer(member.getAddress(), memberProfit, fundFlow.getType(), 1, ChainEnum.BSC_TFC_SOURCE.name(), AppContants.SYMBOL_COIN, batchNo);
-
-            DappFundFlowEntity distribFlow = new DappFundFlowEntity(member.getId(), memberProfit, 4, 2, BigDecimal.ZERO);
-            dappFundFlowDao.insert(distribFlow);
-
-            total = total.add(memberProfit);
-        }
-
-        BigDecimal remain = distribAmount.subtract(total);
-        // 剩余的
-        OnlineTransferUtil.addTransfer(ChainEnum.BSC_TFC_TECH.getAddress(), remain, fundFlow.getType(), 3, ChainEnum.BSC_TFC_SOURCE.name(), AppContants.SYMBOL_COIN, batchNo);
+        // 发送转账消息
+        chainProducer.sendOnlineTransfer(JSONObject.toJSONString(map));
     }
 
 //    public static void main(String[] args) throws IOException {
@@ -733,9 +752,62 @@
         return true;
     }
 
+    /**
+     * 影子生态提现 扣除 10% 等值的tfc,作为手续费。 5%分配卡牌,5%销毁tfc
+     *
+     * @param data
+     */
     @Override
     public void sdmWithdrawFee(String data) {
+        BigDecimal totalFee = new BigDecimal(data);
+        String batchNo = RandomUtil.randomString(16);
 
+        BigDecimal cardProfit = totalFee.multiply(new BigDecimal("0.5"));
+        BigDecimal destroy = totalFee.subtract(cardProfit);
+
+        BigDecimal preFee = cardProfit.divide(BigDecimal.valueOf(5000), 2, RoundingMode.HALF_UP);
+
+        Map<String, Integer> cardCntMap = nfcCardMap();
+        if (!cardCntMap.isEmpty()) {
+            for (Map.Entry<String, Integer> entry : cardCntMap.entrySet()) {
+                BigDecimal amount = preFee.multiply(new BigDecimal(entry.getValue()));
+
+                DappMemberEntity member = dappMemberDao.selectByAddress(entry.getKey(), "BSC");
+                DappFundFlowEntity fundFlow = new DappFundFlowEntity(member.getId(), amount, 4, 1, null, null);
+                dappFundFlowDao.insert(fundFlow);
+
+                OnlineTransferUtil.addTransfer(entry.getKey(), amount, 5, 1, ChainEnum.BSC_TFC_FEE.name(), AppContants.SYMBOL_COIN, batchNo);
+
+                Map<String, Object> map = new HashMap<>();
+                map.put("batchNo", batchNo);
+                chainProducer.sendOnlineTransfer(JSONObject.toJSONString(map));
+            }
+        }
+
+        OnlineTransferUtil.addTransfer(AppContants.DESTROY_ADDRESS, destroy, 5, 2, ChainEnum.BSC_TFC_FEE.name(), AppContants.SYMBOL_COIN, batchNo);
+
+        Map<String, Object> map = new HashMap<>();
+        map.put("batchNo", batchNo);
+        chainProducer.sendOnlineTransfer(JSONObject.toJSONString(map));
+    }
+
+    private Map<String, Integer> nfcCardMap() {
+        ContractChainService nftInstance = ChainService.getInstance(ChainEnum.BSC_NFT_SDC.name());
+        BigInteger totalNFT = nftInstance.totalSupply();
+
+        Map<String, Integer> cardCntMap = new HashMap<>();
+        for (int i = 0; i < totalNFT.intValue(); i++) {
+            String address = nftInstance.ownerOfNft(i + 1);
+
+            Integer count = cardCntMap.get(address);
+            if (count == null) {
+                cardCntMap.put(address, 1);
+            } else {
+                cardCntMap.put(address, count + 1);
+            }
+        }
+
+        return cardCntMap;
     }
 
     @Override
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 b8f984d..67b9782 100644
--- a/src/main/java/cc/mrbird/febs/rabbit/consumer/ChainConsumer.java
+++ b/src/main/java/cc/mrbird/febs/rabbit/consumer/ChainConsumer.java
@@ -53,5 +53,6 @@
     @RabbitListener(queues = QueueConstants.WITHDRAW_FEE)
     public void withdrawFeeMsg(String data) {
         log.info("收到影子生态手续费消息:{}", data);
+        dappSystemService.sdmWithdrawFee(data);
     }
 }

--
Gitblit v1.9.1