xiaoyong931011
2023-08-01 8e6989a4472063a2edb5e63c16610ccf8450a562
src/main/java/cc/mrbird/febs/dapp/service/impl/DappSystemServiceImpl.java
@@ -1,6 +1,8 @@
package cc.mrbird.febs.dapp.service.impl;
import cc.mrbird.febs.common.contants.AppContants;
import cc.mrbird.febs.common.exception.FebsException;
import cc.mrbird.febs.common.tree.MemberNode;
import cc.mrbird.febs.common.utils.LoginUserUtil;
import cc.mrbird.febs.common.utils.RedisUtils;
import cc.mrbird.febs.common.utils.SpringContextUtil;
@@ -14,10 +16,9 @@
import cc.mrbird.febs.dapp.mapper.*;
import cc.mrbird.febs.dapp.service.DappSystemService;
import cc.mrbird.febs.dapp.service.DappWalletService;
import cc.mrbird.febs.dapp.service.IMatrixTreeNodeService;
import cc.mrbird.febs.dapp.vo.AKLineLimitVo;
import cc.mrbird.febs.rabbit.producer.ChainProducer;
import cc.mrbird.febs.tree.MatrixTree;
import cc.mrbird.febs.tree.MemberNode;
import cc.mrbird.febs.tree.TreeConstants;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateTime;
@@ -39,6 +40,8 @@
import java.math.BigInteger;
import java.math.RoundingMode;
import java.util.*;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.stream.Collectors;
/**
@@ -70,6 +73,9 @@
    private final DappWalletMineDao dappWalletMineDao;
    private final DappAKlineMapper dappAKlineMapper;
    private final MallOrderInfoMapper mallOrderInfoMapper;
    private final MallAchieveRecordMapper mallAchieveRecordMapper;
    @Override
@@ -79,111 +85,6 @@
        SystemDto system = new SystemDto();
        system.setBuyAmount(new BigDecimal("100"));
        return system;
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public synchronized void achieveTree(Long memberId) {
        DappMemberEntity member = dappMemberDao.selectById(memberId);
        int batchNo = 0;
        DappAchieveTreeEntity newestTreeNode = dappAchieveTreeDao.selectNewestTreeNode();
        if (newestTreeNode != null) {
            if (newestTreeNode.getValidState() == 2) {
                batchNo = newestTreeNode.getBatchNo() + 1;
            } else {
                batchNo = newestTreeNode.getBatchNo();
            }
        }
        // 在大树中,插入当前节点
        DappAchieveTreeEntity achieveTree = new DappAchieveTreeEntity();
        achieveTree.setMidNode(memberId);
        achieveTree.setValidState(1);
        achieveTree.setBatchNo(batchNo);
        dappAchieveTreeDao.insert(achieveTree);
        // 在内存树(大树)中插入当前节点,并返回父节点
        MemberNode node = new MemberNode(member.getId(), member.getAddress(), member.getInviteId(), member.getRefererId());
        MatrixTree tree = MatrixTree.getInstance();
        MemberNode exist = tree.getNode(member.getId());
        if (exist != null) {
            return;
        }
        MemberNode parentNode = tree.addNode(node);
        // 创建该节点的矩阵
        DappAchieveMemberTreeEntity achieveMemberTree = new DappAchieveMemberTreeEntity();
        achieveMemberTree.setTreeNode(memberId);
        achieveMemberTree.setTopNode(memberId);
        achieveMemberTree.setDeep(1);
        achieveMemberTree.setHasMoney(1);
        if (parentNode != null) {
            achieveMemberTree.setParentNode(parentNode.getMemberId());
        }
        dappAchieveMemberTreeDao.insert(achieveMemberTree);
        // 激活用户状态
        member.setActiveStatus(1);
        dappMemberDao.updateById(member);
        putIntoProfit(memberId, 2);
        if (parentNode == null) {
            return;
        }
        // 修改父节点在数据库中的左/右节点数据
        DappAchieveTreeEntity treeMidNode = dappAchieveTreeDao.selectByMidNode(parentNode.getMemberId());
        boolean isLeft = false;
        if (parentNode.getLeft() != null && memberId.equals(parentNode.getLeft().getMemberId())) {
            treeMidNode.setLeftNode(memberId);
            isLeft = true;
        } else {
            treeMidNode.setRightNode(memberId);
        }
        dappAchieveTreeDao.updateById(treeMidNode);
        // 更新矩阵中的数据
        List<DappAchieveMemberTreeEntity> matrixNodes = dappAchieveMemberTreeDao.selectNotBottomNodeInMatrix(parentNode.getMemberId());
        for (DappAchieveMemberTreeEntity matrixNode : matrixNodes) {
            if (isLeft) {
                matrixNode.setLeftNode(memberId);
            } else {
                matrixNode.setRightNode(memberId);
            }
            dappAchieveMemberTreeDao.updateById(matrixNode);
            DappAchieveMemberTreeEntity newMatrixNode = new DappAchieveMemberTreeEntity();
            newMatrixNode.setTreeNode(memberId);
            newMatrixNode.setTopNode(matrixNode.getTopNode());
            newMatrixNode.setParentNode(parentNode.getMemberId());
            newMatrixNode.setHasMoney(1);
            newMatrixNode.setDeep(matrixNode.getDeep() + 1);
            dappAchieveMemberTreeDao.insert(newMatrixNode);
            if (matrixNode.getDeep() == 2) {
                finishMatrixTree(matrixNode.getTopNode());
            }
        }
    }
    // 完成矩阵树,并重置矩阵且重入
    public void finishMatrixTree(Long memberId) {
        List<DappAchieveMemberTreeEntity> matrixTree = dappAchieveMemberTreeDao.selectMatrixTreeByTopNode(memberId, 1);
        // 如果达到标准,则重置该矩阵树
        if (matrixTree.size() == 7) {
            dappAchieveMemberTreeDao.resetMatrixTree(memberId);
            dappAchieveMemberTreeDao.reentryMoney(memberId);
            putIntoProfit(memberId, 1);
            DappAchieveMemberTreeEntity bottomNode = dappAchieveMemberTreeDao.selectNodeByDeep(memberId, 3);
            if (bottomNode != null) {
                finishMatrixTree(bottomNode.getTopNode());
            }
        }
    }
    @Override
@@ -839,7 +740,7 @@
        chainProducer.sendAllMemberPerkAvaMsg(poolAllMemberAFundFlow.getId());
//        BigDecimal poolAllMemberAPercentCntAva = allMemberPerk(poolAllMemberAPercentCnt, FundFlowEnum.POOL_MEMBER_A_CNT.getCode());
//        DappFundFlowEntity poolAllMemberAFundFlowAva = new DappFundFlowEntity(
//                294L,
//                1L,
//                poolAllMemberAPercentCnt.subtract(poolAllMemberAPercentCntAva),
//                FundFlowEnum.POOL_MEMBER_A_CNT.getCode(),
//                2,
@@ -848,7 +749,7 @@
//                chergeRecordId);
//        dappFundFlowDao.insert(poolAllMemberAFundFlowAva);
//        dappWalletService.updateWalletMineWithLock(poolAllMemberAPercentCnt.subtract(poolAllMemberAPercentCntAva),
//                294L,1);
//                1L,1);
        /**
         * 10%直推
@@ -896,7 +797,7 @@
            }
            if(directAPercentCnt.compareTo(directAPercentFundFlowToMemberFlag) > 0){
                DappFundFlowEntity directAPercentFundFlowToMemberAva = new DappFundFlowEntity(
                        294L,
                        1L,
                        directAPercentCnt.subtract(directAPercentFundFlowToMemberFlag),
                        FundFlowEnum.DIRECT_A_PERCENT.getCode(),
                        2,
@@ -905,7 +806,7 @@
                        chergeRecordId);
                dappFundFlowDao.insert(directAPercentFundFlowToMemberAva);
                dappWalletService.updateWalletMineWithLock(directAPercentCnt.subtract(directAPercentFundFlowToMemberFlag),
                        294L,1);
                        AppContants.YL_MEMBER_ID,1);
            }
        }
        /**
@@ -941,7 +842,7 @@
        if(nodeAPercentCnt.compareTo(nodeAPercentCntAva) > 0){
            DappFundFlowEntity nodeAPercentFundFlowAva = new DappFundFlowEntity(
                    294L,
                    1L,
                    nodeAPercentCnt.subtract(nodeAPercentCntAva),
                    FundFlowEnum.NODE_A_PERCENT_TO_MEMBER.getCode(),
                    2,
@@ -950,7 +851,7 @@
                    chergeRecordId);
            dappFundFlowDao.insert(nodeAPercentFundFlowAva);
            dappWalletService.updateWalletMineWithLock(nodeAPercentCnt.subtract(nodeAPercentCntAva),
                    294L,1);
                    AppContants.YL_MEMBER_ID,1);
        }
        /**
         * 5%基金会
@@ -1090,11 +991,12 @@
    }
//    public static void main(String[] args) {
//        String address = AppContants.ADDRESS_A_POOL_PEOJECT;
//        String address = "0x7a9bfE048d110EF90a467803653f9B8666f9096C";
//        /**
//         * 发起USDT转账
//         */
//        String hash = ChainService.getInstance(ChainEnum.BSC_USDT_A_POOL.name()).transfer(address, new BigDecimal("0.01"));
//        String hash = ChainService.getInstance(ChainEnum.BSC_USDT_W_POOL_CONTRACT.name()).transferUSDT(address, new BigDecimal("0.99"));
//        System.out.println(hash);
//    }
    @Override
@@ -1259,7 +1161,7 @@
                    //用户的A币账户增加divide数量
//                    if(amountTC.compareTo(teamIncomePerkTotal) > 0){
//                        DappFundFlowEntity nodeAPercentFundFlowAva = new DappFundFlowEntity(
//                                294L,
//                                1L,
//                                subtract,
//                                FundFlowEnum.LEVEL_A_PERCENT_CNT_MEMBER.getCode(),
//                                2,
@@ -1268,7 +1170,7 @@
//                                systemProfitId);
//                        dappFundFlowDao.insert(nodeAPercentFundFlowAva);
//                        dappWalletService.updateWalletMineWithLock(subtract,
//                                294L,1);
//                                1L,1);
//                    }
                }
            }
@@ -1289,7 +1191,7 @@
        //用户的A币账户增加divide数量
        if(averagePerkCnt.compareTo(averagePerkCntAva) > 0){
            DappFundFlowEntity nodeAPercentFundFlowAva = new DappFundFlowEntity(
                    294L,
                    1L,
                    averagePerkCnt.subtract(averagePerkCntAva),
                    FundFlowEnum.DAO_3_NODE_PERK.getCode(),
                    2,
@@ -1298,7 +1200,7 @@
                    systemProfitId);
            dappFundFlowDao.insert(nodeAPercentFundFlowAva);
            dappWalletService.updateWalletMineWithLock(averagePerkCnt.subtract(averagePerkCntAva),
                    294L,1);
                    AppContants.YL_MEMBER_ID,1);
        }
        //生成流水记录
        DappFundFlowEntity nodeThreeFundFlow = new DappFundFlowEntity(
@@ -1330,7 +1232,7 @@
        //用户的A币账户增加divide数量
        if(averagePerkFourCnt.compareTo(averagePerkFourCntAva) > 0){
            DappFundFlowEntity nodeAPercentFundFlowAva = new DappFundFlowEntity(
                    294L,
                    1L,
                    averagePerkFourCnt.subtract(averagePerkFourCntAva),
                    FundFlowEnum.DAO_4_NODE_PERK.getCode(),
                    2,
@@ -1339,7 +1241,7 @@
                    systemProfitId);
            dappFundFlowDao.insert(nodeAPercentFundFlowAva);
            dappWalletService.updateWalletMineWithLock(averagePerkFourCnt.subtract(averagePerkFourCntAva),
                    294L,1);
                    AppContants.YL_MEMBER_ID,1);
        }
        DappFundFlowEntity nodeFourFundFlow = new DappFundFlowEntity(
                1L,
@@ -1369,7 +1271,7 @@
        //用户的A币账户增加divide数量
        if(averagePerkFiveCnt.compareTo(averagePerkFiveCntAva) > 0){
            DappFundFlowEntity nodeAPercentFundFlowAva = new DappFundFlowEntity(
                    294L,
                    1L,
                    averagePerkFiveCnt.subtract(averagePerkFiveCntAva),
                    FundFlowEnum.DAO_5_NODE_PERK.getCode(),
                    2,
@@ -1378,7 +1280,7 @@
                    systemProfitId);
            dappFundFlowDao.insert(nodeAPercentFundFlowAva);
            dappWalletService.updateWalletMineWithLock(averagePerkFiveCnt.subtract(averagePerkFiveCntAva),
                    294L,1);
                    AppContants.YL_MEMBER_ID,1);
        }
        DappFundFlowEntity nodeFiveFundFlow = new DappFundFlowEntity(
                1L,
@@ -1410,7 +1312,7 @@
        //用户的A币账户增加divide数量
        if(nodeFiveEqualsCnt.compareTo(nodeFiveEqualsCntAva) > 0){
            DappFundFlowEntity nodeAPercentFundFlowAva = new DappFundFlowEntity(
                    294L,
                    1L,
                    nodeFiveEqualsCnt.subtract(nodeFiveEqualsCntAva),
                    FundFlowEnum.DAO_5_NODE_EQUALS_PERK.getCode(),
                    2,
@@ -1419,7 +1321,7 @@
                    systemProfitId);
            dappFundFlowDao.insert(nodeAPercentFundFlowAva);
            dappWalletService.updateWalletMineWithLock(nodeFiveEqualsCnt.subtract(nodeFiveEqualsCntAva),
                    294L,1);
                    AppContants.YL_MEMBER_ID,1);
        }
        DappFundFlowEntity nodeFiveEqualsFundFlow = new DappFundFlowEntity(
                1L,
@@ -1675,10 +1577,15 @@
         * 发起USDT转账
         */
        log.info("amount:{},address:{}",amount,address);
        String hash = ChainService.getInstance(ChainEnum.BSC_USDT_W_POOL.name()).transfer(address, amount);
        String hash = ChainService.getInstance(ChainEnum.BSC_USDT_W_POOL_CONTRACT.name()).transferUSDT(address, amount);
        if(StrUtil.isEmpty(hash)){
//            hash = ChainService.getInstance(ChainEnum.BSC_USDT_W_POOL.name()).transfer(address, amount);
            return;
        }
//        if(StrUtil.isEmpty(hash)){
//            return;
//        }
        log.info("{},{}",id,hash);
        dappFundFlowEntity.setFromHash(hash);
        dappFundFlowEntity.setStatus(2);
@@ -1689,10 +1596,15 @@
     * 紧急提现方法
     */
    public static void main(String[] args) {
        BigDecimal amount = new BigDecimal("104.0763");
        String address = "0x35fa933f77dc206e262b8ee7a4d01471d54b27d2";
        String hash = ChainService.getInstance(ChainEnum.BSC_USDT_W_POOL.name()).transfer(address, amount);
        BigDecimal amount = new BigDecimal("0.01");
        String address = "0xB3cF9669F398f444DfCAebbAd2A49bF32ba41fE3";
        String hash = ChainService.getInstance(ChainEnum.BSC_USDT_W_POOL_CONTRACT.name()).transferUSDT(address, amount);
        System.out.println(hash);
//        int i = ChainService.getInstance(ChainEnum.BSC_TFC.name()).allowanceCnt("0x80098f854950f9327C4F4E747d285Fd2d41fbf3e");
    }
    @Override
@@ -1738,7 +1650,7 @@
                PoolEnum.COIN_A_CNT.getType(),
                PoolEnum.COIN_A_CNT.getCode());
        BigDecimal coinACnt = new BigDecimal(coinACntDic.getValue());
        coinACnt = coinACnt.subtract(totalCnt);
        coinACnt = coinACnt.subtract(totalCnt.multiply(new BigDecimal(0.8)));
        coinACntDic.setValue(coinACnt.toString());
        dataDictionaryCustomMapper.updateById(coinACntDic);
@@ -2109,7 +2021,7 @@
        BigDecimal poolAllMemberAPercentCnt = dappFundFlowEntity.getAmount();
        BigDecimal poolAllMemberAPercentCntAva = allMemberPerk(poolAllMemberAPercentCnt, FundFlowEnum.POOL_MEMBER_A_CNT.getCode());
        DappFundFlowEntity poolAllMemberAFundFlowAva = new DappFundFlowEntity(
                294L,
                1L,
                poolAllMemberAPercentCnt.subtract(poolAllMemberAPercentCntAva),
                FundFlowEnum.POOL_MEMBER_A_CNT.getCode(),
                2,
@@ -2118,9 +2030,485 @@
                dappFundFlowEntity.getSystemProfitId());
        dappFundFlowDao.insert(poolAllMemberAFundFlowAva);
        dappWalletService.updateWalletMineWithLock(poolAllMemberAPercentCnt.subtract(poolAllMemberAPercentCntAva),
                294L,1);
                AppContants.YL_MEMBER_ID,1);
    }
    @Override
    public void contractAnDaoMsg(Long flowId) {
        DappFundFlowEntity flow = dappFundFlowDao.selectById(flowId);
        if(ObjectUtil.isEmpty(flow)){
            return;
        }
        Long memberId = flow.getMemberId();
        if(DappFundFlowEntity.WITHDRAW_STATUS_AGREE == flow.getStatus()){
            return;
        }
        DappMemberEntity dappMemberEntity = dappMemberDao.selectById(memberId);
        if(ObjectUtil.isEmpty(dappMemberEntity)){
            return;
        }
        /**
         * 生成会员入金买A币的记录
         */
        DappChargeUsdtEntity dappChargeUsdtEntity = new DappChargeUsdtEntity(
                memberId,
                dappMemberEntity.getAddress(),
                null,
                2,
                flow.getAmount(),
                BigDecimal.ZERO,
                BigDecimal.ZERO);
        dappChargeUsdtMapper.insert(dappChargeUsdtEntity);
        /**
         * 减少用户的AUSD数量
         */
        DappUsdtPerkEntity dappUsdtPerkEntity = dappUsdtPerkEntityMapper.selectByMemberId(memberId);
        BigDecimal ausdAmount = dappUsdtPerkEntity.getAusdAmount();
        ausdAmount = ausdAmount.subtract(flow.getFee()).setScale(4,BigDecimal.ROUND_DOWN);
        dappUsdtPerkEntity.setAusdAmount(ausdAmount);
        dappUsdtPerkEntityMapper.updateById(dappUsdtPerkEntity);
        /**
         * 流水关联用户购买记录
         */
        flow.setSystemProfitId(dappChargeUsdtEntity.getId());
        /**
         * 链上转账的hash值
         */
//        flow.setFromHash(null);
        flow.setStatus(DappFundFlowEntity.WITHDRAW_STATUS_AGREE);
        dappFundFlowDao.updateById(flow);
        /**
         * 发送消息处理返利逻辑
         */
        chainProducer.sendAntACoinInContractMsg(flow.getId());
        /**
         * 发送消息处理代理升级
         */
        chainProducer.sendAntMemberLevelMsg(memberId);
    }
    @Override
    public void contractAnDaoInMsg(Long flowId) {
        /**
         * 获取对应的流水记录
         */
        DappFundFlowEntity dappFundFlowEntity = dappFundFlowDao.selectInfoById(flowId);
        if(ObjectUtil.isEmpty(dappFundFlowEntity)){
            return;
        }
        if(DappFundFlowEntity.WITHDRAW_STATUS_AGREE != dappFundFlowEntity.getStatus()){
            return;
        }
        Long memberId = dappFundFlowEntity.getMemberId();
        DappMemberEntity dappMemberEntity = dappMemberDao.selectById(memberId);
        if(ObjectUtil.isEmpty(dappMemberEntity)){
            return;
        }
        /**
         * 会员充值金额
         */
        BigDecimal amount = dappFundFlowEntity.getAmount();
        /**
         * A币的当前价格
         */
        DataDictionaryCustom coinAPriceDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                PoolEnum.COIN_A_PRICE.getType(),
                PoolEnum.COIN_A_PRICE.getCode()
        );
        BigDecimal coinAPrice = new BigDecimal(StrUtil.isEmpty(coinAPriceDic.getValue()) ? "0" : coinAPriceDic.getValue()).setScale(12,BigDecimal.ROUND_DOWN);
        /**
         * 会员充值USDT买入A币记录的ID
         */
        Long chergeRecordId = dappFundFlowEntity.getSystemProfitId() == null ? 0L : dappFundFlowEntity.getSystemProfitId();
        DappChargeUsdtEntity dappChargeUsdtEntity = dappChargeUsdtMapper.selectById(chergeRecordId);
        if(ObjectUtil.isEmpty(dappChargeUsdtEntity)){
            return;
        }
        if(2 != dappChargeUsdtEntity.getStatus()){
            return;
        }
//        if(StrUtil.isEmpty(dappChargeUsdtEntity.getMemberHash())){
//            return;
//        }
        /**
         * 金本位的三倍额度,增加业绩,增加对应的NFT的值
         */
        DappUsdtPerkEntity dappUsdtPerkEntity = dappUsdtPerkEntityMapper.selectByMemberId(memberId);
        if(ObjectUtil.isEmpty(dappUsdtPerkEntity)){
            dappUsdtPerkEntity = new DappUsdtPerkEntity();
            dappUsdtPerkEntity.setAmount(amount.multiply(new BigDecimal(3)));
            dappUsdtPerkEntity.setNftDevote(amount);
            dappUsdtPerkEntity.setMemberId(memberId);
            dappUsdtPerkEntityMapper.insert(dappUsdtPerkEntity);
        }
        //金本位的三倍额度
        BigDecimal amountPerk = dappUsdtPerkEntity.getAmount();
        amountPerk = amountPerk.add(amount.multiply(new BigDecimal(3)));
        dappUsdtPerkEntity.setAmount(amountPerk);
        //生成一条金本位的三倍额度的资金流水记录
        DappFundFlowEntity amountPerkFundFlow = new DappFundFlowEntity(
                memberId,
                amount.multiply(new BigDecimal(3)),
                FundFlowEnum.MEMBER_AMOUNT_PERK_TOTAL.getCode(),
                2,
                BigDecimal.ZERO,
                null,
                chergeRecordId);
        dappFundFlowDao.insert(amountPerkFundFlow);
        //增加业绩
        BigDecimal achieveAmount = dappUsdtPerkEntity.getAchieveAmount();
        achieveAmount = achieveAmount.add(amount);
        dappUsdtPerkEntity.setAchieveAmount(achieveAmount);
        //增加对应的NFT的值
        BigDecimal nftDevote = dappUsdtPerkEntity.getNftDevote();
        nftDevote = nftDevote.add(amount);
        dappUsdtPerkEntity.setNftDevote(nftDevote);
        dappUsdtPerkEntityMapper.updateById(dappUsdtPerkEntity);
        /**
         * 1.90%底池的USDT做成100%溢价,铸造出70%金本位价值的A币。
         */
        DataDictionaryCustom produceAPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                PoolEnum.PRODUCE_A_PERCENT.getType(),
                PoolEnum.PRODUCE_A_PERCENT.getCode()
        );
        BigDecimal produceAPercent = new BigDecimal(StrUtil.isEmpty(produceAPercentDic.getValue()) ? "0.7" : produceAPercentDic.getValue());
        //购买数量
        BigDecimal totalCnt = amount.divide(coinAPrice, 4, BigDecimal.ROUND_DOWN);
        /**
         * 铸造出70%金本位价值的A币。实际产生数量
         */
        BigDecimal realCnt = totalCnt.multiply(produceAPercent).setScale(4, BigDecimal.ROUND_DOWN);
        dappChargeUsdtEntity.setTotalCnt(totalCnt);
        dappChargeUsdtEntity.setRealCnt(realCnt);
        dappChargeUsdtMapper.updateById(dappChargeUsdtEntity);
        /**
         * 重新计算A币的价格
         */
        DataDictionaryCustom coinACntDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                PoolEnum.COIN_A_CNT.getType(),
                PoolEnum.COIN_A_CNT.getCode()
        );
        //A币币本位底池-A币的数量
        BigDecimal coinACntDicCnt = new BigDecimal(coinACntDic.getValue());
        coinACntDicCnt = coinACntDicCnt.add(realCnt);
        coinACntDic.setValue(coinACntDicCnt.toString());
        dataDictionaryCustomMapper.updateById(coinACntDic);
        DataDictionaryCustom coinAUsdtPriceDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                PoolEnum.COIN_A_USDT_PRICE.getType(),
                PoolEnum.COIN_A_USDT_PRICE.getCode()
        );
        //A币金本位底池-usdt数量
        BigDecimal coinAUsdtPriceDicCnt = new BigDecimal(coinAUsdtPriceDic.getValue());
        coinAUsdtPriceDicCnt = coinAUsdtPriceDicCnt.add(amount.multiply(new BigDecimal(0.8)));
        coinAUsdtPriceDic.setValue(coinAUsdtPriceDicCnt.toString());
        dataDictionaryCustomMapper.updateById(coinAUsdtPriceDic);
        BigDecimal divide = coinAUsdtPriceDicCnt.divide(coinACntDicCnt, 12, BigDecimal.ROUND_DOWN);
        coinAPriceDic.setValue(divide.toString());
        dataDictionaryCustomMapper.updateById(coinAPriceDic);
        chainProducer.sendAntKLineMsg(0);
        /**
         * A币的分配 walletMine
         * 【70%换算100%分配】
         * 50%客户秒到
         * 20%全网加权分红(按20%释放递减)
         * 10%直推
         * 5%节点
         * 5%基金会
         * 10%级差奖
         */
        /**
         * 50%客户秒到
         */
        DataDictionaryCustom memberGetAPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                PoolEnum.MEMBER_GET_A_PERCENT.getType(),
                PoolEnum.MEMBER_GET_A_PERCENT.getCode()
        );
        BigDecimal memberGetAPercent = new BigDecimal(StrUtil.isEmpty(memberGetAPercentDic.getValue()) ? "0.5" : memberGetAPercentDic.getValue());
        BigDecimal memberGetACnt = realCnt.multiply(memberGetAPercent).setScale(4, BigDecimal.ROUND_DOWN);
        BigDecimal fundFlowToMemberFlag = this.getAndUpdateMemberPerk(dappFundFlowEntity.getMemberId(), memberGetACnt);
        if(fundFlowToMemberFlag.compareTo(BigDecimal.ZERO) > 0){
            //生成一条50%客户秒到的资金流水记录
            DappFundFlowEntity fundFlowToMember = new DappFundFlowEntity(
                    dappFundFlowEntity.getMemberId(),
                    fundFlowToMemberFlag,
                    FundFlowEnum.MEMBER_GET_A_CNT.getCode(),
                    2,
                    BigDecimal.ZERO,
                    null,
                    chergeRecordId);
            dappFundFlowDao.insert(fundFlowToMember);
            //用户的A币账户增加memberGetACnt数量
            dappWalletService.updateWalletMineWithLock(fundFlowToMemberFlag,dappFundFlowEntity.getMemberId(),1);
        }
        /**
         * 20%全网加权分红(按20%释放递减)进入加权分红底池
         */
        DataDictionaryCustom poolAllMemberAPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                PoolEnum.POOL_ALL_MEMBER_A_PERCENT.getType(),
                PoolEnum.POOL_ALL_MEMBER_A_PERCENT.getCode()
        );
        BigDecimal poolAllMemberAPercent = new BigDecimal(StrUtil.isEmpty(poolAllMemberAPercentDic.getValue()) ? "0.2" : poolAllMemberAPercentDic.getValue());
        BigDecimal poolAllMemberAPercentCnt = realCnt.multiply(poolAllMemberAPercent).setScale(4, BigDecimal.ROUND_DOWN);
        DataDictionaryCustom poolAllMemberACntDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                PoolEnum.POOL_ALL_MEMBER_A_CNT.getType(),
                PoolEnum.POOL_ALL_MEMBER_A_CNT.getCode()
        );
        BigDecimal poolAllMemberACnt = new BigDecimal(StrUtil.isEmpty(poolAllMemberACntDic.getValue()) ? "0" : poolAllMemberACntDic.getValue());
        poolAllMemberACnt = poolAllMemberACnt.add(poolAllMemberAPercentCnt);
        poolAllMemberACntDic.setValue(poolAllMemberACnt.toString());
        dataDictionaryCustomMapper.updateById(poolAllMemberACntDic);
        //生成一条20%全网加权分红(按20%释放递减)进入加权分红底池的资金流水记录
        DappFundFlowEntity poolAllMemberAFundFlow = new DappFundFlowEntity(
                1L,
                poolAllMemberAPercentCnt,
                FundFlowEnum.POOL_ALL_MEMBER_A_CNT.getCode(),
                2,
                BigDecimal.ZERO,
                null,
                chergeRecordId);
        dappFundFlowDao.insert(poolAllMemberAFundFlow);
        /**
         * 20%全网加权平分,按照个人投资占比全网的比例去平分
         */
        chainProducer.sendAllMemberPerkAvaMsg(poolAllMemberAFundFlow.getId());
        /**
         * 10%直推
         */
        DataDictionaryCustom directAPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                PoolEnum.DIRECT_A_PERCENT.getType(),
                PoolEnum.DIRECT_A_PERCENT.getCode()
        );
        BigDecimal directAPercent = new BigDecimal(StrUtil.isEmpty(directAPercentDic.getValue()) ? "0.1" : directAPercentDic.getValue());
        BigDecimal directAPercentCnt = realCnt.multiply(directAPercent).setScale(4, BigDecimal.ROUND_DOWN);
        String refererId = dappMemberEntity.getRefererId();
        DappMemberEntity directMemberEntity = dappMemberDao.selectMemberInfoByInviteId(refererId);
        if(ObjectUtil.isNotEmpty(directMemberEntity)){
            /**
             *推荐用户入单可享有贡献值.例.推荐100获得100贡献值
             */
            DappUsdtPerkEntity directDappUsdtPerkEntity = dappUsdtPerkEntityMapper.selectByMemberId(directMemberEntity.getId());
            if(ObjectUtil.isEmpty(directDappUsdtPerkEntity)){
                directDappUsdtPerkEntity = new DappUsdtPerkEntity();
                directDappUsdtPerkEntity.setNftDevote(amount);
                directDappUsdtPerkEntity.setMemberId(directMemberEntity.getId());
                dappUsdtPerkEntityMapper.insert(directDappUsdtPerkEntity);
            }
            BigDecimal directNftDevote = directDappUsdtPerkEntity.getNftDevote();
            directNftDevote = directNftDevote.add(amount);
            directDappUsdtPerkEntity.setNftDevote(directNftDevote);
            dappUsdtPerkEntityMapper.updateById(directDappUsdtPerkEntity);
            BigDecimal directAPercentFundFlowToMemberFlag = this.getAndUpdateMemberPerk(directMemberEntity.getId(), directAPercentCnt);
            if(directAPercentFundFlowToMemberFlag.compareTo(BigDecimal.ZERO) > 0){
                //生成一条10%直推的资金流水记录
                DappFundFlowEntity directAPercentFundFlowToMember = new DappFundFlowEntity(
                        directMemberEntity.getId(),
                        directAPercentFundFlowToMemberFlag,
                        FundFlowEnum.DIRECT_A_PERCENT.getCode(),
                        2,
                        BigDecimal.ZERO,
                        null,
                        chergeRecordId);
                dappFundFlowDao.insert(directAPercentFundFlowToMember);
                //用户的A币账户增加directAPercentCnt数量
                dappWalletService.updateWalletMineWithLock(directAPercentFundFlowToMemberFlag,directMemberEntity.getId(),1);
            }
            if(directAPercentCnt.compareTo(directAPercentFundFlowToMemberFlag) > 0){
                DappFundFlowEntity directAPercentFundFlowToMemberAva = new DappFundFlowEntity(
                        1L,
                        directAPercentCnt.subtract(directAPercentFundFlowToMemberFlag),
                        FundFlowEnum.DIRECT_A_PERCENT.getCode(),
                        2,
                        BigDecimal.ZERO,
                        null,
                        chergeRecordId);
                dappFundFlowDao.insert(directAPercentFundFlowToMemberAva);
                dappWalletService.updateWalletMineWithLock(directAPercentCnt.subtract(directAPercentFundFlowToMemberFlag),
                        AppContants.YL_MEMBER_ID,1);
            }
        }
        /**
         * 5%节点
         */
        DataDictionaryCustom nodeAPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                PoolEnum.NODE_A_PERCENT.getType(),
                PoolEnum.NODE_A_PERCENT.getCode()
        );
        BigDecimal nodeAPercent = new BigDecimal(StrUtil.isEmpty(nodeAPercentDic.getValue()) ? "0.05" : nodeAPercentDic.getValue());
        BigDecimal nodeAPercentCnt = realCnt.multiply(nodeAPercent).setScale(4, BigDecimal.ROUND_DOWN);
        //生成一条5%节点的资金流水记录
        DappFundFlowEntity nodeAPercentFundFlow = new DappFundFlowEntity(
                1L,
                nodeAPercentCnt,
                FundFlowEnum.NODE_A_PERCENT.getCode(),
                2,
                BigDecimal.ZERO,
                null,
                chergeRecordId);
        dappFundFlowDao.insert(nodeAPercentFundFlow);
//        chainProducer.sendAntACoinInNodeMsg(nodeAPercentFundFlow.getId());
        DataDictionaryCustom nodeAPercentPoolDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                PoolEnum.NODE_A_PERCENT_POOL.getType(),
                PoolEnum.NODE_A_PERCENT_POOL.getCode()
        );
        BigDecimal nodeAPercentPoolDicCnt = new BigDecimal(StrUtil.isEmpty(nodeAPercentPoolDic.getValue()) ? "0" : nodeAPercentPoolDic.getValue());
        nodeAPercentPoolDicCnt = nodeAPercentPoolDicCnt.add(nodeAPercentCnt);
        nodeAPercentPoolDic.setValue(nodeAPercentPoolDicCnt.toString());
        dataDictionaryCustomMapper.updateById(nodeAPercentPoolDic);
        BigDecimal nodeAPercentCntAva = superNodePoolPerk(nodeAPercentCnt, NodeCodeEnum.SUPER_NODE.getCode(), FundFlowEnum.NODE_A_PERCENT_TO_MEMBER.getCode());
        if(nodeAPercentCnt.compareTo(nodeAPercentCntAva) > 0){
            DappFundFlowEntity nodeAPercentFundFlowAva = new DappFundFlowEntity(
                    1L,
                    nodeAPercentCnt.subtract(nodeAPercentCntAva),
                    FundFlowEnum.NODE_A_PERCENT_TO_MEMBER.getCode(),
                    2,
                    BigDecimal.ZERO,
                    null,
                    chergeRecordId);
            dappFundFlowDao.insert(nodeAPercentFundFlowAva);
            dappWalletService.updateWalletMineWithLock(nodeAPercentCnt.subtract(nodeAPercentCntAva),
                    AppContants.YL_MEMBER_ID,1);
        }
        /**
         * 5%基金会
         */
        DataDictionaryCustom foundationAPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                PoolEnum.FOUNDATION_A_PERCENT.getType(),
                PoolEnum.FOUNDATION_A_PERCENT.getCode()
        );
        BigDecimal foundationAPercent = new BigDecimal(StrUtil.isEmpty(foundationAPercentDic.getValue()) ? "0.05" : foundationAPercentDic.getValue());
        BigDecimal foundationAPercentCnt = realCnt.multiply(foundationAPercent).setScale(4, BigDecimal.ROUND_DOWN);
        //生成一条5%基金会的资金流水记录
        DappFundFlowEntity foundationAPercentFundFlow = new DappFundFlowEntity(
                295L,
                foundationAPercentCnt,
                FundFlowEnum.FOUNDATION_A_PERCENT.getCode(),
                2,
                BigDecimal.ZERO,
                null,
                chergeRecordId);
        dappFundFlowDao.insert(foundationAPercentFundFlow);
        //用户的A币账户增加memberGetACnt数量
        dappWalletService.updateWalletMineWithLock(foundationAPercentCnt,295L,1);
        /**
         * 10%级差奖
         */
        DataDictionaryCustom levelAPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                PoolEnum.LEVEL_A_PERCENT.getType(),
                PoolEnum.LEVEL_A_PERCENT.getCode()
        );
        BigDecimal levelAPercent = new BigDecimal(StrUtil.isEmpty(levelAPercentDic.getValue()) ? "0.1" : levelAPercentDic.getValue());
        BigDecimal levelAPercentCnt = realCnt.multiply(levelAPercent).setScale(4, BigDecimal.ROUND_DOWN);
        //生成一条10%级差奖进入10%级差奖底池的资金流水记录
        DappFundFlowEntity levelAPercentCntFundFlow = new DappFundFlowEntity(
                1L,
                levelAPercentCnt,
                FundFlowEnum.LEVEL_A_PERCENT_CNT.getCode(),
                2,
                BigDecimal.ZERO,
                null,
                chergeRecordId);
        dappFundFlowDao.insert(levelAPercentCntFundFlow);
        chainProducer.sendAntACoinInLevelMsg(levelAPercentCntFundFlow.getId());
        /**
         * 更新用户为有效用户
         */
        dappMemberDao.updateMemberActiveStatus(1,memberId);
    }
    @Override
    public void speedPayOrderMsg(Long orderId) {
        MallOrderInfo mallOrderInfo = mallOrderInfoMapper.selectById(orderId);
        if(ObjectUtil.isEmpty(mallOrderInfo)){
            return;
        }
        if(MallOrderInfo.STATUS_PAY != mallOrderInfo.getStatus()){
            return;
        }
        Long memberId = mallOrderInfo.getMemberId();
        /**
         * 赠送消费金额1.5倍增值积分
         */
        BigDecimal amount = mallOrderInfo.getAmount();
        DataDictionaryCustom donateScorePercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                DataDictionaryEnum.DONATE_SCORE_PERCENT.getType(),
                DataDictionaryEnum.DONATE_SCORE_PERCENT.getCode()
        );
        BigDecimal donateScorePercent = new BigDecimal(donateScorePercentDic.getValue());
        BigDecimal donateScore = amount.multiply(donateScorePercent);
        dappWalletMineDao.updateBalance(donateScore,donateScore,memberId);
        DappFundFlowEntity donateScoreFlow = new DappFundFlowEntity(
                memberId,
                donateScore,
                FundFlowEnum.DONATE_SCORE.getCode(),
                2,
                BigDecimal.ZERO,
                null,
                orderId);
        dappFundFlowDao.insert(donateScoreFlow);
        /**
         * 新增一条业绩
         */
        MallAchieveRecord mallAchieveRecord = new MallAchieveRecord(
                memberId,amount,amount,DateUtil.date(),orderId,1,mallOrderInfo.getPayTime()
        );
        mallAchieveRecordMapper.insert(mallAchieveRecord);
    }
    private final IMatrixTreeNodeService matrixTreeNodeService;
    @Override
    public void speedAutoLevelUpMsg(Long memberId) {log.info("###代理自动升级###");
        DappMemberEntity member = dappMemberDao.selectById(memberId);
        if (MemberLevelEnum.V7.getType().equals(member.getAccountType())) {
            return;
        }
        MemberNode parentNode = matrixTreeNodeService.addTreeNode(memberId);
        if (parentNode == null) {
            log.info("父级节点未找到:{}", memberId);
            return;
        }
        List<DataDictionaryCustom> dicList = dataDictionaryCustomMapper.selectDicByType(AppContants.AGENT_LEVEL);
        DataDictionaryCustom dic = null;
        for (DataDictionaryCustom dataDictionaryCustom : dicList) {
            if (Integer.parseInt(dataDictionaryCustom.getValue()) == parentNode.CHILD.size()) {
                dic = dataDictionaryCustom;
                break;
            }
        }
        if (dic == null) {
            return;
        }
        MallMember parentMember = memberMapper.selectById(parentNode.getMemberId());
        parentMember.setChildNodeCnt(parentNode.CHILD.size());
        int levelCode = MemberLevelEnum.getLevelCode(parentMember.getLevel());
        if (Integer.parseInt(dic.getValue()) >= levelCode) {
            parentMember.setLevel(dic.getCode());
        }
        memberMapper.updateById(parentMember);
    }
    /**
     * 测试转账