package cc.mrbird.febs.dapp.service.impl; import cc.mrbird.febs.common.contants.AppContants; import cc.mrbird.febs.common.entity.QueryRequest; import cc.mrbird.febs.common.exception.FebsException; import cc.mrbird.febs.common.utils.LoginUserUtil; import cc.mrbird.febs.dapp.dto.RecordInPageDto; import cc.mrbird.febs.dapp.dto.WalletOperateDto; import cc.mrbird.febs.dapp.entity.*; import cc.mrbird.febs.dapp.mapper.*; import cc.mrbird.febs.dapp.service.DappWalletService; import cc.mrbird.febs.dapp.vo.WalletInfoVo; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.List; /** * @author wzy * @date 2022-03-18 **/ @Slf4j @Service @RequiredArgsConstructor public class DappWalletServiceImpl implements DappWalletService { private final DappMemberDao dappMemberDao; private final DappWalletMineDao dappWalletMineDao; private final DappWalletCoinDao dappWalletCoinDao; private final DappFundFlowDao dappFundFlowDao; private final DappAccountMoneyChangeDao dappAccountMoneyChangeDao; @Override public WalletInfoVo walletInfo() { DappMemberEntity member = LoginUserUtil.getAppUser(); DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(member.getId()); DappWalletMineEntity walletMine = dappWalletMineDao.selectByMemberId(member.getId()); WalletInfoVo walletInfo = new WalletInfoVo(); walletInfo.setTotalMine(walletMine.getTotalAmount()); walletInfo.setAvailableMine(walletMine.getAvailableAmount()); walletInfo.setAvailableWallet(walletCoin.getAvailableAmount()); return walletInfo; } @Override @Transactional(rollbackFor = Exception.class) public void change(WalletOperateDto walletOperateDto) { DappMemberEntity member = LoginUserUtil.getAppUser(); BigDecimal ethUsdtPrice = new BigDecimal("1234"); DappWalletMineEntity walletMine = dappWalletMineDao.selectByMemberId(member.getId()); if (walletOperateDto.getAmount().compareTo(walletMine.getAvailableAmount()) > 0) { throw new FebsException("可用金额不足"); } DappFundFlowEntity fund = new DappFundFlowEntity(member.getId(), walletOperateDto.getAmount().negate(), AppContants.MONEY_TYPE_CHANGE, null); dappFundFlowDao.insert(fund); BigDecimal preEthAmount = walletMine.getAvailableAmount(); // TODO 并发加悲观锁 // 更新eth金额 walletMine.setAvailableAmount(walletMine.getAvailableAmount().subtract(walletOperateDto.getAmount())); walletMine.setTotalAmount(walletMine.getTotalAmount().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.getTotalAmount(), "ETH兑换USDT-ETH", AppContants.MONEY_TYPE_CHANGE); DappAccountMoneyChangeEntity usdtChange = new DappAccountMoneyChangeEntity(member.getId(), preUsdtAmount, usdt, walletCoin.getTotalAmount(), "ETH兑换USDT-USDT", AppContants.MONEY_TYPE_CHANGE); dappAccountMoneyChangeDao.insert(ethChange); dappAccountMoneyChangeDao.insert(usdtChange); } @Override @Transactional(rollbackFor = Exception.class) public void withdraw(WalletOperateDto walletOperateDto) { DappMemberEntity member = LoginUserUtil.getAppUser(); DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(member.getId()); if (walletOperateDto.getAmount().compareTo(walletCoin.getAvailableAmount()) > 0) { throw new FebsException("可用金额不足"); } // TODO 并发加悲观锁 BigDecimal preAmount = walletCoin.getAvailableAmount(); walletCoin.setAvailableAmount(walletCoin.getAvailableAmount().subtract(walletOperateDto.getAmount())); walletCoin.setFrozenAmount(walletCoin.getFrozenAmount().subtract(walletOperateDto.getAmount())); dappWalletCoinDao.updateById(walletCoin); DappFundFlowEntity fund = new DappFundFlowEntity(member.getId(), walletOperateDto.getAmount().negate(), AppContants.MONEY_TYPE_WITHDRAWAL, 1); dappFundFlowDao.insert(fund); DappAccountMoneyChangeEntity usdtChange = new DappAccountMoneyChangeEntity(member.getId(), preAmount, walletOperateDto.getAmount(), walletCoin.getAvailableAmount(), "USDT申请提现", AppContants.MONEY_TYPE_WITHDRAWAL); dappAccountMoneyChangeDao.insert(usdtChange); } @Override public List recordInPage(RecordInPageDto recordInPageDto) { Page page = new Page<>(recordInPageDto.getPageNum(), recordInPageDto.getPageSize()); DappFundFlowEntity dappFundFlowEntity = new DappFundFlowEntity(); dappFundFlowEntity.setType(recordInPageDto.getType()); IPage records = dappFundFlowDao.selectInPage(page, dappFundFlowEntity); return records.getRecords(); } @Override public IPage fundFlowInPage(DappFundFlowEntity dappFundFlowEntity, QueryRequest request) { Page page = new Page<>(request.getPageNum(), request.getPageSize()); return dappFundFlowDao.selectInPage(page, dappFundFlowEntity); } @Override public void withdrawAgreeOrNot(Long id, int type) { DappFundFlowEntity fundFlow = dappFundFlowDao.selectById(id); if (fundFlow == null) { throw new FebsException("数据不存在"); } if (type == 1) { fundFlow.setStatus(DappFundFlowEntity.WITHDRAW_STATUS_AGREE); } else if (type == 2) { fundFlow.setStatus(DappFundFlowEntity.WITHDRAW_STATUS_DISAGREE); } else { throw new FebsException("参数错误"); } dappFundFlowDao.updateById(fundFlow); } @Override public IPage walletCoinInPage(DappWalletCoinEntity walletCoin, QueryRequest request) { Page page = new Page<>(request.getPageNum(), request.getPageSize()); return dappWalletCoinDao.selectInPage(walletCoin, page); } @Override public IPage walletMineInPage(DappWalletMineEntity walletMine, QueryRequest request) { Page page = new Page<>(request.getPageNum(), request.getPageSize()); return dappWalletMineDao.selectInPage(walletMine, page); } @Override public IPage accountMoneyChangeInPage(DappAccountMoneyChangeEntity change, QueryRequest request) { Page page = new Page<>(request.getPageNum(), request.getPageSize()); return dappAccountMoneyChangeDao.selectInPage(change, page); } }