Helius
2022-08-16 ddb907e6378163ad1218e20aa1c656aafe7ebf0f
src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java
@@ -10,17 +10,21 @@
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.DappSystemService;
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.WalletInfoVo;
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 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 lombok.RequiredArgsConstructor;
@@ -30,9 +34,7 @@
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
/**
 * @author
@@ -51,6 +53,7 @@
    private final RedisUtils redisUtils;
    private final DataDictionaryCustomMapper dataDictionaryCustomMapper;
    private final DappSystemService dappSystemService;
    private final DappNftActivationDao dappNftActivationDao;
    @Override
    public WalletInfoVo walletInfo() {
@@ -371,23 +374,19 @@
    }
    @Override
    public int boxSurprise() {
    public ActiveNftListVo boxSurprise() {
        DappMemberEntity member = LoginUserUtil.getAppUser();
        // 功能升级
        throw new FebsException(MessageSourceUtils.getString("box_surprise_002"));
        DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(member.getId());
        if (walletCoin.getBoxCnt() < 1) {
            throw new FebsException(MessageSourceUtils.getString("box_surprise_001"));
        }
//        DappMemberEntity member = LoginUserUtil.getAppUser();
//
//        DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(member.getId());
//        if (walletCoin.getBoxCnt() < 1) {
//            throw new FebsException(MessageSourceUtils.getString("box_surprise_001"));
//        }
//
//        walletCoin.setBoxCnt(walletCoin.getBoxCnt() - 1);
//        dappWalletCoinDao.updateById(walletCoin);
//
//        BoxUtil.Box box = BoxUtil.openBox();
//
        walletCoin.setBoxCnt(walletCoin.getBoxCnt() - 1);
        dappWalletCoinDao.updateById(walletCoin);
        BoxUtil.Box box = BoxUtil.openBox();
//        DappFundFlowEntity boxFundFlow = new DappFundFlowEntity(member.getId(), new BigDecimal(box.getIndex()), 6, 2, BigDecimal.ZERO);
//        dappFundFlowDao.insert(boxFundFlow);
//
@@ -404,7 +403,89 @@
//                log.error("发放卡牌错误", e);
//            }
//        }).start();
//
//        return box.getIndex();
        Date time = new Date();
        Date expire = DateUtil.offset(time, DateField.HOUR, 2);
        DappNftActivation nftActivation = new DappNftActivation();
        nftActivation.setMemberId(member.getId());
        nftActivation.setCount(box.getIndex());
        nftActivation.setOpenTime(time);
        nftActivation.setExpireTime(expire);
        nftActivation.setStatus(1);
        dappNftActivationDao.insert(nftActivation);
        ActiveNftListVo nft = new ActiveNftListVo();
        nft.setCount(box.getIndex());
        nft.setId(nftActivation.getId());
        nft.setRemain(DateUtil.between(time, expire, DateUnit.SECOND));
        return nft;
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public synchronized void activeNft(ActiveDto activeDto) {
        DappMemberEntity member = LoginUserUtil.getAppUser();
        DappNftActivation nftActive = dappNftActivationDao.selectById(activeDto.getId());
        if (nftActive == null) {
            throw new FebsException(MessageSourceUtils.getString("nft_active_003"));
        }
        if (nftActive.getCount() < activeDto.getCount()) {
            throw new FebsException(MessageSourceUtils.getString("nft_active_004"));
        }
        if (DateUtil.between(new Date(), nftActive.getExpireTime(), DateUnit.SECOND) < 0) {
            throw new FebsException(MessageSourceUtils.getString("nft_active_005"));
        }
        if (nftActive.getStatus() != 1) {
            throw new FebsException(MessageSourceUtils.getString("nft_active_001"));
        }
        PriceDto priceDto = new PriceDto();
        priceDto.setAmount(BigDecimal.ZERO);
        Map<String, BigDecimal> price = calPrice(priceDto);
        DappFundFlowEntity fundFlow = new DappFundFlowEntity(member.getId(), new BigDecimal(activeDto.getCount()), 8, 1, BigDecimal.ZERO, activeDto.getTxHash());
        fundFlow.setTargetAmount(price.get("x").multiply(new BigDecimal(activeDto.getCount())));
        fundFlow.setNewestPrice(AppContants.NFT_ACTIVE_PRICE.multiply(BigDecimal.valueOf(nftActive.getCount())));
        dappFundFlowDao.insert(fundFlow);
        int count = nftActive.getCount() - activeDto.getCount();
        if (count == 0) {
            nftActive.setStatus(3);
        }
        nftActive.setCount(count);
        nftActive.setHash(activeDto.getTxHash());
        dappNftActivationDao.updateById(nftActive);
    }
    @Override
    public List<ActiveNftListVo> findUnActiveNftList() {
        DappMemberEntity member = LoginUserUtil.getAppUser();
        List<ActiveNftListVo> list = new ArrayList<>();
        UpdateWrapper<DappNftActivation> query = new UpdateWrapper<>();
        query.eq("status", 1);
        query.eq("member_id", member.getId());
        query.ge("expire_time", new Date());
        List<DappNftActivation> nftActivations = dappNftActivationDao.selectList(query);
        if (CollUtil.isEmpty(nftActivations)) {
            return list;
        }
        Date now = new Date();
        nftActivations.forEach(nft -> {
            ActiveNftListVo nftVo = new ActiveNftListVo();
            nftVo.setId(nft.getId());
            nftVo.setRemain(DateUtil.between(now, nft.getExpireTime(), DateUnit.SECOND, false));
            nftVo.setCount(nft.getCount());
            list.add(nftVo);
        });
        return list;
    }
}