KKSU
2024-06-13 0e11b3498fa678f346815c76ff580e246d64ab26
src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java
@@ -1,5 +1,6 @@
package cc.mrbird.febs.dapp.service.impl;
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.common.entity.QueryRequest;
import cc.mrbird.febs.common.exception.FebsException;
import cc.mrbird.febs.common.utils.LoginUserUtil;
@@ -9,12 +10,17 @@
import cc.mrbird.febs.dapp.dto.*;
import cc.mrbird.febs.dapp.entity.*;
import cc.mrbird.febs.dapp.enumerate.DataDictionaryEnum;
import cc.mrbird.febs.dapp.enumerate.NodeType;
import cc.mrbird.febs.dapp.mapper.*;
import cc.mrbird.febs.dapp.service.DappWalletService;
import cc.mrbird.febs.dapp.vo.MemberNodeVo;
import cc.mrbird.febs.dapp.vo.NodeTypeVo;
import cc.mrbird.febs.dapp.vo.WalletInfoVo;
import cc.mrbird.febs.rabbit.producer.ChainProducer;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
@@ -24,6 +30,7 @@
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
/**
@@ -47,6 +54,7 @@
    private final ChainProducer chainProducer;
    private final DappSystemDao dappSystemDao;
    private final DbMemberNodeMapper dbMemberNodeMapper;
    @Override
    public WalletInfoVo walletInfo() {
@@ -60,7 +68,8 @@
        DappMineDataEntity mineData = dappSystemDao.selectMineDataForOne();
        walletInfo.setDirectCnt(direct.size());
        walletInfo.setInviteId(member.getActiveStatus() == 1 ? member.getInviteId() : "-");
//        walletInfo.setInviteId(member.getActiveStatus() == 1 ? member.getInviteId() : "-");
        walletInfo.setInviteId(member.getInviteId());
        walletInfo.setBalance(walletCoin.getAvailableAmount());
        walletInfo.setHasBuy(memberInfo.getActiveStatus());
        walletInfo.setOutCnt(memberInfo.getOutCnt());
@@ -74,7 +83,17 @@
        );
        BigDecimal buyNodeAmount = new BigDecimal(StrUtil.isEmpty(buyNodeAmountDic.getValue()) ? "100" : buyNodeAmountDic.getValue());
        walletInfo.setBuyNodeAmount(buyNodeAmount);
        DataDictionaryCustom buyNodeCodeCntDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                DataDictionaryEnum.BUY_NODE_CNT.getType(),
                DataDictionaryEnum.BUY_NODE_CNT.getCode()
        );
        BigDecimal buyNodeCodeCnt = new BigDecimal(StrUtil.isEmpty(buyNodeCodeCntDic.getValue()) ? "3" : buyNodeCodeCntDic.getValue());
        walletInfo.setBuyNodeCnt(buyNodeCodeCnt);
        walletInfo.setBuyNode(ObjectUtil.isEmpty(memberInfo.getBuyNode()) ? 0 : memberInfo.getBuyNode());
        BigDecimal bigDecimal = dappFundFlowDao.selectSumAmountByMemberIdAndType(member.getId(), 14);
        walletInfo.setBuyNodePerk(bigDecimal);
        return walletInfo;
    }
@@ -145,7 +164,7 @@
            DappFundFlowEntity fundFlow = new DappFundFlowEntity(member.getId(), transferDto.getAmount().negate(), 1, 2, transferDto.getFee(), transferDto.getTxHash());
            dappFundFlowDao.insert(fundFlow);
            chainProducer.sendAchieveTreeMsg(member.getId());
//            chainProducer.sendAchieveTreeMsg(member.getId());
        } else {
            int type = 1;
            // 1-认购 2-充值tfc
@@ -343,8 +362,13 @@
        }
        member = dappMemberDao.selectById(member.getId());
        int buyNode = ObjectUtil.isEmpty(member.getBuyNode()) ? 0 : 1;
        if (1 == buyNode) {
//        int buyNode = ObjectUtil.isEmpty(member.getBuyNode()) ? 0 : 1;
        int buyNode = member.getBuyNode();
        DataDictionaryCustom buyNodeCodeCntDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                DataDictionaryEnum.BUY_NODE_CNT.getType(),
                DataDictionaryEnum.BUY_NODE_CNT.getCode()
        );
        if (buyNode >= Integer.parseInt(buyNodeCodeCntDic.getValue())) {
            throw new FebsException("Do not repeat purchase");
        }
@@ -364,11 +388,8 @@
                return null;
            }
            if ("success".equals(transferDto.getFlag())) {
                flow.setStatus(2);
                flow.setFromHash(transferDto.getTxHash());
                dappFundFlowDao.updateById(flow);
                member.setBuyNode(1);
                dappMemberDao.updateById(member);
            } else {
                if (flow.getStatus() == 1) {
@@ -378,4 +399,140 @@
        }
        return null;
    }
    @Override
    public Long buyStar(BuyStarDto buyStarDto) {
        DappMemberEntity member = LoginUserUtil.getAppUser();
        String upgrade = redisUtils.getString("APP_UPGRADE");
        if ("upgrade".equals(upgrade)) {
            throw new FebsException("功能升级中");
        }
        /**
         * 买入先验证当前星团是否已经买入
         *      如果不是购买一星,则验证前一新团是否购买
         */
        if(ObjectUtil.isEmpty(buyStarDto.getNodeType())){
            throw new FebsException("选择购买的星团");
        }
        Integer nodeType = buyStarDto.getNodeType();
        if(NodeType.NODE_13.getNodeType() < nodeType || nodeType < NodeType.NODE_1.getNodeType()){
            throw new FebsException("选择购买的星团");
        }
        QueryWrapper<DbMemberNode> nodeQueryWrapper = new QueryWrapper<>();
        nodeQueryWrapper.eq("member_id",member.getId());
        nodeQueryWrapper.eq("type", nodeType);
        nodeQueryWrapper.eq("work_state", DbMemberNode.STATE_ONE);
        List<DbMemberNode> dbMemberNodes = dbMemberNodeMapper.selectList(nodeQueryWrapper);
        if(CollUtil.isNotEmpty(dbMemberNodes)){
            throw new FebsException("已购买");
        }
        if(NodeType.NODE_1.getNodeType() != buyStarDto.getNodeType()){
            Integer nextNodeType = nodeType - 1;
            QueryWrapper<DbMemberNode> nextWrapper = new QueryWrapper<>();
            nextWrapper.eq("member_id",member.getId());
            nextWrapper.eq("type", nextNodeType);
            nextWrapper.eq("work_state", DbMemberNode.STATE_ONE);
            List<DbMemberNode> nextNode = dbMemberNodeMapper.selectList(nextWrapper);
            if(CollUtil.isEmpty(nextNode)){
                throw new FebsException("请先购买上一星团");
            }
        }
        if (ObjectUtil.isEmpty(buyStarDto.getId())) {//第一次
            DappFundFlowEntity fundFlow = new DappFundFlowEntity(
                    member.getId(),
                    buyStarDto.getAmount().negate(),
                    18,
                    1,
                    BigDecimal.ZERO,
                    buyStarDto.getTxHash());
            dappFundFlowDao.insert(fundFlow);
            return fundFlow.getId();
        } else {//第二次
            DappFundFlowEntity flow = dappFundFlowDao.selectById(buyStarDto.getId());
            if(ObjectUtil.isEmpty(flow)){
                return null;
            }
            if ("success".equals(buyStarDto.getFlag())) {
                flow.setFromHash(buyStarDto.getTxHash());
                flow.setToHash(buyStarDto.getNodeType().toString());
                dappFundFlowDao.updateById(flow);
            } else {
                if (flow.getStatus() == 1) {
                    dappFundFlowDao.deleteById(buyStarDto.getId());
                }
            }
        }
        return null;
    }
    @Override
    public FebsResponse nodeList() {
        List<NodeType> nodeList = NodeType.NODE_1.getNodeList();
        List<NodeTypeVo> objects = new ArrayList<>();
        if(CollUtil.isNotEmpty(nodeList)){
            for(NodeType nodeType : nodeList){
                NodeTypeVo nodeTypeVo = new NodeTypeVo();
                nodeTypeVo.setNodeType(nodeType.getNodeType());
                nodeTypeVo.setNodeAmount(nodeType.getNodeAmount());
                nodeTypeVo.setNodePerk(nodeType.getNodePerk());
                objects.add(nodeTypeVo);
            }
        }
        return new FebsResponse().success().data(objects);
    }
    @Override
    public MemberNodeVo memberNode(MemberNodeDto memberNodeDto) {
        DappMemberEntity member = LoginUserUtil.getAppUser();
        Integer type = memberNodeDto.getType();
        QueryWrapper<DbMemberNode> objectQueryWrapper = new QueryWrapper<>();
        objectQueryWrapper.eq("member_id",member.getId());
        objectQueryWrapper.eq("type", type);
        objectQueryWrapper.eq("work_state", DbMemberNode.STATE_ONE);
        DbMemberNode dbMemberNode = dbMemberNodeMapper.selectOne(objectQueryWrapper);
        if(ObjectUtil.isEmpty(dbMemberNode)){
            return null;
        }
        return buildTeamMatrix(dbMemberNode);
    }
    public MemberNodeVo buildTeamMatrix(DbMemberNode dbMemberNode) {
        Long id = dbMemberNode.getId();
        MemberNodeVo memberNodeVo = new MemberNodeVo();
        memberNodeVo.setInviteId(getInviteId(id));
        memberNodeVo.setId(id);
        memberNodeVo.setParentNode(ObjectUtil.isEmpty(dbMemberNode.getParentNode()) ? 0L : dbMemberNode.getParentNode());
        memberNodeVo.setLeftNode(ObjectUtil.isEmpty(dbMemberNode.getLeftNode()) ? 0L : dbMemberNode.getLeftNode());
        memberNodeVo.setRightNode(ObjectUtil.isEmpty(dbMemberNode.getRightNode()) ? 0L : dbMemberNode.getRightNode());
        memberNodeVo.setLeftRight(ObjectUtil.isEmpty(dbMemberNode.getLeftRight()) ? 0 : dbMemberNode.getLeftRight());
        QueryWrapper<DbMemberNode> childQuery = new QueryWrapper<>();
        childQuery.eq("parent_node",id);
        childQuery.eq("type", dbMemberNode.getType());
        childQuery.eq("work_state", DbMemberNode.STATE_ONE);
        List<DbMemberNode> childrenNode = dbMemberNodeMapper.selectList(childQuery);
        if(CollUtil.isEmpty(childrenNode)){
            return memberNodeVo;
        }
        List<MemberNodeVo> list = new ArrayList<>();
        for (DbMemberNode childNode : childrenNode) {
            list.add(buildTeamMatrix(childNode));
        }
        memberNodeVo.setChildren(list);
        return memberNodeVo;
    }
    public String getInviteId(Long memberNodeId){
        DbMemberNode dbMemberNode = dbMemberNodeMapper.selectById(memberNodeId);
        Long memberId = dbMemberNode.getMemberId();
        DappMemberEntity dappMemberEntity = dappMemberDao.selectById(memberId);
        return dappMemberEntity.getInviteId();
    }
}