xiaoyong931011
2023-05-19 83f2d67e5085b052fa6e2e4b0f29a1cbc0a638f7
src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java
@@ -13,10 +13,12 @@
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.NodeCodeEnum;
import cc.mrbird.febs.dapp.mapper.*;
import cc.mrbird.febs.dapp.service.DappWalletService;
import cc.mrbird.febs.dapp.utils.BoxUtil;
import cc.mrbird.febs.dapp.vo.ActiveNftListVo;
import cc.mrbird.febs.dapp.vo.DappMemberNodeVo;
import cc.mrbird.febs.dapp.vo.WalletInfoVo;
import cc.mrbird.febs.rabbit.producer.ChainProducer;
import cn.hutool.core.collection.CollUtil;
@@ -63,6 +65,9 @@
    private final DappSystemDao dappSystemDao;
    private final DappSystemProfitDao dappSystemProfitDao;
    private final DappNodeOrderMapper dappNodeOrderMapper;
    private final DappMemberNodeMapper dappMemberNodeMapper;
    @Override
    public WalletInfoVo walletInfo() {
        DappMemberEntity member = LoginUserUtil.getAppUser();
@@ -82,6 +87,25 @@
        walletInfo.setProfit(dappFundFlowDao.selectProfitAmountByMemberId(member.getId()));
        walletInfo.setTfcBalance(walletMine.getAvailableAmount());
        walletInfo.setSafePool(mineData.getSafePool());
        walletInfo.setAccountType(memberInfo.getAccountType());
        DappSystemProfit dappSystemProfit = dappSystemProfitDao.selectByMemberIdAndState(memberInfo.getId(),DappSystemProfit.STATE_IN);
        walletInfo.setSystemProfitId(ObjectUtil.isEmpty(dappSystemProfit) ? 0L : dappSystemProfit.getId());
        BigDecimal directProfit = dappFundFlowDao.selectSumAmountByMemberIdAndTypeAndStatus(memberInfo.getId(),3,2);
        walletInfo.setDirectProfit(directProfit);
        BigDecimal levelProfit = dappFundFlowDao.selectSumAmountByMemberIdAndTypeAndStatus(memberInfo.getId(),4,2);
        walletInfo.setLevelProfit(levelProfit);
        BigDecimal luckyProfit = dappFundFlowDao.selectSumAmountByMemberIdAndTypeAndStatus(memberInfo.getId(),7,2);
        walletInfo.setLuckyProfit(luckyProfit);
        if(DataDictionaryEnum.BIG_BOSS.getCode().equals(memberInfo.getAccountType())){
            walletInfo.setRunPercent(new BigDecimal(100));
        }else{
            walletInfo.setRunPercent(new BigDecimal(90));
        }
        //获取会员节点信息
        List<DappMemberNodeVo> dappMemberNodeVos = dappMemberNodeMapper.selectListByMemberId(member.getId());
        walletInfo.setDappMemberNodeVos(dappMemberNodeVos);
        return walletInfo;
    }
@@ -145,7 +169,9 @@
                throw new FebsException("Do not repeat purchase");
            }
        }
        /**
         * buyType=1,余额购买
         */
        if (transferDto.getBuyType() == 1) {
            DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(member.getId());
            if (transferDto.getAmount().compareTo(walletCoin.getAvailableAmount()) > 0) {
@@ -157,56 +183,149 @@
            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 {
            /**
             * buyType=2,钱包购买
             */
            int type = 1;
            // 1-认购 2-充值tfc
            if (transferDto.getType() == 2) {
                type = 6;
            }
            /**
             * 第一次请求,生成一条资金流水ID,并且返回。
             */
            if (transferDto.getId() == null) {
                DappFundFlowEntity fundFlow = new DappFundFlowEntity(member.getId(), transferDto.getAmount(), type, 1, transferDto.getFee(), transferDto.getTxHash());
                /**
                 * 验证节点的价格是否和入参价格一致
                 */
                String nodeCode = transferDto.getNodeCode();
                DappNodeOrderEntity dappNodeOrderEntity = dappNodeOrderMapper.selectNodeOrderByNodeCodeForupdate(nodeCode);
                BigDecimal price = dappNodeOrderEntity.getPrice();
                BigDecimal amount = transferDto.getAmount();
                if(price.compareTo(amount) != 0){
                    throw new FebsException("刷新后重试");
//                    throw new FebsException("Refresh and try again");
                }
                Integer surplusCnt = dappNodeOrderEntity.getSurplusCnt();
                if(0 >= surplusCnt){
                    throw new FebsException("该节点剩余数量为0。");
                }
                /**
                 * 超级节点只允许购买一次
                 */
                if(NodeCodeEnum.SUPER_NODE.getCode().equals(nodeCode)){
                    DappMemberNodeEntity superNode = dappMemberNodeMapper.selectNodeByMemberIdAndNodeCode(
                            member.getId(), NodeCodeEnum.SUPER_NODE.getCode());
                    if(ObjectUtil.isNotEmpty(superNode)){
                        throw new FebsException("超级节点只能购买一次");
                    }
                }
                DappFundFlowEntity fundFlowOld = dappFundFlowDao.selectBymemberIdAndType(member.getId(),type,DappFundFlowEntity.WITHDRAW_STATUS_ING);
                if(ObjectUtil.isNotEmpty(fundFlowOld)){
                    //网络问题导致第二次提交前,未成功就关闭了页面
                    if (fundFlowOld.getStatus() == 1 && StrUtil.isEmpty(fundFlowOld.getFromHash())) {
                        dappFundFlowDao.deleteById(fundFlowOld.getId());
                        throw new FebsException("Refresh and try again");
                    }
                }
                DappFundFlowEntity fundFlow = new DappFundFlowEntity(member.getId(), transferDto.getAmount(), type, 1, transferDto.getFee(), transferDto.getTxHash(),transferDto.getNodeCode());
                dappFundFlowDao.insert(fundFlow);
                return fundFlow.getId();
            }
            if ("success".equals(transferDto.getFlag())) {
                //插入一条会员入列记录,即加入动能队列
                DappSystemProfit dappSystemProfit = new DappSystemProfit(member.getId(), transferDto.getAmount());
                dappSystemProfitDao.insert(dappSystemProfit);
                //升级成为Agent
                dappMemberDao.updateMemberAccountType(DataDictionaryEnum.AGENT.getCode(),member.getId());
                DappFundFlowEntity flow = dappFundFlowDao.selectById(transferDto.getId());
                if(DappFundFlowEntity.WITHDRAW_STATUS_AGREE == flow.getStatus()){
                    throw new FebsException("请勿重复提交");
//                    throw new FebsException("Do not repeat purchase");
                }
                /**
                 * 生成会员节点表记录
                 */
                String nodeCode = transferDto.getNodeCode();
                DappNodeOrderEntity dappNodeOrderEntity = dappNodeOrderMapper.selectNodeOrderByNodeCodeForupdate(nodeCode);
                DappMemberNodeEntity dappMemberNodeEntityNew = new DappMemberNodeEntity(
                        member.getId(),
                        dappNodeOrderEntity.getId(),
                        dappNodeOrderEntity.getNodeCode(),
                        transferDto.getAmount()
                );
                dappMemberNodeMapper.insert(dappMemberNodeEntityNew);
                Integer surplusCnt = dappNodeOrderEntity.getSurplusCnt();
                surplusCnt = surplusCnt - 1;
                dappNodeOrderEntity.setSurplusCnt(surplusCnt);
                dappNodeOrderMapper.updateById(dappNodeOrderEntity);
                /**
                 * 流水关联用户购买节点记录
                 */
                flow.setSystemProfitId(dappMemberNodeEntityNew.getId());
                /**
                 * 链上转账的hash值
                 */
                flow.setFromHash(transferDto.getTxHash());
                flow.setSystemProfitId(dappSystemProfit.getId());
                flow.setStatus(DappFundFlowEntity.WITHDRAW_STATUS_AGREE);
                dappFundFlowDao.updateById(flow);
                //直接拿走0.05个BNB放入技术方
                DataDictionaryCustom systemProfit = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.SYSTEM_PROFIT.getType(), DataDictionaryEnum.SYSTEM_PROFIT.getCode());
                String systemProfitStr = StrUtil.isEmpty(systemProfit.getValue()) ? "0.05" : systemProfit.getValue();
                DappFundFlowEntity systemProfitFlow = new DappFundFlowEntity(member.getId(), new BigDecimal(systemProfitStr), 2, 1, BigDecimal.ZERO, transferDto.getTxHash(),dappSystemProfit.getId());
                dappFundFlowDao.insert(systemProfitFlow);
                //发送转币消息
                chainProducer.sendBnbTransferMsg(systemProfitFlow.getId());
                //直接返利30%给直接上级
                /**
                 * 升级账号类型为对应的节点名称
                 */
//                dappMemberDao.updateMemberAccountType(dappNodeOrderEntity.getNodeName(),member.getId());
                /**
                 * 更新账号的状态为已激活-即已经购买节点
                 */
//                dappMemberDao.updateMemberActiveStatus(1,member.getId());
                /**
                 * 直推奖励
                 */
                DappMemberEntity dappMemberEntity = dappMemberDao.selectById(member.getId());
                String refererId = dappMemberEntity.getRefererId();
                DappMemberEntity refererMember = dappMemberDao.selectMemberInfoByInviteId(refererId);
                DataDictionaryCustom directProfitSet = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.DIRECT_PROFIT.getType(), DataDictionaryEnum.DIRECT_PROFIT.getCode());
                BigDecimal directProfitStr = new BigDecimal(StrUtil.isEmpty(directProfitSet.getValue()) ? "0.3" : directProfitSet.getValue());
                BigDecimal directProfit = (transferDto.getAmount().subtract(new BigDecimal(systemProfitStr))).multiply(directProfitStr).setScale(BigDecimal.ROUND_DOWN, 2);
                DappFundFlowEntity fundFlow = new DappFundFlowEntity(refererMember.getId(), directProfit, 3, 1, BigDecimal.ZERO, transferDto.getTxHash(),dappSystemProfit.getId());
                DataDictionaryCustom directProfitDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                        DataDictionaryEnum.DIRECT_PROFIT.getType(),
                        DataDictionaryEnum.DIRECT_PROFIT.getCode());
                BigDecimal directProfitPercent = new BigDecimal(StrUtil.isEmpty(directProfitDic.getValue()) ? "0.1" : directProfitDic.getValue());
                BigDecimal amount = transferDto.getAmount();
                BigDecimal directProfit = amount.multiply(directProfitPercent).setScale(6,BigDecimal.ROUND_DOWN);
                //生成直推奖励的流水
                DappFundFlowEntity fundFlow = new DappFundFlowEntity(
                        refererMember.getId(),
                        directProfit,
                        3,
                        1,
                        BigDecimal.ZERO,
                        null,
                        dappMemberNodeEntityNew.getId());
                dappFundFlowDao.insert(fundFlow);
                //发送转币消息
                /**
                 * 发送转币消息
                 */
                chainProducer.sendBnbTransferMsg(fundFlow.getId());
                //层级奖励30%
                chainProducer.sendLevelProfitMsg(dappSystemProfit.getId());
                //发送一个消息,计算当前是否有人可以出局
                chainProducer.sendMemberOutMsg(dappSystemProfit.getId());
                BigDecimal subtract = amount.subtract(directProfit);
                //生成直推奖励的流水
                DappFundFlowEntity fundFlowEntityProject = new DappFundFlowEntity(
                        refererMember.getId(),
                        directProfit,
                        4,
                        1,
                        BigDecimal.ZERO,
                        null,
                        dappMemberNodeEntityNew.getId());
                dappFundFlowDao.insert(fundFlowEntityProject);
                /**
                 * 发送转币消息
                 */
                chainProducer.sendBnbTransferMsg(fundFlowEntityProject.getId());
            } else {
                DappFundFlowEntity flow = dappFundFlowDao.selectById(transferDto.getId());
                if (flow.getStatus() == 1) {
@@ -387,6 +506,11 @@
            throw new FebsException("功能升级中");
        }
        if ("success".equals(transferDto.getFlag())) {
            //是否已经加入动能
            DappSystemProfit dappSystemProfitIng = dappSystemProfitDao.selectByMemberIdAndState(member.getId(), DappSystemProfit.STATE_IN);
            if(ObjectUtil.isNotEmpty(dappSystemProfitIng)){
                return;
            }
            //插入一条会员入列记录,即加入动能队列
            DappSystemProfit dappSystemProfit = new DappSystemProfit(member.getId(), transferDto.getAmount());
            dappSystemProfitDao.insert(dappSystemProfit);
@@ -399,7 +523,7 @@
            //直接拿走0.05个BNB放入技术方
            DataDictionaryCustom systemProfit = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.SYSTEM_PROFIT.getType(), DataDictionaryEnum.SYSTEM_PROFIT.getCode());
            String systemProfitStr = StrUtil.isEmpty(systemProfit.getValue()) ? "0.05" : systemProfit.getValue();
            DappFundFlowEntity systemProfitFlow = new DappFundFlowEntity(member.getId(), new BigDecimal(systemProfitStr), 2, 1, BigDecimal.ZERO, transferDto.getTxHash(),dappSystemProfit.getId());
            DappFundFlowEntity systemProfitFlow = new DappFundFlowEntity(1L, new BigDecimal(systemProfitStr), 2, 1, BigDecimal.ZERO, null,dappSystemProfit.getId());
            dappFundFlowDao.insert(systemProfitFlow);
            //发送转币消息
            chainProducer.sendBnbTransferMsg(systemProfitFlow.getId());
@@ -410,9 +534,9 @@
            DataDictionaryCustom directProfitSet = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.DIRECT_PROFIT.getType(), DataDictionaryEnum.DIRECT_PROFIT.getCode());
            BigDecimal directProfitStr = new BigDecimal(StrUtil.isEmpty(directProfitSet.getValue()) ? "0.3" : directProfitSet.getValue());
            BigDecimal directProfit = (transferDto.getAmount().subtract(new BigDecimal(systemProfitStr))).multiply(directProfitStr).setScale(BigDecimal.ROUND_DOWN, 2);
            BigDecimal directProfit = (transferDto.getAmount().subtract(new BigDecimal(systemProfitStr))).multiply(directProfitStr).setScale(6,BigDecimal.ROUND_DOWN);
            DappFundFlowEntity fundFlow = new DappFundFlowEntity(refererMember.getId(), directProfit, 3, 1, BigDecimal.ZERO, transferDto.getTxHash(),dappSystemProfit.getId());
            DappFundFlowEntity fundFlow = new DappFundFlowEntity(refererMember.getId(), directProfit, 3, 1, BigDecimal.ZERO, null,dappSystemProfit.getId());
            dappFundFlowDao.insert(fundFlow);
            //发送转币消息
            chainProducer.sendBnbTransferMsg(fundFlow.getId());