From ed4d8807978a6eed32d2b2e1273fdcaa89c6d9a4 Mon Sep 17 00:00:00 2001
From: KKSU <15274802129@163.com>
Date: Thu, 09 May 2024 17:38:14 +0800
Subject: [PATCH] 合约监听

---
 src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java |  378 +++++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 317 insertions(+), 61 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java b/src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java
index 92ae21b..1161fdd 100644
--- a/src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java
@@ -1,22 +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.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;
@@ -25,13 +26,10 @@
 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 
+ * @author
  * @date 2022-03-18
  **/
 @Slf4j
@@ -45,21 +43,89 @@
     private final DappFundFlowDao dappFundFlowDao;
     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();
-//        DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(member.getId());
-//        DappWalletMineEntity walletMine = dappWalletMineDao.selectByMemberId(member.getId());
-
+        Long memberId = LoginUserUtil.getAppUser().getId();
+        DappMemberEntity member = dappMemberDao.selectById(memberId);
         WalletInfoVo walletInfo = new WalletInfoVo();
-//        walletInfo.setInviteId(member.getInviteId());
-//        walletInfo.setTotalMine(walletMine.getTotalAmount());
-//        walletInfo.setAvailableMine(walletMine.getAvailableAmount());
-//        walletInfo.setAvailableWallet(walletCoin.getAvailableAmount());
+        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);
 
-        walletInfo.setTotalChild(10000);
-        walletInfo.setTotalChild(41451);
+        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(new BigDecimal(0.001)) > 0){
+                walletInfo.setGoldAmount(goldAmountAva);
+            }else{
+                walletInfo.setGoldAmount(BigDecimal.ZERO);
+            }
+            if(coinAmountAva.compareTo(new BigDecimal(0.001)) > 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;
     }
 
@@ -75,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();
@@ -132,13 +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();
-        dappFundFlowEntity.setType(recordInPageDto.getType());
+        if (recordInPageDto.getType() != null && recordInPageDto.getType() != 0) {
+            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();
     }
 
@@ -155,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
@@ -198,34 +273,215 @@
     }
 
     @Override
-    public void transfer(TransferDto transferDto) {
+    @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);
 
-//        ChainService.getInstance(ChainEnum.BSC_USDT_SOURCE.name()).balanceOf(member.getAddress());
-//        ChainService.getInstance(ChainEnum.BSC_TFC_SOURCE.name()).balanceOf(member.getAddress());
+        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()));
 
-        DappFundFlowEntity fundFlow = new DappFundFlowEntity(member.getId(), transferDto.getAmount(), transferDto.getType(), 1, transferDto.getFee(), transferDto.getTxHash());
-        fundFlow.setNewestPrice(transferDto.getPrice());
-        dappFundFlowDao.insert(fundFlow);
+        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));
+            }
+        }
+
+
+        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_BUY == transferDto.getType()) {
+                //系统开始标识
+                if ("start".equals(hasStart)) {
+                    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 {
+                    throw new FebsException("暂停质押");
+                }
+            }
+
+            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);
+
+            //用户质押代币数量
+            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);
+
+            /**
+             * 计算金本位和币本位
+             *  金本位:数量*价格*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);
+
+            asyncCjService.insertTeamPerk(flow.getId(), dappAchieve.getId());
+//            asyncCjService.calculateAchieve(dappAchieve);
+
+            //发送一个延时队列消息。24小时之后产生第一次的质押产出
+//            chainProducer.sendZhiYaDelayMsg(dappAchieve.getId(), 24 * 60 * 60 * 1000L);
+        } else {
+            dappFundFlowDao.deleteById(transferDto.getId());
+        }
+        return null;
     }
 
     @Override
-    public Map<String, BigDecimal> calPrice() {
+    public String calPrice() {
         DappMemberEntity member = LoginUserUtil.getAppUser();
+        return redisUtils.getString(DataDicEnum.GFA_PRICE.getValue());
+    }
 
-        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 = tfcInstance.balanceOf(member.getAddress());
-        BigDecimal x = sourceU.divide(sourceCoin, tfcInstance.decimals(), RoundingMode.HALF_DOWN);
-        BigDecimal y = sourceU.divide(sourceCoin.add(coin), tfcInstance.decimals(), RoundingMode.HALF_DOWN);
+    @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;
+    }
 
-        HashMap<String, BigDecimal> map = new HashMap<>();
-        map.put("x", BigDecimal.ONE);
-        map.put("y", BigDecimal.valueOf(0.8D));
-        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);
+        }
+
+        DappFundFlowEntity fundFlowTuiJian = new DappFundFlowEntity(
+                memberId,
+                amount.negate(),
+                flowType,
+                DappFundFlowEntity.WITHDRAW_STATUS_ING,
+                flowDes,
+                null,
+                dappMemberEntity.getAddress());
+        dappFundFlowDao.insert(fundFlowTuiJian);
+
+//        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();
     }
 }

--
Gitblit v1.9.1