KKSU
2024-05-07 8ce06347909eaa44482b86a7ec1652aa16d793e1
src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java
@@ -1,23 +1,23 @@
package cc.mrbird.febs.dapp.service.impl;
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.enumerates.DataDicEnum;
import cc.mrbird.febs.common.enumerates.FlowTypeEnum;
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.PriceDto;
import cc.mrbird.febs.dapp.dto.RecordInPageDto;
import cc.mrbird.febs.dapp.dto.TransferDto;
import cc.mrbird.febs.dapp.dto.WalletOperateDto;
import cc.mrbird.febs.dapp.dto.*;
import cc.mrbird.febs.dapp.entity.*;
import cc.mrbird.febs.dapp.mapper.*;
import cc.mrbird.febs.dapp.service.AsyncCjService;
import cc.mrbird.febs.dapp.service.DappWalletService;
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 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;
@@ -26,10 +26,7 @@
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
/**
 * @author
@@ -47,23 +44,88 @@
    private final DappAccountMoneyChangeDao dappAccountMoneyChangeDao;
    private final RedisUtils redisUtils;
    private final DataDictionaryCustomMapper dataDictionaryCustomMapper;
    private final DappAchieveMapper dappAchieveMapper;
    private final DappAchieveItemMapper dappAchieveItemMapper;
    private final ChainProducer chainProducer;
    private final AsyncCjService asyncCjService;
    private final DappMemberFundMapper dappMemberFundMapper;
    @Override
    public WalletInfoVo walletInfo() {
        DappMemberEntity member = LoginUserUtil.getAppUser();
        Map<String, BigDecimal> map = dappFundFlowDao.selectAmountTotalByType(member.getId());
        Long memberId = LoginUserUtil.getAppUser().getId();
        DappMemberEntity member = dappMemberDao.selectById(memberId);
        WalletInfoVo walletInfo = new WalletInfoVo();
        List<DappMemberEntity> direct = dappMemberDao.selectChildMemberDirectOrNot(member.getInviteId(), 1);
        List<DappMemberEntity> notDirect = dappMemberDao.selectChildMemberDirectOrNot(member.getInviteId(), 2);
        BigDecimal childHoldAmount = dappMemberDao.selectChildHoldAmount(member.getInviteId());
        walletInfo.setTotalChild(notDirect.size());
        walletInfo.setDirectCnt(direct.size());
        walletInfo.setTotalChildCoin(childHoldAmount);
        walletInfo.setTeamReward(map.get("teamReward"));
        walletInfo.setMiningAmount(map.get("mine"));
        walletInfo.setInviteId(member.getInviteId());
        walletInfo.setBalance(member.getBalance());
        walletInfo.setUsdtBalance(member.getUsdtBalance());
        String zyOpen = redisUtils.getString(DataDicEnum.SYSTEM_START_FLAG.getValue());
        walletInfo.setZyOpen(zyOpen.equals("start") ? 1 : 0);
        BigDecimal minAmount = new BigDecimal(redisUtils.getString(DataDicEnum.GFA_BUY_MIN_AMOUNT.getValue())).setScale(2,BigDecimal.ROUND_DOWN);
        walletInfo.setZyMin(minAmount);
        BigDecimal maxAmount = new BigDecimal(redisUtils.getString(DataDicEnum.GFA_BUY_MAX_AMOUNT.getValue())).setScale(2,BigDecimal.ROUND_DOWN);
        walletInfo.setZyMax(maxAmount);
        BigDecimal tzCoin = dappFundFlowDao.selectAmountTotalByTypeAndMemberIdAndDate(member.getId(), FlowTypeEnum.TUAN_DUI.getValue(),null);
        walletInfo.setTzCoin(tzCoin);
        BigDecimal hdCoinGeren = dappFundFlowDao.selectAmountTotalByTypeAndMemberIdAndDate(member.getId(), FlowTypeEnum.HUA_DIAN_GEREN.getValue(),null);
        BigDecimal hdCoinTuandui = dappFundFlowDao.selectAmountTotalByTypeAndMemberIdAndDate(member.getId(), FlowTypeEnum.HUA_DIAN_TUANDUI_DAIBI.getValue(),null);
        BigDecimal hdCoinTuanduiUSDT = dappFundFlowDao.selectAmountTotalByTypeAndMemberIdAndDate(member.getId(), FlowTypeEnum.HUA_DIAN_TUANDUI_USDT.getValue(),null);
        walletInfo.setHdCoin(hdCoinGeren.add(hdCoinTuandui).add(hdCoinTuanduiUSDT));
        BigDecimal zyTotal = dappFundFlowDao.selectAmountTotalByTypeAndMemberIdAndDate(member.getId(), FlowTypeEnum.ZHI_YA.getValue(),null).negate();
        walletInfo.setZyTotal(zyTotal);
        BigDecimal zyToday = dappFundFlowDao.selectAmountTotalByTypeAndMemberIdAndDate(member.getId(), FlowTypeEnum.ZHI_YA.getValue(), new Date()).negate();
        walletInfo.setZyToday(zyToday);
        QueryWrapper<DappMemberFund> fundQueryWrapper = new QueryWrapper<>();
        fundQueryWrapper.eq("member_id",memberId);
        List<DappMemberFund> ccTodays = dappMemberFundMapper.selectList(fundQueryWrapper);
        BigDecimal ccToday = BigDecimal.ZERO;
        if(CollUtil.isNotEmpty(ccTodays)){
            for(DappMemberFund dappMemberFund : ccTodays){
                BigDecimal usdtCoin = dappMemberFund.getUsdtCoin();
                BigDecimal coinTarget = dappMemberFund.getCoinTarget();
                BigDecimal add = coinTarget.add(usdtCoin);
                ccToday = ccToday.add(add);
            }
        }
        walletInfo.setCcToday(ccToday);
        List<DappMemberFund> dappMemberFunds = dappMemberFundMapper.selectList(null);
        walletInfo.setCcTotal(CollUtil.isEmpty(dappMemberFunds) ? BigDecimal.ZERO :
                dappMemberFunds.stream().map(DappMemberFund::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(8,BigDecimal.ROUND_DOWN));
        List<DappAchieve> dappAchieves = dappAchieveMapper.selectListByMemberId(memberId);
        BigDecimal goldAmountDone = dappAchieveMapper.selectGoldAmountByMemberId(memberId);
        BigDecimal coinAmountDone = dappAchieveMapper.selectCoinAmountByMemberId(memberId);
        if(CollUtil.isNotEmpty(dappAchieves)){
            BigDecimal goldAmount = dappAchieves.stream().map(DappAchieve::getGoldAmount).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(8,BigDecimal.ROUND_DOWN);
            BigDecimal coinAmount = dappAchieves.stream().map(DappAchieve::getCoinAmount).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(8,BigDecimal.ROUND_DOWN);
            BigDecimal goldAmountAva = goldAmount.subtract(goldAmountDone);//金本位剩余
            BigDecimal coinAmountAva = coinAmount.subtract(coinAmountDone);//币本位剩余
            if(goldAmountAva.compareTo(BigDecimal.ZERO) > 0){
                walletInfo.setGoldAmount(goldAmountAva);
            }else{
                walletInfo.setGoldAmount(BigDecimal.ZERO);
            }
            if(coinAmountAva.compareTo(BigDecimal.ZERO) > 0){
                walletInfo.setCoinAmount(coinAmountAva);
            }else{
                walletInfo.setCoinAmount(BigDecimal.ZERO);
            }
        }else{
            walletInfo.setGoldAmount(BigDecimal.ZERO);
            walletInfo.setCoinAmount(BigDecimal.ZERO);
        }
        BigDecimal gfaDays = new BigDecimal(redisUtils.getString(DataDicEnum.GFA_DAYS.getValue())).setScale(2,BigDecimal.ROUND_DOWN);
        walletInfo.setGfaDays(gfaDays);
        return walletInfo;
    }
@@ -79,7 +141,7 @@
            throw new FebsException("可用金额不足");
        }
        DappFundFlowEntity fund = new DappFundFlowEntity(member.getId(), walletOperateDto.getAmount(), AppContants.MONEY_TYPE_CHANGE, null, null);
        DappFundFlowEntity fund = new DappFundFlowEntity(member.getId(), walletOperateDto.getAmount(), AppContants.MONEY_TYPE_CHANGE, 2, (String) null);
        dappFundFlowDao.insert(fund);
        BigDecimal preEthAmount = walletMine.getAvailableAmount();
@@ -136,15 +198,30 @@
    @Override
    public List<DappFundFlowEntity> recordInPage(RecordInPageDto recordInPageDto) {
        Page<DappFundFlowEntity> page = new Page<>(recordInPageDto.getPageNum(), recordInPageDto.getPageSize());
        DappMemberEntity member = LoginUserUtil.getAppUser();
        Page<DappFundFlowEntity> page = new Page<>(recordInPageDto.getPageNum(), recordInPageDto.getPageSize());
        DappFundFlowEntity dappFundFlowEntity = new DappFundFlowEntity();
        if (recordInPageDto.getType() != null && recordInPageDto.getType() != 0) {
            dappFundFlowEntity.setType(recordInPageDto.getType());
            dappFundFlowEntity.setStatus(recordInPageDto.getType());
        }
        if (recordInPageDto.getState() != null && recordInPageDto.getState() != 0) {
            dappFundFlowEntity.setType(recordInPageDto.getState());
        }
        dappFundFlowEntity.setMemberId(member.getId());
        IPage<DappFundFlowEntity> records = dappFundFlowDao.selectInPage(page, dappFundFlowEntity);
        IPage<DappFundFlowEntity> records = dappFundFlowDao.selectInPages(page, dappFundFlowEntity);
        return records.getRecords();
    }
    @Override
    public List<DappAchieve> zyInPage(RecordInPageDto recordInPageDto) {
        DappMemberEntity member = LoginUserUtil.getAppUser();
        Page<DappAchieve> page = new Page<>(recordInPageDto.getPageNum(), recordInPageDto.getPageSize());
        DappAchieve dappAchieve = new DappAchieve();
        if (recordInPageDto.getType() != null && recordInPageDto.getType() != 0) {
            dappAchieve.setState(recordInPageDto.getType());
        }
        dappAchieve.setMemberId(member.getId());
        IPage<DappAchieve> records = dappFundFlowDao.selectZyInPage(page, dappAchieve);
        return records.getRecords();
    }
@@ -161,28 +238,20 @@
        if (fundFlow == null) {
            throw new FebsException("数据不存在");
        }
        DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(fundFlow.getMemberId());
        if (type == 1) {
            walletCoin.setFrozenAmount(walletCoin.getFrozenAmount().subtract(fundFlow.getAmount()));
            walletCoin.setTotalAmount(walletCoin.getTotalAmount().subtract(fundFlow.getAmount()));
            fundFlow.setStatus(DappFundFlowEntity.WITHDRAW_STATUS_AGREE);
            dappFundFlowDao.updateById(fundFlow);
        } else if (type == 2) {
            BigDecimal preAmount = walletCoin.getAvailableAmount();
            walletCoin.setFrozenAmount(walletCoin.getFrozenAmount().subtract(fundFlow.getAmount()));
            walletCoin.setAvailableAmount(walletCoin.getAvailableAmount().add(fundFlow.getAmount()));
            DappAccountMoneyChangeEntity accountMoneyChange = new DappAccountMoneyChangeEntity(walletCoin.getMemberId(), preAmount, fundFlow.getAmount(), walletCoin.getAvailableAmount(), "提现申请被驳回", 2);
            fundFlow.setStatus(DappFundFlowEntity.WITHDRAW_STATUS_DISAGREE);
            dappFundFlowDao.updateById(fundFlow);
            dappAccountMoneyChangeDao.insert(accountMoneyChange);
            DappMemberEntity dappMemberEntity = dappMemberDao.selectById(fundFlow.getMemberId());
            //流水记录的金额是一个负数
            dappMemberEntity.setUsdtBalance(dappMemberEntity.getUsdtBalance().subtract(fundFlow.getAmount()));
            dappMemberDao.updateUsdtBalanceWithVersion(dappMemberEntity);
        } else {
            throw new FebsException("参数错误");
        }
        dappWalletCoinDao.updateById(walletCoin);
        dappFundFlowDao.updateById(fundFlow);
    }
    @Override
@@ -204,89 +273,124 @@
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Long transfer(TransferDto transferDto) {
        DappMemberEntity member = LoginUserUtil.getAppUser();
//        QueryWrapper<DappFundFlowEntity> objectQueryWrapper = new QueryWrapper<>();
//        objectQueryWrapper.eq("type" ,FlowTypeEnum.ZHI_YA.getValue());
//        objectQueryWrapper.eq("status" ,DappFundFlowEntity.WITHDRAW_STATUS_AGREE);
//        objectQueryWrapper.eq("member_id" ,member.getId());
//        List<DappFundFlowEntity> dappFundFlowEntities = dappFundFlowDao.selectList(objectQueryWrapper);
        if (member.getActiveStatus() == 2) {
            throw new FebsException("请联系邀请人转币激活");
        List<DappFundFlowEntity> dappFundFlowEntities = dappFundFlowDao.selectAmountTotalByTypeAndMemberIdAndDateAndState(
                member.getId(),
                FlowTypeEnum.ZHI_YA.getValue(),
                DappFundFlowEntity.WITHDRAW_STATUS_AGREE,
                new Date());
        BigDecimal zhiyaAmount = new BigDecimal(redisUtils.getString(DataDicEnum.MEMBER_ZHIYA_AMOUNT.getValue()));
        Integer zhiyaTime = Integer.parseInt(redisUtils.getString(DataDicEnum.MEMBER_ZHIYA_TIME.getValue()));
        if(CollUtil.isNotEmpty(dappFundFlowEntities)){
            if(dappFundFlowEntities.size() >= zhiyaTime){
                throw new FebsException("今日暂停质押");
            }
            BigDecimal teamAchieveMemberSum = dappFundFlowEntities.stream().map(DappFundFlowEntity::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add).negate();
            if(zhiyaAmount.compareTo(teamAchieveMemberSum.add(transferDto.getAmount())) < 0){
                throw new FebsException("今日最多质押"+zhiyaAmount.subtract(teamAchieveMemberSum).setScale(4,BigDecimal.ROUND_DOWN));
            }
        }
        // 每日出U剩余量(卖币)
        BigDecimal usdtRemain = (BigDecimal) redisUtils.get(AppContants.REDIS_KEY_USDT_OUT_LIMIT_REMAIN);
        // 用户24小时可出售量
        BigDecimal saleCoinRemain = (BigDecimal) redisUtils.get(AppContants.REDIS_KEY_COIN_REMAIN + member.getAddress());
        BigDecimal buyCoinRemain = (BigDecimal) redisUtils.get(AppContants.REDIS_KEY_TRANSFER_POOL_VOL_REMAIN);
        // 铸池中的币的剩余量
        BigDecimal makeCoinRemain = (BigDecimal) redisUtils.get(AppContants.REDIS_KEY_MAKE_POOL_CNT);
        String hasStart = redisUtils.getString(AppContants.SYSTEM_START_FLAG);
        String hasStart = redisUtils.getString(DataDicEnum.SYSTEM_START_FLAG.getValue());
        BigDecimal minAmount = new BigDecimal(redisUtils.getString(DataDicEnum.GFA_BUY_MIN_AMOUNT.getValue()));
        BigDecimal maxAmount = new BigDecimal(redisUtils.getString(DataDicEnum.GFA_BUY_MAX_AMOUNT.getValue())).setScale(2,BigDecimal.ROUND_DOWN);
        BigDecimal gfaDays = new BigDecimal(redisUtils.getString(DataDicEnum.GFA_DAYS.getValue())).setScale(2,BigDecimal.ROUND_DOWN);
        minAmount = minAmount.divide(transferDto.getPrice(),2,BigDecimal.ROUND_DOWN);
        maxAmount = maxAmount.divide(transferDto.getPrice(),2,BigDecimal.ROUND_DOWN);;
        if (transferDto.getId() == null) {
            if (DappFundFlowEntity.TYPE_SALE == transferDto.getType()) {
                if (!"start".equals(hasStart)) {
                    throw new FebsException("系统还未启动");
                }
                if (transferDto.getAmount().multiply(transferDto.getPrice()).compareTo(usdtRemain) > 0) {
                    throw new FebsException("超过当日出U剩余量");
                }
                if (transferDto.getAmount().compareTo(saleCoinRemain) > 0) {
                    throw new FebsException("超出24小时内可售量");
                }
            } else if (DappFundFlowEntity.TYPE_BUY == transferDto.getType()) {
            if (DappFundFlowEntity.TYPE_BUY == transferDto.getType()) {
                //系统开始标识
                if ("start".equals(hasStart)) {
                    if (transferDto.getAmount().compareTo(buyCoinRemain) > 0) {
                        throw new FebsException("超过当日可购买量");
                    if (transferDto.getAmount().compareTo(maxAmount) > 0) {
                        throw new FebsException("超过购买限制");
                    }
                    // 如果系统还没有启动,则判断铸池中的剩余量
                    if (transferDto.getAmount().compareTo(minAmount) < 0) {
                        throw new FebsException("超过购买限制");
                    }
//                    if (BigDecimal.ZERO.compareTo(gfaDays) >= 0) {
//                        throw new FebsException("今日暂停质押");
//                    }
                    if (transferDto.getAmount().compareTo(zhiyaAmount) > 0) {
                        throw new FebsException("今日最多质押"+zhiyaAmount);
                    }
                } else {
                    DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(AppContants.DIC_TYPE_SYSTEM_SETTING, AppContants.DIC_VALUE_MAKER_MIN_LIMIT);
                    if (transferDto.getAmount().compareTo(new BigDecimal(dic.getValue())) < 0) {
                        throw new FebsException("未达到最低购买要求");
                    }
                    if (transferDto.getAmount().compareTo(makeCoinRemain) > 0) {
                        throw new FebsException("可购数量不足");
                    }
                    throw new FebsException("暂停质押");
                }
            }
            DappFundFlowEntity fundFlow = new DappFundFlowEntity(member.getId(), transferDto.getAmount(), transferDto.getType(), 1, transferDto.getFee(), transferDto.getTxHash());
            DappFundFlowEntity fundFlow = new DappFundFlowEntity(
                    member.getId(),
                    transferDto.getAmount().setScale(2,BigDecimal.ROUND_DOWN).negate(),
                    FlowTypeEnum.ZHI_YA.getValue(),
                    DappFundFlowEntity.WITHDRAW_STATUS_ING,
                    BigDecimal.ZERO,
                    transferDto.getTxHash());
            fundFlow.setNewestPrice(transferDto.getPrice());
            dappFundFlowDao.insert(fundFlow);
            //发送一个延时队列消息。10分钟流水还没有更新,则删除流水
            chainProducer.sendZhiYaDelayFlowMsg(fundFlow.getId(), 10 * 60 * 1000L);
            return fundFlow.getId();
        }
        if ("success".equals(transferDto.getFlag())) {
            if (transferDto.getId() == null) {
                throw new FebsException("网络异常");
            }
            //更新第一次请求的资金划转记录
            DappFundFlowEntity flow = dappFundFlowDao.selectById(transferDto.getId());
            if(ObjectUtil.isEmpty(flow)){
                throw new FebsException("网络异常");
            }
            flow.setFromHash(transferDto.getTxHash());
            flow.setStatus(DappFundFlowEntity.WITHDRAW_STATUS_AGREE);
            flow.setContent(FlowTypeEnum.ZHI_YA.getDescrition());
            dappFundFlowDao.updateById(flow);
            if (DappFundFlowEntity.TYPE_SALE == transferDto.getType()) {
                usdtRemain = usdtRemain.subtract(flow.getAmount().multiply(flow.getNewestPrice()));
                saleCoinRemain = saleCoinRemain.subtract(flow.getAmount());
            //用户质押代币数量
            BigDecimal amount = flow.getAmount().negate();
            Long memberId = flow.getMemberId();
            //新增一条用户质押记录
            DappAchieve dappAchieve = new DappAchieve();
            dappAchieve.setMemberId(memberId);
            dappAchieve.setPrice(transferDto.getPrice());
            dappAchieve.setAmount(amount);
            BigDecimal achieveReleasePercent = new BigDecimal("0.01").multiply(
                    new BigDecimal(redisUtils.getString(DataDicEnum.GFA_ACHIEVE_RELEASE.getValue())).setScale(2,BigDecimal.ROUND_DOWN)
            );
            dappAchieve.setAmountDay(achieveReleasePercent.multiply(amount).setScale(2,BigDecimal.ROUND_DOWN));
            BigDecimal achieveOut = new BigDecimal(redisUtils.getString(DataDicEnum.GFA_ACHIEVE_OUT.getValue())).setScale(2,BigDecimal.ROUND_DOWN);
            dappAchieve.setAmountMax(achieveOut.multiply(amount).setScale(2,BigDecimal.ROUND_DOWN));
            dappAchieve.setState(DappAchieve.STATUS_ING);
            dappAchieve.setAmountDone(BigDecimal.ZERO);
                // 修改当日U剩余量
                redisUtils.set(AppContants.REDIS_KEY_USDT_OUT_LIMIT_REMAIN, usdtRemain);
                // 修改用户24小时可售量
                redisUtils.set(AppContants.REDIS_KEY_COIN_REMAIN + member.getAddress(), saleCoinRemain);
            } else if (DappFundFlowEntity.TYPE_BUY == transferDto.getType()) {
                if ("start".equals(hasStart)) {
                    buyCoinRemain = buyCoinRemain.subtract(flow.getAmount());
            /**
             * 计算金本位和币本位
             *  金本位:数量*价格*70*产矿百分比
             *  币本位:数量*30*产矿百分比
             */
            BigDecimal price = dappAchieve.getPrice();
            BigDecimal goldAmount = amount.multiply(price).multiply(new BigDecimal("0.7")).multiply(achieveOut).setScale(8, BigDecimal.ROUND_DOWN);
            BigDecimal coinAmount = amount.multiply(new BigDecimal("0.3")).multiply(achieveOut).setScale(8, BigDecimal.ROUND_DOWN);
            dappAchieve.setGoldAmount(goldAmount);
            dappAchieve.setCoinAmount(coinAmount);
            dappAchieveMapper.insert(dappAchieve);
                    // 修改当日可购买量
                    redisUtils.set(AppContants.REDIS_KEY_TRANSFER_POOL_VOL_REMAIN, buyCoinRemain);
                } else {
                    makeCoinRemain = makeCoinRemain.subtract(flow.getAmount());
            asyncCjService.insertTeamPerk(flow.getId(), dappAchieve.getId());
//            asyncCjService.calculateAchieve(dappAchieve);
                    // 修改铸池量
                    redisUtils.set(AppContants.REDIS_KEY_MAKE_POOL_CNT, makeCoinRemain);
                }
            } else {
                throw new FebsException("参数错误");
            }
            //发送一个延时队列消息。24小时之后产生第一次的质押产出
//            chainProducer.sendZhiYaDelayMsg(dappAchieve.getId(), 24 * 60 * 60 * 1000L);
        } else {
            dappFundFlowDao.deleteById(transferDto.getId());
        }
@@ -294,32 +398,90 @@
    }
    @Override
    public Map<String, BigDecimal> calPrice(PriceDto priceDto) {
    public String calPrice() {
        DappMemberEntity member = LoginUserUtil.getAppUser();
        return redisUtils.getString(DataDicEnum.GFA_PRICE.getValue());
    }
    @Override
    public IPage<DappAchieve> dappAchieveInPage(DappAchieve dappAchieve, QueryRequest request) {
        Page<DappAchieve> page = new Page<>(request.getPageNum(), request.getPageSize());
        IPage<DappAchieve> dappAchieveIPage = dappAchieveMapper.selectInPage(page, dappAchieve);
        List<DappAchieve> records = dappAchieveIPage.getRecords();
        if(CollUtil.isNotEmpty(records)){
            for(DappAchieve dappAchieve1 : records){
                dappAchieve1.setUsdtAmount(dappAchieve1.getAmount().multiply(dappAchieve1.getPrice()).setScale(2,BigDecimal.ROUND_DOWN));
            }
        }
        return dappAchieveIPage;
    }
        String hasStart = redisUtils.getString(AppContants.SYSTEM_START_FLAG);
        if (!"start".equals(hasStart)) {
            HashMap<String, BigDecimal> map = new HashMap<>();
            map.put("x", new BigDecimal("0.075"));
            map.put("y", new BigDecimal("100000"));
            return map;
    @Override
    public IPage<DappAchieveItem> dappAchieveItemInPage(DappAchieve dappAchieve, QueryRequest request) {
        Page<DappAchieveItem> page = new Page<>(request.getPageNum(), request.getPageSize());
        return dappAchieveMapper.dappAchieveItemInPage(page, dappAchieve);
    }
    @Override
    public FebsResponse transferOut(TransferOutDto transferOutDto) {
        Long memberId = LoginUserUtil.getAppUser().getId();
        DappMemberEntity dappMemberEntity = dappMemberDao.selectById(memberId);
        BigDecimal usdtBalance = dappMemberEntity.getUsdtBalance();
        BigDecimal balance = dappMemberEntity.getBalance();
        Integer type = transferOutDto.getType();
        Integer flowType;
        String flowDes;
        BigDecimal amount = transferOutDto.getAmount();
        if(1 == type){//代币提现
            if(new BigDecimal("10").compareTo(amount) > 0){
                throw new FebsException("最小数量为10");
            }
            if(balance.compareTo(amount) < 0){
                throw new FebsException("余额不足");
            }
            flowType = FlowTypeEnum.DAI_BI_OUT.getValue();
            flowDes = FlowTypeEnum.DAI_BI_OUT.getDescrition();
            dappMemberEntity.setBalance(balance.subtract(amount).setScale(2,BigDecimal.ROUND_DOWN));
            dappMemberDao.updateBalanceWithVersion(dappMemberEntity);
        }else{
            if(new BigDecimal("1").compareTo(amount) > 0){
                throw new FebsException("最小数量为100");
            }
            if(usdtBalance.compareTo(amount) < 0){
                throw new FebsException("余额不足");
            }
            flowType = FlowTypeEnum.USDT_OUT.getValue();
            flowDes = FlowTypeEnum.USDT_OUT.getDescrition();
            dappMemberEntity.setUsdtBalance(usdtBalance.subtract(amount).setScale(2,BigDecimal.ROUND_DOWN));
            dappMemberDao.updateUsdtBalanceWithVersion(dappMemberEntity);
        }
        ContractChainService tfcInstance = ChainService.getInstance(ChainEnum.BSC_TFC.name());
        // u剩余数量
        BigDecimal sourceU = ChainService.getInstance(ChainEnum.BSC_USDT.name()).balanceOf(ChainEnum.BSC_USDT_SOURCE.getAddress());
        // 源池代币剩余数量
        BigDecimal sourceCoin = tfcInstance.balanceOf(ChainEnum.BSC_USDT_SOURCE.getAddress());
        // 用户代币剩余数量
        BigDecimal coin = priceDto.getAmount();
        BigDecimal x = sourceU.divide(sourceCoin, tfcInstance.decimals(), RoundingMode.HALF_UP);
        BigDecimal y = sourceU.divide(sourceCoin.add(coin), tfcInstance.decimals(), RoundingMode.HALF_UP);
        DappFundFlowEntity fundFlowTuiJian = new DappFundFlowEntity(
                memberId,
                amount.negate(),
                flowType,
                DappFundFlowEntity.WITHDRAW_STATUS_ING,
                flowDes,
                null,
                dappMemberEntity.getAddress());
        dappFundFlowDao.insert(fundFlowTuiJian);
        log.info("购买价格:{}, 出卖价格:{}", x, y);
        HashMap<String, BigDecimal> map = new HashMap<>();
        map.put("x", x);
        map.put("y", y);
        return map;
//        dappMemberEntity.setBalance(balance.subtract(amount).setScale(2,BigDecimal.ROUND_DOWN));
//        dappMemberEntity.setUsdtBalance(usdtBalance.subtract(amount).setScale(2,BigDecimal.ROUND_DOWN));
//        dappMemberDao.updateBalanceAndUsdtBalanceWithVersion(dappMemberEntity);
        return new FebsResponse().success();
    }
    @Override
    public List<DappMemberFund> memberFundList(RecordInPageDto recordInPageDto) {
        DappMemberEntity member = LoginUserUtil.getAppUser();
        Page<DappMemberFund> page = new Page<>(recordInPageDto.getPageNum(), recordInPageDto.getPageSize());
        DappMemberFund dappMemberFund = new DappMemberFund();
        dappMemberFund.setMemberId(member.getId());
        IPage<DappMemberFund> records = dappFundFlowDao.memberFundList(page, dappMemberFund);
        return records.getRecords();
    }
}