| | |
| | | |
| | | private final MallOrderInfoMapper mallOrderInfoMapper; |
| | | private final MallAchieveRecordMapper mallAchieveRecordMapper; |
| | | private final DappAccountMoneyChangeDao dappAccountMoneyChangeDao; |
| | | |
| | | |
| | | |
| | |
| | | } |
| | | for(DappMemberEntity dappMemberEntity : dappMemberEntityList){ |
| | | if(1 != dappMemberEntity.getActiveStatus()){ |
| | | break; |
| | | continue; |
| | | } |
| | | List<MallAchieveRecord> mallAchieveRecords = mallAchieveRecordMapper.selectListByMemberId(dappMemberEntity.getId()); |
| | | Long perkMemberId = dappMemberEntity.getId(); |
| | | //获取当前用户所有进行中的业绩释放 |
| | | List<MallAchieveRecord> mallAchieveRecords = mallAchieveRecordMapper.selectListByMemberId(perkMemberId); |
| | | |
| | | if(CollUtil.isEmpty(mallAchieveRecords)){ |
| | | continue; |
| | | } |
| | | /** |
| | | * 按照订单、比例生成对应的静态释放 |
| | | */ |
| | | for(MallAchieveRecord mallAchieveRecord : mallAchieveRecords){ |
| | | //释放总额 |
| | | BigDecimal costAmount = mallAchieveRecord.getCostAmount(); |
| | | //剩余 |
| | | BigDecimal amount = mallAchieveRecord.getAmount(); |
| | | if(BigDecimal.ZERO.compareTo(amount) >= 0){ |
| | | mallAchieveRecord.setIsNormal(2); |
| | | mallAchieveRecordMapper.updateById(mallAchieveRecord); |
| | | continue; |
| | | } |
| | | //每日释放金额 |
| | | BigDecimal eachDayPerk = costAmount.multiply(staticRelease).setScale(2,BigDecimal.ROUND_DOWN); |
| | | /** |
| | | * 生成一条静态补贴的流水 |
| | | * 增加账户余额 |
| | | * 生成减少赠送积分流水 |
| | | * 减少账户的赠送积分 |
| | | * 业绩记录减少实际业绩amount |
| | | * |
| | | */ |
| | | if(eachDayPerk.compareTo(amount) >= 0){ |
| | | eachDayPerk = amount; |
| | | mallAchieveRecord.setIsNormal(2); |
| | | } |
| | | DappMemberEntity mallAchieveMemberEntity = dappMemberDao.selectById(mallAchieveRecord.getMemberId()); |
| | | sendPerk(mallAchieveMemberEntity,eachDayPerk,mallAchieveRecord.getOrderId(),FundFlowEnum.STATIC_RELEASE.getCode()); |
| | | //实时更新用户等级 |
| | | chainProducer.sendAutoLevelUpTeamMsg(perkMemberId); |
| | | } |
| | | |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | @Override |
| | | public void speedAutoLevelUpTeamMsg(Long memberId) { |
| | | DappMemberEntity member = dappMemberDao.selectById(memberId); |
| | | if(StrUtil.isBlank(member.getRefererIds())) { |
| | | return; |
| | | } |
| | | |
| | | List<String> ids = StrUtil.split(member.getRefererIds(), ','); |
| | | List<DappMemberEntity> parentMembers = dappMemberDao.selectByInviteIds(ids); |
| | | for (DappMemberEntity parent : parentMembers) { |
| | | //V7不能再升级了 |
| | | if (MemberLevelEnum.V7.getType().equals(member.getAccountType())) { |
| | | continue; |
| | | } |
| | | |
| | | String nextLevelName = MemberLevelEnum.MEMBER.getNextLevel(parent.getAccountType()); |
| | | |
| | | DataDictionaryCustom newLevelDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode("TEAM_LEVEL", nextLevelName); |
| | | if(ObjectUtil.isEmpty(newLevelDic)){ |
| | | continue; |
| | | } |
| | | TeamLevelPerk teamLevelPerk = JSONObject.parseObject(newLevelDic.getValue(), TeamLevelPerk.class); |
| | | |
| | | //需要判断小区业绩 |
| | | if( MemberLevelEnum.V1.getType().equals(nextLevelName)){ |
| | | if (!teamAchieve(parent, teamLevelPerk)) { |
| | | continue; |
| | | } |
| | | }else{ |
| | | if (!agentCntFinish(parent, teamLevelPerk)) { |
| | | continue; |
| | | } |
| | | if (!teamAchieveOther(parent, teamLevelPerk)) { |
| | | continue; |
| | | } |
| | | } |
| | | |
| | | parent.setAccountType(nextLevelName); |
| | | dappMemberDao.updateById(parent); |
| | | } |
| | | } |
| | | /** |
| | | * 判断下级代理数量是否达标 |
| | | * |
| | | * @return |
| | | */ |
| | | private boolean agentCntFinish(DappMemberEntity member,TeamLevelPerk teamLevelPerk) { |
| | | if (teamLevelPerk.getLastAgentCnt() == null || teamLevelPerk.getLastAgentCnt() == 0) { |
| | | return true; |
| | | } |
| | | |
| | | // 直推用户 |
| | | List<DappMemberEntity> directMember = dappMemberDao.selectMemberInfoByRefererId(member.getInviteId()); |
| | | if (CollUtil.isEmpty(directMember)) { |
| | | return false; |
| | | } |
| | | |
| | | // 用户团队达到指定代理数量,且都不在同一条线 |
| | | int i = 0; |
| | | for (DappMemberEntity child : directMember) { |
| | | List<DappMemberEntity> mallMembers = dappMemberDao.selectChildAgentList(child.getInviteId(), member.getAccountType()); |
| | | if (CollUtil.isNotEmpty(mallMembers)) { |
| | | i++; |
| | | } |
| | | } |
| | | |
| | | if (i >= teamLevelPerk.getLastAgentCnt()) { |
| | | return true; |
| | | } |
| | | |
| | | log.info("用户:{}代理数量未达标, 当前等级:{}, 当前数量:{}, 目标数量:{}", member.getAddress(), member.getAccountType(), i, teamLevelPerk.getLastAgentCnt()); |
| | | return false; |
| | | } |
| | | /** |
| | | * 团队业绩是否达标 |
| | | * 除去直属的最大的一个业绩团队,剩余的所有业绩之和 |
| | | */ |
| | | private boolean teamAchieveOther(DappMemberEntity member, TeamLevelPerk teamLevelPerk ) { |
| | | BigDecimal teamIncome = teamLevelPerk.getSmallAchieve(); |
| | | //总业绩 |
| | | BigDecimal teamIncomeMax = BigDecimal.ZERO; |
| | | //所有直推团队,就是这个会员的所有区域的业绩。 |
| | | |
| | | // 直推用户 |
| | | List<DappMemberEntity> childs = dappMemberDao.selectMemberInfoByRefererId(member.getInviteId()); |
| | | List<String> childsInviteIds = childs.stream().map(DappMemberEntity::getInviteId).collect(Collectors.toList()); |
| | | for(String inviteId : childsInviteIds){ |
| | | BigDecimal totalIncomeMember = dappMemberDao.selectAchieveRecordByInviteId(inviteId); |
| | | teamIncomeMax = teamIncomeMax.add(totalIncomeMember); |
| | | } |
| | | |
| | | if (teamIncomeMax.compareTo(teamIncome) >= 0) { |
| | | return true; |
| | | } |
| | | log.info("用户:{}团队业绩未达标, 当前等级:{}, 当前业绩:{}, 目标业绩:{}", member.getAddress(), member.getAccountType(), teamIncomeMax, teamIncome); |
| | | return false; |
| | | } |
| | | |
| | | /** |
| | | * 团队业绩是否达标 |
| | | * 除去直属的最大的一个业绩团队,剩余的所有业绩之和 |
| | | */ |
| | | private boolean teamAchieve(DappMemberEntity member, TeamLevelPerk teamLevelPerk ) { |
| | | BigDecimal teamIncome = teamLevelPerk.getSmallAchieve(); |
| | | //业绩集合 |
| | | List<BigDecimal> list = new ArrayList<>(); |
| | | //总业绩 |
| | | BigDecimal teamIncomeMax = BigDecimal.ZERO; |
| | | //所有直推团队,就是这个会员的所有区域的业绩。 |
| | | |
| | | // 直推用户 |
| | | List<DappMemberEntity> childs = dappMemberDao.selectMemberInfoByRefererId(member.getInviteId()); |
| | | List<String> childsInviteIds = childs.stream().map(DappMemberEntity::getInviteId).collect(Collectors.toList()); |
| | | for(String inviteId : childsInviteIds){ |
| | | BigDecimal totalIncomeMember = dappMemberDao.selectAchieveRecordByInviteId(inviteId); |
| | | teamIncomeMax = teamIncomeMax.add(totalIncomeMember); |
| | | list.add(totalIncomeMember); |
| | | } |
| | | //去掉一个最大区的业绩 |
| | | BigDecimal bigMax = list.stream().max(BigDecimal::compareTo).get(); |
| | | teamIncomeMax = teamIncomeMax.subtract(bigMax); |
| | | |
| | | if (teamIncomeMax.compareTo(teamIncome) >= 0) { |
| | | return true; |
| | | } |
| | | log.info("用户:{}团队业绩未达标, 当前等级:{}, 当前业绩:{}, 目标业绩:{}", member.getAddress(), member.getAccountType(), teamIncomeMax, teamIncome); |
| | | return false; |
| | | } |
| | | |
| | | |
| | | |
| | | @Override |
| | | public BigDecimal getRealNum(Long memberId, BigDecimal amount) { |
| | | BigDecimal returnAmount = BigDecimal.ZERO; |
| | | DappWalletMineEntity dappWalletMineEntity = dappWalletMineDao.selectByMemberId(memberId); |
| | | BigDecimal totalScore = dappWalletMineEntity.getTotalAmount(); |
| | | if(totalScore.compareTo(amount) >= 0){ |
| | | returnAmount = amount; |
| | | }else{ |
| | | returnAmount = totalScore; |
| | | } |
| | | return returnAmount; |
| | | } |
| | | |
| | | @Override |
| | | public void directMemberPerk() { |
| | | List<DappMemberEntity> dappMemberEntityList = dappMemberDao.selectMemberByActiveStatus(); |
| | | if(CollUtil.isEmpty(dappMemberEntityList)){ |
| | | return; |
| | | } |
| | | /** |
| | | * 直推消费分享:享受直接分享人每日消费金额释放的100%加速; |
| | | */ |
| | | for(DappMemberEntity dappMemberEntity : dappMemberEntityList){ |
| | | Long memberId = dappMemberEntity.getId(); |
| | | String inviteId = dappMemberEntity.getInviteId(); |
| | | //该用户全部的直推用户 |
| | | List<DappMemberEntity> dappMemberEntities = dappMemberDao.selectChildMemberDirectOrNot(inviteId, 1, 1); |
| | | for(DappMemberEntity directMember : dappMemberEntities){ |
| | | Long directMemberId = directMember.getId(); |
| | | chainProducer.sendDirectPerkMsg(directMemberId); |
| | | } |
| | | |
| | | |
| | | } |
| | | |
| | | } |
| | | |
| | | @Override |
| | | public void speedDirectPerkMsg(Long memberId) { |
| | | DappMemberEntity dappMemberEntity = dappMemberDao.selectById(memberId); |
| | | if(1 != dappMemberEntity.getActiveStatus()){ |
| | | return; |
| | | } |
| | | |
| | | DataDictionaryCustom directReleaseDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | DataDictionaryEnum.DIRECT_RELEASE.getType(), |
| | | DataDictionaryEnum.DIRECT_RELEASE.getCode() |
| | | ); |
| | | if(ObjectUtil.isEmpty(directReleaseDic)){ |
| | | return; |
| | | } |
| | | BigDecimal directRelease = new BigDecimal(directReleaseDic.getValue() == null ? "0" : directReleaseDic.getValue()); |
| | | if(BigDecimal.ZERO.compareTo(directRelease) >= 0){ |
| | | return; |
| | | } |
| | | DappMemberEntity parentMember = dappMemberDao.selectMemberInfoByInviteId(dappMemberEntity.getRefererId()); |
| | | /** |
| | | * 获取用户前一天的所有返利记录 |
| | | */ |
| | | List<DappFundFlowEntity> dappFundFlowEntities = dappFundFlowDao.selectListByMemberIdAndTypeAndDate(memberId, |
| | | FundFlowEnum.STATIC_RELEASE.getCode(),DateUtil.now()); |
| | | for(DappFundFlowEntity dappFundFlowEntity : dappFundFlowEntities){ |
| | | BigDecimal staticReleaseAmount = dappFundFlowEntity.getAmount(); |
| | | BigDecimal directReleaseAmount = staticReleaseAmount.multiply(directRelease).setScale(2, BigDecimal.ROUND_DOWN); |
| | | sendPerk(parentMember,directReleaseAmount,dappFundFlowEntity.getSystemProfitId(),FundFlowEnum.DIRECT_AMOUNT.getCode()); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public void teamStaticPerk() { |
| | | List<DappMemberEntity> dappMemberEntities = dappMemberDao.selectMemberByAccountType(MemberLevelEnum.V1.getType()); |
| | | if(CollUtil.isEmpty(dappMemberEntities)){ |
| | | return; |
| | | } |
| | | |
| | | //平级 |
| | | DataDictionaryCustom teamPerkEqualsDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | DataDictionaryEnum.TEAM_PERK_LEVEL_EQUALS.getType(), |
| | | DataDictionaryEnum.TEAM_PERK_LEVEL_EQUALS.getCode()); |
| | | BigDecimal teamPerkEquals = new BigDecimal(ObjectUtil.isEmpty(teamPerkEqualsDic) ? "0.1" : teamPerkEqualsDic.getValue()); |
| | | DataDictionaryCustom staticReleaseDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | DataDictionaryEnum.STATIC_RELEASE.getType(), |
| | | DataDictionaryEnum.STATIC_RELEASE.getCode()); |
| | | BigDecimal staticRelease = new BigDecimal(ObjectUtil.isEmpty(staticReleaseDic) ? "0.006" : staticReleaseDic.getValue()); |
| | | |
| | | for(DappMemberEntity dappMemberEntity : dappMemberEntities){ |
| | | if(StrUtil.isNotEmpty(dappMemberEntity.getRefererIds())){ |
| | | String referrerIds = dappMemberEntity.getRefererIds(); |
| | | List<String> referrerIdList = StrUtil.splitTrim(referrerIds, ","); |
| | | |
| | | if(CollUtil.isNotEmpty(referrerIdList)){ |
| | | List<DappMemberEntity> mallMemberTeamPerk = dappMemberDao.selectByInviteIds(referrerIdList); |
| | | |
| | | if(CollUtil.isNotEmpty(mallMemberTeamPerk)){ |
| | | String levelNormal = MemberLevelEnum.V1.getType(); |
| | | BigDecimal cashPercentNormal = BigDecimal.ZERO; |
| | | |
| | | for(DappMemberEntity teamPerkMember : mallMemberTeamPerk){ |
| | | String level = teamPerkMember.getAccountType(); |
| | | //比较两个级别的大小,level大于levelNormal返回1 |
| | | int compareMin = MemberLevelEnum.V1.compareLevel(level, levelNormal); |
| | | int compareMax = MemberLevelEnum.V1.compareLevel(MemberLevelEnum.V7.getType(), level); |
| | | if(compareMin >= 1 && compareMax >= 1){ |
| | | DataDictionaryCustom teamPerkMemberDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | "TEAM_LEVEL", level); |
| | | TeamLevelPerk adminAgentInfo = JSONObject.parseObject(teamPerkMemberDic.getValue(), TeamLevelPerk.class); |
| | | BigDecimal cashPercent = adminAgentInfo.getTeamPercent(); |
| | | //极差 |
| | | if(MemberLevelEnum.V1.compareLevel(levelNormal, level) == 0){ |
| | | //平级 |
| | | cashPercent = cashPercent.subtract(teamPerkEquals); |
| | | }else{ |
| | | cashPercent = cashPercent.subtract(cashPercentNormal); |
| | | } |
| | | //总业绩 |
| | | BigDecimal teamIncomeMax = BigDecimal.ZERO; |
| | | //所有直推团队,就是这个会员的所有区域的业绩。 |
| | | |
| | | // 直推用户 |
| | | List<DappMemberEntity> childs = dappMemberDao.selectMemberInfoByRefererId(teamPerkMember.getInviteId()); |
| | | List<String> childsInviteIds = childs.stream().map(DappMemberEntity::getInviteId).collect(Collectors.toList()); |
| | | for(String inviteId : childsInviteIds){ |
| | | BigDecimal totalIncomeMember = dappMemberDao.selectAllAchieveByInviteId(inviteId); |
| | | teamIncomeMax = teamIncomeMax.add(totalIncomeMember); |
| | | } |
| | | if(BigDecimal.ZERO.compareTo(teamIncomeMax) >= 0){ |
| | | continue; |
| | | } |
| | | //V1加速团队静态收益的15%=每日静态的20000*6‰*15%=18元的额外释放加速 |
| | | BigDecimal cashAmount = teamIncomeMax.multiply(cashPercent).multiply(staticRelease).setScale(2, BigDecimal.ROUND_DOWN); |
| | | |
| | | BigDecimal bigDecimal = sendPerk(teamPerkMember, cashAmount, null, FundFlowEnum.TEAM_PERK.getCode()); |
| | | levelNormal = level; |
| | | cashPercentNormal = adminAgentInfo.getTeamPercent(); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | private BigDecimal sendPerk(DappMemberEntity parentMember,BigDecimal directReleaseAmount,Long orderId |
| | | ,Integer fundFlowEnumType){ |
| | | |
| | | BigDecimal realScoreReduce = BigDecimal.ZERO; |
| | | //用户减少赠送积分 |
| | | DappWalletMineEntity dappWalletMineEntity = dappWalletMineDao.selectByMemberId(parentMember.getId()); |
| | | BigDecimal totalScore = dappWalletMineEntity.getTotalAmount(); |
| | | BigDecimal availableScore = dappWalletMineEntity.getAvailableAmount(); |
| | | if(BigDecimal.ZERO.compareTo(totalScore) >= 0){ |
| | | parentMember.setActiveStatus(2); |
| | | dappMemberDao.updateById(parentMember); |
| | | return realScoreReduce; |
| | | } |
| | | if(directReleaseAmount.compareTo(totalScore) > 0){ |
| | | realScoreReduce = totalScore; |
| | | }else{ |
| | | realScoreReduce = directReleaseAmount; |
| | | } |
| | | BigDecimal totalScoreRelease = totalScore.subtract(realScoreReduce); |
| | | BigDecimal availableScoreRelease = availableScore.subtract(realScoreReduce); |
| | | //更新积分账户 |
| | | dappWalletMineEntity.setTotalAmount(totalScoreRelease); |
| | | dappWalletMineEntity.setAvailableAmount(availableScoreRelease); |
| | | dappWalletMineDao.updateById(dappWalletMineEntity); |
| | | //插入积分流水 |
| | | DappFundFlowEntity scoreFlow = new DappFundFlowEntity( |
| | | parentMember.getId(), |
| | | realScoreReduce.negate(), |
| | | FundFlowEnum.REDUCE_SCORE.getCode(), |
| | | DappFundFlowEntity.WITHDRAW_STATUS_AGREE, |
| | | BigDecimal.ZERO, |
| | | orderId); |
| | | dappFundFlowDao.insert(scoreFlow); |
| | | DappAccountMoneyChangeEntity reduceScoreAMC = new DappAccountMoneyChangeEntity( |
| | | parentMember.getId(), |
| | | totalScore, |
| | | realScoreReduce.negate(), |
| | | totalScoreRelease, |
| | | FundFlowEnum.REDUCE_SCORE.getCode(), |
| | | orderId.toString()); |
| | | dappAccountMoneyChangeDao.insert(reduceScoreAMC); |
| | | |
| | | //生成一条静态补贴的流水 |
| | | DappFundFlowEntity realUsdtAmountFlow = new DappFundFlowEntity( |
| | | parentMember.getId(), |
| | | realScoreReduce, |
| | | fundFlowEnumType, |
| | | DappFundFlowEntity.WITHDRAW_STATUS_AGREE, |
| | | BigDecimal.ZERO, |
| | | orderId); |
| | | dappFundFlowDao.insert(realUsdtAmountFlow); |
| | | //用户增加余额 |
| | | DappWalletCoinEntity dappWalletCoinEntity = dappWalletCoinDao.selectByMemberId(parentMember.getId()); |
| | | BigDecimal totalAmount = dappWalletCoinEntity.getTotalAmount(); |
| | | BigDecimal availableAmount = dappWalletCoinEntity.getAvailableAmount(); |
| | | |
| | | BigDecimal totalAmountRelease = totalAmount.add(realScoreReduce); |
| | | BigDecimal availableAmountRelease = availableAmount.add(realScoreReduce); |
| | | //更新余额账户 |
| | | dappWalletCoinEntity.setTotalAmount(totalAmountRelease); |
| | | dappWalletCoinEntity.setAvailableAmount(availableAmountRelease); |
| | | dappWalletCoinDao.updateById(dappWalletCoinEntity); |
| | | //插入余额流水 |
| | | DappFundFlowEntity amountFlow = new DappFundFlowEntity( |
| | | parentMember.getId(), |
| | | realScoreReduce, |
| | | FundFlowEnum.ADD_AMOUNT.getCode(), |
| | | DappFundFlowEntity.WITHDRAW_STATUS_AGREE, |
| | | BigDecimal.ZERO, |
| | | orderId); |
| | | dappFundFlowDao.insert(amountFlow); |
| | | DappAccountMoneyChangeEntity addAmountAMC = new DappAccountMoneyChangeEntity( |
| | | parentMember.getId(), |
| | | totalAmount, |
| | | realScoreReduce, |
| | | totalAmountRelease, |
| | | FundFlowEnum.ADD_AMOUNT.getCode(), |
| | | orderId.toString()); |
| | | dappAccountMoneyChangeDao.insert(addAmountAMC); |
| | | |
| | | return realScoreReduce; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 测试转账 |
| | | * @param args |