From 422be47bbda3dbf14a350b119bbf0d0eb3a91c3e Mon Sep 17 00:00:00 2001
From: wzy <wzy19931122ai@163.com>
Date: Sun, 28 Aug 2022 20:32:59 +0800
Subject: [PATCH] fix

---
 src/main/java/cc/mrbird/febs/dapp/service/impl/DappSystemServiceImpl.java |  130 ++++++++++++++++++++++++++++++++++--------
 1 files changed, 104 insertions(+), 26 deletions(-)

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..dd0362d 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,68 @@
         return true;
     }
 
+    /**
+     * 影子生态提现 扣除 10% 等值的tfc,作为手续费。 5%分配卡牌,5%销毁tfc
+     *
+     * @param data
+     */
     @Override
     public void sdmWithdrawFee(String data) {
+        JSONObject jsonObject = JSONObject.parseObject(data);
 
+        String address = jsonObject.getString("address");
+        if (!ChainEnum.BSC_TFC_FEE.getAddress().equals(address)) {
+            return;
+        }
+
+        BigDecimal totalFee = new BigDecimal(jsonObject.getString("fee"));
+        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), ChainService.getInstance(ChainEnum.BSC_TFC.name()).decimals(), 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");
+                if (member == null) {
+                    continue;
+                }
+                DappFundFlowEntity fundFlow = new DappFundFlowEntity(member.getId(), amount, 4, 2, null, null);
+                dappFundFlowDao.insert(fundFlow);
+
+                OnlineTransferUtil.addTransfer(entry.getKey(), amount, 5, 1, ChainEnum.BSC_TFC_FEE.name(), AppContants.SYMBOL_COIN, batchNo);
+            }
+        }
+
+        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.totalSupplyNFT();
+
+        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

--
Gitblit v1.9.1