xiaoyong931011
2023-09-15 0537e73efb9aba020fdc8cb48708bb51b46aaf57
src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java
@@ -1,47 +1,28 @@
package cc.mrbird.febs.dapp.service.impl;
import cc.mrbird.febs.common.configure.i18n.MessageSourceUtils;
import cc.mrbird.febs.common.contants.AppContants;
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.FebsUtil;
import cc.mrbird.febs.common.utils.LoginUserUtil;
import cc.mrbird.febs.common.utils.RedisUtils;
import cc.mrbird.febs.dapp.chain.ChainEnum;
import cc.mrbird.febs.dapp.chain.ChainService;
import cc.mrbird.febs.dapp.chain.ContractChainService;
import cc.mrbird.febs.dapp.dto.*;
import cc.mrbird.febs.dapp.entity.*;
import cc.mrbird.febs.dapp.enumerate.*;
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.DappFundFlowVo;
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;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cc.mrbird.febs.dapp.vo.*;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import freemarker.template.utility.StringUtil;
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.math.RoundingMode;
import java.util.*;
/**
@@ -60,17 +41,10 @@
    private final DappAccountMoneyChangeDao dappAccountMoneyChangeDao;
    private final RedisUtils redisUtils;
    private final DataDictionaryCustomMapper dataDictionaryCustomMapper;
    private final DappNftActivationDao dappNftActivationDao;
    private final MemberCoinWithdrawDao memberCoinWithdrawDao;
    private final ChainProducer chainProducer;
    private final DappSystemDao dappSystemDao;
    private final DappSystemProfitDao dappSystemProfitDao;
    private final DappNodeOrderMapper dappNodeOrderMapper;
    private final DappMemberNodeMapper dappMemberNodeMapper;
    private final DappChargeUsdtMapper dappChargeUsdtMapper;
    private final DappUsdtPerkEntityMapper dappUsdtPerkEntityMapper;
    private final DappAKlineMapper dappAKlineMapper;
    @Override
    public List<DappFundFlowEntity> recordInPage(RecordInPageDto recordInPageDto) {
@@ -121,6 +95,10 @@
         * A币卖币规则,卖出100%销毁,30%回流底池溢价
         */
        DappMemberEntity member = LoginUserUtil.getAppUser();
        DappMemberEntity dappMemberEntity = dappMemberDao.selectById(member.getId());
        if(2 == dappMemberEntity.getChangeAble()){
            throw new FebsException("账号已冻结");
        }
        DataDictionaryCustom systemStateDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                PoolEnum.SYSTEM.getType(),
@@ -144,25 +122,49 @@
                DataDictionaryEnum.WITHDRAW_FEE.getCode()
        );
        BigDecimal withdrawFee = new BigDecimal(withdrawFeeDic.getValue());
        //最小提现金额
        DataDictionaryCustom minWithdrawDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                DataDictionaryEnum.MIN_WITHDRAW_AMOUNT.getType(),
                DataDictionaryEnum.MIN_WITHDRAW_AMOUNT.getCode()
        );
        BigDecimal minWithdraw = new BigDecimal(minWithdrawDic.getValue()).setScale(2,BigDecimal.ROUND_DOWN);
        if (minWithdraw.compareTo(withdrawDto.getAmount()) > 0) {
            throw new FebsException("最小提现金额为"+minWithdraw);
        }
        //今日最大提现金额
        DataDictionaryCustom maxWithdrawDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                DataDictionaryEnum.MAX_WITHDRAW_AMOUNT.getType(),
                DataDictionaryEnum.MAX_WITHDRAW_AMOUNT.getCode()
        );
        BigDecimal maxWithdraw = new BigDecimal(maxWithdrawDic.getValue()).setScale(2,BigDecimal.ROUND_DOWN);
        BigDecimal withdrawToday = dappFundFlowDao.selectSumAmountByMemberIdAndType(member.getId(), FundFlowEnum.WITHDRAW_USDT.getCode());
        withdrawToday = withdrawToday.add(withdrawDto.getAmount());
        if (maxWithdraw.compareTo(withdrawToday) < 0) {
            throw new FebsException("今日提现最多可申请"+maxWithdraw);
        }
        //手续费
        BigDecimal feeAmount = amount.multiply(withdrawFee);
        //减少余额
        this.updateWalletCoinWithLock(amount, member.getId(), 2);
        BigDecimal withdrawAmount = amount.divide(new BigDecimal(7),2,BigDecimal.ROUND_DOWN);
        BigDecimal withdrawAmountFee = feeAmount.divide(new BigDecimal(7),2,BigDecimal.ROUND_DOWN);
        //增加流水
        DappFundFlowEntity dappFundFlowEntity = new DappFundFlowEntity(
                AccountFlowEnum.AMOUNT.getCode(),
                member.getId(),
                amount.negate(),
                withdrawAmount.negate(),
                FundFlowEnum.WITHDRAW_USDT.getCode(),
                DappFundFlowEntity.WITHDRAW_STATUS_ING,
                feeAmount);
                withdrawAmountFee);
        dappFundFlowDao.insert(dappFundFlowEntity);
        //增加提现的记录
        MemberCoinWithdrawEntity memberCoinWithdraw = new MemberCoinWithdrawEntity();
        memberCoinWithdraw.setMemberId(member.getId());
        memberCoinWithdraw.setAddress(member.getAddress());
        memberCoinWithdraw.setAmount(amount.subtract(feeAmount));
        memberCoinWithdraw.setFeeAmount(feeAmount);
        memberCoinWithdraw.setAmount(withdrawAmount.subtract(withdrawAmountFee));
        memberCoinWithdraw.setFeeAmount(withdrawAmountFee);
        memberCoinWithdraw.setStatus(MemberCoinWithdrawEntity.STATUS_DOING);
        memberCoinWithdraw.setSymbol("USDT");
        memberCoinWithdraw.setFlowId(dappFundFlowEntity.getId());
@@ -447,6 +449,10 @@
        if ("upgrade".equals(upgrade)) {
            throw new FebsException("功能升级中");
        }
        BigDecimal amountIn = transferAusdDto.getAmount();
        if(BigDecimal.ZERO.compareTo(amountIn) >= 0){
            throw new FebsException("请输入正确的金额");
        }
        /**
         * 充值
@@ -470,7 +476,7 @@
            //生成一条进行中的入金资金流水记录
            DappFundFlowEntity fundFlow = new DappFundFlowEntity(
                    dappMemberEntity.getId(),
                    transferAusdDto.getAmount(),
                    transferAusdDto.getAmount().multiply(new BigDecimal(7)),
                    type,
                    1,
                    transferAusdDto.getFee(),
@@ -495,7 +501,7 @@
            /**
             * 增加用户的余额
             */
            dappWalletCoinDao.addTotalAndaddAvailableByMemberId(member.getId(),amount);
            dappWalletCoinDao.addTotalAndaddAvailableByMemberId(member.getId(),amount.multiply(new BigDecimal(7)));
            DappChargeUsdtEntity dappChargeUsdtEntity = new DappChargeUsdtEntity();
            dappChargeUsdtEntity.setMemberId(member.getId());
@@ -503,7 +509,7 @@
            dappChargeUsdtEntity.setMemberHash(transferAusdDto.getTxHash());
            dappChargeUsdtEntity.setStatus(2);
            dappChargeUsdtEntity.setTotalCnt(amount);
            dappChargeUsdtEntity.setRealCnt(amount);
            dappChargeUsdtEntity.setRealCnt(amount.multiply(new BigDecimal(7)));
            dappChargeUsdtMapper.insert(dappChargeUsdtEntity);
        } else {
            if (flow.getStatus() == 1) {
@@ -514,7 +520,7 @@
    }
    @Override
    public List<DappFundFlowVo> getRecordVoInPage(RecordInPageDto recordInPageDto) {
    public IPage<DappFundFlowVo> getRecordVoInPage(RecordInPageDto recordInPageDto) {
        Page<DappFundFlowVo> page = new Page<>(recordInPageDto.getPageNum(), recordInPageDto.getPageSize());
        DappMemberEntity member = LoginUserUtil.getAppUser();
@@ -525,7 +531,7 @@
        dappFundFlowEntity.setFlowType(recordInPageDto.getFlowType());
        dappFundFlowEntity.setMemberId(member.getId());
        IPage<DappFundFlowVo> records = dappFundFlowDao.selectVoInPage(page, dappFundFlowEntity);
        return records.getRecords();
        return records;
    }
    @Override
@@ -715,6 +721,55 @@
        memberCoinWithdrawEntity.setStatus(MemberCoinWithdrawEntity.STATUS_YES);
        memberCoinWithdrawEntity.setIsInside(MemberCoinWithdrawEntity.ISINSIDE_NO);
        memberCoinWithdrawDao.updateById(memberCoinWithdrawEntity);
        /**
         * 提现手续费10%进入资产管理池
         * USDT_ORDER_PERCENT
         */
        BigDecimal withdrawFee = dappFundFlowEntity.getFee();
        if(BigDecimal.ZERO.compareTo(withdrawFee) < 0){
            BigDecimal addPoor = withdrawFee.multiply(new BigDecimal(7));
            DataDictionaryCustom packageScorePriceDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                    DataDictionaryEnum.PACKAGE_SCORE_PRICE.getType(),
                    DataDictionaryEnum.PACKAGE_SCORE_PRICE.getCode()
            );
            DataDictionaryCustom packageTotalScoreDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                    DataDictionaryEnum.PACKAGE_TOTAL_SCORE.getType(),
                    DataDictionaryEnum.PACKAGE_TOTAL_SCORE.getCode()
            );
            BigDecimal packageTotalScore = new BigDecimal(ObjectUtil.isEmpty(packageTotalScoreDic) ? "21000" : packageTotalScoreDic.getValue()).setScale(2, BigDecimal.ROUND_DOWN);
            //更新USDT底池
            DataDictionaryCustom packagePoorDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                    DataDictionaryEnum.PACKAGE_POOR.getType(),
                    DataDictionaryEnum.PACKAGE_POOR.getCode()
            );
            BigDecimal packagePoor = new BigDecimal(ObjectUtil.isEmpty(packagePoorDic) ? "0" : packagePoorDic.getValue()).setScale(2, BigDecimal.ROUND_DOWN);
            BigDecimal avaPackagePoor = packagePoor.add(addPoor);
            packagePoorDic.setValue(avaPackagePoor.toString());
            dataDictionaryCustomMapper.updateById(packagePoorDic);
            //计算当前价格
            BigDecimal divide = avaPackagePoor.divide(packageTotalScore, 8, BigDecimal.ROUND_DOWN);
            packageScorePriceDic.setValue(divide.toString());
            dataDictionaryCustomMapper.updateById(packageScorePriceDic);
            DappFundFlowEntity packageFlow = new DappFundFlowEntity(
                    AccountFlowEnum.SYSTEM_PACKAGE.getCode(),
                    1L,
                    addPoor,
                    FundFlowEnum.SYSTEM_WITHDRAW_PACKAGE.getCode(),
                    2,
                    BigDecimal.ZERO,
                    null,
                    memberCoinWithdrawEntity.getId());
            dappFundFlowDao.insert(packageFlow);
            DappAKlineEntity dappAKlineEntity = new DappAKlineEntity();
            dappAKlineEntity.setOpenPrice(divide);
            dappAKlineEntity.setType(1);
            dappAKlineMapper.insert(dappAKlineEntity);
        }
        return new FebsResponse().success();
    }
@@ -741,12 +796,61 @@
        }
        dappFundFlowEntity.setStatus(DappFundFlowEntity.WITHDRAW_STATUS_DISAGREE);
        dappFundFlowDao.updateById(dappFundFlowEntity);
        DappFundFlowEntity dappFundFlowEntityIn = new DappFundFlowEntity(
                AccountFlowEnum.AMOUNT.getCode(),
                dappFundFlowEntity.getMemberId(),
                dappFundFlowEntity.getAmount().negate(),
                FundFlowEnum.WITHDRAW_USDT_NO.getCode(),
                DappFundFlowEntity.WITHDRAW_STATUS_AGREE,
                BigDecimal.ZERO);
        dappFundFlowDao.insert(dappFundFlowEntityIn);
        memberCoinWithdrawEntity.setStatus(MemberCoinWithdrawEntity.STATUS_NO);
        memberCoinWithdrawEntity.setIsInside(MemberCoinWithdrawEntity.ISINSIDE_NO);
        memberCoinWithdrawDao.updateById(memberCoinWithdrawEntity);
        //增加余额
        this.updateWalletCoinWithLock(dappFundFlowEntity.getAmount().negate(), dappMemberEntity.getId(), 1);
        BigDecimal negate = dappFundFlowEntity.getAmount().negate().multiply(new BigDecimal(7));
        this.updateWalletCoinWithLock(negate, dappMemberEntity.getId(), 1);
        return new FebsResponse().success();
    }
    @Override
    public FebsResponse getChangeInPageInPage(ChangeInPageDto changeInPageDto) {
        DappMemberEntity member = LoginUserUtil.getAppUser();
        Long memberId = member.getId();
        changeInPageDto.setMemberId(memberId);
        Page<DappAccountMoneyChangeEntity> page = new Page<>(changeInPageDto.getPageNum(), changeInPageDto.getPageSize());
        IPage<DappAccountMoneyChangeEntity> memberMoneyFlowVos = dappAccountMoneyChangeDao.getChangeInPageInPage(page,changeInPageDto);
        return new FebsResponse().success().data(memberMoneyFlowVos);
    }
    @Override
    public FebsResponse changeInToday() {
        DappMemberEntity member = LoginUserUtil.getAppUser();
        Long memberId = member.getId();
        DappAccountMoneyChangeEntity dappAccountMoneyChangeEntity = dappAccountMoneyChangeDao.selectNewOneByMemberId(memberId);
        return new FebsResponse().success().data(dappAccountMoneyChangeEntity);
    }
    @Override
    public CashOutSettingVo cashOutSetting() {
        CashOutSettingVo cashOutSettingVo = new CashOutSettingVo();
        //最小提现金额
        DataDictionaryCustom minWithdrawDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                DataDictionaryEnum.MIN_WITHDRAW_AMOUNT.getType(),
                DataDictionaryEnum.MIN_WITHDRAW_AMOUNT.getCode()
        );
        BigDecimal minWithdraw = new BigDecimal(minWithdrawDic.getValue()).setScale(2,BigDecimal.ROUND_DOWN);
        cashOutSettingVo.setMinWithdraw(minWithdraw);
        //今日最大提现金额
        DataDictionaryCustom maxWithdrawDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                DataDictionaryEnum.MAX_WITHDRAW_AMOUNT.getType(),
                DataDictionaryEnum.MAX_WITHDRAW_AMOUNT.getCode()
        );
        BigDecimal maxWithdraw = new BigDecimal(maxWithdrawDic.getValue()).setScale(2,BigDecimal.ROUND_DOWN);
        cashOutSettingVo.setMaxWithdraw(maxWithdraw);
        return cashOutSettingVo;
    }
}