| | |
| | | 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.dapp.dto.RecordInPageDto; |
| | | import cc.mrbird.febs.dapp.dto.WalletOperateDto; |
| | | import cc.mrbird.febs.common.utils.RedisUtils; |
| | | 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.conditions.query.QueryWrapper; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import lombok.RequiredArgsConstructor; |
| | |
| | | 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 |
| | |
| | | private final DappWalletCoinDao dappWalletCoinDao; |
| | | 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; |
| | | private final DappMemberFundMapper dappMemberFundMapper; |
| | | |
| | | @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); |
| | | |
| | | QueryWrapper<DappMemberFund> fundQueryWrapper = new QueryWrapper<>(); |
| | | fundQueryWrapper.eq("member_id",memberId); |
| | | List<DappMemberFund> ccTodays = dappMemberFundMapper.selectList(fundQueryWrapper); |
| | | BigDecimal ccToday = BigDecimal.ZERO; |
| | | if(CollUtil.isNotEmpty(ccTodays)){ |
| | | for(DappMemberFund dappMemberFund : ccTodays){ |
| | | BigDecimal usdtCoin = dappMemberFund.getUsdtCoin(); |
| | | BigDecimal coinTarget = dappMemberFund.getCoinTarget(); |
| | | BigDecimal add = coinTarget.add(usdtCoin); |
| | | ccToday = ccToday.add(add); |
| | | } |
| | | } |
| | | walletInfo.setCcToday(ccToday); |
| | | |
| | | List<DappMemberFund> dappMemberFunds = dappMemberFundMapper.selectList(null); |
| | | walletInfo.setCcTotal(CollUtil.isEmpty(dappMemberFunds) ? BigDecimal.ZERO : |
| | | dappMemberFunds.stream().map(DappMemberFund::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(8,BigDecimal.ROUND_DOWN)); |
| | | |
| | | List<DappAchieve> dappAchieves = dappAchieveMapper.selectListByMemberId(memberId); |
| | | |
| | | BigDecimal goldAmountDone = dappAchieveMapper.selectGoldAmountByMemberId(memberId); |
| | | BigDecimal coinAmountDone = dappAchieveMapper.selectCoinAmountByMemberId(memberId); |
| | | if(CollUtil.isNotEmpty(dappAchieves)){ |
| | | BigDecimal goldAmount = dappAchieves.stream().map(DappAchieve::getGoldAmount).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(8,BigDecimal.ROUND_DOWN); |
| | | BigDecimal coinAmount = dappAchieves.stream().map(DappAchieve::getCoinAmount).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(8,BigDecimal.ROUND_DOWN); |
| | | BigDecimal goldAmountAva = goldAmount.subtract(goldAmountDone);//金本位剩余 |
| | | BigDecimal coinAmountAva = coinAmount.subtract(coinAmountDone);//币本位剩余 |
| | | if(goldAmountAva.compareTo(new BigDecimal(0.001)) > 0){ |
| | | walletInfo.setGoldAmount(goldAmountAva); |
| | | }else{ |
| | | walletInfo.setGoldAmount(BigDecimal.ZERO); |
| | | } |
| | | if(coinAmountAva.compareTo(new BigDecimal(0.001)) > 0){ |
| | | walletInfo.setCoinAmount(coinAmountAva); |
| | | }else{ |
| | | walletInfo.setCoinAmount(BigDecimal.ZERO); |
| | | } |
| | | }else{ |
| | | walletInfo.setGoldAmount(BigDecimal.ZERO); |
| | | walletInfo.setCoinAmount(BigDecimal.ZERO); |
| | | } |
| | | |
| | | BigDecimal gfaDays = new BigDecimal(redisUtils.getString(DataDicEnum.GFA_DAYS.getValue())).setScale(2,BigDecimal.ROUND_DOWN); |
| | | walletInfo.setGfaDays(gfaDays); |
| | | |
| | | return walletInfo; |
| | | } |
| | | |
| | |
| | | public void change(WalletOperateDto walletOperateDto) { |
| | | DappMemberEntity member = LoginUserUtil.getAppUser(); |
| | | |
| | | BigDecimal ethUsdtPrice = new BigDecimal("1234"); |
| | | BigDecimal ethUsdtPrice = (BigDecimal) redisUtils.get(AppContants.REDIS_KEY_ETH_NEW_PRICE); |
| | | |
| | | 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); |
| | | DappFundFlowEntity fund = new DappFundFlowEntity(member.getId(), walletOperateDto.getAmount(), AppContants.MONEY_TYPE_CHANGE, 2, (String) 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()); |
| | |
| | | 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); |
| | | 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); |
| | | } |
| | |
| | | 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("可用金额不足"); |
| | | } |
| | | |
| | | // TODO 并发加悲观锁 |
| | | 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().subtract(walletOperateDto.getAmount())); |
| | | walletCoin.setFrozenAmount(walletCoin.getFrozenAmount().add(walletOperateDto.getAmount())); |
| | | dappWalletCoinDao.updateById(walletCoin); |
| | | |
| | | DappFundFlowEntity fund = new DappFundFlowEntity(member.getId(), walletOperateDto.getAmount().negate(), AppContants.MONEY_TYPE_WITHDRAWAL, 1); |
| | | 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); |
| | |
| | | |
| | | @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()); |
| | | } |
| | | if (recordInPageDto.getState() != null && recordInPageDto.getState() != 0) { |
| | | dappFundFlowEntity.setType(recordInPageDto.getState()); |
| | | } |
| | | 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(); |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | 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); |
| | | dappFundFlowDao.updateById(fundFlow); |
| | | } else if (type == 2) { |
| | | fundFlow.setStatus(DappFundFlowEntity.WITHDRAW_STATUS_DISAGREE); |
| | | dappFundFlowDao.updateById(fundFlow); |
| | | |
| | | DappMemberEntity dappMemberEntity = dappMemberDao.selectById(fundFlow.getMemberId()); |
| | | //流水记录的金额是一个负数 |
| | | dappMemberEntity.setUsdtBalance(dappMemberEntity.getUsdtBalance().subtract(fundFlow.getAmount())); |
| | | dappMemberDao.updateUsdtBalanceWithVersion(dappMemberEntity); |
| | | } else { |
| | | throw new FebsException("参数错误"); |
| | | } |
| | | |
| | | dappFundFlowDao.updateById(fundFlow); |
| | | } |
| | | |
| | | @Override |
| | |
| | | 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(); |
| | | // QueryWrapper<DappFundFlowEntity> objectQueryWrapper = new QueryWrapper<>(); |
| | | // objectQueryWrapper.eq("type" ,FlowTypeEnum.ZHI_YA.getValue()); |
| | | // objectQueryWrapper.eq("status" ,DappFundFlowEntity.WITHDRAW_STATUS_AGREE); |
| | | // objectQueryWrapper.eq("member_id" ,member.getId()); |
| | | // List<DappFundFlowEntity> dappFundFlowEntities = dappFundFlowDao.selectList(objectQueryWrapper); |
| | | |
| | | List<DappFundFlowEntity> dappFundFlowEntities = dappFundFlowDao.selectAmountTotalByTypeAndMemberIdAndDateAndState( |
| | | member.getId(), |
| | | FlowTypeEnum.ZHI_YA.getValue(), |
| | | DappFundFlowEntity.WITHDRAW_STATUS_AGREE, |
| | | new Date()); |
| | | BigDecimal zhiyaAmount = new BigDecimal(redisUtils.getString(DataDicEnum.MEMBER_ZHIYA_AMOUNT.getValue())); |
| | | |
| | | Integer zhiyaTime = Integer.parseInt(redisUtils.getString(DataDicEnum.MEMBER_ZHIYA_TIME.getValue())); |
| | | if(CollUtil.isNotEmpty(dappFundFlowEntities)){ |
| | | if(dappFundFlowEntities.size() >= zhiyaTime){ |
| | | throw new FebsException("今日暂停质押"); |
| | | } |
| | | BigDecimal teamAchieveMemberSum = dappFundFlowEntities.stream().map(DappFundFlowEntity::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add).negate(); |
| | | if(zhiyaAmount.compareTo(teamAchieveMemberSum.add(transferDto.getAmount())) < 0){ |
| | | throw new FebsException("今日最多质押"+zhiyaAmount.subtract(teamAchieveMemberSum).setScale(4,BigDecimal.ROUND_DOWN)); |
| | | } |
| | | } |
| | | |
| | | |
| | | 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(zhiyaAmount) > 0) { |
| | | throw new FebsException("今日最多质押"+zhiyaAmount); |
| | | } |
| | | } 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.setPrice(transferDto.getPrice()); |
| | | 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); |
| | | |
| | | /** |
| | | * 计算金本位和币本位 |
| | | * 金本位:数量*价格*70*产矿百分比 |
| | | * 币本位:数量*30*产矿百分比 |
| | | */ |
| | | BigDecimal price = dappAchieve.getPrice(); |
| | | BigDecimal goldAmount = amount.multiply(price).multiply(new BigDecimal("0.7")).multiply(achieveOut).setScale(8, BigDecimal.ROUND_DOWN); |
| | | BigDecimal coinAmount = amount.multiply(new BigDecimal("0.3")).multiply(achieveOut).setScale(8, BigDecimal.ROUND_DOWN); |
| | | dappAchieve.setGoldAmount(goldAmount); |
| | | dappAchieve.setCoinAmount(coinAmount); |
| | | dappAchieveMapper.insert(dappAchieve); |
| | | |
| | | asyncCjService.insertTeamPerk(flow.getId(), dappAchieve.getId()); |
| | | // asyncCjService.calculateAchieve(dappAchieve); |
| | | |
| | | //发送一个延时队列消息。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()); |
| | | IPage<DappAchieve> dappAchieveIPage = dappAchieveMapper.selectInPage(page, dappAchieve); |
| | | List<DappAchieve> records = dappAchieveIPage.getRecords(); |
| | | if(CollUtil.isNotEmpty(records)){ |
| | | for(DappAchieve dappAchieve1 : records){ |
| | | dappAchieve1.setUsdtAmount(dappAchieve1.getAmount().multiply(dappAchieve1.getPrice()).setScale(2,BigDecimal.ROUND_DOWN)); |
| | | } |
| | | } |
| | | return dappAchieveIPage; |
| | | } |
| | | |
| | | @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(); |
| | | |
| | | dappMemberEntity.setBalance(balance.subtract(amount).setScale(2,BigDecimal.ROUND_DOWN)); |
| | | dappMemberDao.updateBalanceWithVersion(dappMemberEntity); |
| | | }else{ |
| | | if(new BigDecimal("1").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(); |
| | | |
| | | dappMemberEntity.setUsdtBalance(usdtBalance.subtract(amount).setScale(2,BigDecimal.ROUND_DOWN)); |
| | | dappMemberDao.updateUsdtBalanceWithVersion(dappMemberEntity); |
| | | } |
| | | |
| | | 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(); |
| | | } |
| | | |
| | | @Override |
| | | public List<DappMemberFund> memberFundList(RecordInPageDto recordInPageDto) { |
| | | DappMemberEntity member = LoginUserUtil.getAppUser(); |
| | | Page<DappMemberFund> page = new Page<>(recordInPageDto.getPageNum(), recordInPageDto.getPageSize()); |
| | | DappMemberFund dappMemberFund = new DappMemberFund(); |
| | | dappMemberFund.setMemberId(member.getId()); |
| | | IPage<DappMemberFund> records = dappFundFlowDao.memberFundList(page, dappMemberFund); |
| | | return records.getRecords(); |
| | | } |
| | | } |