From c54f0c60faae496e0fd989b281b776b69b65a87a Mon Sep 17 00:00:00 2001 From: Helius <wangdoubleone@gmail.com> Date: Sat, 27 Aug 2022 22:29:30 +0800 Subject: [PATCH] finish sde --- src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java | 268 ++++++++++++++++++++++++----------------------------- 1 files changed, 123 insertions(+), 145 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 e6cf50d..8268809 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,5 +1,6 @@ package cc.mrbird.febs.dapp.service.impl; +import cc.mrbird.febs.common.configure.i18n.MessageSourceUtils; import cc.mrbird.febs.common.contants.AppContants; import cc.mrbird.febs.common.entity.QueryRequest; import cc.mrbird.febs.common.exception.FebsException; @@ -9,14 +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.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.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; +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; @@ -26,12 +34,10 @@ 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,89 +51,30 @@ private final DappFundFlowDao dappFundFlowDao; private final DappAccountMoneyChangeDao dappAccountMoneyChangeDao; private final RedisUtils redisUtils; + private final DataDictionaryCustomMapper dataDictionaryCustomMapper; + private final DappNftActivationDao dappNftActivationDao; + + private final ChainProducer chainProducer; @Override public WalletInfoVo walletInfo() { -// DappMemberEntity member = LoginUserUtil.getAppUser(); -// DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(member.getId()); -// DappWalletMineEntity walletMine = dappWalletMineDao.selectByMemberId(member.getId()); + DappMemberEntity member = LoginUserUtil.getAppUser(); + DappMemberEntity memberInfo = dappMemberDao.selectById(member.getId()); WalletInfoVo walletInfo = new WalletInfoVo(); -// walletInfo.setInviteId(member.getInviteId()); -// walletInfo.setTotalMine(walletMine.getTotalAmount()); -// walletInfo.setAvailableMine(walletMine.getAvailableAmount()); -// walletInfo.setAvailableWallet(walletCoin.getAvailableAmount()); - - walletInfo.setTotalChild(10000); - walletInfo.setTotalChild(41451); - return walletInfo; - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void change(WalletOperateDto walletOperateDto) { - DappMemberEntity member = LoginUserUtil.getAppUser(); - - BigDecimal ethUsdtPrice = (BigDecimal) redisUtils.get(AppContants.REDIS_KEY_ETH_NEW_PRICE); - + List<DappMemberEntity> direct = dappMemberDao.selectChildMemberDirectOrNot(member.getInviteId(), 1); + DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(member.getId()); DappWalletMineEntity walletMine = dappWalletMineDao.selectByMemberId(member.getId()); - if (walletOperateDto.getAmount().compareTo(walletMine.getAvailableAmount()) > 0) { - throw new FebsException("可用金额不足"); - } - DappFundFlowEntity fund = new DappFundFlowEntity(member.getId(), walletOperateDto.getAmount(), AppContants.MONEY_TYPE_CHANGE, null, null); - dappFundFlowDao.insert(fund); + walletInfo.setDirectCnt(direct.size()); + walletInfo.setInviteId(member.getInviteId()); + walletInfo.setBalance(walletCoin.getAvailableAmount()); + walletInfo.setHasBuy(memberInfo.getActiveStatus()); + walletInfo.setOutCnt(memberInfo.getOutCnt()); + walletInfo.setProfit(dappFundFlowDao.selectProfitAmountByMemberId(member.getId())); + walletInfo.setTfcBalance(walletMine.getAvailableAmount()); - BigDecimal preEthAmount = walletMine.getAvailableAmount(); - - // TODO 并发加悲观锁 - // 更新eth金额 - walletMine.setAvailableAmount(walletMine.getAvailableAmount().subtract(walletOperateDto.getAmount())); - dappWalletMineDao.updateById(walletMine); - - DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(member.getId()); - BigDecimal preUsdtAmount = walletCoin.getAvailableAmount(); - - // 更新usdt金额 - BigDecimal usdt = walletOperateDto.getAmount().multiply(ethUsdtPrice); - walletCoin.setAvailableAmount(walletCoin.getAvailableAmount().add(usdt)); - walletCoin.setTotalAmount(walletCoin.getTotalAmount().add(usdt)); - dappWalletCoinDao.updateById(walletCoin); - - 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); + return walletInfo; } @Override @@ -136,8 +83,12 @@ DappMemberEntity member = LoginUserUtil.getAppUser(); DappFundFlowEntity dappFundFlowEntity = new DappFundFlowEntity(); - dappFundFlowEntity.setType(recordInPageDto.getType()); + if (recordInPageDto.getType() != null && recordInPageDto.getType() != 0) { + dappFundFlowEntity.setType(recordInPageDto.getType()); + } dappFundFlowEntity.setMemberId(member.getId()); + dappFundFlowEntity.setStatus(2); + IPage<DappFundFlowEntity> records = dappFundFlowDao.selectInPage(page, dappFundFlowEntity); return records.getRecords(); } @@ -146,37 +97,6 @@ public IPage<DappFundFlowEntity> fundFlowInPage(DappFundFlowEntity dappFundFlowEntity, QueryRequest request) { Page<DappFundFlowEntity> page = new Page<>(request.getPageNum(), request.getPageSize()); return dappFundFlowDao.selectInPage(page, dappFundFlowEntity); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void withdrawAgreeOrNot(Long id, int type) { - DappFundFlowEntity fundFlow = dappFundFlowDao.selectById(id); - 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); - } 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); - - dappAccountMoneyChangeDao.insert(accountMoneyChange); - } else { - throw new FebsException("参数错误"); - } - - dappWalletCoinDao.updateById(walletCoin); - dappFundFlowDao.updateById(fundFlow); } @Override @@ -201,49 +121,107 @@ public Long transfer(TransferDto transferDto) { DappMemberEntity member = LoginUserUtil.getAppUser(); - if (transferDto.getId() == null) { - if (DappFundFlowEntity.TYPE_SALE == transferDto.getType()) { - String hasStart = redisUtils.getString(AppContants.SYSTEM_START_FLAG); - if (!"start".equals(hasStart)) { - throw new FebsException("系统还未启动"); - } + if (transferDto.getType() != 2) { + member = dappMemberDao.selectById(member.getId()); + if (member.getActiveStatus() == 1) { + throw new FebsException("Do not repeat purchase"); + } + } + + 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 { - dappFundFlowDao.deleteById(transferDto.getId()); - } + 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 ("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()); + } + } + } return null; } @Override - public Map<String, BigDecimal> calPrice() { + public BigDecimal calPrice(PriceDto priceDto) { + String priceStr = redisUtils.getString(AppContants.REDIS_KEY_TFC_NEW_PRICE); + + return priceDto.getAmount().multiply(new BigDecimal("0.1")).multiply(new BigDecimal(priceStr)); + } + + @Override + public void withdraw(WithdrawDto withdrawDto) { DappMemberEntity member = LoginUserUtil.getAppUser(); - 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); + updateWalletCoinWithLock(withdrawDto.getAmount().negate(), member.getId()); + updateWalletMineWithLock(withdrawDto.getFee().negate(), member.getId()); - HashMap<String, BigDecimal> map = new HashMap<>(); - map.put("x", BigDecimal.ONE); - map.put("y", BigDecimal.valueOf(0.8D)); - return map; + 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) { + DappWalletMineEntity walletMine = dappWalletMineDao.selectByMemberId(memberId); + + walletMine.setTotalAmount(walletMine.getTotalAmount().add(amount)); + walletMine.setAvailableAmount(walletMine.getAvailableAmount().add(amount)); + + int i = dappWalletMineDao.updateWithLock(walletMine); + if (i > 0) { + isSuccess = true; + } + } } } -- Gitblit v1.9.1