| | |
| | | public void updateMemberCoin() { |
| | | try { |
| | | // 操作时间 |
| | | DateTime operationDate = DateUtil.date(); |
| | | DateTime operationDate = DateUtil.parseDate(DateUtil.today()); |
| | | |
| | | // 获取会员等级 |
| | | List<RunVip> runVips = runVipMapper.selectList(null); |
| | | if (CollUtil.isEmpty(runVips)) { |
| | | log.error("未找到任何会员等级"); |
| | | return; |
| | | } |
| | | Map<String, RunVip> runVipMap = runVips.stream() |
| | | .collect(Collectors.toMap(RunVip::getVipCode, runVip -> runVip)); |
| | | |
| | | // 获取最低级别的会员等级 |
| | | RunVip minRunVip = runVipMapper.selectOne(new LambdaQueryWrapper<RunVip>() |
| | | .orderByAsc(RunVip::getOrderNumber) |
| | | .last("LIMIT 1") |
| | | ); |
| | | Optional<RunVip> optionalRunVip = runVips.stream().min(Comparator.comparingInt(RunVip::getOrderNumber)); |
| | | RunVip minRunVip = optionalRunVip.orElse(null); |
| | | if (minRunVip == null) { |
| | | log.error("最低级别的会员等级未找到"); |
| | | return; |
| | | } |
| | | |
| | | // 获取全部referrerId不为空的用户,并获取每个用户的所有上级id,返回一个set集合 |
| | | // 获取全部等级不是游客的用户,返回一个set集合 |
| | | List<MallMember> mallMembers = mallMemberMapper.selectList( |
| | | new LambdaQueryWrapper<MallMember>() |
| | | .isNotNull(MallMember::getReferrerId) |
| | | .select(MallMember::getId, MallMember::getLevel, MallMember::getInviteId, MallMember::getReferrerId) |
| | | .ne(MallMember::getLevel,minRunVip.getVipCode()) |
| | | ); |
| | | if (CollUtil.isEmpty(mallMembers)) { |
| | | log.info("没有符合条件的会员"); |
| | | return; |
| | | } |
| | | |
| | |
| | | .map(MallMember::getId) |
| | | .collect(Collectors.toSet()); |
| | | if (CollUtil.isEmpty(memberIds)) { |
| | | log.info("没有有效的会员ID"); |
| | | return; |
| | | } |
| | | |
| | | |
| | | // 构建成员ID到MallMember对象的映射 |
| | | Map<Long, MallMember> memberMap = mallMemberMapper.selectBatchIds(memberIds).stream() |
| | | Map<Long, MallMember> memberMap = mallMembers.stream() |
| | | .collect(Collectors.toMap(MallMember::getId, member -> member)); |
| | | // 缓存直推成员 |
| | | Map<String, Set<MallMember>> directMembersCache = mallMembers.stream() |
| | | .collect(Collectors.groupingBy(MallMember::getReferrerId, Collectors.toSet())); |
| | | |
| | | |
| | | for (Long memberId : memberIds) { |
| | | MallMember mallMember = memberMap.get(memberId); |
| | |
| | | } |
| | | |
| | | // 获取所有购买了会员等级的直推成员 |
| | | List<MallMember> directMembers = mallMemberMapper.selectList( |
| | | new LambdaQueryWrapper<MallMember>() |
| | | .eq(MallMember::getReferrerId, mallMember.getInviteId()) |
| | | .ne(MallMember::getLevel, minRunVip.getVipCode()) |
| | | ); |
| | | Set<MallMember> directMembers = directMembersCache.get(mallMember.getInviteId()); |
| | | if (CollUtil.isEmpty(directMembers)) { |
| | | continue; |
| | | } |
| | | |
| | | RunVip memberRunVip = runVipMap.get(mallMember.getLevel()); |
| | | if (memberRunVip == null) { |
| | | log.warn("会员等级 {} 不存在", mallMember.getLevel()); |
| | | continue; |
| | | } |
| | | for (MallMember item : directMembers) { |
| | | BigDecimal realScore = calculateDirectScore(mallMember, item, operationDate); |
| | | BigDecimal realScore = calculateDirectScore(memberRunVip, item, operationDate, runVipMap); |
| | | if(BigDecimal.ZERO.compareTo(realScore) >= 0){ |
| | | continue; |
| | | } |
| | |
| | | } |
| | | |
| | | |
| | | private BigDecimal calculateDirectScore(MallMember mallMember, MallMember directMember, Date operationDate) { |
| | | private BigDecimal calculateDirectScore(RunVip memberRunVip, MallMember directMember, Date operationDate, Map<String, RunVip> runVipMap) { |
| | | // 实际助力 |
| | | BigDecimal realScore = BigDecimal.ZERO; |
| | | |
| | | try { |
| | | String directLevel = directMember.getLevel(); |
| | | RunVip directRunVip = runVipMapper.selectOne(new LambdaQueryWrapper<RunVip>().eq(RunVip::getVipCode, directLevel)); |
| | | RunVip directRunVip = runVipMap.get(directMember.getLevel()); |
| | | if (directRunVip == null) { |
| | | return realScore; |
| | | } |
| | | // 获取每一个会员的前一日碳积分总和 |
| | | LambdaQueryWrapper<MallMoneyFlow> mallMoneyFlowLambdaQueryWrapper = new LambdaQueryWrapper<>(); |
| | | mallMoneyFlowLambdaQueryWrapper.ge(MallMoneyFlow::getCreatedTime, DateUtil.offsetDay(operationDate, -1)); |
| | | mallMoneyFlowLambdaQueryWrapper.lt(MallMoneyFlow::getCreatedTime, operationDate); |
| | | mallMoneyFlowLambdaQueryWrapper.eq(MallMoneyFlow::getFlowType, FlowTypeEnum.SCORE.getValue()); |
| | | mallMoneyFlowLambdaQueryWrapper.eq(MallMoneyFlow::getType, RunVipMoneyFlowTypeEnum.GET_SCORE.getValue()); |
| | | mallMoneyFlowLambdaQueryWrapper.eq(MallMoneyFlow::getMemberId, directMember.getId()); |
| | | |
| | | List<MallMoneyFlow> mallMoneyFlows = mallMoneyFlowMapper.selectList(mallMoneyFlowLambdaQueryWrapper); |
| | | if (CollUtil.isEmpty(mallMoneyFlows)) { |
| | | return realScore; |
| | | } |
| | | |
| | | String memberLevel = mallMember.getLevel(); |
| | | RunVip memberRunVip = runVipMapper.selectOne(new LambdaQueryWrapper<RunVip>().eq(RunVip::getVipCode, memberLevel)); |
| | | if (memberRunVip == null) { |
| | | return realScore; |
| | | } |
| | | |