From df1f1d655c2ede40933ea047f00d2ce975489e23 Mon Sep 17 00:00:00 2001
From: wzy <wzy19931122ai@163.com>
Date: Sat, 27 Aug 2022 15:29:20 +0800
Subject: [PATCH] fix
---
src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java | 272 +++++++++++++++++++-----------------------------------
1 files changed, 96 insertions(+), 176 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 7c61c18..c0258d4 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
@@ -13,11 +13,11 @@
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 cc.mrbird.febs.rabbit.producer.ChainProducer;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateUnit;
@@ -52,28 +52,28 @@
private final DappAccountMoneyChangeDao dappAccountMoneyChangeDao;
private final RedisUtils redisUtils;
private final DataDictionaryCustomMapper dataDictionaryCustomMapper;
- private final DappSystemService dappSystemService;
private final DappNftActivationDao dappNftActivationDao;
+
+ private final ChainProducer chainProducer;
@Override
public WalletInfoVo walletInfo() {
DappMemberEntity member = LoginUserUtil.getAppUser();
- Map<String, BigDecimal> map = dappFundFlowDao.selectAmountTotalByType(member.getId());
+ DappMemberEntity memberInfo = dappMemberDao.selectById(member.getId());
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());
-
DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(member.getId());
+ DappWalletMineEntity walletMine = dappWalletMineDao.selectByMemberId(member.getId());
- 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.setBoxCnt(walletCoin.getBoxCnt());
+ walletInfo.setBalance(walletCoin.getAvailableAmount());
+ walletInfo.setHasBuy(memberInfo.getActiveStatus());
+ walletInfo.setOutCnt(memberInfo.getOutCnt());
+ walletInfo.setProfit(dappFundFlowDao.selectProfitAmountByMemberId(member.getId()));
+ walletInfo.setTFCbalance(walletMine.getAvailableAmount());
+
return walletInfo;
}
@@ -111,36 +111,6 @@
DappAccountMoneyChangeEntity ethChange = new DappAccountMoneyChangeEntity(member.getId(), preEthAmount, walletOperateDto.getAmount(), walletMine.getAvailableAmount(), "ETH兑换USDT-ETH, 兑换价格为:" + ethUsdtPrice, AppContants.MONEY_TYPE_CHANGE);
DappAccountMoneyChangeEntity usdtChange = new DappAccountMoneyChangeEntity(member.getId(), preUsdtAmount, usdt, walletCoin.getAvailableAmount(), "ETH兑换USDT-USDT, 兑换价格为:" + ethUsdtPrice, AppContants.MONEY_TYPE_CHANGE);
dappAccountMoneyChangeDao.insert(ethChange);
- dappAccountMoneyChangeDao.insert(usdtChange);
- }
-
- @Override
- @Transactional(rollbackFor = Exception.class)
- public void withdraw(WalletOperateDto walletOperateDto) {
- DappMemberEntity member = LoginUserUtil.getAppUser();
-
- List<DappFundFlowEntity> fundFlows = dappFundFlowDao.selectListForMemberAndDay(member.getId(), 2);
- if (CollUtil.isNotEmpty(fundFlows)) {
- throw new FebsException("一天只能提现一次");
- }
-
- DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(member.getId());
- if (walletOperateDto.getAmount().compareTo(walletCoin.getAvailableAmount()) > 0) {
- throw new FebsException("可用金额不足");
- }
-
- Integer fee = (Integer) redisUtils.get(AppContants.REDIS_KEY_CHANGE_FEE);
-
- //TODO 并发加悲观锁
- BigDecimal preAmount = walletCoin.getAvailableAmount();
- walletCoin.setAvailableAmount(walletCoin.getAvailableAmount().subtract(walletOperateDto.getAmount()));
- walletCoin.setFrozenAmount(walletCoin.getFrozenAmount().add(walletOperateDto.getAmount()));
- dappWalletCoinDao.updateById(walletCoin);
-
- 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);
dappAccountMoneyChangeDao.insert(usdtChange);
}
@@ -219,127 +189,44 @@
public Long transfer(TransferDto transferDto) {
DappMemberEntity member = LoginUserUtil.getAppUser();
- if (member.getActiveStatus() == 2) {
- throw new FebsException("请联系邀请人转币激活");
+ member = dappMemberDao.selectById(member.getId());
+ if (member.getActiveStatus() == 1) {
+ throw new FebsException("Do not repeat purchase");
}
- // 每日出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());
-
- // 用户24小时可购买USDT
- BigDecimal buyUsdtMax = (BigDecimal) redisUtils.get(AppContants.REDIS_KEY_IDO_USDT_MAX_BUY_DAILY + 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);
- if (transferDto.getId() == null) {
- if (DappFundFlowEntity.TYPE_SALE == transferDto.getType()) {
- if (!"start".equals(hasStart)) {
- throw new FebsException(MessageSourceUtils.getString("transfer_msg_001"));
- }
-
- if (transferDto.getAmount().multiply(transferDto.getPrice()).compareTo(usdtRemain) > 0) {
- throw new FebsException(MessageSourceUtils.getString("transfer_msg_002"));
- }
-
- if (transferDto.getAmount().compareTo(saleCoinRemain) > 0) {
- throw new FebsException(MessageSourceUtils.getString("transfer_msg_003"));
- }
-
- usdtRemain = usdtRemain.subtract(transferDto.getAmount().multiply(transferDto.getPrice()));
- saleCoinRemain = saleCoinRemain.subtract(transferDto.getAmount());
-
- // 修改当日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()) {
- // 购买时,前端传来的amount是USDT,卖出amount是TFC
- BigDecimal usdtAmount = transferDto.getAmount();
- BigDecimal coinAmount = transferDto.getAmount().divide(transferDto.getPrice(), 6, RoundingMode.HALF_UP);
- transferDto.setAmount(coinAmount);
-
- if ("start".equals(hasStart)) {
- if (transferDto.getAmount().compareTo(buyCoinRemain) > 0) {
- throw new FebsException(MessageSourceUtils.getString("transfer_msg_004"));
- }
- buyCoinRemain = buyCoinRemain.subtract(transferDto.getAmount());
-
- // 修改当日可购买量
- redisUtils.set(AppContants.REDIS_KEY_TRANSFER_POOL_VOL_REMAIN, buyCoinRemain);
- // 如果系统还没有启动,则判断铸池中的剩余量
- } 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(MessageSourceUtils.getString("transfer_msg_005"));
-// }
-
- if (buyUsdtMax.compareTo(usdtAmount) < 0) {
- throw new FebsException(MessageSourceUtils.getString("transfer_msg_007"));
- }
-
- if (transferDto.getAmount().compareTo(makeCoinRemain) > 0) {
- throw new FebsException(MessageSourceUtils.getString("transfer_msg_006"));
- }
- makeCoinRemain = makeCoinRemain.subtract(transferDto.getAmount());
- buyUsdtMax = buyUsdtMax.subtract(usdtAmount);
-
- // 修改每日最大购买USDT量
- redisUtils.set(AppContants.REDIS_KEY_IDO_USDT_MAX_BUY_DAILY + member.getAddress(), buyUsdtMax);
-
- // 修改铸池量
- redisUtils.set(AppContants.REDIS_KEY_MAKE_POOL_CNT, makeCoinRemain);
- }
+ if (transferDto.getBuyType() == 1) {
+ DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(member.getId());
+ if (transferDto.getAmount().compareTo(walletCoin.getAvailableAmount()) > 0) {
+ throw new FebsException("Balance Not Enough");
}
- DappFundFlowEntity fundFlow = new DappFundFlowEntity(member.getId(), transferDto.getAmount(), transferDto.getType(), 1, transferDto.getFee(), transferDto.getTxHash());
- fundFlow.setNewestPrice(transferDto.getPrice());
+ updateWalletCoinWithLock(transferDto.getAmount().negate(), member.getId());
+
+ DappFundFlowEntity fundFlow = new DappFundFlowEntity(member.getId(), transferDto.getAmount().negate(), 1, 2, transferDto.getFee(), transferDto.getTxHash());
dappFundFlowDao.insert(fundFlow);
- return fundFlow.getId();
- }
- if ("success".equals(transferDto.getFlag())) {
- DappFundFlowEntity flow = dappFundFlowDao.selectById(transferDto.getId());
-
- flow.setFromHash(transferDto.getTxHash());
- dappFundFlowDao.updateById(flow);
+ chainProducer.sendAchieveTreeMsg(member.getId());
} else {
- DappFundFlowEntity flow = dappFundFlowDao.selectById(transferDto.getId());
- if (flow.getStatus() == 1) {
- if (DappFundFlowEntity.TYPE_BUY == flow.getType()) {
- // 购买时,前端传来的amount是USDT,卖出amount是TFC
- BigDecimal usdtAmount = transferDto.getAmount();
- BigDecimal coinAmount = transferDto.getAmount().divide(flow.getNewestPrice(), 6, RoundingMode.HALF_UP);
- transferDto.setAmount(coinAmount);
+ int type = 1;
+ // 1-认购 2-充值tfc
+ if (transferDto.getType() == 2) {
+ type = 6;
+ }
+ if (transferDto.getId() == null) {
+ DappFundFlowEntity fundFlow = new DappFundFlowEntity(member.getId(), transferDto.getAmount(), type, 1, transferDto.getFee(), transferDto.getTxHash());
+ dappFundFlowDao.insert(fundFlow);
+ return fundFlow.getId();
+ }
- if ("start".equals(hasStart)) {
- buyCoinRemain = buyCoinRemain.add(flow.getAmount());
-
- // 修改当日可购买量
- redisUtils.set(AppContants.REDIS_KEY_TRANSFER_POOL_VOL_REMAIN, buyCoinRemain);
- } else {
- makeCoinRemain = makeCoinRemain.add(flow.getAmount());
- buyUsdtMax = buyUsdtMax.add(usdtAmount);
-
- // 修改铸池量
- redisUtils.set(AppContants.REDIS_KEY_MAKE_POOL_CNT, makeCoinRemain);
- redisUtils.set(AppContants.REDIS_KEY_IDO_USDT_MAX_BUY_DAILY + member.getAddress(), buyUsdtMax);
- }
- } else {
- usdtRemain = usdtRemain.add(transferDto.getAmount().multiply(transferDto.getPrice()));
- saleCoinRemain = saleCoinRemain.add(transferDto.getAmount());
-
- // 修改当日U剩余量
- redisUtils.set(AppContants.REDIS_KEY_USDT_OUT_LIMIT_REMAIN, usdtRemain);
- // 修改用户24小时可售量
- redisUtils.set(AppContants.REDIS_KEY_COIN_REMAIN + member.getAddress(), saleCoinRemain);
+ if ("success".equals(transferDto.getFlag())) {
+ DappFundFlowEntity flow = dappFundFlowDao.selectById(transferDto.getId());
+ flow.setFromHash(transferDto.getTxHash());
+ dappFundFlowDao.updateById(flow);
+ } else {
+ DappFundFlowEntity flow = dappFundFlowDao.selectById(transferDto.getId());
+ if (flow.getStatus() == 1) {
+ dappFundFlowDao.deleteById(transferDto.getId());
}
- dappFundFlowDao.deleteById(transferDto.getId());
}
}
return null;
@@ -347,30 +234,11 @@
@Override
public Map<String, BigDecimal> calPrice(PriceDto priceDto) {
- DappMemberEntity member = LoginUserUtil.getAppUser();
+ String priceStr = redisUtils.getString(AppContants.REDIS_KEY_TFC_NEW_PRICE);
- if (!dappSystemService.systemHasStart()) {
- HashMap<String, BigDecimal> map = new HashMap<>();
- map.put("x", new BigDecimal("0.05"));
- map.put("y", new BigDecimal("0.05"));
- return map;
- }
-
- 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);
-
- log.info("购买价格:{}, 出卖价格:{}", x, y);
- HashMap<String, BigDecimal> map = new HashMap<>();
- map.put("x", x);
- map.put("y", y);
- return map;
+ Map<String, BigDecimal> data = new HashMap<>();
+ data.put("fee", new BigDecimal(priceStr));
+ return data;
}
@Override
@@ -488,4 +356,56 @@
return list;
}
+
+ @Override
+ public void withdraw(WithdrawDto withdrawDto) {
+ DappMemberEntity member = LoginUserUtil.getAppUser();
+
+ updateWalletCoinWithLock(withdrawDto.getAmount().negate(), member.getId());
+ updateWalletMineWithLock(withdrawDto.getFee(), member.getId());
+
+ DappFundFlowEntity feeFlow = new DappFundFlowEntity(member.getId(), withdrawDto.getFee().negate(), 7, 2, null, null);
+ dappFundFlowDao.insert(feeFlow);
+
+ DappFundFlowEntity fundFlow = new DappFundFlowEntity(member.getId(), withdrawDto.getAmount().negate(), 5, 2, withdrawDto.getFee(), null);
+ dappFundFlowDao.insert(fundFlow);
+
+ String hash = ChainService.getInstance(ChainEnum.BSC_USDT.name()).transfer(member.getAddress(), withdrawDto.getAmount());
+ fundFlow.setToHash(hash);
+ dappFundFlowDao.updateById(fundFlow);
+
+ chainProducer.sendTfcFee(withdrawDto.getFee().toPlainString());
+ }
+
+ @Override
+ public void updateWalletCoinWithLock(BigDecimal amount, Long memberId) {
+ boolean isSuccess = false;
+ while(!isSuccess) {
+ DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(memberId);
+
+ walletCoin.setTotalAmount(walletCoin.getTotalAmount().add(amount));
+ walletCoin.setAvailableAmount(walletCoin.getAvailableAmount().add(amount));
+
+ int i = dappWalletCoinDao.updateWithLock(walletCoin);
+ if (i > 0) {
+ isSuccess = true;
+ }
+ }
+ }
+
+ @Override
+ public void updateWalletMineWithLock(BigDecimal amount, Long memberId) {
+ boolean isSuccess = false;
+ while(!isSuccess) {
+ DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(memberId);
+
+ walletCoin.setTotalAmount(walletCoin.getTotalAmount().add(amount));
+ walletCoin.setAvailableAmount(walletCoin.getAvailableAmount().add(amount));
+
+ int i = dappWalletCoinDao.updateWithLock(walletCoin);
+ if (i > 0) {
+ isSuccess = true;
+ }
+ }
+ }
}
--
Gitblit v1.9.1