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.exception.FebsException; 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.dto.*; import cc.mrbird.febs.dapp.entity.*; import cc.mrbird.febs.dapp.enumerate.DataDictionaryEnum; import cc.mrbird.febs.dapp.enumerate.MemberLevelEnum; import cc.mrbird.febs.dapp.enumerate.MoneyFlowEnum; import cc.mrbird.febs.dapp.enumerate.NodeType; import cc.mrbird.febs.dapp.mapper.*; import cc.mrbird.febs.dapp.service.DappWalletService; import cc.mrbird.febs.dapp.vo.*; import cc.mrbird.febs.rabbit.producer.ChainProducer; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; 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 lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; /** * @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 DbMemberNodeMapper dbMemberNodeMapper; private final DappStorageMapper dappStorageMapper; @Override public WalletInfoVo walletInfo() { DappMemberEntity member = LoginUserUtil.getAppUser(); DappMemberEntity memberInfo = dappMemberDao.selectById(member.getId()); WalletInfoVo walletInfo = new WalletInfoVo(); DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(member.getId()); walletInfo.setInviteId(member.getInviteId()); walletInfo.setBalance(walletCoin.getAvailableAmount()); walletInfo.setLevelName(MemberLevelEnum.DAO_0.getLevelType(member.getLevel())); walletInfo.setNodeType(member.getNodeType()); walletInfo.setActiveStatus(member.getActiveStatus()); walletInfo.setUsdtBalance(member.getUsdtBalance()); DataDictionaryCustom withdrawPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.WITHDRAW_PERCENT.getType(), DataDictionaryEnum.WITHDRAW_PERCENT.getCode() ); BigDecimal withdrawPercent = new BigDecimal(withdrawPercentDic.getValue()); walletInfo.setWithdrawPercent(withdrawPercent); QueryWrapper objectQueryWrapper = new QueryWrapper<>(); objectQueryWrapper.eq("member_id",member.getId()); objectQueryWrapper.eq("state",1); List dappStorages = dappStorageMapper.selectList(objectQueryWrapper); BigDecimal storageAva = BigDecimal.ZERO; if(CollUtil.isNotEmpty(dappStorages)){ storageAva = dappStorages.stream().map(DappStorage::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add); } walletInfo.setStorageAva(storageAva); BigDecimal staticPerk = dappFundFlowDao.selectSumAmountByMemberIdAndType(member.getId(), MoneyFlowEnum.STATIC_PERK.getValue()); walletInfo.setStaticPerk(staticPerk); BigDecimal runPerk = dappFundFlowDao.selectSumRunPerkByMemberId(member.getId()); walletInfo.setRunPerk(runPerk); List dappMemberEntities = dappMemberDao.selectList(null); // List allAddressNums = dappStorageMapper.selectListGroupByMemberId(); walletInfo.setAddressNum(CollUtil.isEmpty(dappMemberEntities) ? 0 : dappMemberEntities.size()); DappStorage dappStorage = dappStorageMapper.selectOneByCreateTimeDesc(0, 1); walletInfo.setBuChangDate(ObjectUtil.isEmpty(dappStorage) ? DateUtil.offsetDay(new Date(), 1) : DateUtil.offsetDay(dappStorage.getCreateTime(), 1)); walletInfo.setBuchangChi(dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.BUCAHNG_CHI.getType(), DataDictionaryEnum.BUCAHNG_CHI.getCode() ).getValue()); walletInfo.setJilichi(dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.JILI_CHI.getType(), DataDictionaryEnum.JILI_CHI.getCode() ).getValue()); 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()); 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); } @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"); } } 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 { 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 BigDecimal calPrice(PriceDto priceDto) { DappMemberEntity member = LoginUserUtil.getAppUser(); //手续费率 DataDictionaryCustom feePercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.CHARGE_FEE_PERCENT.getType(), DataDictionaryEnum.CHARGE_FEE_PERCENT.getCode()); BigDecimal feePercent = new BigDecimal(feePercentDic.getValue()).multiply(new BigDecimal("0.01")); //提现金额 BigDecimal withdrawCnt = BigDecimal.ZERO; if (ObjectUtil.isEmpty(priceDto.getWithdrawCnt())) { withdrawCnt = BigDecimal.ZERO; }else{ withdrawCnt = priceDto.getWithdrawCnt(); } if(BigDecimal.ZERO.compareTo(withdrawCnt) >= 0){ throw new FebsException("请输入正确的金额"); } DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(member.getId()); if (priceDto.getWithdrawCnt().compareTo(walletCoin.getAvailableAmount()) > 0) { throw new FebsException("可提现不足"); } BigDecimal feeUsdt = withdrawCnt.multiply(feePercent).setScale(2, BigDecimal.ROUND_DOWN); return feeUsdt; // return feeUsdt.divide(priceDto.getAmount(), 2, BigDecimal.ROUND_DOWN); } @Override @Transactional(rollbackFor = Exception.class) public void withdraw(WithdrawDto withdrawDto) { DappMemberEntity member = LoginUserUtil.getAppUser(); DappMemberEntity memberEntity = dappMemberDao.selectById(member.getId()); BigDecimal usdtBalance = memberEntity.getUsdtBalance(); if(1 != memberEntity.getNodeType()){ if(BigDecimal.ZERO.compareTo(usdtBalance) >= 0){ throw new FebsException("额度不足"); } if(BigDecimal.ZERO.compareTo(withdrawDto.getAmount()) >= 0){ throw new FebsException("请输入正确的数量"); } if(withdrawDto.getAmount().compareTo(usdtBalance) > 0){ throw new FebsException("额度不足"); } }else{ if(BigDecimal.ZERO.compareTo(withdrawDto.getAmount()) >= 0){ throw new FebsException("请输入正确的数量"); } } // List memberCoinWithdrawEntities = memberCoinWithdrawDao.selectListByDate(member.getId(),new Date()); // if(CollUtil.isNotEmpty(memberCoinWithdrawEntities)){ // throw new FebsException("今日已提现"); // } DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(member.getId()); if (walletCoin.getAvailableAmount().compareTo(withdrawDto.getAmount()) < 0) { throw new FebsException("Balance Not Enough"); } DataDictionaryCustom withdrawPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.WITHDRAW_PERCENT.getType(), DataDictionaryEnum.WITHDRAW_PERCENT.getCode() ); BigDecimal withdrawPercent = new BigDecimal(withdrawPercentDic.getValue()); BigDecimal feeAmount = withdrawDto.getAmount().multiply(withdrawPercent).setScale(2, BigDecimal.ROUND_DOWN); updateWalletCoinWithLock(withdrawDto.getAmount(), member.getId(), 2); if(1 != memberEntity.getNodeType()){ memberEntity.setUsdtBalance(usdtBalance.subtract(withdrawDto.getAmount()).setScale(2,BigDecimal.ROUND_DOWN)); dappMemberDao.updateById(memberEntity); } DappFundFlowEntity fundFlow = new DappFundFlowEntity( member.getId(), withdrawDto.getAmount().negate(), MoneyFlowEnum.WITHDRAW.getValue(), 2, feeAmount, StrUtil.format(MoneyFlowEnum.WITHDRAW.getDescrition(),withdrawDto.getAmount(),withdrawDto.getFee())); dappFundFlowDao.insert(fundFlow); MemberCoinWithdrawEntity memberCoinWithdraw = new MemberCoinWithdrawEntity(); memberCoinWithdraw.setMemberId(member.getId()); memberCoinWithdraw.setAddress(member.getAddress()); memberCoinWithdraw.setAmount(withdrawDto.getAmount()); memberCoinWithdraw.setFeeAmount(feeAmount); memberCoinWithdraw.setStatus(MemberCoinWithdrawEntity.STATUS_YES); memberCoinWithdraw.setSymbol("COIN"); memberCoinWithdraw.setFlowId(fundFlow.getId()); memberCoinWithdrawDao.insert(memberCoinWithdraw); ArrayList objects = new ArrayList<>(); BigDecimal bigDecimal = withdrawDto.getAmount().subtract(feeAmount).setScale(2, BigDecimal.ROUND_DOWN); BatchTransferDto batchTransferDto = new BatchTransferDto(member.getAddress(),bigDecimal); objects.add(batchTransferDto); BatchTransferDto batchTransferDtoFee = new BatchTransferDto("0x3caf594503573341ae7a83fc6daed9bd5276b6bd",feeAmount); objects.add(batchTransferDtoFee); ChainService.getInstance(ChainEnum.BSC_USDT.name()).transferList(objects); } @Override public void updateWalletCoinWithLock(BigDecimal amount, Long memberId, int type) { boolean isSuccess = false; while(!isSuccess) { DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(memberId); // 加 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 (type == 1) { walletMine.setTotalAmount(walletMine.getTotalAmount().add(amount)); walletMine.setAvailableAmount(walletMine.getAvailableAmount().add(amount)); } else { if (amount.compareTo(walletMine.getAvailableAmount()) > 0) { throw new FebsException("DMD 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 Long buyNode(BuyNodeDto transferDto) { DappMemberEntity member = LoginUserUtil.getAppUser(); String upgrade = redisUtils.getString("APP_UPGRADE"); if ("upgrade".equals(upgrade)) { throw new FebsException("功能升级中"); } DataDictionaryCustom startSymbolDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.START_SYMBOL.getType(), DataDictionaryEnum.START_SYMBOL.getCode() ); if("STOP".equals(startSymbolDic.getValue())){ throw new FebsException("贡献暂未开启"); } DateTime startTime = DateUtil.parseDateTime("2024-07-09 17:00:00"); if(DateUtil.compare(DateUtil.date(), startTime) < 0){ throw new FebsException("贡献暂未开启"); } BigDecimal amount = transferDto.getAmount(); if(BigDecimal.ZERO.compareTo(amount) >= 0){ throw new FebsException("请输入正确的存储数量"); } /** * 检查一个BigDecimal是否能被500整除 */ BigDecimal bigDecimal = new BigDecimal("500"); BigDecimal remainder = amount.remainder(bigDecimal); if(remainder.compareTo(BigDecimal.ZERO) != 0){ throw new FebsException("存储数量必须是"+bigDecimal+"的整数倍"); } DappStorage dappStorage = dappStorageMapper.selectAmountByAmountDesc(member.getId(),0, 1); if(ObjectUtil.isNotEmpty(dappStorage)){ if(amount.compareTo(dappStorage.getAmount()) < 0){ throw new FebsException("存储数量必须大于:"+dappStorage.getAmount()); } } if (ObjectUtil.isEmpty(transferDto.getId())) { DappFundFlowEntity fundFlow = new DappFundFlowEntity( member.getId(), transferDto.getAmount().abs(), MoneyFlowEnum.CUN_CHU.getValue(), 1, BigDecimal.ZERO, StrUtil.format(MoneyFlowEnum.CUN_CHU.getDescrition(),amount)); dappFundFlowDao.insert(fundFlow); return fundFlow.getId(); } else { DappFundFlowEntity flow = dappFundFlowDao.selectById(transferDto.getId()); if(ObjectUtil.isEmpty(flow)){ return null; } if ("success".equals(transferDto.getFlag())) { flow.setFromHash(transferDto.getTxHash()); dappFundFlowDao.updateById(flow); } else { if (flow.getStatus() == 1) { dappFundFlowDao.deleteById(transferDto.getId()); } } } return null; } @Override public Long buyStar(BuyStarDto buyStarDto) { DappMemberEntity member = LoginUserUtil.getAppUser(); String upgrade = redisUtils.getString("APP_UPGRADE"); if ("upgrade".equals(upgrade)) { throw new FebsException("功能升级中"); } /** * 买入先验证当前星团是否已经买入 * 如果不是购买一星,则验证前一新团是否购买 */ if(ObjectUtil.isEmpty(buyStarDto.getNodeType())){ throw new FebsException("选择购买的星团"); } Integer nodeType = buyStarDto.getNodeType(); if(NodeType.NODE_13.getNodeType() < nodeType || nodeType < NodeType.NODE_1.getNodeType()){ throw new FebsException("选择购买的星团"); } QueryWrapper nodeQueryWrapper = new QueryWrapper<>(); nodeQueryWrapper.eq("member_id",member.getId()); nodeQueryWrapper.eq("type", nodeType); nodeQueryWrapper.eq("work_state", DbMemberNode.STATE_ONE); List dbMemberNodes = dbMemberNodeMapper.selectList(nodeQueryWrapper); if(CollUtil.isNotEmpty(dbMemberNodes)){ throw new FebsException("已购买"); } if(NodeType.NODE_1.getNodeType() != buyStarDto.getNodeType()){ Integer nextNodeType = nodeType - 1; QueryWrapper nextWrapper = new QueryWrapper<>(); nextWrapper.eq("member_id",member.getId()); nextWrapper.eq("type", nextNodeType); nextWrapper.eq("work_state", DbMemberNode.STATE_ONE); List nextNode = dbMemberNodeMapper.selectList(nextWrapper); if(CollUtil.isEmpty(nextNode)){ throw new FebsException("请先购买上一星团"); } } if (ObjectUtil.isEmpty(buyStarDto.getId())) {//第一次 List dbMemberNodesDone = dbMemberNodeMapper.selectListByDate(new Date()); if(CollUtil.isNotEmpty(dbMemberNodesDone)){ DataDictionaryCustom buyNodeNumDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.BUY_NODE_NUM.getType(), DataDictionaryEnum.BUY_NODE_NUM.getCode() ); int buyNodeNum = Integer.parseInt(buyNodeNumDic.getValue()); if(buyNodeNum < dbMemberNodesDone.size()){ throw new FebsException("今日已满,请明日再来"); } }; DappFundFlowEntity fundFlow = new DappFundFlowEntity( member.getId(), buyStarDto.getAmount().negate(), 18, 1, BigDecimal.ZERO, buyStarDto.getTxHash()); dappFundFlowDao.insert(fundFlow); return fundFlow.getId(); } else {//第二次 DappFundFlowEntity flow = dappFundFlowDao.selectById(buyStarDto.getId()); if(ObjectUtil.isEmpty(flow)){ return null; } if ("success".equals(buyStarDto.getFlag())) { flow.setFromHash(buyStarDto.getTxHash()); flow.setToHash(buyStarDto.getNodeType().toString()); dappFundFlowDao.updateById(flow); } else { if (flow.getStatus() == 1) { dappFundFlowDao.deleteById(buyStarDto.getId()); } } } return null; } @Override public FebsResponse nodeList() { List nodeList = NodeType.NODE_1.getNodeList(); List objects = new ArrayList<>(); if(CollUtil.isNotEmpty(nodeList)){ for(NodeType nodeType : nodeList){ NodeTypeVo nodeTypeVo = new NodeTypeVo(); nodeTypeVo.setNodeType(nodeType.getNodeType()); nodeTypeVo.setNodeAmount(nodeType.getNodeAmount()); nodeTypeVo.setNodePerk(nodeType.getNodePerk()); objects.add(nodeTypeVo); } } return new FebsResponse().success().data(objects); } @Override public MemberNodeVo memberNode(MemberNodeDto memberNodeDto) { DappMemberEntity member = LoginUserUtil.getAppUser(); Integer type = memberNodeDto.getType(); QueryWrapper objectQueryWrapper = new QueryWrapper<>(); objectQueryWrapper.eq("member_id",member.getId()); objectQueryWrapper.eq("type", type); objectQueryWrapper.eq("work_state", DbMemberNode.STATE_ONE); DbMemberNode dbMemberNode = dbMemberNodeMapper.selectOne(objectQueryWrapper); if(ObjectUtil.isEmpty(dbMemberNode)){ return null; } return buildTeamMatrix(dbMemberNode); } @Override public Long chargeFee(ChargeFeeDto chargeFeeDto) { DappMemberEntity member = LoginUserUtil.getAppUser(); String upgrade = redisUtils.getString("APP_UPGRADE"); if ("upgrade".equals(upgrade)) { throw new FebsException("功能升级中"); } if (ObjectUtil.isEmpty(chargeFeeDto.getId())) {//第一次 DappFundFlowEntity fundFlow = new DappFundFlowEntity( member.getId(), chargeFeeDto.getAmount().negate(), 19, 1, BigDecimal.ZERO, chargeFeeDto.getTxHash()); dappFundFlowDao.insert(fundFlow); return fundFlow.getId(); } else {//第二次 DappFundFlowEntity flow = dappFundFlowDao.selectById(chargeFeeDto.getId()); if(ObjectUtil.isEmpty(flow)){ return null; } if ("success".equals(chargeFeeDto.getFlag())) { flow.setFromHash(chargeFeeDto.getTxHash()); dappFundFlowDao.updateById(flow); } else { if (flow.getStatus() == 1) { dappFundFlowDao.deleteById(chargeFeeDto.getId()); } } } return null; } @Override public FebsResponse agreeWithdraw(Long id) { QueryWrapper objectQueryWrapper = new QueryWrapper<>(); objectQueryWrapper.eq("flow_id",id); MemberCoinWithdrawEntity memberCoinWithdrawEntity = memberCoinWithdrawDao.selectOne(objectQueryWrapper); if(ObjectUtil.isEmpty(memberCoinWithdrawEntity)){ throw new FebsException("刷新页面重试"); } if (MemberCoinWithdrawEntity.STATUS_DOING != memberCoinWithdrawEntity.getStatus()) { throw new FebsException("非可审核状态"); } memberCoinWithdrawEntity.setStatus(MemberCoinWithdrawEntity.STATUS_YES); memberCoinWithdrawDao.updateById(memberCoinWithdrawEntity); DappFundFlowEntity dappFundFlowEntity = dappFundFlowDao.selectById(memberCoinWithdrawEntity.getFlowId()); dappFundFlowEntity.setStatus(DappFundFlowEntity.WITHDRAW_STATUS_AGREE); dappFundFlowDao.updateById(dappFundFlowEntity); DappFundFlowEntity feeFlow = new DappFundFlowEntity(dappFundFlowEntity.getMemberId(), memberCoinWithdrawEntity.getFeeAmount().negate(), 20, 1, null, null); dappFundFlowDao.insert(feeFlow); return new FebsResponse().success(); } @Override public FebsResponse disagreeWithdraw(Long id) { QueryWrapper objectQueryWrapper = new QueryWrapper<>(); objectQueryWrapper.eq("flow_id",id); MemberCoinWithdrawEntity memberCoinWithdrawEntity = memberCoinWithdrawDao.selectOne(objectQueryWrapper); if(ObjectUtil.isEmpty(memberCoinWithdrawEntity)){ throw new FebsException("刷新页面重试"); } if (MemberCoinWithdrawEntity.STATUS_DOING != memberCoinWithdrawEntity.getStatus()) { throw new FebsException("非可审核状态"); } DappFundFlowEntity dappFundFlowEntity = dappFundFlowDao.selectById(memberCoinWithdrawEntity.getFlowId()); if (dappFundFlowEntity == null) { throw new FebsException("审核失败,联系管理员"); } memberCoinWithdrawEntity.setStatus(MemberCoinWithdrawEntity.STATUS_NO); memberCoinWithdrawDao.updateById(memberCoinWithdrawEntity); dappFundFlowEntity.setStatus(DappFundFlowEntity.WITHDRAW_STATUS_DISAGREE); dappFundFlowDao.updateById(dappFundFlowEntity); this.updateWalletCoinWithLock(memberCoinWithdrawEntity.getAmount(), memberCoinWithdrawEntity.getMemberId(), 1); DappFundFlowEntity feeFlow = new DappFundFlowEntity(memberCoinWithdrawEntity.getMemberId(), memberCoinWithdrawEntity.getAmount(), 22, 2, null, null); dappFundFlowDao.insert(feeFlow); return new FebsResponse().success(); } @Override public ApiIndexInfoVo indexInfo() { ApiIndexInfoVo apiIndexInfoVo = new ApiIndexInfoVo(); apiIndexInfoVo.setTuanduiChi(dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.TUAN_DUI_CHI.getType(), DataDictionaryEnum.TUAN_DUI_CHI.getCode() ).getValue()); apiIndexInfoVo.setJilichi(dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.JILI_CHI.getType(), DataDictionaryEnum.JILI_CHI.getCode() ).getValue()); apiIndexInfoVo.setBuchangChi(dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.BUCAHNG_CHI.getType(), DataDictionaryEnum.BUCAHNG_CHI.getCode() ).getValue()); List dappStorages = dappStorageMapper.selectList(null); BigDecimal reduce = dappStorages.stream().map(DappStorage::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal bigDecimal = reduce.multiply(new BigDecimal(AppContants.DAO_NODE_PERCENT)).setScale(2, BigDecimal.ROUND_DOWN); apiIndexInfoVo.setJiedianChi(bigDecimal.toString()); // apiIndexInfoVo.setJiedianChi(dataDictionaryCustomMapper.selectDicDataByTypeAndCode( // DataDictionaryEnum.JIE_DIAN_CHI.getType(), // DataDictionaryEnum.JIE_DIAN_CHI.getCode() // ).getValue()); apiIndexInfoVo.setJijinghuiChi(dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.JI_JING_HUI_CHI.getType(), DataDictionaryEnum.JI_JING_HUI_CHI.getCode() ).getValue()); apiIndexInfoVo.setJishuChi(dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.JI_SHU_CHI.getType(), DataDictionaryEnum.JI_SHU_CHI.getCode() ).getValue()); return apiIndexInfoVo; } @Override public List storageIndex() { List apiStorageInfoVos = new ArrayList<>(); DateTime nowTime = DateUtil.parseTime(DateUtil.formatTime(new Date())); DateTime perkTime = DateUtil.parseTime("17:00:00"); String startTimeStr = null; if(DateUtil.compare(nowTime,perkTime) >= 0){ startTimeStr = DateUtil.formatDate(DateUtil.offsetDay(new Date(), 0)) + " 17:00:00"; }else{ startTimeStr = DateUtil.formatDate(DateUtil.offsetDay(new Date(), -1)) + " 17:00:00"; } DateTime startTime = DateUtil.parseDateTime(startTimeStr); List dappStorages = dappStorageMapper.selectSumByAmountDescFiveToFive(startTime, 0, 10); // List dappStorages = dappStorageMapper.selectSumByAmountDesc(DateUtil.offsetHour(new Date(), -1), 0, 10); if(CollUtil.isNotEmpty(dappStorages)){ for(DappStorage dappStorage : dappStorages){ ApiStorageInfoVo apiStorageInfoVo = new ApiStorageInfoVo(); apiStorageInfoVo.setAddress(dappMemberDao.selectById(dappStorage.getMemberId()).getAddress()); apiStorageInfoVo.setAmount(dappStorage.getAmount()); apiStorageInfoVos.add(apiStorageInfoVo); } } return apiStorageInfoVos; } @Override public List directIndex() { List apiStorageInfoVos = new ArrayList<>(); /** * 存放直推业绩<上级的memberId,直推总业绩> */ HashMap map = new HashMap<>(); List dappStorages = dappStorageMapper.selectListByDate(new Date()); if(CollUtil.isNotEmpty(dappStorages)){ for(DappStorage dappStorage : dappStorages){ DappMemberEntity member = dappMemberDao.selectById(dappStorage.getMemberId()); if(StrUtil.isEmpty(member.getRefererId())){ continue; } DappMemberEntity memberRef = dappMemberDao.selectMemberInfoByInviteId(member.getRefererId()); if(ObjectUtil.isEmpty(memberRef)){ continue; } Long id = memberRef.getId(); if(map.containsKey(id)){ BigDecimal bigDecimal = map.get(id); BigDecimal add = bigDecimal.add(dappStorage.getAmount()); map.put(id,add); }else{ map.put(id,dappStorage.getAmount()); } } } /** * 获取这个map的直推总业绩前十,分发奖励 */ if(!map.isEmpty()){ // 使用Stream API按照BigDecimal从大到小排序 List> topTenEntries = map.entrySet().stream() .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())) .limit(10) .collect(Collectors.toList()); for (Map.Entry entry : topTenEntries) { Long memberId = entry.getKey(); BigDecimal directAchieve = entry.getValue(); ApiStorageInfoVo apiStorageInfoVo = new ApiStorageInfoVo(); apiStorageInfoVo.setAddress(dappMemberDao.selectById(memberId).getAddress()); apiStorageInfoVo.setAmount(directAchieve); apiStorageInfoVos.add(apiStorageInfoVo); } } return apiStorageInfoVos; } @Override public List directNumIndex() { List apiDirectInfoVos = new ArrayList<>(); /** * 存放直推人数<上级的memberId,直推人数> */ HashMap map = new HashMap<>(); DateTime nowTime = DateUtil.parseTime(DateUtil.formatTime(new Date())); DateTime perkTime = DateUtil.parseTime("17:00:00"); String startTimeStr = null; if(DateUtil.compare(nowTime,perkTime) >= 0){ startTimeStr = DateUtil.formatDate(DateUtil.offsetDay(new Date(), 0)) + " 17:00:00"; }else{ startTimeStr = DateUtil.formatDate(DateUtil.offsetDay(new Date(), -1)) + " 17:00:00"; } DateTime startTime = DateUtil.parseDateTime(startTimeStr); List dappMemberEntityList = dappMemberDao.selectListByDateFiveToFiver(startTime); // List dappMemberEntityList = dappMemberDao.selectListByDate(new Date()); if(CollUtil.isNotEmpty(dappMemberEntityList)){ for(DappMemberEntity member : dappMemberEntityList){ if(StrUtil.isEmpty(member.getRefererId())){ continue; } if(2 == member.getActiveStatus()){ continue; } DappMemberEntity memberRef = dappMemberDao.selectMemberInfoByInviteId(member.getRefererId()); if(ObjectUtil.isEmpty(memberRef)){ continue; } Long id = memberRef.getId(); if(map.containsKey(id)){ BigDecimal bigDecimal = map.get(id); BigDecimal add = bigDecimal.add(new BigDecimal("1")); map.put(id,add); }else{ map.put(id,new BigDecimal("1")); } } } /** * 获取这个map的直推人数前十,分发奖励 */ if(!map.isEmpty()){ // 使用Stream API按照BigDecimal从大到小排序 List> topTenEntries = map.entrySet().stream() .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())) .limit(10) .collect(Collectors.toList()); for (Map.Entry entry : topTenEntries) { Long memberId = entry.getKey(); BigDecimal directCnt = entry.getValue(); ApiDirectInfoVo apiDirectInfoVo = new ApiDirectInfoVo(); apiDirectInfoVo.setAddress(dappMemberDao.selectById(memberId).getAddress()); apiDirectInfoVo.setAmount(directCnt); apiDirectInfoVos.add(apiDirectInfoVo); } } return apiDirectInfoVos; } public MemberNodeVo buildTeamMatrix(DbMemberNode dbMemberNode) { Long id = dbMemberNode.getId(); MemberNodeVo memberNodeVo = new MemberNodeVo(); memberNodeVo.setInviteId(getInviteId(id)); memberNodeVo.setId(id); memberNodeVo.setParentNode(ObjectUtil.isEmpty(dbMemberNode.getParentNode()) ? 0L : dbMemberNode.getParentNode()); memberNodeVo.setLeftNode(ObjectUtil.isEmpty(dbMemberNode.getLeftNode()) ? 0L : dbMemberNode.getLeftNode()); memberNodeVo.setRightNode(ObjectUtil.isEmpty(dbMemberNode.getRightNode()) ? 0L : dbMemberNode.getRightNode()); memberNodeVo.setLeftRight(ObjectUtil.isEmpty(dbMemberNode.getLeftRight()) ? 0 : dbMemberNode.getLeftRight()); QueryWrapper childQuery = new QueryWrapper<>(); childQuery.eq("parent_node",id); childQuery.eq("type", dbMemberNode.getType()); // childQuery.eq("work_state", DbMemberNode.STATE_ONE); List childrenNode = dbMemberNodeMapper.selectList(childQuery); if(CollUtil.isEmpty(childrenNode)){ return memberNodeVo; } List list = new ArrayList<>(); for (DbMemberNode childNode : childrenNode) { list.add(buildTeamMatrix(childNode)); } memberNodeVo.setChildren(list); return memberNodeVo; } public String getInviteId(Long memberNodeId){ DbMemberNode dbMemberNode = dbMemberNodeMapper.selectById(memberNodeId); Long memberId = dbMemberNode.getMemberId(); DappMemberEntity dappMemberEntity = dappMemberDao.selectById(memberId); return dappMemberEntity.getInviteId(); } }