KKSU
2025-01-03 575411c3f1abc10184ee2c1b416241246f943226
src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java
@@ -1,5 +1,6 @@
package cc.mrbird.febs.mall.service.impl;
import cc.mrbird.febs.common.configure.FebsConfigure;
import cc.mrbird.febs.common.enumerates.*;
import cc.mrbird.febs.common.utils.AppContants;
import cc.mrbird.febs.common.utils.MallUtils;
@@ -29,6 +30,7 @@
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
/**
@@ -57,6 +59,7 @@
    private final IMallMoneyFlowService mallMoneyFlowService;
    private final AsyncService asyncService;
    private final FebsConfigure febsConfigure;
    @Override
    @Transactional(rollbackFor = Exception.class)
@@ -719,22 +722,24 @@
                    continue;
                }
                for (MallMember item : directMembers) {
                    BigDecimal realScore = calculateDirectScore(memberRunVip, item, operationDate, runVipMap);
                    if(BigDecimal.ZERO.compareTo(realScore) >= 0){
                        continue;
                    }
                    walletService.addScore(realScore, memberId);
                    String orderNo = MallUtils.getOrderNum("ZLS");
                    mallMoneyFlowService.runVipMoneyFlowAdd(
                            memberId,
                            item.getId(),
                            orderNo,
                            FlowTypeEnum.SCORE.getValue(),
                            RunVipMoneyFlowTypeEnum.DIRECT_SCORE.getValue(),
                            realScore,
                            StrUtil.format(RunVipMoneyFlowTypeEnum.DIRECT_SCORE.getDescription(), realScore),
                            YesOrNoEnum.YES.getValue()
                    );
                    CompletableFuture.runAsync(() -> {
                        BigDecimal realScore = calculateDirectScore(memberRunVip, item, operationDate, runVipMap);
                        if(BigDecimal.ZERO.compareTo(realScore) >= 0){
                            return;
                        }
                        walletService.addScore(realScore, memberId);
                        String orderNo = MallUtils.getOrderNum("ZLS");
                        mallMoneyFlowService.runVipMoneyFlowAdd(
                                memberId,
                                item.getId(),
                                orderNo,
                                FlowTypeEnum.SCORE.getValue(),
                                RunVipMoneyFlowTypeEnum.DIRECT_SCORE.getValue(),
                                realScore,
                                StrUtil.format(RunVipMoneyFlowTypeEnum.DIRECT_SCORE.getDescription(), realScore),
                                YesOrNoEnum.YES.getValue()
                        );
                    },febsConfigure.asyncThreadPoolTaskExecutor());
                }
            }
        } catch (Exception e) {
@@ -852,24 +857,28 @@
        }
        //获取节点设置
        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);
        //获取节点设置runNodeSets中orderNumber最小的节点
        RunNodeSet minRunNodeSet = runNodeSets.stream().min(Comparator.comparingInt(RunNodeSet::getOrderNumber)).orElse(null);
        if(null == minRunNodeSet){
            return;
        }
        DateTime endTime = DateUtil.date();
        for (MallMember item : mallMembers) {
            //获取总业绩
            BigDecimal achieve = getDirectAchieve(item.getInviteId(),item.getDirectorTime(),endTime);
            if(BigDecimal.ZERO.compareTo(achieve) >= 0){
            //判断总业绩是否小于最小业绩
            if(minRunNodeSet.getMinAchieve().compareTo(achieve) > 0){
                item.setDirector(YesOrNoEnum.NO.getValue());
                mallMemberMapper.updateById(item);
                continue;
            }
            BigDecimal nodePercent = getNodePercent(runNodeSets, achieve);
            if(BigDecimal.ZERO.compareTo(nodePercent) >= 0){
                continue;
            }
            asyncService.releaseNodeCoin(achieve,nodePercent,balanceToCoin,item.getId());
            asyncService.releaseNodeCoin(achieve,nodePercent,item.getId());
            item.setDirectorTime(endTime);
            mallMemberMapper.updateById(item);
        }
@@ -915,6 +924,9 @@
                new LambdaQueryWrapper<MallMember>()
                        .eq(MallMember::getReferrerId, inviteId)
        );
        if(CollUtil.isEmpty(directMembers)){
            return memberIds;
        }
        memberIds.addAll(directMembers.stream().map(MallMember::getId).collect(Collectors.toSet()));
        // 获取团队成员
@@ -922,6 +934,10 @@
                new LambdaQueryWrapper<MallMember>()
                        .in(MallMember::getReferrerId, directMembers.stream().map(MallMember::getInviteId).collect(Collectors.toSet()))
        );
        if(CollUtil.isEmpty(teamMembers)){
            return memberIds;
        }
        memberIds.addAll(teamMembers.stream().map(MallMember::getId).collect(Collectors.toSet()));
        return memberIds;