fix
Helius
2022-09-04 08d5c76dc776c64efeb2a7d8fa33f90ee5132bfe
src/main/java/cc/mrbird/febs/dapp/service/impl/DappSystemServiceImpl.java
@@ -1,24 +1,33 @@
package cc.mrbird.febs.dapp.service.impl;
import cc.mrbird.febs.common.contants.AppContants;
import cc.mrbird.febs.common.utils.LoginUserUtil;
import cc.mrbird.febs.common.utils.RedisUtils;
import cc.mrbird.febs.dapp.entity.DappMineDataEntity;
import cc.mrbird.febs.dapp.entity.DappReturnRatioEntity;
import cc.mrbird.febs.dapp.mapper.DappReturnRatioDao;
import cc.mrbird.febs.dapp.mapper.DappSystemDao;
import cc.mrbird.febs.common.utils.SpringContextUtil;
import cc.mrbird.febs.dapp.chain.ChainEnum;
import cc.mrbird.febs.dapp.chain.ChainService;
import cc.mrbird.febs.dapp.dto.SystemDto;
import cc.mrbird.febs.dapp.entity.*;
import cc.mrbird.febs.dapp.mapper.*;
import cc.mrbird.febs.dapp.service.DappSystemService;
import cc.mrbird.febs.dapp.service.DappWalletService;
import cc.mrbird.febs.rabbit.producer.ChainProducer;
import cc.mrbird.febs.tree.MatrixTree;
import cc.mrbird.febs.tree.MemberNode;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.math.RoundingMode;
import java.util.*;
/**
 * @author wzy
 * @author
 * @date 2022-03-24
 **/
@Slf4j
@@ -27,37 +36,241 @@
public class DappSystemServiceImpl implements DappSystemService {
    private final DappSystemDao dappSystemDao;
    private final DappReturnRatioDao dappReturnRatioDao;
    private final RedisUtils redisUtils;
    private final DappFundFlowDao dappFundFlowDao;
    private final DappMemberDao dappMemberDao;
    private final DappAchieveTreeDao dappAchieveTreeDao;
    private final DappAchieveMemberTreeDao dappAchieveMemberTreeDao;
    private final DappWalletService dappWalletService;
    @Override
    public Map<String, Object> findTotalInComeAndList() {
        DappMineDataEntity dataMine = dappSystemDao.selectMineDataForOne();
    public SystemDto system() {
        DappMemberEntity member = LoginUserUtil.getAppUser();
        List<Map<String, Object>> incomeList = new ArrayList<>();
        for (int i = 0; i < 15; i++) {
            Map<String, Object> incomeItem = new HashMap<>();
            incomeItem.put("address", "TUy8XwDmdsDKPLDGUrGuNRVMhwSEKtkDcD");
            incomeItem.put("income", 0.313241234);
            incomeList.add(incomeItem);
        }
        Map<String, Object> result = new HashMap<>();
        result.put("mineData", dataMine);
        result.put("userIncome", incomeList);
        return result;
        SystemDto system = new SystemDto();
        system.setBuyAmount(new BigDecimal("100"));
        return system;
    }
    @Override
    public Map<String, Object> globalSetting() {
        BigDecimal newPrice = (BigDecimal) redisUtils.get(AppContants.REDIS_KEY_ETH_NEW_PRICE);
        Integer changeFee = (Integer) redisUtils.get(AppContants.REDIS_KEY_CHANGE_FEE);
    @Transactional(rollbackFor = Exception.class)
    public synchronized void achieveTree(Long memberId) {
        DappMemberEntity member = dappMemberDao.selectById(memberId);
        List<DappReturnRatioEntity> ratios = dappReturnRatioDao.selectList(null);
        Map<String, Object> result = new HashMap<>();
        result.put("newPrice", newPrice);
        result.put("changeFee", changeFee);
        result.put("ratio", ratios);
        return result;
        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
    public void putIntoProfit(Long memberId, int isReIn) {
        DappMemberEntity member = dappMemberDao.selectById(memberId);
        DappMemberEntity parent = dappMemberDao.selectMemberInfoByInviteId(member.getRefererId());
        if (parent != null) {
            BigDecimal directProfit = new BigDecimal("100").multiply(new BigDecimal("0.15"));
            dappWalletService.updateWalletCoinWithLock(directProfit, parent.getId(), 1);
            DappFundFlowEntity fundFlow = new DappFundFlowEntity(parent.getId(), directProfit, 3, 2, null, null);
            dappFundFlowDao.insert(fundFlow);
        }
        // 如果是复投的,则需奖励
        if (isReIn == 1) {
            List<DappMemberEntity> directCnt = dappMemberDao.selectChildMemberDirectOrNot(member.getInviteId(), 1, 1);
            boolean hasNewDirect = false;
            if (directCnt.size() < 3) {
                DappMemberEntity newestDirect = dappMemberDao.selectNewestDirectMember(member.getInviteId());
                DappFundFlowEntity fundFlow = dappFundFlowDao.selectNewestFundFlow(memberId, 9);
                if (newestDirect != null && fundFlow != null) {
                    if (newestDirect.getCreateTime().after(fundFlow.getCreateTime())) {
                        hasNewDirect = true;
                    }
                }
            }
            /**
             * 复投后,推一个拿一轮,推两个拿两轮,推三个后终身有效。
             * 按规则每轮未能提取的奖金分配:
             * 50%直接进入TFC底池
             * 20%给到推荐人
             * 30%留下待提。
             */
            if (directCnt.size() < 3 && member.getOutCnt() != 0 && member.getOutCnt() - 1 == directCnt.size() && !hasNewDirect) {
                BigDecimal amount = new BigDecimal("190");
                BigDecimal sourcePool = amount.multiply(new BigDecimal("0.5"));
                BigDecimal directAmount = amount.multiply(new BigDecimal("0.2"));
                BigDecimal remain = amount.subtract(sourcePool).subtract(directAmount);
//                ChainService.getInstance(ChainEnum.BSC_USDT.name()).transfer("", sourcePool);
                if (parent != null) {
                    dappWalletService.updateWalletCoinWithLock(directAmount, parent.getId(), 1);
                    DappFundFlowEntity direct = new DappFundFlowEntity(parent.getId(), directAmount, 3, 2, null, null);
                    dappFundFlowDao.insert(direct);
                }
                dappWalletService.addFrozenAmountWithLock(remain, memberId);
            } else {
                dappWalletService.releaseFrozenAmountWithLock(memberId);
                member.setOutCnt(member.getOutCnt() + 1);
                dappMemberDao.updateById(member);
                dappWalletService.updateWalletCoinWithLock(new BigDecimal(190), member.getId(), 1);
                DappFundFlowEntity matrixProfitFlow = new DappFundFlowEntity(memberId, new BigDecimal("190"), 2, 2, null, null);
                dappFundFlowDao.insert(matrixProfitFlow);
            }
            DappFundFlowEntity rePutInFlow = new DappFundFlowEntity(memberId, new BigDecimal("100").negate(), 1, 2, null, null);
            dappFundFlowDao.insert(rePutInFlow);
            DappFundFlowEntity safePoolFlow = new DappFundFlowEntity(memberId, new BigDecimal("10").negate(), 4, 2, null, null);
            dappFundFlowDao.insert(safePoolFlow);
            DappMineDataEntity mineData = dappSystemDao.selectMineDataForOne();
            mineData.setSafePool(mineData.getSafePool().add(BigDecimal.TEN));
            dappSystemDao.updateMineData(mineData);
        }
    }
    @Override
    public void tfcNewPrice(String data) {
        redisUtils.set(AppContants.REDIS_KEY_TFC_NEW_PRICE, new BigDecimal(data));
    }
    @Override
    public void resetMatrix() {
        DappAchieveTreeEntity node = dappAchieveTreeDao.selectNewestTreeNode();
        if (node.getValidState() == 2) {
            return;
        }
        long days = DateUtil.between(node.getCreateTime(), new Date(), DateUnit.DAY);
        if (days < 7) {
            return;
        }
        DappMineDataEntity mineDataEntity = dappSystemDao.selectMineDataForOne();
        List<DappAchieveTreeEntity> list = dappAchieveTreeDao.selectLastCountTreeNode(500);
        if (CollUtil.isNotEmpty(list)) {
            BigDecimal preAmount = mineDataEntity.getSafePool().divide(new BigDecimal(list.size()), 2, RoundingMode.HALF_UP);
            list.forEach(item -> {
                dappWalletService.updateWalletCoinWithLock(preAmount, item.getMidNode(), 1);
                DappFundFlowEntity flow = new DappFundFlowEntity(item.getMidNode(), preAmount, 8, 2, null, null);
                dappFundFlowDao.insert(flow);
            });
        }
        mineDataEntity.setSafePool(BigDecimal.ZERO);
        dappSystemDao.updateMineData(mineDataEntity);
        dappAchieveTreeDao.updateNodeValidState();
        dappAchieveMemberTreeDao.emptyTable();
        dappMemberDao.updateMemberActive();
    }
}