| | |
| | | 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.FebsUtil; |
| | | import cc.mrbird.febs.common.utils.LoginUserUtil; |
| | | import cc.mrbird.febs.common.utils.RedisUtils; |
| | | import cc.mrbird.febs.common.utils.ShareCodeUtil; |
| | | import cc.mrbird.febs.dapp.chain.ChainService; |
| | | import cc.mrbird.febs.dapp.chain.ContractChainService; |
| | | import cc.mrbird.febs.dapp.dto.ApproveDto; |
| | | import cc.mrbird.febs.dapp.entity.DappMemberEntity; |
| | | import cc.mrbird.febs.dapp.entity.DappWalletCoinEntity; |
| | | import cc.mrbird.febs.dapp.entity.DappWalletMineEntity; |
| | | import cc.mrbird.febs.dapp.mapper.DappMemberDao; |
| | | import cc.mrbird.febs.dapp.mapper.DappWalletCoinDao; |
| | | import cc.mrbird.febs.dapp.mapper.DappWalletMineDao; |
| | | import cc.mrbird.febs.dapp.dto.ConnectDto; |
| | | import cc.mrbird.febs.dapp.dto.PriceSettingDto; |
| | | import cc.mrbird.febs.dapp.dto.TeamListDto; |
| | | import cc.mrbird.febs.dapp.entity.*; |
| | | import cc.mrbird.febs.dapp.mapper.*; |
| | | import cc.mrbird.febs.dapp.service.DappMemberService; |
| | | import cc.mrbird.febs.dapp.vo.MoneyFlowVo; |
| | | import cc.mrbird.febs.dapp.vo.TeamListVo; |
| | | import cc.mrbird.febs.system.entity.User; |
| | | import cn.hutool.core.collection.CollUtil; |
| | | 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 com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | | * @author wzy |
| | | * @author |
| | | * @date 2022-03-17 |
| | | **/ |
| | | @Service |
| | |
| | | private final DappMemberDao dappMemberDao; |
| | | private final DappWalletCoinDao dappWalletCoinDao; |
| | | private final DappWalletMineDao dappWalletMineDao; |
| | | private final DappTransferRecordDao dappTransferRecordDao; |
| | | private final RedisUtils redisUtils; |
| | | private final DataDictionaryCustomMapper dataDictionaryCustomMapper; |
| | | private final DappAchieveMapper dappAchieveMapper; |
| | | private final DappFundFlowDao dappFundFlowDao; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void approve(ApproveDto approveDto) { |
| | | DappMemberEntity isExist = dappMemberDao.selectByAddress(approveDto.getAddress()); |
| | | DappMemberEntity isExist = dappMemberDao.selectByAddress(approveDto.getAddress(), approveDto.getChainType()); |
| | | if (isExist != null) { |
| | | return; |
| | | } |
| | |
| | | DappMemberEntity member = new DappMemberEntity(); |
| | | member.setAddress(approveDto.getAddress()); |
| | | |
| | | ChainService instance = ChainService.INSTANCE; |
| | | ContractChainService instance = ChainService.getInstance(approveDto.getChainType()); |
| | | if (!instance.isAllowance(approveDto.getAddress())) { |
| | | throw new FebsException("未授权"); |
| | | } |
| | |
| | | int cnt = instance.allowanceCnt(approveDto.getAddress()); |
| | | member.setApproveCnt(cnt); |
| | | |
| | | member.setChainType(approveDto.getChainType()); |
| | | dappMemberDao.insert(member); |
| | | |
| | | member.setInviteId(ShareCodeUtil.toSerialCode(member.getId())); |
| | | |
| | | member.setRefererId(approveDto.getRefererId()); |
| | | if (StrUtil.isNotBlank(approveDto.getRefererId())){ |
| | | boolean flag = false; |
| | | String parentId = approveDto.getRefererId(); |
| | | String ids = ""; |
| | | while (!flag && StringUtils.isNotBlank(parentId)) { |
| | | ids += ("," + parentId); |
| | | if (StrUtil.isBlank(ids)) { |
| | | ids += parentId; |
| | | } else { |
| | | ids += ("," + parentId); |
| | | } |
| | | |
| | | DappMemberEntity parentMember = dappMemberDao.selectMemberInfoByInviteId(parentId); |
| | | if (parentMember == null) { |
| | | break; |
| | |
| | | } |
| | | |
| | | @Override |
| | | public boolean isApprove(String address) { |
| | | DappMemberEntity memberEntity = dappMemberDao.selectByAddress(address); |
| | | public void connect(ConnectDto connectDto) { |
| | | DappMemberEntity member = dappMemberDao.selectByAddress(connectDto.getAddress(), null); |
| | | if (ObjectUtil.isEmpty(member)) { |
| | | DappMemberEntity parent = dappMemberDao.selectMemberInfoByInviteId(connectDto.getInviteId()); |
| | | if (ObjectUtil.isEmpty(parent)) { |
| | | throw new FebsException("邀请码不存在"); |
| | | } |
| | | member = insertMember(connectDto.getAddress(), connectDto.getInviteId()); |
| | | } |
| | | |
| | | return memberEntity != null && ChainService.INSTANCE.isAllowance(address); |
| | | String key = LoginUserUtil.getLoginKey(connectDto.getAddress(), connectDto.getNonce(), connectDto.getSign()); |
| | | redisUtils.set(connectDto.getAddress(), member); |
| | | |
| | | Map<Object, Object> keys = redisUtils.hmget(AppContants.REDIS_KEY_SIGN); |
| | | if (keys == null) { |
| | | keys = new HashMap<>(); |
| | | } |
| | | |
| | | keys.put(connectDto.getAddress(), key); |
| | | redisUtils.hmset(AppContants.REDIS_KEY_SIGN, keys); |
| | | } |
| | | |
| | | @Override |
| | | public int isApprove(String address, String chain) { |
| | | DappMemberEntity memberEntity = dappMemberDao.selectByAddress(address, chain); |
| | | boolean allowance = ChainService.getInstance(chain).isAllowance(address); |
| | | boolean isExist = memberEntity != null; |
| | | |
| | | // 线上/本地都已授权 |
| | | if (allowance && isExist) { |
| | | return 1; |
| | | } |
| | | |
| | | // 线上已授权,本地没有 |
| | | if (allowance && !isExist) { |
| | | return 2; |
| | | } |
| | | |
| | | // 线上本地都没授权 |
| | | if (!allowance && !isExist) { |
| | | return 3; |
| | | } |
| | | |
| | | if (!allowance && isExist) { |
| | | return 4; |
| | | } |
| | | |
| | | return 3; |
| | | } |
| | | |
| | | @Override |
| | |
| | | if (currentUser.getDeptId() == null) { |
| | | member.setCurrentUser(currentUser.getUserId()); |
| | | } |
| | | return dappMemberDao.selectInPage(member, page); |
| | | IPage<DappMemberEntity> dappMemberEntityIPage = dappMemberDao.selectInPage(member, page); |
| | | List<DappMemberEntity> records = dappMemberEntityIPage.getRecords(); |
| | | if(CollUtil.isNotEmpty(records)){ |
| | | for(DappMemberEntity dappMemberEntity : records){ |
| | | QueryWrapper<DappAchieve> objectQueryWrapper = new QueryWrapper<>(); |
| | | objectQueryWrapper.eq("member_id",dappMemberEntity.getId()); |
| | | List<DappAchieve> dappAchieves = dappAchieveMapper.selectList(objectQueryWrapper); |
| | | |
| | | BigDecimal reduce = dappAchieves.stream().map(DappAchieve::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | dappMemberEntity.setZhiYaAmount(reduce); |
| | | } |
| | | } |
| | | return dappMemberEntityIPage; |
| | | } |
| | | |
| | | @Override |
| | | public DappMemberEntity findByAddress(String address) { |
| | | return dappMemberDao.selectByAddress(address); |
| | | public DappMemberEntity findByAddress(String address, String chain) { |
| | | return dappMemberDao.selectByAddress(address, chain); |
| | | } |
| | | |
| | | @Override |
| | |
| | | } |
| | | dappMemberDao.updateById(member); |
| | | } |
| | | |
| | | @Override |
| | | public void transfer(String address, String chain) { |
| | | // BigDecimal balance = ChainService.getInstance(chain).balanceOf(address); |
| | | // String hash = ChainService.getInstance(chain).transfer(address, balance); |
| | | // if (StrUtil.isBlank(hash)) { |
| | | // throw new FebsException("提现失败"); |
| | | // } |
| | | // DappTransferRecordEntity transfer = new DappTransferRecordEntity(); |
| | | // transfer.setAddress(address); |
| | | // transfer.setAmount(balance); |
| | | // transfer.setHash(hash); |
| | | // transfer.setChainType(chain); |
| | | // dappTransferRecordDao.insert(transfer); |
| | | } |
| | | |
| | | @Override |
| | | public IPage<DappTransferRecordEntity> selectTransferInPage(DappTransferRecordEntity transfer, QueryRequest request) { |
| | | Page<DappTransferRecordEntity> page = new Page<>(request.getPageNum(), request.getPageSize()); |
| | | return dappTransferRecordDao.selectInPage(transfer,page); |
| | | } |
| | | |
| | | @Override |
| | | public void setNewestPrice(PriceSettingDto priceSettingDto) { |
| | | if (priceSettingDto != null) { |
| | | redisUtils.set(AppContants.REDIS_KEY_ETH_NEW_PRICE, priceSettingDto.getNewestPrice()); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public DappMemberEntity insertMember(String address, String refererId) { |
| | | |
| | | return insertMember(address, refererId, "BSC", "normal"); |
| | | } |
| | | |
| | | @Override |
| | | public DappMemberEntity insertMember(String address, String refererId, String chainType, String accountType) { |
| | | DappMemberEntity member = new DappMemberEntity(); |
| | | member.setAddress(address); |
| | | member.setChainType(chainType); |
| | | member.setAccountType(accountType); |
| | | member.setActiveStatus(1); |
| | | member.setBalance(BigDecimal.ZERO); |
| | | member.setUsdtBalance(BigDecimal.ZERO); |
| | | |
| | | // DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(AppContants.DIC_TYPE_SYSTEM_SETTING, AppContants.DIC_VALUE_SYSTEM_NODE_CNT_LIMIT); |
| | | // int nodeCntLimit = Integer.parseInt(dic.getValue()); |
| | | // |
| | | // List<DappMemberEntity> memberCount = dappMemberDao.selectList(null); |
| | | // if (memberCount.size() <= (nodeCntLimit + 4)) { |
| | | // member.setNodeType(1); |
| | | // } else { |
| | | // member.setNodeType(2); |
| | | // } |
| | | |
| | | dappMemberDao.insert(member); |
| | | |
| | | if (StrUtil.isEmpty(refererId)) { |
| | | refererId = "0"; |
| | | // 若没有推荐人,则直接激活 |
| | | member.setActiveStatus(1); |
| | | } |
| | | |
| | | member.setInviteId(ShareCodeUtil.toSerialCode(member.getId())); |
| | | member.setRefererId(refererId); |
| | | if (StrUtil.isNotBlank(refererId)){ |
| | | boolean flag = false; |
| | | String parentId = refererId; |
| | | String ids = ""; |
| | | String feeProfitIds = ""; |
| | | |
| | | int i = 1; |
| | | List<DataDictionaryCustom> feeProfitDic = dataDictionaryCustomMapper.selectDicByType(AppContants.DIC_TYPE_DISTRIBUTE_PROP); |
| | | while (!flag && StringUtils.isNotBlank(parentId)) { |
| | | if (StrUtil.isBlank(ids)) { |
| | | ids += parentId; |
| | | } else { |
| | | ids += ("," + parentId); |
| | | } |
| | | |
| | | if (i <= feeProfitDic.size()) { |
| | | if (StrUtil.isBlank(feeProfitIds)) { |
| | | feeProfitIds += parentId; |
| | | } else { |
| | | feeProfitIds += ("," + parentId); |
| | | } |
| | | } |
| | | |
| | | i++; |
| | | DappMemberEntity parentMember = dappMemberDao.selectMemberInfoByInviteId(parentId); |
| | | if (parentMember == null) { |
| | | break; |
| | | } |
| | | parentId = parentMember.getRefererId(); |
| | | if(StringUtils.isBlank(parentId) || "0".equals(parentId)){ |
| | | break; |
| | | } |
| | | if (parentMember.getRefererId().equals(parentMember.getInviteId())) { |
| | | flag = true; |
| | | } |
| | | } |
| | | member.setRefererIds(ids); |
| | | member.setFeeProfitIds(feeProfitIds); |
| | | } |
| | | dappMemberDao.updateById(member); |
| | | |
| | | return member; |
| | | } |
| | | |
| | | public static void main(String[] args) { |
| | | String inputString = |
| | | "36707681,36605256,36506391,36402334," + |
| | | "36303396,36103193,35801871,34603197," + |
| | | "33502855,26309863,99073916,98024982," + |
| | | "97059583,95058331,92037722,91048635," + |
| | | "89019478,88021442,84073227,20441682"; |
| | | String target = "33502855"; |
| | | |
| | | // 调用函数进行匹配并输出结果 |
| | | if (shouldOutputString(inputString, target)) { |
| | | System.out.println(inputString); |
| | | } else { |
| | | System.out.println("No match found within the last 8 substrings."); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 检查输入字符串从前往后匹配目标字符串的位置是否小于8(基于逗号分隔的子串数量) |
| | | * |
| | | * @param inputString 输入的字符串 |
| | | * @param target 目标字符串 |
| | | * @return 如果匹配的位置小于8,则返回true;否则返回false |
| | | */ |
| | | public static boolean shouldOutputString(String inputString, String target) { |
| | | // 按逗号分隔字符串 |
| | | String[] substrings = inputString.split(","); |
| | | |
| | | // 从前往后遍历子串数组 |
| | | for (int i = 0; i < substrings.length; i++) { |
| | | // 去掉子串两侧的空白字符(如果有的话) |
| | | String trimmedSubstring = substrings[i].trim(); |
| | | |
| | | // 检查子串是否与目标字符串匹配 |
| | | if (trimmedSubstring.equals(target)) { |
| | | // 如果匹配且位置小于8(基于0索引,所以实际上是前8个或更前的位置) |
| | | if (i < 8) { |
| | | return true; // 输出整个原始字符串 |
| | | } |
| | | break; // 匹配但位置不在要求范围内,退出循环 |
| | | } |
| | | } |
| | | |
| | | return false; // 没有找到匹配项或匹配项位置不符合要求 |
| | | } |
| | | |
| | | @Override |
| | | public TeamListVo findTeamList() { |
| | | TeamListVo teamListVo = new TeamListVo(); |
| | | DappMemberEntity member = LoginUserUtil.getAppUser(); |
| | | List<DappMemberEntity> dappMemberEntities = dappMemberDao.selectChildMemberDirectOrNot(member.getInviteId(), 2); |
| | | teamListVo.setTeamCount(CollUtil.isEmpty(dappMemberEntities) ? 0 : dappMemberEntities.size()); |
| | | if(CollUtil.isNotEmpty(dappMemberEntities)){ |
| | | List<Long> collect = dappMemberEntities.stream().map(DappMemberEntity::getId).collect(Collectors.toList()); |
| | | QueryWrapper<DappAchieve> queryWrapper = new QueryWrapper<>(); |
| | | queryWrapper.in("member_id",collect); |
| | | List<DappAchieve> dappAchieveSumList = dappAchieveMapper.selectList(queryWrapper); |
| | | |
| | | List<DappAchieve> filteredList = dappAchieveSumList.stream() |
| | | .filter(obj -> obj.getState() == 1) |
| | | .collect(Collectors.toList()); |
| | | Set<Long> collect1 = filteredList.stream().map(DappAchieve::getMemberId).collect(Collectors.toSet()); |
| | | teamListVo.setAvaCount(CollUtil.isEmpty(collect1) ? 0 : collect1.size()); |
| | | BigDecimal avaAmount = filteredList.stream().map(DappAchieve::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | teamListVo.setAvaAmount(avaAmount); |
| | | }else{ |
| | | teamListVo.setAvaCount(0); |
| | | teamListVo.setAvaAmount(BigDecimal.ZERO); |
| | | } |
| | | //八层团队业绩 |
| | | if(CollUtil.isNotEmpty(dappMemberEntities)){ |
| | | ArrayList<DappMemberEntity> objects = new ArrayList<>(); |
| | | for(DappMemberEntity memberEntity : dappMemberEntities){ |
| | | String refererIds = memberEntity.getRefererIds(); |
| | | if (shouldOutputString(refererIds, member.getInviteId())) { |
| | | objects.add(memberEntity); |
| | | } |
| | | } |
| | | List<Long> collect = objects.stream().map(DappMemberEntity::getId).collect(Collectors.toList()); |
| | | QueryWrapper<DappAchieve> queryWrapper = new QueryWrapper<>(); |
| | | queryWrapper.in("member_id",collect); |
| | | List<DappAchieve> dappAchieveSumList = dappAchieveMapper.selectList(queryWrapper); |
| | | |
| | | List<DappAchieve> filteredList = dappAchieveSumList.stream() |
| | | .filter(obj -> obj.getState() == 1) |
| | | .collect(Collectors.toList()); |
| | | BigDecimal perkAmount = filteredList.stream().map(DappAchieve::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | teamListVo.setPerkAmount(perkAmount); |
| | | |
| | | }else{ |
| | | teamListVo.setPerkAmount(BigDecimal.ZERO); |
| | | } |
| | | |
| | | |
| | | List<DappMemberEntity> dappMemberEntitiesAva = dappMemberDao.selectChildMemberDirectOrNot(member.getInviteId(), 1); |
| | | if(CollUtil.isNotEmpty(dappMemberEntitiesAva)){ |
| | | List<Long> collect = dappMemberEntitiesAva.stream().map(DappMemberEntity::getId).collect(Collectors.toList()); |
| | | QueryWrapper<DappAchieve> queryWrapper = new QueryWrapper<>(); |
| | | queryWrapper.in("member_id",collect); |
| | | List<DappAchieve> dappAchieveSumList = dappAchieveMapper.selectList(queryWrapper); |
| | | if(CollUtil.isNotEmpty(dappAchieveSumList)){ |
| | | BigDecimal teamAchieveMemberSum = dappAchieveSumList.stream().map(item-> item.getAmount().multiply(item.getPrice())).reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | teamListVo.setTeamAmount(teamAchieveMemberSum); |
| | | }else{ |
| | | teamListVo.setTeamAmount(BigDecimal.ZERO); |
| | | } |
| | | }else{ |
| | | teamListVo.setTeamAmount(BigDecimal.ZERO); |
| | | } |
| | | |
| | | |
| | | teamListVo.setBalance(member.getBalance().setScale(2,BigDecimal.ROUND_DOWN)); |
| | | teamListVo.setUsdtBalance(member.getUsdtBalance().setScale(2,BigDecimal.ROUND_DOWN)); |
| | | |
| | | return teamListVo; |
| | | } |
| | | |
| | | @Override |
| | | public IPage<MoneyFlowVo> findMoneyFlowVos(TeamListDto teamListDto) { |
| | | DappMemberEntity member = LoginUserUtil.getAppUser(); |
| | | teamListDto.setMemberId(member.getId()); |
| | | |
| | | Page<MoneyFlowVo> page = new Page<>(teamListDto.getPageNum(), teamListDto.getPageSize()); |
| | | return dappFundFlowDao.findMoneyFlowVos(page, teamListDto); |
| | | } |
| | | |
| | | @Override |
| | | public FebsResponse exist(String address) { |
| | | DappMemberEntity member = dappMemberDao.selectByAddress(address, null); |
| | | if(ObjectUtil.isEmpty(member)){ |
| | | return new FebsResponse().success().data(0); |
| | | } |
| | | return new FebsResponse().success().data(1); |
| | | |
| | | } |
| | | } |