From 8d326b853cd3f2d2ca5f9a70b343389da63d9af6 Mon Sep 17 00:00:00 2001 From: KKSU <15274802129@163.com> Date: Mon, 23 Dec 2024 18:00:00 +0800 Subject: [PATCH] feat(mall): 新增节点规则功能 --- src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java | 95 +++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 95 insertions(+), 0 deletions(-) diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java index ad065f7..c7e69f2 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java @@ -51,6 +51,8 @@ private final MallMemberCouponMapper mallMemberCouponMapper; private final RunVipMapper runVipMapper; private final MallMemberWalletMapper mallMemberWalletMapper; + private final RunNodeSetMapper runNodeSetMapper; + private final MallChargeMapper mallChargeMapper; private final AsyncService asyncService; @@ -688,4 +690,97 @@ } } } + + @Override + public void updateNodeScore() { + /** + * 获取全部的节点 + */ + List<MallMember> mallMembers = mallMemberMapper.selectList( + new LambdaQueryWrapper<MallMember>() + .eq(MallMember::getDirector, YesOrNoEnum.YES.getValue()) + ); + if(CollUtil.isEmpty(mallMembers)){ + return; + } + //获取节点设置 + List<RunNodeSet> runNodeSets = runNodeSetMapper.selectList(null); + BigDecimal balanceToCoin = new BigDecimal( + dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + RunVipDataDictionaryEnum.RUN_VIP_BALANCE_TO_COIN.getType(), + RunVipDataDictionaryEnum.RUN_VIP_BALANCE_TO_COIN.getCode()).getValue() + ).setScale(2, BigDecimal.ROUND_DOWN); + for (MallMember item : mallMembers) { + //获取总业绩 + BigDecimal achieve = getDirectAchieve(item.getInviteId()); + BigDecimal nodePercent = getNodePercent(runNodeSets, achieve); + asyncService.releaseNodeCoin(achieve,nodePercent,balanceToCoin,item.getId()); + } + } + + private BigDecimal getDirectAchieve(String inviteId) { + + try { + // 获取直推成员和团队成员的ID集合 + Set<Long> memberIds = getTeamMemberIds(inviteId); + + if (CollUtil.isEmpty(memberIds)) { + return BigDecimal.ZERO; + } + + // 获取团队业绩(不包含本人业绩) + List<MallCharge> mallCharges = mallChargeMapper.selectList( + new LambdaQueryWrapper<MallCharge>() + .in(MallCharge::getMemberId, memberIds) + .eq(MallCharge::getState, YesOrNoEnum.YES.getValue()) + ); + + if (CollUtil.isEmpty(mallCharges)) { + return BigDecimal.ZERO; + } + + return mallCharges.stream() + .map(MallCharge::getAmount) + .reduce(BigDecimal.ZERO, BigDecimal::add); + } catch (Exception e) { + // 异常处理 + log.error("Error occurred while calculating direct achieve for member: {}", inviteId, e); + return BigDecimal.ZERO; + } + } + + private Set<Long> getTeamMemberIds(String inviteId) { + Set<Long> memberIds = new HashSet<>(); + // 获取直推成员 + List<MallMember> directMembers = mallMemberMapper.selectList( + new LambdaQueryWrapper<MallMember>() + .eq(MallMember::getReferrerId, inviteId) + ); + memberIds.addAll(directMembers.stream().map(MallMember::getId).collect(Collectors.toSet())); + + // 获取团队成员 + List<MallMember> teamMembers = mallMemberMapper.selectList( + new LambdaQueryWrapper<MallMember>() + .in(MallMember::getReferrerId, directMembers.stream().map(MallMember::getInviteId).collect(Collectors.toSet())) + ); + memberIds.addAll(teamMembers.stream().map(MallMember::getId).collect(Collectors.toSet())); + + return memberIds; + } + + + private BigDecimal getNodePercent(List<RunNodeSet> runNodeSets, BigDecimal directAchieve) { + BigDecimal percent = BigDecimal.ZERO; + //获取directAchieve在runNodeSets中哪一个位置 + for(RunNodeSet item : runNodeSets){ + BigDecimal minAchieve = item.getMinAchieve(); + BigDecimal maxAchieve = item.getMaxAchieve(); + BigDecimal nodePercent = new BigDecimal(item.getNodePercent()); + if(directAchieve.compareTo(minAchieve) >= 0 && directAchieve.compareTo(maxAchieve) < 0){ + percent = nodePercent; + break; + } + } + return percent; + } } -- Gitblit v1.9.1