KKSU
2024-12-23 8d326b853cd3f2d2ca5f9a70b343389da63d9af6
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;
    }
}