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; 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.*; import cc.mrbird.febs.dapp.entity.*; import cc.mrbird.febs.dapp.enumerate.DataDictionaryEnum; import cc.mrbird.febs.dapp.enumerate.FundFlowEnum; import cc.mrbird.febs.dapp.enumerate.NodeCodeEnum; import cc.mrbird.febs.dapp.enumerate.PoolEnum; 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.DappFundFlowVo; import cc.mrbird.febs.dapp.vo.DappMemberNodeVo; 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 cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; 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; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.*; /** * @author * @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; private final RedisUtils redisUtils; private final DataDictionaryCustomMapper dataDictionaryCustomMapper; private final DappNftActivationDao dappNftActivationDao; private final MemberCoinWithdrawDao memberCoinWithdrawDao; private final ChainProducer chainProducer; private final DappSystemDao dappSystemDao; private final DappSystemProfitDao dappSystemProfitDao; private final DappNodeOrderMapper dappNodeOrderMapper; private final DappMemberNodeMapper dappMemberNodeMapper; private final DappChargeUsdtMapper dappChargeUsdtMapper; private final DappUsdtPerkEntityMapper dappUsdtPerkEntityMapper; @Override public WalletInfoVo walletInfo() { DappMemberEntity member = LoginUserUtil.getAppUser(); DappMemberEntity memberInfo = dappMemberDao.selectById(member.getId()); WalletInfoVo walletInfo = new WalletInfoVo(); List direct = dappMemberDao.selectChildMemberDirectOrNot(member.getInviteId(), 1, 1); DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(member.getId()); DappWalletMineEntity walletMine = dappWalletMineDao.selectByMemberId(member.getId()); DappMineDataEntity mineData = dappSystemDao.selectMineDataForOne(); walletInfo.setDirectCnt(direct.size()); walletInfo.setInviteId(member.getActiveStatus() == 1 ? member.getInviteId() : "-"); walletInfo.setBalance(walletCoin.getAvailableAmount()); walletInfo.setHasBuy(memberInfo.getActiveStatus()); walletInfo.setOutCnt(memberInfo.getOutCnt()); walletInfo.setProfit(dappFundFlowDao.selectProfitAmountByMemberId(member.getId())); walletInfo.setTfcBalance(walletMine.getAvailableAmount()); walletInfo.setSafePool(mineData.getSafePool()); walletInfo.setAccountType(memberInfo.getAccountType()); DappSystemProfit dappSystemProfit = dappSystemProfitDao.selectByMemberIdAndState(memberInfo.getId(),DappSystemProfit.STATE_IN); walletInfo.setSystemProfitId(ObjectUtil.isEmpty(dappSystemProfit) ? 0L : dappSystemProfit.getId()); BigDecimal directProfit = dappFundFlowDao.selectSumAmountByMemberIdAndTypeAndStatus(memberInfo.getId(),3,2); walletInfo.setDirectProfit(directProfit); BigDecimal levelProfit = dappFundFlowDao.selectSumAmountByMemberIdAndTypeAndStatus(memberInfo.getId(),4,2); walletInfo.setLevelProfit(levelProfit); BigDecimal luckyProfit = dappFundFlowDao.selectSumAmountByMemberIdAndTypeAndStatus(memberInfo.getId(),7,2); walletInfo.setLuckyProfit(luckyProfit); if(DataDictionaryEnum.BIG_BOSS.getCode().equals(memberInfo.getAccountType())){ walletInfo.setRunPercent(new BigDecimal(100)); }else{ walletInfo.setRunPercent(new BigDecimal(90)); } //获取会员节点信息 List dappMemberNodeVos = dappMemberNodeMapper.selectListByMemberId(member.getId()); walletInfo.setDappMemberNodeVos(dappMemberNodeVos); return walletInfo; } @Override public List recordInPage(RecordInPageDto recordInPageDto) { Page page = new Page<>(recordInPageDto.getPageNum(), recordInPageDto.getPageSize()); DappMemberEntity member = LoginUserUtil.getAppUser(); DappFundFlowEntity dappFundFlowEntity = new DappFundFlowEntity(); if (recordInPageDto.getType() != null && recordInPageDto.getType() != 0) { dappFundFlowEntity.setType(recordInPageDto.getType()); } dappFundFlowEntity.setMemberId(member.getId()); // dappFundFlowEntity.setStatus(2); 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 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); } /** * // 第一次{amount: val, fee: 0, txHash: '', type: 1, buyType: 2} *       // 成功{type: 1, txHash: result.transactionHash, id: res.data, flag: 'success', buyType: 2} *       // 失败{type: 1, id: res.data, flag: 'fail', buyType: 2} */ @Override public Long transfer(TransferDto transferDto) { DappMemberEntity member = LoginUserUtil.getAppUser(); String upgrade = redisUtils.getString("APP_UPGRADE"); if ("upgrade".equals(upgrade)) { throw new FebsException("功能升级中"); } // if (transferDto.getType() != 2) { // member = dappMemberDao.selectById(member.getId()); // if (member.getActiveStatus() == 1) { // throw new FebsException("Do not repeat purchase"); // } // } /** * buyType=1,余额购买 */ if (transferDto.getBuyType() == 1) { DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(member.getId()); if (transferDto.getAmount().compareTo(walletCoin.getAvailableAmount()) > 0) { throw new FebsException("Balance Not Enough"); } updateWalletCoinWithLock(transferDto.getAmount(), member.getId(), 2); DappFundFlowEntity fundFlow = new DappFundFlowEntity(member.getId(), transferDto.getAmount().negate(), 1, 2, transferDto.getFee(), transferDto.getTxHash()); dappFundFlowDao.insert(fundFlow); // chainProducer.sendAchieveTreeMsg(member.getId()); } else { /** * buyType=2,钱包购买 */ int type = FundFlowEnum.BUY_NODE.getCode(); // 1-认购 2-充值tfc if (transferDto.getType() == 2) { type = 6; } /** * 第一次请求,生成一条资金流水ID,并且返回。 */ if (transferDto.getId() == null) { /** * 验证节点的价格是否和入参价格一致 */ String nodeCode = transferDto.getNodeCode(); DappNodeOrderEntity dappNodeOrderEntity = dappNodeOrderMapper.selectNodeOrderByNodeCodeForupdate(nodeCode); BigDecimal price = dappNodeOrderEntity.getPrice(); BigDecimal amount = transferDto.getAmount(); if(price.compareTo(amount) != 0){ throw new FebsException("刷新后重试"); // throw new FebsException("Refresh and try again"); } Integer surplusCnt = dappNodeOrderEntity.getSurplusCnt(); if(0 >= surplusCnt){ throw new FebsException("该节点剩余数量为0。"); } /** * 超级节点只允许购买一次 */ if(NodeCodeEnum.SUPER_NODE.getCode().equals(nodeCode)){ DappMemberNodeEntity superNode = dappMemberNodeMapper.selectNodeByMemberIdAndNodeCode( member.getId(), NodeCodeEnum.SUPER_NODE.getCode()); if(ObjectUtil.isNotEmpty(superNode)){ throw new FebsException("超级节点只能购买一次"); } } DappFundFlowEntity fundFlowOld = dappFundFlowDao.selectBymemberIdAndType(member.getId(),type,DappFundFlowEntity.WITHDRAW_STATUS_ING); if(ObjectUtil.isNotEmpty(fundFlowOld)){ //网络问题导致第二次提交前,未成功就关闭了页面 if (fundFlowOld.getStatus() == 1 && StrUtil.isEmpty(fundFlowOld.getFromHash())) { dappFundFlowDao.deleteById(fundFlowOld.getId()); throw new FebsException("Refresh and try again"); } } DappFundFlowEntity fundFlow = new DappFundFlowEntity(member.getId(), transferDto.getAmount(), type, 1, transferDto.getFee(), transferDto.getTxHash(),transferDto.getNodeCode()); dappFundFlowDao.insert(fundFlow); return fundFlow.getId(); } if ("success".equals(transferDto.getFlag())) { DappFundFlowEntity flow = dappFundFlowDao.selectById(transferDto.getId()); if(DappFundFlowEntity.WITHDRAW_STATUS_AGREE == flow.getStatus()){ throw new FebsException("请勿重复提交"); // throw new FebsException("Do not repeat purchase"); } /** * 生成会员节点表记录 */ String nodeCode = transferDto.getNodeCode(); DappNodeOrderEntity dappNodeOrderEntity = dappNodeOrderMapper.selectNodeOrderByNodeCodeForupdate(nodeCode); DappMemberNodeEntity dappMemberNodeEntityNew = new DappMemberNodeEntity( member.getId(), dappNodeOrderEntity.getId(), dappNodeOrderEntity.getNodeCode(), transferDto.getAmount() ); dappMemberNodeMapper.insert(dappMemberNodeEntityNew); Integer surplusCnt = dappNodeOrderEntity.getSurplusCnt(); surplusCnt = surplusCnt - 1; dappNodeOrderEntity.setSurplusCnt(surplusCnt); dappNodeOrderMapper.updateById(dappNodeOrderEntity); /** * 流水关联用户购买节点记录 */ flow.setSystemProfitId(dappMemberNodeEntityNew.getId()); /** * 链上转账的hash值 */ flow.setFromHash(transferDto.getTxHash()); flow.setStatus(DappFundFlowEntity.WITHDRAW_STATUS_AGREE); dappFundFlowDao.updateById(flow); /** * 升级账号类型为对应的节点名称 */ // dappMemberDao.updateMemberAccountType(dappNodeOrderEntity.getNodeName(),member.getId()); /** * 更新账号的状态为已激活-即已经购买节点 */ // dappMemberDao.updateMemberActiveStatus(1,member.getId()); /** * 直推奖励 */ DappMemberEntity dappMemberEntity = dappMemberDao.selectById(member.getId()); String refererId = dappMemberEntity.getRefererId(); DappMemberEntity refererMember = dappMemberDao.selectMemberInfoByInviteId(refererId); DataDictionaryCustom directProfitDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.DIRECT_PROFIT.getType(), DataDictionaryEnum.DIRECT_PROFIT.getCode()); BigDecimal directProfitPercent = new BigDecimal(StrUtil.isEmpty(directProfitDic.getValue()) ? "0.1" : directProfitDic.getValue()); BigDecimal amount = transferDto.getAmount(); BigDecimal directProfit = amount.multiply(directProfitPercent).setScale(6,BigDecimal.ROUND_DOWN); //生成直推奖励的流水 DappFundFlowEntity fundFlow = new DappFundFlowEntity( refererMember.getId(), directProfit, 2, 1, BigDecimal.ZERO, null, dappMemberNodeEntityNew.getId()); dappFundFlowDao.insert(fundFlow); /** * 发送转币消息 */ chainProducer.sendBnbTransferMsg(fundFlow.getId()); BigDecimal subtract = amount.subtract(directProfit); //剩余的钱给分走 DappFundFlowEntity fundFlowEntityProject = new DappFundFlowEntity( 4L, subtract, 3, 1, BigDecimal.ZERO, null, dappMemberNodeEntityNew.getId()); dappFundFlowDao.insert(fundFlowEntityProject); /** * 发送转币消息 */ chainProducer.sendBnbTransferMsg(fundFlowEntityProject.getId()); } else { DappFundFlowEntity flow = dappFundFlowDao.selectById(transferDto.getId()); if (flow.getStatus() == 1) { dappFundFlowDao.deleteById(transferDto.getId()); } } } return null; } @Override public BigDecimal calPrice(PriceDto priceDto) { // String priceStr = redisUtils.getString(AppContants.REDIS_KEY_TFC_NEW_PRICE); DataDictionaryCustom symbolPrice = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.SYMBOL_PRICE.getType(), DataDictionaryEnum.SYMBOL_PRICE.getCode()); DataDictionaryCustom serviceFeeDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.WITHDRAW_SERVICE_FEE.getType(), DataDictionaryEnum.WITHDRAW_SERVICE_FEE.getCode()); BigDecimal amount = priceDto.getAmount(); if (priceDto.getAmount() == null) { amount = BigDecimal.ZERO; } return amount.multiply(new BigDecimal(serviceFeeDic.getValue()).divide(BigDecimal.valueOf(100), 8, RoundingMode.HALF_DOWN)).divide(new BigDecimal(symbolPrice.getValue()), 2, RoundingMode.HALF_UP); } @Override @Transactional(rollbackFor = Exception.class) public void withdraw(WithdrawDto withdrawDto) { /** * USDT提现1%手续费.(扣USDT) * 提币需要*当前a币价格,转换成USDT * A币卖币规则,卖出100%销毁,30%回流底池溢价 */ DappMemberEntity member = LoginUserUtil.getAppUser(); DataDictionaryCustom systemStateDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( PoolEnum.SYSTEM.getType(), PoolEnum.SYSTEM.getCode() ); String value = systemStateDic.getValue(); if("STOP".equals(value)){ throw new FebsException("Not yet open"); } //提币数量 BigDecimal amount = withdrawDto.getAmount(); if(BigDecimal.ZERO.compareTo(amount) >= 0){ throw new FebsException("输入正确的数量"); } DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(member.getId()); if (walletCoin.getAvailableAmount().compareTo(withdrawDto.getAmount()) < 0) { throw new FebsException("可提现的数量不足"); } DataDictionaryCustom aCoinPriceDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( PoolEnum.COIN_A_PRICE.getType(), PoolEnum.COIN_A_PRICE.getCode() ); BigDecimal coinAPrice = new BigDecimal(aCoinPriceDic.getValue()); //预计提现的USDT数量 = 币的数量 * 当前A币的价格 BigDecimal coinUsdtAmount = amount.multiply(coinAPrice); /** * 卖币可享有贡献值,鼓励卖币,例.卖出价值100U获得100贡献值 */ DappUsdtPerkEntity directDappUsdtPerkEntity = dappUsdtPerkEntityMapper.selectByMemberId(member.getId()); if(ObjectUtil.isEmpty(directDappUsdtPerkEntity)){ directDappUsdtPerkEntity = new DappUsdtPerkEntity(); directDappUsdtPerkEntity.setNftDevote(coinUsdtAmount); directDappUsdtPerkEntity.setMemberId(member.getId()); dappUsdtPerkEntityMapper.insert(directDappUsdtPerkEntity); } BigDecimal directNftDevote = directDappUsdtPerkEntity.getNftDevote(); directNftDevote = directNftDevote.add(coinUsdtAmount); directDappUsdtPerkEntity.setNftDevote(directNftDevote); dappUsdtPerkEntityMapper.updateById(directDappUsdtPerkEntity); DataDictionaryCustom toUsdtPercentFeeDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( PoolEnum.WALLET_COIN_TO_USDT_PERCENT.getType(), PoolEnum.WALLET_COIN_TO_USDT_PERCENT.getCode() ); BigDecimal feePercent = new BigDecimal(toUsdtPercentFeeDic.getValue()); //手续费扣除USDT BigDecimal feeUsdtAmount = coinUsdtAmount.multiply(feePercent).setScale(4,BigDecimal.ROUND_DOWN); //实际提现USDT数量,先扣除1%的手续费后,只到账70% DataDictionaryCustom outPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( PoolEnum.WALLET_COIN_OUT_PERCENT.getType(), PoolEnum.WALLET_COIN_OUT_PERCENT.getCode() ); BigDecimal outPercent = new BigDecimal(outPercentDic.getValue()); BigDecimal realUsdtAmount = coinUsdtAmount.subtract(feeUsdtAmount).setScale(4,BigDecimal.ROUND_DOWN); BigDecimal realUsdtAmountFee = realUsdtAmount.multiply(outPercent).setScale(4,BigDecimal.ROUND_DOWN); realUsdtAmount = realUsdtAmount.subtract(realUsdtAmountFee); //减少闪对钱包的币的数量 this.updateWalletCoinWithLock(amount, member.getId(), 2); //增加流水 DappFundFlowEntity dappFundFlowEntity = new DappFundFlowEntity(member.getId(), amount.negate(), FundFlowEnum.WALLET_COIN_TO_USDT.getCode(), 2, BigDecimal.ZERO); dappFundFlowDao.insert(dappFundFlowEntity); //增加流水 DappFundFlowEntity realUsdtAmountFlow = new DappFundFlowEntity(member.getId(), realUsdtAmount.negate(), FundFlowEnum.WALLET_COIN_TO_USDT_W.getCode(), 1, feeUsdtAmount); dappFundFlowDao.insert(realUsdtAmountFlow); //增加提现的记录 MemberCoinWithdrawEntity memberCoinWithdraw = new MemberCoinWithdrawEntity(); memberCoinWithdraw.setMemberId(member.getId()); memberCoinWithdraw.setAddress(member.getAddress()); memberCoinWithdraw.setAmount(realUsdtAmount); memberCoinWithdraw.setFeeAmount(feeUsdtAmount); memberCoinWithdraw.setStatus(MemberCoinWithdrawEntity.STATUS_YES); memberCoinWithdraw.setSymbol("USDT"); memberCoinWithdraw.setFlowId(realUsdtAmountFlow.getId()); memberCoinWithdrawDao.insert(memberCoinWithdraw); //发送提现消息 chainProducer.sendAntACoinOutMsg(realUsdtAmountFlow.getId()); /** * A币卖币规则,卖出100%销毁,30%回流底池溢价 */ coinUsdtAmount = coinUsdtAmount.multiply(outPercent).setScale(4,BigDecimal.ROUND_DOWN); //金本位底池数量 DataDictionaryCustom coinAUsdtPriceDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( PoolEnum.COIN_A_USDT_PRICE.getType(), PoolEnum.COIN_A_USDT_PRICE.getCode() ); BigDecimal coinAUsdtCnt = new BigDecimal(coinAUsdtPriceDic.getValue()); coinAUsdtCnt = coinAUsdtCnt.add(coinUsdtAmount).setScale(4,BigDecimal.ROUND_DOWN); coinAUsdtPriceDic.setValue(coinAUsdtCnt.toString()); dataDictionaryCustomMapper.updateById(coinAUsdtPriceDic); //币本位底池数量 DataDictionaryCustom coinACntDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( PoolEnum.COIN_A_CNT.getType(), PoolEnum.COIN_A_CNT.getCode() ); BigDecimal coinACnt = new BigDecimal(coinACntDic.getValue()); coinACnt = coinACnt.subtract(amount).setScale(4,BigDecimal.ROUND_DOWN); coinACntDic.setValue(coinACnt.toString()); dataDictionaryCustomMapper.updateById(coinACntDic); coinAPrice = coinAUsdtCnt.divide(coinACnt,12,BigDecimal.ROUND_DOWN); aCoinPriceDic.setValue(coinAPrice.toString()); dataDictionaryCustomMapper.updateById(aCoinPriceDic); chainProducer.sendAntKLineMsg(0); } @Override public void updateWalletCoinWithLock(BigDecimal amount, Long memberId, int type) { boolean isSuccess = false; while(!isSuccess) { DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(memberId); if(ObjectUtil.isEmpty(walletCoin)){ return; } // 加 if (type == 1) { walletCoin.setTotalAmount(walletCoin.getTotalAmount().add(amount)); walletCoin.setAvailableAmount(walletCoin.getAvailableAmount().add(amount)); // 减 } else { if (amount.compareTo(walletCoin.getAvailableAmount()) > 0) { throw new FebsException("Balance Not Enough"); } walletCoin.setTotalAmount(walletCoin.getTotalAmount().subtract(amount)); walletCoin.setAvailableAmount(walletCoin.getAvailableAmount().subtract(amount)); } int i = dappWalletCoinDao.updateWithLock(walletCoin); if (i > 0) { isSuccess = true; } } } @Override public void updateWalletMineWithLock(BigDecimal amount, Long memberId, int type) { boolean isSuccess = false; while(!isSuccess) { DappWalletMineEntity walletMine = dappWalletMineDao.selectByMemberId(memberId); if(ObjectUtil.isEmpty(walletMine)){ return; } if (type == 1) { walletMine.setTotalAmount(walletMine.getTotalAmount().add(amount)); walletMine.setAvailableAmount(walletMine.getAvailableAmount().add(amount)); } else { if (amount.compareTo(walletMine.getAvailableAmount()) > 0) { throw new FebsException("Not Enough"); } walletMine.setTotalAmount(walletMine.getTotalAmount().subtract(amount)); walletMine.setAvailableAmount(walletMine.getAvailableAmount().subtract(amount)); } int i = dappWalletMineDao.updateWithLock(walletMine); if (i > 0) { isSuccess = true; } } } @Override public void addFrozenAmountWithLock(BigDecimal amount, Long memberId) { boolean isSuccess = false; while(!isSuccess) { DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(memberId); walletCoin.setTotalAmount(walletCoin.getTotalAmount().add(amount)); walletCoin.setFrozenAmount(walletCoin.getFrozenAmount().add(amount)); int i = dappWalletCoinDao.updateWithLock(walletCoin); if (i > 0) { isSuccess = true; DappFundFlowEntity frozenAmount = new DappFundFlowEntity(memberId, amount, 9, 2, null, null); dappFundFlowDao.insert(frozenAmount); } } } @Override public void releaseFrozenAmountWithLock(Long memberId) { boolean isSuccess = false; while(!isSuccess) { DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(memberId); if (walletCoin.getFrozenAmount().compareTo(BigDecimal.ZERO) <= 0) { return; } BigDecimal frozen = walletCoin.getFrozenAmount(); walletCoin.setAvailableAmount(walletCoin.getAvailableAmount().add(frozen)); walletCoin.setFrozenAmount(walletCoin.getFrozenAmount().subtract(frozen)); int i = dappWalletCoinDao.updateWithLock(walletCoin); if (i > 0) { isSuccess = true; DappFundFlowEntity releaseFrozen = new DappFundFlowEntity(memberId, frozen, 10, 2, null, null); dappFundFlowDao.insert(releaseFrozen); DappFundFlowEntity releaseFrozenNegate = new DappFundFlowEntity(memberId, frozen.negate(), 9, 2, null, null); dappFundFlowDao.insert(releaseFrozenNegate); } } } @Override public DappWalletCoinEntity findByMemberId(Long memberId) { return dappWalletCoinDao.selectByMemberId(memberId); } @Override public void transferAgain(TransferDto transferDto) { Long memberId = transferDto.getMemberId(); DappMemberEntity member = dappMemberDao.selectById(memberId); String upgrade = redisUtils.getString("APP_UPGRADE"); if ("upgrade".equals(upgrade)) { throw new FebsException("功能升级中"); } if ("success".equals(transferDto.getFlag())) { //是否已经加入动能 DappSystemProfit dappSystemProfitIng = dappSystemProfitDao.selectByMemberIdAndState(member.getId(), DappSystemProfit.STATE_IN); if(ObjectUtil.isNotEmpty(dappSystemProfitIng)){ return; } //插入一条会员入列记录,即加入动能队列 DappSystemProfit dappSystemProfit = new DappSystemProfit(member.getId(), transferDto.getAmount()); dappSystemProfitDao.insert(dappSystemProfit); DappFundFlowEntity flow = dappFundFlowDao.selectById(transferDto.getId()); flow.setFromHash(transferDto.getTxHash()); flow.setSystemProfitId(dappSystemProfit.getId()); flow.setStatus(DappFundFlowEntity.WITHDRAW_STATUS_AGREE); dappFundFlowDao.updateById(flow); //直接拿走0.05个BNB放入技术方 DataDictionaryCustom systemProfit = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.SYSTEM_PROFIT.getType(), DataDictionaryEnum.SYSTEM_PROFIT.getCode()); String systemProfitStr = StrUtil.isEmpty(systemProfit.getValue()) ? "0.05" : systemProfit.getValue(); DappFundFlowEntity systemProfitFlow = new DappFundFlowEntity(1L, new BigDecimal(systemProfitStr), 2, 1, BigDecimal.ZERO, null,dappSystemProfit.getId()); dappFundFlowDao.insert(systemProfitFlow); //发送转币消息 chainProducer.sendBnbTransferMsg(systemProfitFlow.getId()); //直接返利30%给直接上级 DappMemberEntity dappMemberEntity = dappMemberDao.selectById(member.getId()); String refererId = dappMemberEntity.getRefererId(); DappMemberEntity refererMember = dappMemberDao.selectMemberInfoByInviteId(refererId); DataDictionaryCustom directProfitSet = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.DIRECT_PROFIT.getType(), DataDictionaryEnum.DIRECT_PROFIT.getCode()); BigDecimal directProfitStr = new BigDecimal(StrUtil.isEmpty(directProfitSet.getValue()) ? "0.3" : directProfitSet.getValue()); BigDecimal directProfit = (transferDto.getAmount().subtract(new BigDecimal(systemProfitStr))).multiply(directProfitStr).setScale(6,BigDecimal.ROUND_DOWN); DappFundFlowEntity fundFlow = new DappFundFlowEntity(refererMember.getId(), directProfit, 3, 1, BigDecimal.ZERO, null,dappSystemProfit.getId()); dappFundFlowDao.insert(fundFlow); //发送转币消息 chainProducer.sendBnbTransferMsg(fundFlow.getId()); //层级奖励30% chainProducer.sendLevelProfitMsg(dappSystemProfit.getId()); //发送一个消息,计算当前是否有人可以出局 chainProducer.sendMemberOutMsg(dappSystemProfit.getId()); } } @Override public Long transferA(TransferADto transferADto) { DappMemberEntity member = LoginUserUtil.getAppUser(); DappMemberEntity dappMemberEntity = dappMemberDao.selectById(member.getId()); DataDictionaryCustom systemStateDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( PoolEnum.SYSTEM.getType(), PoolEnum.SYSTEM.getCode() ); String value = systemStateDic.getValue(); if("STOP".equals(value)){ throw new FebsException("Not yet open"); } String upgrade = redisUtils.getString("APP_UPGRADE"); if ("upgrade".equals(upgrade)) { throw new FebsException("功能升级中"); } // if (transferADto.getType() != 2) { // member = dappMemberDao.selectById(member.getId()); // if (member.getActiveStatus() == 1) { // throw new FebsException("Do not repeat purchase"); // } // } /** * buyType=1,余额购买 */ if (transferADto.getBuyType() == 1) { DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(member.getId()); if (transferADto.getAmount().compareTo(walletCoin.getAvailableAmount()) > 0) { throw new FebsException("Balance Not Enough"); } updateWalletCoinWithLock(transferADto.getAmount(), member.getId(), 2); DappFundFlowEntity fundFlow = new DappFundFlowEntity( member.getId(), transferADto.getAmount().negate(), FundFlowEnum.BUY_A_COIN.getCode(), 2, transferADto.getFee(), transferADto.getTxHash()); dappFundFlowDao.insert(fundFlow); } else { /** * buyType=2,钱包购买 * 4:入金,买入A币 */ int type = FundFlowEnum.BUY_A_COIN.getCode(); // 1-认购 2-充值tfc if (transferADto.getType() == 2) { type = 6; } /** * 第一次请求,生成一条资金流水ID,并且返回。 */ if (transferADto.getId() == null) { /** * 查询会员是否已经有正在进行中的入金记录 */ DappFundFlowEntity fundFlowOld = dappFundFlowDao.selectBymemberIdAndType(member.getId(),type,DappFundFlowEntity.WITHDRAW_STATUS_ING); if(ObjectUtil.isNotEmpty(fundFlowOld)){ //网络问题导致第二次提交前,未成功就关闭了页面 if (fundFlowOld.getStatus() == 1 && StrUtil.isEmpty(fundFlowOld.getFromHash())) { dappFundFlowDao.deleteById(fundFlowOld.getId()); throw new FebsException("Refresh and try again"); } } /** * 入金限制 * 每人总共入金100U */ BigDecimal amountIn = transferADto.getAmount(); if(amountIn.compareTo(new BigDecimal(100)) != 0){ throw new FebsException("Limit per address 100 USDT"); } BigDecimal amountInLast = dappChargeUsdtMapper.selectByMaxAmountMemberId(member.getId()); if(BigDecimal.ZERO.compareTo(amountInLast) < 0){ throw new FebsException("Limit per address 100 USDT"); } /** * 验证账户是否有入金金额的10%的AUSD */ DappUsdtPerkEntity dappUsdtPerkEntity = dappUsdtPerkEntityMapper.selectByMemberId(member.getId()); if(ObjectUtil.isEmpty(dappUsdtPerkEntity)){ dappUsdtPerkEntity = new DappUsdtPerkEntity(); dappUsdtPerkEntity.setMemberId(member.getId()); dappUsdtPerkEntityMapper.insert(dappUsdtPerkEntity); } BigDecimal ausdAmount = dappUsdtPerkEntity.getAusdAmount(); DataDictionaryCustom ausdPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( PoolEnum.TRANSFER_A_AUSD_PERCENT.getType(), PoolEnum.TRANSFER_A_AUSD_PERCENT.getCode() ); BigDecimal ausdPercent = new BigDecimal(ausdPercentDic.getValue()); BigDecimal ausdPercentUsdt = transferADto.getAmount().multiply(ausdPercent); DataDictionaryCustom ausdPriceDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( PoolEnum.TRANSFER_A_AUSD_PRICE.getType(), PoolEnum.TRANSFER_A_AUSD_PRICE.getCode() ); BigDecimal ausdPrice = new BigDecimal(ausdPriceDic.getValue()); BigDecimal ausdAmountNeed = ausdPercentUsdt.divide(ausdPrice); if(BigDecimal.ZERO.compareTo(ausdAmount) >= 0){ throw new FebsException("AUSDT数量不足"); } if(ausdAmountNeed.compareTo(ausdAmount) > 0){ throw new FebsException("AUSDT数量不足"); } /** * 出局复投要求等于戓大于自己上次投资金额 */ BigDecimal maxAmount = dappChargeUsdtMapper.selectByMaxAmountMemberId(member.getId()); if(maxAmount.compareTo(transferADto.getAmount()) > 0){ throw new FebsException("投资金额不能小于"+maxAmount.setScale(4,BigDecimal.ROUND_DOWN)); } //生成一条进行中的入金资金流水记录 DappFundFlowEntity fundFlow = new DappFundFlowEntity( member.getId(), transferADto.getAmount(), type, 1, ausdAmountNeed, transferADto.getTxHash()); dappFundFlowDao.insert(fundFlow); return fundFlow.getId(); } if ("success".equals(transferADto.getFlag())) { DappFundFlowEntity flow = dappFundFlowDao.selectById(transferADto.getId()); if(DappFundFlowEntity.WITHDRAW_STATUS_AGREE == flow.getStatus()){ throw new FebsException("请勿重复提交"); } /** * 生成会员入金买A币的记录 */ DappChargeUsdtEntity dappChargeUsdtEntity = new DappChargeUsdtEntity( member.getId(), dappMemberEntity.getAddress(), transferADto.getTxHash(), 2, transferADto.getAmount(), BigDecimal.ZERO, BigDecimal.ZERO); dappChargeUsdtMapper.insert(dappChargeUsdtEntity); /** * 减少用户的AUSD数量 */ DappUsdtPerkEntity dappUsdtPerkEntity = dappUsdtPerkEntityMapper.selectByMemberId(member.getId()); BigDecimal ausdAmount = dappUsdtPerkEntity.getAusdAmount(); ausdAmount = ausdAmount.subtract(flow.getFee()).setScale(4,BigDecimal.ROUND_DOWN); dappUsdtPerkEntity.setAusdAmount(ausdAmount); dappUsdtPerkEntityMapper.updateById(dappUsdtPerkEntity); /** * 流水关联用户购买记录 */ flow.setSystemProfitId(dappChargeUsdtEntity.getId()); /** * 链上转账的hash值 */ flow.setFromHash(transferADto.getTxHash()); flow.setStatus(DappFundFlowEntity.WITHDRAW_STATUS_AGREE); dappFundFlowDao.updateById(flow); /** * 发送消息处理返利逻辑 */ chainProducer.sendAntACoinInMsg(flow.getId()); /** * 发送消息处理代理升级 */ chainProducer.sendAntMemberLevelMsg(member.getId()); } else { DappFundFlowEntity flow = dappFundFlowDao.selectById(transferADto.getId()); if (flow.getStatus() == 1) { dappFundFlowDao.deleteById(transferADto.getId()); } } } return null; } @Override @Transactional(rollbackFor = Exception.class) public void mineToCoin(MineToCoinDto mineToCoinDto) { /** * 资产钱包转帐到闪兑钱包3% 手续费(扣币) * 4、增加闪对钱包 * 5、增加流水 */ DappMemberEntity member = LoginUserUtil.getAppUser(); DappMemberEntity dappMemberEntity = dappMemberDao.selectById(member.getId()); BigDecimal aCoinCnt = mineToCoinDto.getACoinCnt(); if(BigDecimal.ZERO.compareTo(aCoinCnt) >= 0){ throw new FebsException("输入正确的数量"); } DappWalletMineEntity dappWalletMineEntity = dappWalletMineDao.selectByMemberId(dappMemberEntity.getId()); BigDecimal availableAmount = dappWalletMineEntity.getAvailableAmount(); if(availableAmount.compareTo(aCoinCnt) < 0){ throw new FebsException("数量不足"); } //减少资产钱包 this.updateWalletMineWithLock(aCoinCnt,dappMemberEntity.getId(),2); //插入资产闪对的流水 DappFundFlowEntity aCoinCntFlow = new DappFundFlowEntity( dappMemberEntity.getId(), aCoinCnt.negate(), FundFlowEnum.WALLET_MINE_TO_COIN.getCode(), 2, BigDecimal.ZERO); dappFundFlowDao.insert(aCoinCntFlow); //闪对钱包3% 手续费(扣币) DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( PoolEnum.WALLET_MINE_TO_COIN_PERCENT.getType(), PoolEnum.WALLET_MINE_TO_COIN_PERCENT.getCode()); BigDecimal feePercent = new BigDecimal(StrUtil.isEmpty(dic.getValue()) ? "0.03" : dic.getValue()); //手续费 BigDecimal feeCnt = aCoinCnt.multiply(feePercent).setScale(4,BigDecimal.ROUND_DOWN); //闪对钱包获取的 BigDecimal aCoinCntReal = aCoinCnt.subtract(feeCnt).setScale(4, BigDecimal.ROUND_DOWN); //增加闪对钱包 this.updateWalletCoinWithLock(aCoinCntReal,dappMemberEntity.getId(),1); //插入资产闪对的流水 DappFundFlowEntity dappFundFlowEntity = new DappFundFlowEntity( dappMemberEntity.getId(), aCoinCntReal, FundFlowEnum.WALLET_MINE_TO_COIN.getCode(), 2, BigDecimal.ZERO); dappFundFlowDao.insert(dappFundFlowEntity); //插入资产闪对手续费的流水 DappFundFlowEntity memberFeeflow = new DappFundFlowEntity( dappMemberEntity.getId(), feeCnt.negate(), FundFlowEnum.WALLET_MINE_TO_COIN_FEE.getCode(), 2, BigDecimal.ZERO); dappFundFlowDao.insert(memberFeeflow); //插入资产闪对手续费的流水 DappFundFlowEntity dappFundFlowEntityFee = new DappFundFlowEntity( 295L, feeCnt, FundFlowEnum.WALLET_MINE_TO_COIN_FEE.getCode(), 2, BigDecimal.ZERO); dappFundFlowDao.insert(dappFundFlowEntityFee); this.updateWalletMineWithLock(feeCnt,295L,1); } @Override public Long transferAusd(TransferAusdDto transferAusdDto) { DappMemberEntity member = LoginUserUtil.getAppUser(); DappMemberEntity dappMemberEntity = dappMemberDao.selectById(member.getId()); String upgrade = redisUtils.getString("APP_UPGRADE"); if ("upgrade".equals(upgrade)) { throw new FebsException("功能升级中"); } // if (transferAusdDto.getType() != 2) { // member = dappMemberDao.selectById(member.getId()); // if (member.getActiveStatus() == 1) { // throw new FebsException("Do not repeat purchase"); // } // } /** * buyType=1,余额购买 */ if (transferAusdDto.getBuyType() == 1) { DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(member.getId()); if (transferAusdDto.getAmount().compareTo(walletCoin.getAvailableAmount()) > 0) { throw new FebsException("Balance Not Enough"); } updateWalletCoinWithLock(transferAusdDto.getAmount(), member.getId(), 2); DappFundFlowEntity fundFlow = new DappFundFlowEntity( member.getId(), transferAusdDto.getAmount().negate(), FundFlowEnum.BUY_AUSD_COIN.getCode(), 2, transferAusdDto.getFee(), transferAusdDto.getTxHash()); dappFundFlowDao.insert(fundFlow); } else { /** * buyType=2,钱包购买 * 4:入金,买入A币 */ int type = FundFlowEnum.BUY_AUSD_COIN.getCode(); // 1-认购 2-充值tfc if (transferAusdDto.getType() == 2) { type = 6; } /** * 第一次请求,生成一条资金流水ID,并且返回。 */ if (transferAusdDto.getId() == null) { /** * 查询会员是否已经有正在进行中的入金记录 */ DappFundFlowEntity fundFlowOld = dappFundFlowDao.selectBymemberIdAndType(member.getId(),type,DappFundFlowEntity.WITHDRAW_STATUS_ING); if(ObjectUtil.isNotEmpty(fundFlowOld)){ //网络问题导致第二次提交前,未成功就关闭了页面 if (fundFlowOld.getStatus() == 1 && StrUtil.isEmpty(fundFlowOld.getFromHash())) { dappFundFlowDao.deleteById(fundFlowOld.getId()); throw new FebsException("Refresh and try again"); } } //生成一条进行中的入金资金流水记录 DappFundFlowEntity fundFlow = new DappFundFlowEntity( member.getId(), transferAusdDto.getAmount(), type, 1, transferAusdDto.getFee(), transferAusdDto.getTxHash()); dappFundFlowDao.insert(fundFlow); return fundFlow.getId(); } if ("success".equals(transferAusdDto.getFlag())) { DappFundFlowEntity flow = dappFundFlowDao.selectById(transferAusdDto.getId()); if(DappFundFlowEntity.WITHDRAW_STATUS_AGREE == flow.getStatus()){ throw new FebsException("请勿重复提交"); } /** * 增加用户的AUSD数量 */ BigDecimal amount = transferAusdDto.getAmount(); DataDictionaryCustom ausdPriceDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( PoolEnum.TRANSFER_A_AUSD_PRICE.getType(), PoolEnum.TRANSFER_A_AUSD_PRICE.getCode() ); BigDecimal ausdPrice = new BigDecimal(ausdPriceDic.getValue()); BigDecimal ausdCnt = amount.divide(ausdPrice, 4, BigDecimal.ROUND_DOWN); DappUsdtPerkEntity dappUsdtPerkEntity = dappUsdtPerkEntityMapper.selectByMemberId(member.getId()); if(ObjectUtil.isEmpty(dappUsdtPerkEntity)){ dappUsdtPerkEntity = new DappUsdtPerkEntity(); dappUsdtPerkEntity.setMemberId(member.getId()); dappUsdtPerkEntity.setAmount(BigDecimal.ZERO); dappUsdtPerkEntity.setAusdAmount(BigDecimal.ZERO); dappUsdtPerkEntityMapper.insert(dappUsdtPerkEntity); } BigDecimal ausdAmount = dappUsdtPerkEntity.getAusdAmount(); ausdAmount = ausdAmount.add(ausdCnt).setScale(4,BigDecimal.ROUND_DOWN); dappUsdtPerkEntity.setAusdAmount(ausdAmount); dappUsdtPerkEntityMapper.updateById(dappUsdtPerkEntity); /** * 链上转账的hash值 */ flow.setFromHash(transferAusdDto.getTxHash()); flow.setStatus(DappFundFlowEntity.WITHDRAW_STATUS_AGREE); dappFundFlowDao.updateById(flow); } else { DappFundFlowEntity flow = dappFundFlowDao.selectById(transferAusdDto.getId()); if (flow.getStatus() == 1) { dappFundFlowDao.deleteById(transferAusdDto.getId()); } } } return null; } @Override public List getRecordVoInPage(RecordInPageDto recordInPageDto) { Page page = new Page<>(recordInPageDto.getPageNum(), recordInPageDto.getPageSize()); DappMemberEntity member = LoginUserUtil.getAppUser(); DappFundFlowEntity dappFundFlowEntity = new DappFundFlowEntity(); if (recordInPageDto.getType() != null && recordInPageDto.getType() != 0) { dappFundFlowEntity.setType(recordInPageDto.getType()); } dappFundFlowEntity.setMemberId(member.getId()); IPage records = dappFundFlowDao.selectVoInPage(page, dappFundFlowEntity); return records.getRecords(); } @Override public void roundCoin(RoundCoinDto roundCoinDto) { DappMemberEntity member = LoginUserUtil.getAppUser(); DappMemberEntity dappMemberEntity = dappMemberDao.selectById(member.getId()); String address = roundCoinDto.getAddress(); DappMemberEntity memberParent = dappMemberDao.selectByAddress(address, null); if(ObjectUtil.isEmpty(memberParent)){ throw new FebsException("请输入正确的地址"); } BigDecimal coinCnt = roundCoinDto.getCoinCnt(); if(BigDecimal.ZERO.compareTo(coinCnt) >= 0){ throw new FebsException("输入正确的数量"); } DappWalletCoinEntity dappWalletCoinEntity = dappWalletCoinDao.selectByMemberId(dappMemberEntity.getId()); BigDecimal availableAmount = dappWalletCoinEntity.getAvailableAmount(); if(availableAmount.compareTo(coinCnt) < 0){ throw new FebsException("数量不足"); } //减少闪兑钱包 this.updateWalletCoinWithLock(coinCnt,dappMemberEntity.getId(),2); //插入资产闪对的流水 DappFundFlowEntity aCoinCntFlow = new DappFundFlowEntity( dappMemberEntity.getId(), coinCnt.negate(), FundFlowEnum.ANDAO_MEMBER_TO_MENBER.getCode(), 2, BigDecimal.ZERO); dappFundFlowDao.insert(aCoinCntFlow); //闪对钱包20% 手续费(扣币) DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( PoolEnum.ANDAO_MEMBER_TO_MENBER_PERCENT.getType(), PoolEnum.ANDAO_MEMBER_TO_MENBER_PERCENT.getCode()); BigDecimal feePercent = new BigDecimal(StrUtil.isEmpty(dic.getValue()) ? "0.2" : dic.getValue()); //手续费 BigDecimal feeCnt = coinCnt.multiply(feePercent).setScale(4,BigDecimal.ROUND_DOWN); //闪对钱包获取的 BigDecimal aCoinCntReal = coinCnt.subtract(feeCnt).setScale(4, BigDecimal.ROUND_DOWN); //增加闪对钱包 this.updateWalletCoinWithLock(aCoinCntReal,memberParent.getId(),1); //插入资产闪对的流水 DappFundFlowEntity dappFundFlowEntity = new DappFundFlowEntity( memberParent.getId(), aCoinCntReal, FundFlowEnum.ANDAO_MEMBER_TO_MENBER.getCode(), 2, BigDecimal.ZERO); dappFundFlowDao.insert(dappFundFlowEntity); //金本位底池数量 DataDictionaryCustom coinAUsdtPriceDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( PoolEnum.COIN_A_USDT_PRICE.getType(), PoolEnum.COIN_A_USDT_PRICE.getCode() ); BigDecimal coinAUsdtCnt = new BigDecimal(coinAUsdtPriceDic.getValue()); //币本位底池数量 DataDictionaryCustom coinACntDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( PoolEnum.COIN_A_CNT.getType(), PoolEnum.COIN_A_CNT.getCode() ); BigDecimal coinACnt = new BigDecimal(coinACntDic.getValue()); coinACnt = coinACnt.subtract(feeCnt).setScale(4,BigDecimal.ROUND_DOWN); coinACntDic.setValue(coinACnt.toString()); dataDictionaryCustomMapper.updateById(coinACntDic); DataDictionaryCustom aCoinPriceDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( PoolEnum.COIN_A_PRICE.getType(), PoolEnum.COIN_A_PRICE.getCode() ); BigDecimal coinAPrice = new BigDecimal(aCoinPriceDic.getValue()); coinAPrice = coinAUsdtCnt.divide(coinACnt,12,BigDecimal.ROUND_DOWN); aCoinPriceDic.setValue(coinAPrice.toString()); dataDictionaryCustomMapper.updateById(aCoinPriceDic); chainProducer.sendAntKLineMsg(0); } @Override public void roundCoinAusdt(RoundCoinDto roundCoinDto) { DappMemberEntity member = LoginUserUtil.getAppUser(); DappMemberEntity dappMemberEntity = dappMemberDao.selectById(member.getId()); String address = roundCoinDto.getAddress(); DappMemberEntity memberParent = dappMemberDao.selectByAddress(address, null); if(ObjectUtil.isEmpty(memberParent)){ throw new FebsException("请输入正确的地址"); } BigDecimal coinCnt = roundCoinDto.getCoinCnt(); if(BigDecimal.ZERO.compareTo(coinCnt) >= 0){ throw new FebsException("输入正确的数量"); } DappUsdtPerkEntity dappUsdtPerkEntity = dappUsdtPerkEntityMapper.selectByMemberId(dappMemberEntity.getId()); BigDecimal availableAmount = dappUsdtPerkEntity.getAusdAmount(); if(availableAmount.compareTo(coinCnt) < 0){ throw new FebsException("数量不足"); } dappUsdtPerkEntity.setAusdAmount(availableAmount.subtract(coinCnt)); dappUsdtPerkEntityMapper.updateById(dappUsdtPerkEntity); //插入资产闪对的流水 DappFundFlowEntity aCoinCntFlow = new DappFundFlowEntity( dappMemberEntity.getId(), coinCnt.negate(), FundFlowEnum.AUSDT_MEMBER_TO_MENBER.getCode(), 2, BigDecimal.ZERO); dappFundFlowDao.insert(aCoinCntFlow); DappUsdtPerkEntity parentEntity = dappUsdtPerkEntityMapper.selectByMemberId(memberParent.getId()); BigDecimal availableAmountParent = parentEntity.getAusdAmount(); parentEntity.setAusdAmount(availableAmountParent.add(coinCnt)); dappUsdtPerkEntityMapper.updateById(parentEntity); //插入资产闪对的流水 DappFundFlowEntity aCoinCntFlowParent = new DappFundFlowEntity( memberParent.getId(), coinCnt, FundFlowEnum.AUSDT_MEMBER_TO_MENBER.getCode(), 2, BigDecimal.ZERO); dappFundFlowDao.insert(aCoinCntFlowParent); } }