| | |
| | | import cc.mrbird.febs.dapp.dto.SystemDto; |
| | | import cc.mrbird.febs.dapp.entity.*; |
| | | import cc.mrbird.febs.dapp.enumerate.DataDictionaryEnum; |
| | | import cc.mrbird.febs.dapp.enumerate.InviteRule; |
| | | import cc.mrbird.febs.dapp.enumerate.NodeType; |
| | | import cc.mrbird.febs.dapp.mapper.*; |
| | | import cc.mrbird.febs.dapp.service.DappSystemService; |
| | | import cc.mrbird.febs.dapp.service.DappWalletService; |
| | |
| | | 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 lombok.RequiredArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Service; |
| | |
| | | private final DappAchieveMemberTreeDao dappAchieveMemberTreeDao; |
| | | private final DappWalletService dappWalletService; |
| | | private final DataDictionaryCustomMapper dataDictionaryCustomMapper; |
| | | |
| | | private final DbMemberNodeMapper dbMemberNodeMapper; |
| | | |
| | | |
| | | @Override |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public void achieveTreeV2(Long fundId) { |
| | | DappFundFlowEntity dappFundFlowEntity = dappFundFlowDao.selectById(fundId); |
| | | if(ObjectUtil.isEmpty(dappFundFlowEntity)){ |
| | | return; |
| | | } |
| | | Integer status = dappFundFlowEntity.getStatus(); |
| | | if(2 != status){ |
| | | return; |
| | | } |
| | | Long memberId = dappFundFlowEntity.getMemberId(); |
| | | DappMemberEntity member = dappMemberDao.selectById(memberId); |
| | | if(ObjectUtil.isEmpty(member)){ |
| | | return; |
| | | } |
| | | BigDecimal amount = dappFundFlowEntity.getAmount(); |
| | | //根据金额判断属于属于购买的哪一个节点 |
| | | NodeType nodeType = NodeType.NODE_1.getNodeByAmount(amount); |
| | | /** |
| | | * 获取一条最老的左右节点未满的记录 |
| | | * 然后生成一条新的记录 |
| | | * 如果添加的为左节点,那么没人出局 |
| | | * 如果添加的为右节点,那么进入判断 |
| | | * 1、父节点为左节点,那么没人出局 |
| | | * 2、父节点为右节点,那么进入判断,父节点是否有上级节点 |
| | | * 1、有,则上级节点出局复投,轮数加1,复投逻辑 |
| | | * |
| | | */ |
| | | //获取一条最老的左右节点未满且生效中的记录 |
| | | DbMemberNode dbMemberNodeOld = dbMemberNodeMapper.selectOneByWorkStateAndLeftNodeNullOrRightNodeNull(DbMemberNode.STATE_ONE); |
| | | if(ObjectUtil.isEmpty(dbMemberNodeOld)){ |
| | | //生成ROOT节点 |
| | | DbMemberNode root = new DbMemberNode(); |
| | | root.setMemberId(memberId); |
| | | root.setFundId(fundId); |
| | | root.setAmount(new BigDecimal(nodeType.getNodeAmount())); |
| | | root.setType(nodeType.getNodeType()); |
| | | root.setCountFund(1); |
| | | root.setPerkState(1); |
| | | root.setWorkState(1); |
| | | dbMemberNodeMapper.insert(root); |
| | | |
| | | return; |
| | | } |
| | | |
| | | //然后生成一条新的记录 |
| | | DbMemberNode dbMemberNode = new DbMemberNode(); |
| | | dbMemberNode.setMemberId(memberId); |
| | | dbMemberNode.setFundId(fundId); |
| | | dbMemberNode.setAmount(new BigDecimal(nodeType.getNodeAmount())); |
| | | dbMemberNode.setType(nodeType.getNodeType()); |
| | | dbMemberNode.setCountFund(1); |
| | | dbMemberNode.setPerkState(1); |
| | | dbMemberNode.setLeftRight(ObjectUtil.isEmpty(dbMemberNodeOld.getLeftNode()) ? 1 : 2); |
| | | dbMemberNode.setParentNode(dbMemberNodeOld.getId()); |
| | | dbMemberNode.setWorkState(1); |
| | | dbMemberNodeMapper.insert(dbMemberNode); |
| | | |
| | | //如果添加的为右节点,那么进入判断 |
| | | if(DbMemberNode.STATE_TWO == dbMemberNode.getLeftRight()){ |
| | | //父节点为右节点,那么进入判断,父节点是否有上级节点 |
| | | int leftRight = ObjectUtil.isEmpty(dbMemberNodeOld.getLeftNode()) ? 1 : 2; |
| | | if(DbMemberNode.STATE_TWO == leftRight){ |
| | | if(ObjectUtil.isEmpty(dbMemberNodeOld.getParentNode())){ |
| | | return; |
| | | } |
| | | Long parentNode = dbMemberNodeOld.getParentNode(); |
| | | DbMemberNode dbMemberNodeRoot = dbMemberNodeMapper.selectById(parentNode); |
| | | if(ObjectUtil.isEmpty(dbMemberNodeRoot)){ |
| | | return; |
| | | } |
| | | //有,则上级节点出局复投,轮数加1,复投逻辑 |
| | | memberNodeNext(dbMemberNodeRoot); |
| | | }else{//父节点为左节点,那么没人出局 |
| | | return; |
| | | } |
| | | }else{ |
| | | //如果添加的为左节点,那么没人出局 |
| | | return; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 有,则上级节点出局复投,轮数加1,复投逻辑 |
| | | * @param dbMemberNodeRoot |
| | | */ |
| | | public void memberNodeNext(DbMemberNode dbMemberNodeRoot) { |
| | | log.info("进入复投"); |
| | | } |
| | | |
| | | |
| | | |
| | | // 完成矩阵树,并重置矩阵且重入 |
| | | public void finishMatrixTree(Long memberId) { |
| | |
| | | dappFundFlowDao.insert(profitFlow); |
| | | }); |
| | | } |
| | | |
| | | @Override |
| | | public void invitePerkMsg(Long id) { |
| | | /** |
| | | * 推荐规则: |
| | | * 无直推奖励,推2个3层,3个6层,4个10层。1%见点奖(有效层级内,每个每1%),共10层,共%10。 |
| | | */ |
| | | DappFundFlowEntity dappFundFlowEntity = dappFundFlowDao.selectById(id); |
| | | if(ObjectUtil.isEmpty(dappFundFlowEntity)){ |
| | | return; |
| | | } |
| | | BigDecimal amount = dappFundFlowEntity.getAmount().abs(); |
| | | /** |
| | | * 往上循环十层,判断每一层是否有见点奖 |
| | | */ |
| | | Long memberId = dappFundFlowEntity.getMemberId(); |
| | | for(int i = 1;i <= 10;i++){ |
| | | DappMemberEntity dappMemberEntity = dappMemberDao.selectById(memberId); |
| | | String refererId = dappMemberEntity.getRefererId(); |
| | | //上级不存在,则停止循环。 |
| | | QueryWrapper<DappMemberEntity> objectQueryWrapper = new QueryWrapper<>(); |
| | | objectQueryWrapper.eq("invite_id",refererId); |
| | | DappMemberEntity dappMemberEntityRef = dappMemberDao.selectOne(objectQueryWrapper); |
| | | if(ObjectUtil.isEmpty(dappMemberEntityRef)){ |
| | | return; |
| | | } |
| | | //如果为购买星级激活用户,则跳过 |
| | | Integer activeStatus = dappMemberEntityRef.getActiveStatus(); |
| | | if(1 != activeStatus){ |
| | | memberId = dappMemberEntityRef.getId(); |
| | | continue; |
| | | } |
| | | //获取上级全部的直推 |
| | | String inviteId = dappMemberEntityRef.getInviteId(); |
| | | QueryWrapper<DappMemberEntity> memberInviteQuery = new QueryWrapper<>(); |
| | | memberInviteQuery.eq("referer_id",inviteId); |
| | | List<DappMemberEntity> memberInviteList = dappMemberDao.selectList(memberInviteQuery); |
| | | |
| | | //如果没有直推,则跳过 |
| | | if(CollUtil.isEmpty(memberInviteList)){ |
| | | memberId = dappMemberEntityRef.getId(); |
| | | continue; |
| | | } |
| | | |
| | | InviteRule rule = InviteRule.LEVEL_1.getRule(i); |
| | | if(ObjectUtil.isEmpty(rule)){ |
| | | return; |
| | | } |
| | | //如果直推不满足当前规则需要的人数,则跳过 |
| | | if(memberInviteList.size() < rule.getInviteNum()){ |
| | | memberId = dappMemberEntityRef.getId(); |
| | | continue; |
| | | } |
| | | BigDecimal perkPercent = new BigDecimal(rule.getPerkPercent()); |
| | | BigDecimal perkAmount = perkPercent.multiply(amount); |
| | | Long perkMemberId = dappMemberEntityRef.getId(); |
| | | //生成一条流水 |
| | | DappFundFlowEntity rePutInFlow = new DappFundFlowEntity( |
| | | perkMemberId, |
| | | perkAmount, |
| | | 15, |
| | | 2, |
| | | null, |
| | | null); |
| | | dappFundFlowDao.insert(rePutInFlow); |
| | | //更新用户的金额 |
| | | dappWalletService.updateWalletCoinWithLock(perkAmount, perkMemberId, 1); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public void nodePerkMsg(Long id) { |
| | | DappFundFlowEntity dappFundFlowEntity = dappFundFlowDao.selectById(id); |
| | | if(ObjectUtil.isEmpty(dappFundFlowEntity)){ |
| | | return; |
| | | } |
| | | BigDecimal amount = dappFundFlowEntity.getAmount().abs(); |
| | | log.info("买入贡献值-平分总金额-{}",amount); |
| | | /** |
| | | * 获取节点平分百分比 perkPercent |
| | | * 获取平分的份数 perKNum |
| | | * 获取每一份的金额 perkAmount |
| | | * 获取节点总数 buyNodeNum |
| | | * 如果perKNum大于buyNodeNum,则每个人获得(amount * perkPercent)/ perKNum = perkAmount |
| | | * 如果超出,再超出的人没有奖励 |
| | | */ |
| | | DataDictionaryCustom perkPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | DataDictionaryEnum.PERK_PERCENT.getType(), |
| | | DataDictionaryEnum.PERK_PERCENT.getCode() |
| | | ); |
| | | BigDecimal perkPercent = new BigDecimal(ObjectUtil.isEmpty(perkPercentDic) ? "10" : perkPercentDic.getValue()).multiply(new BigDecimal("0.01")); |
| | | |
| | | DataDictionaryCustom perKNumDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | DataDictionaryEnum.PERK_NUM.getType(), |
| | | DataDictionaryEnum.PERK_NUM.getCode() |
| | | ); |
| | | BigDecimal perKNum = new BigDecimal(ObjectUtil.isEmpty(perkPercentDic) ? "1000" : perKNumDic.getValue()); |
| | | |
| | | BigDecimal perkAmount = amount.multiply(perkPercent).divide(perKNum, 8, BigDecimal.ROUND_DOWN); |
| | | if(BigDecimal.ZERO.compareTo(perkAmount) >= 0){ |
| | | return; |
| | | } |
| | | |
| | | QueryWrapper<DappMemberEntity> objectQueryWrapper = new QueryWrapper<>(); |
| | | objectQueryWrapper.ge("buy_node",0); |
| | | List<DappMemberEntity> dappMemberEntities = dappMemberDao.selectList(objectQueryWrapper); |
| | | if(CollUtil.isEmpty(dappMemberEntities)){ |
| | | return; |
| | | } |
| | | |
| | | //奖励总份数 |
| | | BigDecimal totalPerkNum = BigDecimal.ZERO; |
| | | for(DappMemberEntity dappMemberEntity : dappMemberEntities){ |
| | | BigDecimal buyNode = new BigDecimal(dappMemberEntity.getBuyNode()); |
| | | totalPerkNum = totalPerkNum.add(buyNode); |
| | | if(perKNum.compareTo(totalPerkNum) < 0){ |
| | | return; |
| | | } |
| | | //奖励金额 |
| | | BigDecimal memberPerk = perkPercent.multiply(buyNode); |
| | | dappWalletService.updateWalletCoinWithLock(memberPerk, dappMemberEntity.getId(), 1); |
| | | |
| | | DappFundFlowEntity fundFlow = new DappFundFlowEntity( |
| | | dappMemberEntity.getId(), |
| | | memberPerk, |
| | | 14, |
| | | 2, |
| | | BigDecimal.ZERO, |
| | | null); |
| | | dappFundFlowDao.insert(fundFlow); |
| | | } |
| | | |
| | | log.info("买入贡献值-总人数{},-每人金额{}",dappMemberEntities.size(),perkAmount); |
| | | } |
| | | |
| | | } |