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 | 262 ++++++++++++++++++++++++++++++++++++++++++++++------
1 files changed, 231 insertions(+), 31 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 fde1fbb..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,17 +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.LoginUserUtil;
import cc.mrbird.febs.common.utils.RedisUtils;
-import cc.mrbird.febs.dapp.dto.RecordInPageDto;
-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;
@@ -20,10 +25,10 @@
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
-import java.util.List;
+import java.util.*;
/**
- * @author wzy
+ * @author
* @date 2022-03-18
**/
@Slf4j
@@ -37,18 +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();
-
- 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.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);
+
+ 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;
}
@@ -64,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();
@@ -112,7 +151,7 @@
walletCoin.setFrozenAmount(walletCoin.getFrozenAmount().add(walletOperateDto.getAmount()));
dappWalletCoinDao.updateById(walletCoin);
- DappFundFlowEntity fund = new DappFundFlowEntity(member.getId(), walletOperateDto.getAmount(), AppContants.MONEY_TYPE_WITHDRAWAL, 1, fee);
+ DappFundFlowEntity fund = new DappFundFlowEntity(member.getId(), walletOperateDto.getAmount(), AppContants.MONEY_TYPE_WITHDRAWAL, 1, new BigDecimal(fee));
dappFundFlowDao.insert(fund);
DappAccountMoneyChangeEntity usdtChange = new DappAccountMoneyChangeEntity(member.getId(), preAmount, walletOperateDto.getAmount(), walletCoin.getAvailableAmount(), "USDT申请提现", AppContants.MONEY_TYPE_WITHDRAWAL);
@@ -121,11 +160,27 @@
@Override
public List<DappFundFlowEntity> recordInPage(RecordInPageDto recordInPageDto) {
+ DappMemberEntity member = LoginUserUtil.getAppUser();
Page<DappFundFlowEntity> page = new Page<>(recordInPageDto.getPageNum(), recordInPageDto.getPageSize());
-
DappFundFlowEntity dappFundFlowEntity = new DappFundFlowEntity();
- dappFundFlowEntity.setType(recordInPageDto.getType());
- IPage<DappFundFlowEntity> records = dappFundFlowDao.selectInPage(page, dappFundFlowEntity);
+ if (recordInPageDto.getType() != null && recordInPageDto.getType() != 0) {
+ dappFundFlowEntity.setStatus(recordInPageDto.getType());
+ }
+ dappFundFlowEntity.setMemberId(member.getId());
+ 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();
}
@@ -142,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
@@ -183,4 +230,157 @@
Page<DappAccountMoneyChangeEntity> page = new Page<>(request.getPageNum(), request.getPageSize());
return dappAccountMoneyChangeDao.selectInPage(change, page);
}
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public Long transfer(TransferDto transferDto) {
+ DappMemberEntity member = LoginUserUtil.getAppUser();
+
+ 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(gfaDays) > 0) {
+ throw new FebsException("今日最多质押"+gfaDays);
+ }
+ } 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.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);
+
+ asyncCjService.insertTeamPerk(flow.getId(), dappAchieve.getId());
+
+ //发送一个延时队列消息。24小时之后产生第一次的质押产出
+// chainProducer.sendZhiYaDelayMsg(dappAchieve.getId(), 24 * 60 * 60 * 1000L);
+ } else {
+ dappFundFlowDao.deleteById(transferDto.getId());
+ }
+ return null;
+ }
+
+ @Override
+ 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);
+ }
+
+ @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();
+ }
+
+ 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();
+ }
}
--
Gitblit v1.9.1