From f10afe3a9aab4e962b3ec456b8a707163e11f9bd Mon Sep 17 00:00:00 2001
From: KKSU <15274802129@163.com>
Date: Wed, 27 Mar 2024 19:22:58 +0800
Subject: [PATCH] 滑点
---
src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java | 298 +++++++++++++++++++++++++++++++++++++----------------------
1 files changed, 186 insertions(+), 112 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 a1abc90..b58d543 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,22 @@
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.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
@@ -25,10 +25,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
@@ -45,23 +42,52 @@
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;
@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);
+
+ BigDecimal ccTotal = dappFundFlowDao.selectAmountTotalByTypeAndMemberIdAndDate(member.getId(), FlowTypeEnum.ZHIYA_CHA_CHU.getValue(),null).negate();
+ walletInfo.setCcTotal(ccTotal);
+
+ BigDecimal ccToday = dappFundFlowDao.selectAmountTotalByTypeAndMemberIdAndDate(member.getId(), FlowTypeEnum.ZHIYA_CHA_CHU.getValue(), new Date()).negate();
+ walletInfo.setCcToday(ccToday);
+
+ BigDecimal gfaDays = new BigDecimal(redisUtils.getString(DataDicEnum.GFA_DAYS.getValue())).setScale(2,BigDecimal.ROUND_DOWN);
+ walletInfo.setGfaDays(gfaDays);
+
return walletInfo;
}
@@ -77,7 +103,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();
@@ -134,15 +160,27 @@
@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());
}
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();
}
@@ -159,28 +197,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
@@ -202,78 +232,87 @@
}
@Override
+ @Transactional(rollbackFor = Exception.class)
public Long transfer(TransferDto transferDto) {
DappMemberEntity member = LoginUserUtil.getAppUser();
- if (member.getActiveStatus() == 2) {
- throw new FebsException("请联系邀请人转币激活");
- }
+ 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);
- // 每日出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);
-
+ minAmount = minAmount.divide(transferDto.getPrice(),2,BigDecimal.ROUND_DOWN);
+ maxAmount = maxAmount.divide(transferDto.getPrice(),2,BigDecimal.ROUND_DOWN);;
if (transferDto.getId() == null) {
- String hasStart = redisUtils.getString(AppContants.SYSTEM_START_FLAG);
- 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(gfaDays) > 0) {
+ throw new FebsException("今日最多质押"+gfaDays);
+ }
} else {
- 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.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);
+ dappAchieveMapper.insert(dappAchieve);
- // 修改当日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()) {
- buyCoinRemain = buyCoinRemain.subtract(flow.getAmount());
+ asyncCjService.insertTeamPerk(flow.getId(), dappAchieve.getId());
- // 修改当日可购买量
- redisUtils.set(AppContants.REDIS_KEY_TRANSFER_POOL_VOL_REMAIN, buyCoinRemain);
- } else {
-
- throw new FebsException("参数错误");
- }
+ //发送一个延时队列消息。24小时之后产生第一次的质押产出
+// chainProducer.sendZhiYaDelayMsg(dappAchieve.getId(), 24 * 60 * 60 * 1000L);
} else {
dappFundFlowDao.deleteById(transferDto.getId());
}
@@ -281,32 +320,67 @@
}
@Override
- public Map<String, BigDecimal> calPrice() {
+ 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());
+ return dappAchieveMapper.selectInPage(page, dappAchieve);
+ }
- String hasStart = redisUtils.getString(AppContants.SYSTEM_START_FLAG);
- if (!"start".equals(hasStart)) {
- HashMap<String, BigDecimal> map = new HashMap<>();
- map.put("x", new BigDecimal("0.073"));
- 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();
+ }else{
+ if(new BigDecimal("100").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();
}
- 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_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();
}
}
--
Gitblit v1.9.1