| | |
| | | |
| | | import cc.mrbird.febs.common.contants.AppContants; |
| | | import cc.mrbird.febs.common.exception.FebsException; |
| | | import cc.mrbird.febs.common.tree.MatrixTree; |
| | | import cc.mrbird.febs.common.tree.MemberNode; |
| | | import cc.mrbird.febs.common.utils.LoginUserUtil; |
| | | import cc.mrbird.febs.common.utils.RedisUtils; |
| | | import cc.mrbird.febs.common.utils.SpringContextUtil; |
| | |
| | | import cc.mrbird.febs.dapp.mapper.*; |
| | | import cc.mrbird.febs.dapp.service.DappSystemService; |
| | | import cc.mrbird.febs.dapp.service.DappWalletService; |
| | | import cc.mrbird.febs.dapp.service.IMatrixTreeNodeService; |
| | | import cc.mrbird.febs.dapp.vo.AKLineLimitVo; |
| | | import cc.mrbird.febs.rabbit.producer.ChainProducer; |
| | | import cc.mrbird.febs.tree.MatrixTree; |
| | | import cc.mrbird.febs.tree.MemberNode; |
| | | import cc.mrbird.febs.tree.TreeConstants; |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.date.DateTime; |
| | |
| | | private final DappWalletMineDao dappWalletMineDao; |
| | | private final DappAKlineMapper dappAKlineMapper; |
| | | |
| | | private final MallOrderInfoMapper mallOrderInfoMapper; |
| | | private final MallAchieveRecordMapper mallAchieveRecordMapper; |
| | | |
| | | |
| | | |
| | | @Override |
| | |
| | | SystemDto system = new SystemDto(); |
| | | system.setBuyAmount(new BigDecimal("100")); |
| | | return system; |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public synchronized void achieveTree(Long memberId) { |
| | | DappMemberEntity member = dappMemberDao.selectById(memberId); |
| | | |
| | | int batchNo = 0; |
| | | DappAchieveTreeEntity newestTreeNode = dappAchieveTreeDao.selectNewestTreeNode(); |
| | | if (newestTreeNode != null) { |
| | | if (newestTreeNode.getValidState() == 2) { |
| | | batchNo = newestTreeNode.getBatchNo() + 1; |
| | | } else { |
| | | batchNo = newestTreeNode.getBatchNo(); |
| | | } |
| | | } |
| | | |
| | | // 在大树中,插入当前节点 |
| | | DappAchieveTreeEntity achieveTree = new DappAchieveTreeEntity(); |
| | | achieveTree.setMidNode(memberId); |
| | | achieveTree.setValidState(1); |
| | | achieveTree.setBatchNo(batchNo); |
| | | dappAchieveTreeDao.insert(achieveTree); |
| | | |
| | | // 在内存树(大树)中插入当前节点,并返回父节点 |
| | | MemberNode node = new MemberNode(member.getId(), member.getAddress(), member.getInviteId(), member.getRefererId()); |
| | | |
| | | MatrixTree tree = MatrixTree.getInstance(); |
| | | MemberNode exist = tree.getNode(member.getId()); |
| | | if (exist != null) { |
| | | return; |
| | | } |
| | | |
| | | MemberNode parentNode = tree.addNode(node); |
| | | |
| | | // 创建该节点的矩阵 |
| | | DappAchieveMemberTreeEntity achieveMemberTree = new DappAchieveMemberTreeEntity(); |
| | | achieveMemberTree.setTreeNode(memberId); |
| | | achieveMemberTree.setTopNode(memberId); |
| | | achieveMemberTree.setDeep(1); |
| | | achieveMemberTree.setHasMoney(1); |
| | | if (parentNode != null) { |
| | | achieveMemberTree.setParentNode(parentNode.getMemberId()); |
| | | } |
| | | dappAchieveMemberTreeDao.insert(achieveMemberTree); |
| | | |
| | | // 激活用户状态 |
| | | member.setActiveStatus(1); |
| | | dappMemberDao.updateById(member); |
| | | |
| | | putIntoProfit(memberId, 2); |
| | | if (parentNode == null) { |
| | | return; |
| | | } |
| | | |
| | | // 修改父节点在数据库中的左/右节点数据 |
| | | DappAchieveTreeEntity treeMidNode = dappAchieveTreeDao.selectByMidNode(parentNode.getMemberId()); |
| | | boolean isLeft = false; |
| | | if (parentNode.getLeft() != null && memberId.equals(parentNode.getLeft().getMemberId())) { |
| | | treeMidNode.setLeftNode(memberId); |
| | | isLeft = true; |
| | | } else { |
| | | treeMidNode.setRightNode(memberId); |
| | | } |
| | | dappAchieveTreeDao.updateById(treeMidNode); |
| | | |
| | | // 更新矩阵中的数据 |
| | | List<DappAchieveMemberTreeEntity> matrixNodes = dappAchieveMemberTreeDao.selectNotBottomNodeInMatrix(parentNode.getMemberId()); |
| | | for (DappAchieveMemberTreeEntity matrixNode : matrixNodes) { |
| | | if (isLeft) { |
| | | matrixNode.setLeftNode(memberId); |
| | | } else { |
| | | matrixNode.setRightNode(memberId); |
| | | } |
| | | |
| | | dappAchieveMemberTreeDao.updateById(matrixNode); |
| | | |
| | | DappAchieveMemberTreeEntity newMatrixNode = new DappAchieveMemberTreeEntity(); |
| | | newMatrixNode.setTreeNode(memberId); |
| | | newMatrixNode.setTopNode(matrixNode.getTopNode()); |
| | | newMatrixNode.setParentNode(parentNode.getMemberId()); |
| | | newMatrixNode.setHasMoney(1); |
| | | newMatrixNode.setDeep(matrixNode.getDeep() + 1); |
| | | dappAchieveMemberTreeDao.insert(newMatrixNode); |
| | | |
| | | if (matrixNode.getDeep() == 2) { |
| | | finishMatrixTree(matrixNode.getTopNode()); |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 完成矩阵树,并重置矩阵且重入 |
| | | public void finishMatrixTree(Long memberId) { |
| | | List<DappAchieveMemberTreeEntity> matrixTree = dappAchieveMemberTreeDao.selectMatrixTreeByTopNode(memberId, 1); |
| | | // 如果达到标准,则重置该矩阵树 |
| | | if (matrixTree.size() == 7) { |
| | | dappAchieveMemberTreeDao.resetMatrixTree(memberId); |
| | | dappAchieveMemberTreeDao.reentryMoney(memberId); |
| | | |
| | | putIntoProfit(memberId, 1); |
| | | DappAchieveMemberTreeEntity bottomNode = dappAchieveMemberTreeDao.selectNodeByDeep(memberId, 3); |
| | | if (bottomNode != null) { |
| | | finishMatrixTree(bottomNode.getTopNode()); |
| | | } |
| | | } |
| | | } |
| | | |
| | | @Override |
| | |
| | | PoolEnum.COIN_A_CNT.getType(), |
| | | PoolEnum.COIN_A_CNT.getCode()); |
| | | BigDecimal coinACnt = new BigDecimal(coinACntDic.getValue()); |
| | | coinACnt = coinACnt.subtract(totalCnt.multiply(new BigDecimal(0.9))); |
| | | coinACnt = coinACnt.subtract(totalCnt.multiply(new BigDecimal(0.8))); |
| | | coinACntDic.setValue(coinACnt.toString()); |
| | | dataDictionaryCustomMapper.updateById(coinACntDic); |
| | | |
| | |
| | | ); |
| | | //A币金本位底池-usdt数量 |
| | | BigDecimal coinAUsdtPriceDicCnt = new BigDecimal(coinAUsdtPriceDic.getValue()); |
| | | coinAUsdtPriceDicCnt = coinAUsdtPriceDicCnt.add(amount.multiply(new BigDecimal(0.9))); |
| | | coinAUsdtPriceDicCnt = coinAUsdtPriceDicCnt.add(amount.multiply(new BigDecimal(0.8))); |
| | | coinAUsdtPriceDic.setValue(coinAUsdtPriceDicCnt.toString()); |
| | | dataDictionaryCustomMapper.updateById(coinAUsdtPriceDic); |
| | | |
| | |
| | | |
| | | } |
| | | |
| | | @Override |
| | | public void speedPayOrderMsg(Long orderId) { |
| | | MallOrderInfo mallOrderInfo = mallOrderInfoMapper.selectById(orderId); |
| | | if(ObjectUtil.isEmpty(mallOrderInfo)){ |
| | | return; |
| | | } |
| | | if(MallOrderInfo.STATUS_PAY != mallOrderInfo.getStatus()){ |
| | | return; |
| | | } |
| | | Long memberId = mallOrderInfo.getMemberId(); |
| | | /** |
| | | * 赠送消费金额1.5倍增值积分 |
| | | */ |
| | | BigDecimal amount = mallOrderInfo.getAmount(); |
| | | DataDictionaryCustom donateScorePercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | DataDictionaryEnum.DONATE_SCORE_PERCENT.getType(), |
| | | DataDictionaryEnum.DONATE_SCORE_PERCENT.getCode() |
| | | ); |
| | | BigDecimal donateScorePercent = new BigDecimal(donateScorePercentDic.getValue()); |
| | | BigDecimal donateScore = amount.multiply(donateScorePercent); |
| | | dappWalletMineDao.updateBalance(donateScore,donateScore,memberId); |
| | | DappFundFlowEntity donateScoreFlow = new DappFundFlowEntity( |
| | | memberId, |
| | | donateScore, |
| | | FundFlowEnum.DONATE_SCORE.getCode(), |
| | | 2, |
| | | BigDecimal.ZERO, |
| | | null, |
| | | orderId); |
| | | dappFundFlowDao.insert(donateScoreFlow); |
| | | /** |
| | | * 新增一条业绩 |
| | | */ |
| | | MallAchieveRecord mallAchieveRecord = new MallAchieveRecord( |
| | | memberId,amount,amount,DateUtil.date(),orderId,1,mallOrderInfo.getPayTime() |
| | | ); |
| | | mallAchieveRecordMapper.insert(mallAchieveRecord); |
| | | |
| | | } |
| | | |
| | | |
| | | private final IMatrixTreeNodeService matrixTreeNodeService; |
| | | |
| | | @Override |
| | | public void speedAutoLevelUpMsg(Long memberId) {log.info("###代理自动升级###"); |
| | | DappMemberEntity member = dappMemberDao.selectById(memberId); |
| | | if (MemberLevelEnum.V7.getType().equals(member.getAccountType())) { |
| | | return; |
| | | } |
| | | |
| | | MemberNode parentNode = matrixTreeNodeService.addTreeNode(memberId); |
| | | if (parentNode == null) { |
| | | log.info("父级节点未找到:{}", memberId); |
| | | return; |
| | | } |
| | | |
| | | MatrixTree matrixTree = MatrixTree.getInstance(); |
| | | List<MemberNode> allNodes = matrixTree.getAllAncestors(parentNode); // 获取某一个MemberNode的所有上级节点 |
| | | allNodes.add(parentNode); |
| | | if(CollUtil.isEmpty(allNodes)){ |
| | | return; |
| | | } |
| | | /** |
| | | * 更新所有上级的小区业绩 |
| | | */ |
| | | for(MemberNode memberNode : allNodes){ |
| | | BigDecimal smallAchieve = BigDecimal.ZERO; |
| | | List<MemberNode> allNodesChildList = memberNode.getCHILD(); |
| | | if(CollUtil.isNotEmpty(allNodesChildList)){ |
| | | List<Long> left = allNodesChildList.stream().filter(allNodesChild -> allNodesChild.getType() == 1).map(MemberNode::getMemberId).collect(Collectors.toList()); |
| | | List<Long> right = allNodesChildList.stream().filter(allNodesChild -> allNodesChild.getType() == 2).map(MemberNode::getMemberId).collect(Collectors.toList()); |
| | | |
| | | BigDecimal leftAmount = mallAchieveRecordMapper.selectSumAchieveByMemberIdList(left); |
| | | |
| | | BigDecimal rightAmount = mallAchieveRecordMapper.selectSumAchieveByMemberIdList(right); |
| | | if(leftAmount.compareTo(rightAmount) > 0){ |
| | | smallAchieve = rightAmount; |
| | | }else{ |
| | | smallAchieve = leftAmount; |
| | | } |
| | | //更新用户的区域业绩 |
| | | DappMemberEntity dappMemberEntity = dappMemberDao.selectById(memberNode.getMemberId()); |
| | | dappMemberEntity.setUsdtBalance(smallAchieve); |
| | | dappMemberEntity.setLeftAchieve(leftAmount); |
| | | dappMemberEntity.setRightAchieve(rightAmount); |
| | | dappMemberDao.updateById(dappMemberEntity); |
| | | log.info("用户:{},leftAchieve :{}, rightAchieve:{}, smallAchieve:{}", |
| | | dappMemberEntity.getAddress(), leftAmount, rightAmount, smallAchieve); |
| | | |
| | | /** |
| | | * 判断是否符合升级条件 |
| | | */ |
| | | String nextLevel = MemberLevelEnum.MEMBER.getNextLevel(dappMemberEntity.getAccountType()); |
| | | DataDictionaryCustom memberLevelDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | DataDictionaryEnum.V1.getType() |
| | | , nextLevel); |
| | | if(ObjectUtil.isNotEmpty(memberLevelDic)){ |
| | | String value = memberLevelDic.getValue(); |
| | | cn.hutool.json.JSONObject parseObj = JSONUtil.parseObj(value); |
| | | BigDecimal smallAchieveDic = new BigDecimal(parseObj.get("smallAchieve").toString()); |
| | | if(smallAchieve.compareTo(smallAchieveDic) >= 0){ |
| | | //升级 |
| | | dappMemberEntity.setAccountType(nextLevel); |
| | | dappMemberDao.updateById(dappMemberEntity); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public void memberPerk() { |
| | | List<DappMemberEntity> dappMemberEntityList = dappMemberDao.selectMemberByActiveStatus(); |
| | | if(CollUtil.isEmpty(dappMemberEntityList)){ |
| | | return; |
| | | } |
| | | DataDictionaryCustom staticReleaseDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | DataDictionaryEnum.STATIC_RELEASE.getType(), |
| | | DataDictionaryEnum.STATIC_RELEASE.getCode() |
| | | ); |
| | | if(ObjectUtil.isEmpty(staticReleaseDic)){ |
| | | return; |
| | | } |
| | | BigDecimal staticRelease = new BigDecimal(staticReleaseDic.getValue() == null ? "0" : staticReleaseDic.getValue()); |
| | | if(BigDecimal.ZERO.compareTo(staticRelease) >= 0){ |
| | | return; |
| | | } |
| | | for(DappMemberEntity dappMemberEntity : dappMemberEntityList){ |
| | | if(1 != dappMemberEntity.getActiveStatus()){ |
| | | break; |
| | | } |
| | | List<MallAchieveRecord> mallAchieveRecords = mallAchieveRecordMapper.selectListByMemberId(dappMemberEntity.getId()); |
| | | /** |
| | | * 按照订单、比例生成对应的静态释放 |
| | | */ |
| | | for(MallAchieveRecord mallAchieveRecord : mallAchieveRecords){ |
| | | BigDecimal costAmount = mallAchieveRecord.getCostAmount(); |
| | | BigDecimal amount = mallAchieveRecord.getAmount(); |
| | | BigDecimal eachDayPerk = costAmount.multiply(staticRelease).setScale(2,BigDecimal.ROUND_DOWN); |
| | | /** |
| | | * 生成一条静态补贴的流水 |
| | | * 增加账户余额 |
| | | * 生成减少赠送积分流水 |
| | | * 减少账户的赠送积分 |
| | | * 业绩记录减少实际业绩amount |
| | | * |
| | | */ |
| | | } |
| | | |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 测试转账 |
| | | * @param args |