From 29310bedd35effb09afa54617a0cfd10a079262e Mon Sep 17 00:00:00 2001 From: xiaoyong931011 <15274802129@163.com> Date: Wed, 23 Feb 2022 16:02:46 +0800 Subject: [PATCH] 20222223 --- src/main/java/com/xcong/excoin/modules/coin/service/impl/CoinServiceImpl.java | 324 ++++++++++++++++++++++++++++++++++++++++++++++------- 1 files changed, 281 insertions(+), 43 deletions(-) diff --git a/src/main/java/com/xcong/excoin/modules/coin/service/impl/CoinServiceImpl.java b/src/main/java/com/xcong/excoin/modules/coin/service/impl/CoinServiceImpl.java index 5516712..a2b4b05 100644 --- a/src/main/java/com/xcong/excoin/modules/coin/service/impl/CoinServiceImpl.java +++ b/src/main/java/com/xcong/excoin/modules/coin/service/impl/CoinServiceImpl.java @@ -1,10 +1,14 @@ package com.xcong.excoin.modules.coin.service.impl; import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.List; +import java.text.SimpleDateFormat; +import java.util.*; import javax.annotation.Resource; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.date.DateUtil; +import com.xcong.excoin.modules.coin.dao.ZhiYaRecordDao; +import com.xcong.excoin.modules.coin.entity.ZhiYaRecordEntity; import com.xcong.excoin.modules.platform.entity.PlatformCnyUsdtExchangeEntity; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -21,6 +25,7 @@ import com.xcong.excoin.modules.coin.entity.OrderCoinsDealEntity; import com.xcong.excoin.modules.coin.mapper.MemberAccountMoneyChangeMapper; import com.xcong.excoin.modules.coin.parameter.dto.RecordsPageDto; +import com.xcong.excoin.modules.coin.parameter.vo.AllWalletCoinVo; import com.xcong.excoin.modules.coin.parameter.vo.MemberAccountMoneyChangeInfoVo; import com.xcong.excoin.modules.coin.parameter.vo.MemberAgentIntoInfoVo; import com.xcong.excoin.modules.coin.parameter.vo.MemberWalletAgentInfoVo; @@ -58,6 +63,8 @@ MemberAccountMoneyChangeDao memberAccountMoneyChangeDao; @Resource MemberWalletAgentDao memberWalletAgentDao; + @Resource + ZhiYaRecordDao zhiYaRecordDao; @Resource RedisUtils redisUtils; @@ -139,7 +146,6 @@ memberWalletCoinVo.setTotalUsdt(totalUsdts.setScale(4, BigDecimal.ROUND_DOWN)); memberWalletCoinVo.setTotalCny(totalUsdts.multiply(cnyUsdt).setScale(4, BigDecimal.ROUND_DOWN)); memberWalletCoinVo.setMemberWalletCoinInfoVo(memberWalletCoinlist); - ; return Result.ok(memberWalletCoinVo); } } @@ -185,26 +191,12 @@ if (ObjectUtil.isEmpty(walletContract)) { return Result.fail(MessageSourceUtils.getString("member_service_0001")); } - /** - * todo - */ - //获取当前的合约持仓 - //获取实时盈亏 - BigDecimal profitAndLoss = new BigDecimal("0"); - //获取总付款 - BigDecimal totalPayment = new BigDecimal("0"); - BigDecimal lastTotalBalance = new BigDecimal("0"); - BigDecimal totalBalance = walletContract.getTotalBalance(); - lastTotalBalance = totalBalance.add(profitAndLoss); - if (lastTotalBalance.compareTo(BigDecimal.ZERO) < 0) { - lastTotalBalance = new BigDecimal("0"); - } MemberWalletContractInfoVo memberWalletContractInfoVo = new MemberWalletContractInfoVo(); - memberWalletContractInfoVo.setFrozenBalance(totalPayment.setScale(4, BigDecimal.ROUND_DOWN)); - memberWalletContractInfoVo.setAvailableBalance(walletContract.getAvailableBalance()); - memberWalletContractInfoVo.setTotalBalance(lastTotalBalance.setScale(4, BigDecimal.ROUND_DOWN)); - memberWalletContractInfoVo.setTotalRMBBalance(lastTotalBalance.multiply(cnyUsdt).setScale(4, BigDecimal.ROUND_DOWN)); + memberWalletContractInfoVo.setFrozenBalance(walletContract.getFrozenBalance().setScale(4, BigDecimal.ROUND_DOWN)); + memberWalletContractInfoVo.setAvailableBalance(walletContract.getAvailableBalance().setScale(4, BigDecimal.ROUND_DOWN)); + memberWalletContractInfoVo.setTotalBalance(walletContract.getTotalBalance().setScale(4, BigDecimal.ROUND_DOWN)); + memberWalletContractInfoVo.setTotalRMBBalance(walletContract.getTotalBalance().multiply(cnyUsdt).setScale(4, BigDecimal.ROUND_DOWN)); return Result.ok(memberWalletContractInfoVo); } @@ -228,9 +220,6 @@ return Result.fail(MessageSourceUtils.getString("member_service_0005")); } BigDecimal subtract = walletCoin.getTotalBalance().subtract(balance); - if (subtract.compareTo(BigDecimal.ZERO) < 0) { - return Result.fail(MessageSourceUtils.getString("member_service_0005")); - } walletCoin.setAvailableBalance(total); walletCoin.setTotalBalance(subtract); int updateWalletCoinById = memberWalletCoinDao.updateById(walletCoin); @@ -497,29 +486,278 @@ } @Override - public Result getWalletAgentIntoRecords() { + public Result getWalletAgentIntoRecords(RecordsPageDto recordsPageDto) { //获取用户ID Long memberId = LoginUserUtils.getAppLoginUser().getId(); - - List<MemberAccountMoneyChange> contractRecordList = - memberAccountMoneyChangeDao.selectWalletAgentIntoRecordsByMemIdTypeSymbol(memberId); - - MemberAgentIntoInfoVo memberAgentIntoInfoVo = new MemberAgentIntoInfoVo(); + + Page<OrderCoinsDealEntity> page = new Page<>(recordsPageDto.getPageNum(), recordsPageDto.getPageSize()); + MemberAccountMoneyChange memberAccountMoneyChange = new MemberAccountMoneyChange(); + memberAccountMoneyChange.setMemberId(memberId); + IPage<MemberAccountMoneyChange> list = memberAccountMoneyChangeDao.selectWalletAgentIntoRecordsByMemIdTypeSymbol(page, memberAccountMoneyChange); + List<MemberAccountMoneyChange> contractRecordList = list.getRecords(); List<MemberAccountMoneyChangeInfoVo> arrayList = new ArrayList<>(); - if (ObjectUtil.isNotNull(contractRecordList)) { - for (MemberAccountMoneyChange memberAccountMoneyChange : contractRecordList) { - MemberAccountMoneyChangeInfoVo memberAccountMoneyChangeInfoVo = new MemberAccountMoneyChangeInfoVo(); - memberAccountMoneyChangeInfoVo.setAmount(memberAccountMoneyChange.getAmount()); - memberAccountMoneyChangeInfoVo.setContent(memberAccountMoneyChange.getContent()); - memberAccountMoneyChangeInfoVo.setStatus(memberAccountMoneyChange.getStatus()); - memberAccountMoneyChangeInfoVo.setSymbol(memberAccountMoneyChange.getSymbol()); - memberAccountMoneyChangeInfoVo.setType(memberAccountMoneyChange.getType()); - memberAccountMoneyChangeInfoVo.setUpdateTime(memberAccountMoneyChange.getUpdateTime()); - arrayList.add(memberAccountMoneyChangeInfoVo); - } + if(CollUtil.isNotEmpty(contractRecordList)) { + if (ObjectUtil.isNotNull(contractRecordList)) { + for (MemberAccountMoneyChange memberAccountMoneyChanges : contractRecordList) { + MemberAccountMoneyChangeInfoVo memberAccountMoneyChangeInfoVo = new MemberAccountMoneyChangeInfoVo(); + memberAccountMoneyChangeInfoVo.setAmount(memberAccountMoneyChanges.getAmount()); + memberAccountMoneyChangeInfoVo.setContent(memberAccountMoneyChanges.getContent()); + memberAccountMoneyChangeInfoVo.setStatus(memberAccountMoneyChanges.getStatus()); + memberAccountMoneyChangeInfoVo.setSymbol(memberAccountMoneyChanges.getSymbol()); + memberAccountMoneyChangeInfoVo.setType(memberAccountMoneyChanges.getType()); + memberAccountMoneyChangeInfoVo.setUpdateTime(memberAccountMoneyChanges.getUpdateTime()); + arrayList.add(memberAccountMoneyChangeInfoVo); + } + } } - memberAgentIntoInfoVo.setMemberAccountMoneyChangeInfoVo(arrayList); - return Result.ok(memberAgentIntoInfoVo); + Page<MemberAccountMoneyChangeInfoVo> pageEntityToPageVo = new Page<>(); + pageEntityToPageVo.setRecords(arrayList); + + return Result.ok(pageEntityToPageVo); } + @Override + public Result getAllWalletCoin() { + //获取【币币】 + Long memberId = LoginUserUtils.getAppLoginUser().getId(); + PlatformCnyUsdtExchangeEntity cnyUsdtExchange = cnyUsdtExchangeDao.getCNYAndUSDTOne(); + BigDecimal cnyUsdt = cnyUsdtExchange.getValue(); + AllWalletCoinVo allWalletCoinVo = new AllWalletCoinVo(); + + BigDecimal totalUsdts = BigDecimal.ZERO; + if (!StrUtil.isEmpty(memberId.toString())) { + + List<MemberWalletCoinEntity> memberWalletCoinlist = memberWalletCoinDao.selectMemberWalletCoinsByMemberId(memberId); + List<MemberWalletCoinInfoVo> memberWalletCoinInfoVolist = new ArrayList<MemberWalletCoinInfoVo>(); + + if (CollUtil.isNotEmpty(memberWalletCoinlist)) { + for (MemberWalletCoinEntity memberWalletCoinEntity : memberWalletCoinlist) { + MemberWalletCoinInfoVo memberWalletCoinInfoVo = new MemberWalletCoinInfoVo(); + memberWalletCoinInfoVo.setAvailableBalance(memberWalletCoinEntity.getAvailableBalance().setScale(4, BigDecimal.ROUND_DOWN)); + memberWalletCoinInfoVo.setFrozenBalance(memberWalletCoinEntity.getFrozenBalance().setScale(4, BigDecimal.ROUND_DOWN)); + memberWalletCoinInfoVo.setMemberId(memberWalletCoinEntity.getMemberId()); + memberWalletCoinInfoVo.setTotalBalance(memberWalletCoinEntity.getTotalBalance().setScale(4, BigDecimal.ROUND_DOWN)); + memberWalletCoinInfoVo.setWalletCode(memberWalletCoinEntity.getWalletCode()); + memberWalletCoinInfoVolist.add(memberWalletCoinInfoVo); + } + } + + if (CollUtil.isNotEmpty(memberWalletCoinInfoVolist)) { + for (MemberWalletCoinInfoVo walletCoin : memberWalletCoinInfoVolist) { + if (MemberWalletCoinEnum.WALLETCOINCODE.getValue().equals(walletCoin.getWalletCode())) { + BigDecimal totalUsdt = BigDecimal.ZERO; + totalUsdt = walletCoin.getAvailableBalance().add(walletCoin.getFrozenBalance()); + totalUsdts = totalUsdts.add(totalUsdt); + } else { + BigDecimal amount = walletCoin.getAvailableBalance().add(walletCoin.getFrozenBalance()); + // 获取最新价 + BigDecimal closePrice = new BigDecimal(redisUtils.getString(CoinTypeConvert.convertToKey(walletCoin.getWalletCode()+"/USDT"))); + BigDecimal totalUsdt = BigDecimal.ZERO; + totalUsdt = totalUsdt.add(amount.multiply(closePrice)); + totalUsdts = totalUsdts.add(totalUsdt); + } + } + } + } + allWalletCoinVo.setWalletUsdt(totalUsdts.setScale(4, BigDecimal.ROUND_DOWN)); + //获取【合约】 + String walletCode = MemberWalletCoinEnum.WALLETCOINCODE.getValue(); + MemberWalletContractEntity walletContract = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(memberId, walletCode); + if (ObjectUtil.isEmpty(walletContract)) { + return Result.fail(MessageSourceUtils.getString("member_service_0001")); + } + allWalletCoinVo.setContractUsdt(walletContract.getTotalBalance().setScale(4, BigDecimal.ROUND_DOWN)); + totalUsdts = totalUsdts.add(walletContract.getTotalBalance()); + //获取【代理】 + MemberWalletAgentEntity walletAgent = memberWalletAgentDao.selectWalletAgentBymIdAndCode(memberId, walletCode); + BigDecimal availableBalance = walletAgent.getAvailableBalance(); + allWalletCoinVo.setAgentUsdt(availableBalance.setScale(4, BigDecimal.ROUND_DOWN)); + totalUsdts = totalUsdts.add(availableBalance); + + allWalletCoinVo.setTotalUsdt(totalUsdts.setScale(4, BigDecimal.ROUND_DOWN)); + allWalletCoinVo.setTotalCny(totalUsdts.multiply(cnyUsdt).setScale(4, BigDecimal.ROUND_DOWN)); + return Result.ok(allWalletCoinVo); + } + + @Override + public void updateWalletBalance(Long id, BigDecimal availableBalance, BigDecimal totalBalance,BigDecimal frozenBalance) { + if(id==null){ + return; + } + // 这里需要加锁 保证同一个时间只有一个线程操作一个钱包 + String key = "UPDATE_WALLET_COIN_"+id; + while (true){ + boolean b = redisUtils.setNotExist(key, 1, 2); + if(b){ + //System.out.println("我拿到了锁"); + // 拿到了锁才能扣 + memberWalletCoinDao.updateWalletBalance(id,availableBalance,totalBalance,frozenBalance); + // 扣完释放锁 + redisUtils.del(key); + break; + }else { + + } + } + } + + @Override + public Result usdtToGusd(BigDecimal balance) { + //获取用户ID + Long memberId = LoginUserUtils.getAppLoginUser().getId(); + if (balance.compareTo(BigDecimal.ZERO) <= 0) { + return Result.fail(MessageSourceUtils.getString("member_service_0004")); + } + + // 扣币 + String walletCode = MemberWalletCoinEnum.WALLETCOINCODE.getValue(); + MemberWalletCoinEntity memberWalletCoinEntity = memberWalletCoinDao.selectWalletCoinBymIdAndCode(memberId, walletCode); + BigDecimal availableBalance = memberWalletCoinEntity.getAvailableBalance(); + BigDecimal totalBalance = memberWalletCoinEntity.getTotalBalance(); + + BigDecimal available = availableBalance.subtract(balance); + if (available.compareTo(BigDecimal.ZERO) < 0) { + return Result.fail(MessageSourceUtils.getString("member_service_0005")); + } + BigDecimal total = totalBalance.subtract(balance); + if (total.compareTo(BigDecimal.ZERO) < 0) { + return Result.fail(MessageSourceUtils.getString("member_service_0005")); + } + + memberWalletCoinEntity.setAvailableBalance(available); + memberWalletCoinEntity.setTotalBalance(total); + int i = memberWalletCoinDao.updateById(memberWalletCoinEntity); + if (i < 1) { + return Result.fail(MessageSourceUtils.getString("member_service_0095")); + } + //添加资金划转历史记录 + MemberAccountMoneyChange memberAccountRecord = new MemberAccountMoneyChange(); + //获取usdt兑换gusd的兑换比例 + String gusdName = CoinTypeEnum.GUSD.name(); + MemberWalletCoinEntity gusdMemberWalletCoinEntity = memberWalletCoinDao.selectWalletCoinBymIdAndCode(memberId, gusdName); + BigDecimal gusdAvailableBalance = gusdMemberWalletCoinEntity.getAvailableBalance(); + BigDecimal gusdTotalBalance = gusdMemberWalletCoinEntity.getTotalBalance(); + gusdMemberWalletCoinEntity.setAvailableBalance(gusdAvailableBalance.add(balance)); + gusdMemberWalletCoinEntity.setTotalBalance(gusdTotalBalance.add(balance)); + + int updateById = memberWalletCoinDao.updateById(gusdMemberWalletCoinEntity); + if (updateById < 1) { + return Result.fail(MessageSourceUtils.getString("member_service_0095")); + } + + //添加资金划转历史记录 + memberAccountRecord.setMemberId(memberId); + memberAccountRecord.setStatus(MemberAccountMoneyChange.STATUS_SUCCESS_INTEGER); + memberAccountRecord.setSymbol(walletCode); + memberAccountRecord.setContent(MemberWalletCoinEnum.ZHIYATOGUSD.getValue()); + memberAccountRecord.setType(MemberAccountMoneyChange.TYPE_WALLET_COIN); + memberAccountRecord.setAmount(balance); + memberAccountMoneyChangeDao.insert(memberAccountRecord); + + return Result.ok(MessageSourceUtils.getString("member_service_0024")); + } + + @Override + public Result zhiYaGusd(BigDecimal balance) { + //获取用户ID + Long memberId = LoginUserUtils.getAppLoginUser().getId(); + if (balance.compareTo(new BigDecimal(100)) < 0) { + return Result.fail(MessageSourceUtils.getString("member_service_0005")); + } + //质押Gusd,质押数量进入冻结余额, + String gusdName = CoinTypeEnum.GUSD.name(); + MemberWalletCoinEntity gusdMemberWalletCoinEntity = memberWalletCoinDao.selectWalletCoinBymIdAndCode(memberId, gusdName); + BigDecimal gusdAvailableBalance = gusdMemberWalletCoinEntity.getAvailableBalance(); + BigDecimal gusdTotalBalance = gusdMemberWalletCoinEntity.getTotalBalance(); + BigDecimal gusdfrozenBalance = gusdMemberWalletCoinEntity.getFrozenBalance(); + + BigDecimal available = gusdAvailableBalance.subtract(balance); + if (available.compareTo(BigDecimal.ZERO) < 0) { + return Result.fail(MessageSourceUtils.getString("member_service_0005")); + } + BigDecimal total = gusdTotalBalance.subtract(balance); + if (total.compareTo(BigDecimal.ZERO) < 0) { + return Result.fail(MessageSourceUtils.getString("member_service_0005")); + } + gusdMemberWalletCoinEntity.setFrozenBalance(gusdfrozenBalance.add(gusdfrozenBalance)); + gusdMemberWalletCoinEntity.setAvailableBalance(gusdAvailableBalance.subtract(balance)); + + int updateById = memberWalletCoinDao.updateById(gusdMemberWalletCoinEntity); + if (updateById < 1) { + return Result.fail(MessageSourceUtils.getString("member_service_0095")); + } + //产生质押单,当前有的话,累加质押数量 + ZhiYaRecordEntity zhiYaRecord = zhiYaRecordDao.selectByMemberIdAndOrderStatus(memberId,1); + if(ObjectUtil.isEmpty(zhiYaRecord)){ + //产生一条质押记录 + ZhiYaRecordEntity zhiYaRecordEntity = new ZhiYaRecordEntity(); + zhiYaRecordEntity.setMemberId(memberId); + zhiYaRecordEntity.setOrderNo(generateSimpleSerialno(memberId.toString())); + zhiYaRecordEntity.setSymbol(gusdName); + zhiYaRecordEntity.setZhiyaCnt(balance); + zhiYaRecordEntity.setOrderStatus(1); + Date date = new Date(); + Date newDate = DateUtil.offsetDay(date, 1); + zhiYaRecordEntity.setEffectDate(newDate); + zhiYaRecordDao.insert(zhiYaRecordEntity); + }else{ + zhiYaRecord.setZhiyaCnt(zhiYaRecord.getZhiyaCnt().add(balance)); + Date date = new Date(); + Date newDate = DateUtil.offsetDay(date, 1); + zhiYaRecord.setEffectDate(newDate); + zhiYaRecordDao.updateById(zhiYaRecord); + } + + return Result.ok(MessageSourceUtils.getString("member_service_0024")); + } + + @Override + public Result shuhuiGusd(BigDecimal balance) { + //获取用户ID + Long memberId = LoginUserUtils.getAppLoginUser().getId(); + if (balance.compareTo(BigDecimal.ZERO) <= 0) { + return Result.fail(MessageSourceUtils.getString("order_service_0010")); + } + //质押Gusd,质押数量进入冻结余额, + String gusdName = CoinTypeEnum.GUSD.name(); + MemberWalletCoinEntity gusdMemberWalletCoinEntity = memberWalletCoinDao.selectWalletCoinBymIdAndCode(memberId, gusdName); + BigDecimal gusdAvailableBalance = gusdMemberWalletCoinEntity.getAvailableBalance(); + BigDecimal gusdTotalBalance = gusdMemberWalletCoinEntity.getTotalBalance(); + BigDecimal gusdfrozenBalance = gusdMemberWalletCoinEntity.getFrozenBalance(); + + BigDecimal frozen = gusdfrozenBalance.subtract(balance); + if (frozen.compareTo(BigDecimal.ZERO) < 0) { + return Result.fail(MessageSourceUtils.getString("zhiya_service_0001")); + } + BigDecimal total = gusdTotalBalance.subtract(balance); + if (total.compareTo(BigDecimal.ZERO) < 0) { + return Result.fail(MessageSourceUtils.getString("member_service_0005")); + } + return null; + } + + public String generateSimpleSerialno(String userId) { + StringBuilder sb = new StringBuilder(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + SimpleDateFormat sd = new SimpleDateFormat("yyyyMMdd"); + Date now = new Date(); + sb.append(sd.format(now)); + Calendar calendar = new GregorianCalendar(); + calendar.setTime(now); + calendar.add(calendar.DATE, 1); + Date nextDate = calendar.getTime(); + if (StrUtil.isNotEmpty(userId)) { + sb.append(userId); + } + sb.append(RandomUtil.randomInt(2)); + long count = zhiYaRecordDao.getOrderCountByToday(sdf.format(now), sdf.format(nextDate)); + count++; + int size = 4; + for (int i = 0; i < size - String.valueOf(count).length(); i++) { + sb.append("0"); + } + sb.append(count); + return sb.toString(); + } + } -- Gitblit v1.9.1