| | |
| | | import java.math.RoundingMode; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | | * @author |
| | |
| | | return; |
| | | } |
| | | BigDecimal amount = dappFundFlowEntity.getAmount(); |
| | | //存放买入新团的类型 |
| | | String toHash = dappFundFlowEntity.getToHash(); |
| | | //根据金额判断属于属于购买的哪一个节点 |
| | | NodeType nodeType = NodeType.NODE_1.getNodeByAmount(amount); |
| | | NodeType nodeType = NodeType.NODE_1.getNode(Integer.parseInt(toHash)); |
| | | if(ObjectUtil.isEmpty(nodeType)){ |
| | | return; |
| | | } |
| | | /** |
| | | * 获取一条最老的左右节点未满的记录 |
| | | * 然后生成一条新的记录 |
| | |
| | | * |
| | | */ |
| | | //获取一条最老的左右节点未满且生效中的记录 |
| | | DbMemberNode dbMemberNodeOld = dbMemberNodeMapper.selectOneByWorkStateAndLeftNodeNullOrRightNodeNull(DbMemberNode.STATE_ONE); |
| | | DbMemberNode dbMemberNodeOld = dbMemberNodeMapper.selectOneByWorkStateAndLeftNodeNullOrRightNodeNull(DbMemberNode.STATE_ONE,nodeType.getNodeType()); |
| | | if(ObjectUtil.isEmpty(dbMemberNodeOld)){ |
| | | //生成ROOT节点 |
| | | DbMemberNode root = 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); |
| | |
| | | |
| | | //如果添加的为右节点,那么进入判断 |
| | | if(DbMemberNode.STATE_TWO == dbMemberNode.getLeftRight()){ |
| | | //更新父节点的右节点 |
| | | dbMemberNodeOld.setRightNode(dbMemberNode.getId()); |
| | | dbMemberNodeMapper.updateById(dbMemberNodeOld); |
| | | |
| | | //父节点为右节点,那么进入判断,父节点是否有上级节点 |
| | | int leftRight = ObjectUtil.isEmpty(dbMemberNodeOld.getLeftNode()) ? 1 : 2; |
| | | int leftRight = ObjectUtil.isEmpty(dbMemberNodeOld.getLeftRight()) ? 1 : dbMemberNodeOld.getLeftRight(); |
| | | if(DbMemberNode.STATE_TWO == leftRight){ |
| | | if(ObjectUtil.isEmpty(dbMemberNodeOld.getParentNode())){ |
| | | return; |
| | |
| | | if(ObjectUtil.isEmpty(dbMemberNodeRoot)){ |
| | | return; |
| | | } |
| | | //每个星团,只复投10轮 |
| | | if(10 < dbMemberNodeRoot.getCountFund()){ |
| | | return; |
| | | } |
| | | //有,则上级节点出局复投,轮数加1,复投逻辑 |
| | | memberNodeNext(dbMemberNodeRoot); |
| | | }else{//父节点为左节点,那么没人出局 |
| | | return; |
| | | } |
| | | }else{ |
| | | //更新父节点的左节点 |
| | | dbMemberNodeOld.setLeftNode(dbMemberNode.getId()); |
| | | dbMemberNodeMapper.updateById(dbMemberNodeOld); |
| | | //如果添加的为左节点,那么没人出局 |
| | | return; |
| | | } |
| | |
| | | */ |
| | | public void memberNodeNext(DbMemberNode dbMemberNodeRoot) { |
| | | log.info("进入复投"); |
| | | |
| | | DataDictionaryCustom inviteNumDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | DataDictionaryEnum.INVITE_NUM.getType(), |
| | | DataDictionaryEnum.INVITE_NUM.getCode() |
| | | ); |
| | | |
| | | int inviteNum = Integer.parseInt(inviteNumDic.getValue()); |
| | | |
| | | Long memberId = dbMemberNodeRoot.getMemberId(); |
| | | DappMemberEntity dappMemberEntity = dappMemberDao.selectById(memberId); |
| | | //必须要有两个直推才能复投,或者获取收益,否则,直接返回 |
| | | QueryWrapper<DappMemberEntity> inviteQuery = new QueryWrapper<>(); |
| | | inviteQuery.eq("referer_id",dappMemberEntity.getInviteId()); |
| | | List<DappMemberEntity> dappMemberEntities = dappMemberDao.selectList(inviteQuery); |
| | | if(CollUtil.isEmpty(dappMemberEntities)){ |
| | | return; |
| | | } |
| | | if(inviteNum > dappMemberEntities.size()){ |
| | | return; |
| | | } |
| | | List<Long> collect = dappMemberEntities.stream().map(DappMemberEntity::getId).collect(Collectors.toList()); |
| | | QueryWrapper<DbMemberNode> inviteNodeQuery = new QueryWrapper<>(); |
| | | inviteNodeQuery.select("member_id"); |
| | | inviteNodeQuery.eq("work_state", DbMemberNode.STATE_ONE); |
| | | inviteNodeQuery.in("member_id",collect); |
| | | inviteNodeQuery.groupBy("member_id"); |
| | | List<DbMemberNode> inviteNodes = dbMemberNodeMapper.selectList(inviteNodeQuery); |
| | | if(CollUtil.isEmpty(inviteNodes)){ |
| | | return; |
| | | } |
| | | if(inviteNum > inviteNodes.size()){ |
| | | return; |
| | | } |
| | | //任何星级的原来节点都要出局 |
| | | dbMemberNodeRoot.setWorkState(DbMemberNode.STATE_TWO); |
| | | dbMemberNodeMapper.updateById(dbMemberNodeRoot); |
| | | //任何星级,10轮,收益本金都返回 |
| | | Integer countFund = dbMemberNodeRoot.getCountFund(); |
| | | //收益 |
| | | BigDecimal perkAmount = dbMemberNodeRoot.getAmount().multiply(new BigDecimal("1.4")); |
| | | if(10 == countFund){//任何星级,10轮,收益本金都返回 |
| | | BigDecimal add = dbMemberNodeRoot.getAmount().add(perkAmount); |
| | | perkSevenTeen(memberId,add,countFund); |
| | | |
| | | return; |
| | | }else{ |
| | | Integer type = dbMemberNodeRoot.getType(); |
| | | //如果是13星局,则直接复投产生收益 |
| | | if(NodeType.NODE_13.getNodeType() == type){ |
| | | //复投 |
| | | futouSixTeen(memberId,dbMemberNodeRoot.getAmount(),type,countFund+1); |
| | | //产生收益 |
| | | perkSevenTeen(memberId,perkAmount,countFund); |
| | | return; |
| | | } |
| | | //如果是1到12星团 |
| | | if(type >=NodeType.NODE_1.getNodeType() && type <= NodeType.NODE_12.getNodeType()){ |
| | | //需要复投本轮, |
| | | //如果是第一轮,当下一个星团没有投入时,收益复投下一个新团 |
| | | //如果是第一轮,下一个新团有投入,则产生收益 |
| | | //复投或者收益的金额 |
| | | if(1 == countFund){//第一轮 |
| | | //复投本轮,轮数 +1 |
| | | futouSixTeen(memberId,dbMemberNodeRoot.getAmount(),type,countFund+1); |
| | | //收益复投(当前的下一个星团没有已投入),还是收益提出 |
| | | Integer nextType = type + 1; |
| | | QueryWrapper<DbMemberNode> nodeQueryWrapper = new QueryWrapper<>(); |
| | | nodeQueryWrapper.eq("member_id",memberId); |
| | | nodeQueryWrapper.eq("type", nextType); |
| | | nodeQueryWrapper.eq("work_state", DbMemberNode.STATE_ONE); |
| | | DbMemberNode dbMemberNode = dbMemberNodeMapper.selectOne(nodeQueryWrapper); |
| | | if(ObjectUtil.isEmpty(dbMemberNode)){ |
| | | futouSixTeen(memberId,perkAmount,nextType,1); |
| | | }else{ |
| | | perkSevenTeen(memberId,perkAmount,countFund); |
| | | } |
| | | }else{//2-9轮 |
| | | //复投本轮,轮数 +1 |
| | | futouSixTeen(memberId,dbMemberNodeRoot.getAmount(),type,countFund+1); |
| | | perkSevenTeen(memberId,perkAmount,countFund); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | /** |
| | | * 产生收益 |
| | | * @param memberId 会员ID |
| | | * @param amount 收益金额 |
| | | * @param countFund 轮数 |
| | | */ |
| | | public void perkSevenTeen(Long memberId,BigDecimal amount,Integer countFund){ |
| | | //收益流水 |
| | | DappFundFlowEntity fundFlow = new DappFundFlowEntity( |
| | | memberId, |
| | | amount, |
| | | 17, |
| | | 2, |
| | | BigDecimal.ZERO, |
| | | countFund.toString()); |
| | | dappFundFlowDao.insert(fundFlow); |
| | | //更新用户的金额 |
| | | dappWalletService.updateWalletCoinWithLock(amount, memberId, 1); |
| | | } |
| | | |
| | | /** |
| | | * 复投本轮 |
| | | * 插入流水,产生记录 |
| | | * @param memberId 会员ID |
| | | * @param amount 复投金额 |
| | | * @param type 星团类型 |
| | | * @param countFund 轮数 |
| | | */ |
| | | public void futouSixTeen(Long memberId,BigDecimal amount,Integer type,Integer countFund){ |
| | | //复投流水 |
| | | DappFundFlowEntity fundFlow = new DappFundFlowEntity( |
| | | memberId, |
| | | amount, |
| | | 16, |
| | | 2, |
| | | BigDecimal.ZERO, |
| | | null); |
| | | dappFundFlowDao.insert(fundFlow); |
| | | DbMemberNode dbMemberNodeOld = dbMemberNodeMapper.selectOneByWorkStateAndLeftNodeNullOrRightNodeNull(DbMemberNode.STATE_ONE,type); |
| | | |
| | | //复投 |
| | | DbMemberNode dbMemberNode = new DbMemberNode(); |
| | | dbMemberNode.setMemberId(memberId); |
| | | dbMemberNode.setFundId(fundFlow.getId()); |
| | | dbMemberNode.setAmount(amount); |
| | | dbMemberNode.setType(type); |
| | | dbMemberNode.setCountFund(countFund); |
| | | dbMemberNode.setPerkState(1); |
| | | if(ObjectUtil.isNotEmpty(dbMemberNodeOld)){ |
| | | dbMemberNode.setLeftRight(ObjectUtil.isEmpty(dbMemberNodeOld.getLeftNode()) ? 1 : 2); |
| | | dbMemberNode.setParentNode(dbMemberNodeOld.getId()); |
| | | } |
| | | dbMemberNode.setWorkState(1); |
| | | dbMemberNodeMapper.insert(dbMemberNode); |
| | | |
| | | if(ObjectUtil.isNotEmpty(dbMemberNodeOld)){ |
| | | if(dbMemberNode.getLeftRight() == 1){ |
| | | dbMemberNodeOld.setLeftNode(dbMemberNode.getId()); |
| | | }else{ |
| | | dbMemberNodeOld.setRightNode(dbMemberNode.getId()); |
| | | } |
| | | dbMemberNodeMapper.updateById(dbMemberNodeOld); |
| | | } |
| | | } |
| | | |
| | | |
| | |
| | | //奖励总份数 |
| | | BigDecimal totalPerkNum = BigDecimal.ZERO; |
| | | for(DappMemberEntity dappMemberEntity : dappMemberEntities){ |
| | | //如果账号未激活,则无法领取收益 |
| | | if(1 != dappMemberEntity.getActiveStatus()){ |
| | | continue; |
| | | } |
| | | BigDecimal buyNode = new BigDecimal(dappMemberEntity.getBuyNode()); |
| | | totalPerkNum = totalPerkNum.add(buyNode); |
| | | if(perKNum.compareTo(totalPerkNum) < 0){ |