KKSU
2025-03-14 7338052ad16f1f2f5dc338f6c20643ebbc836f00
src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java
@@ -60,6 +60,7 @@
    private final AsyncService asyncService;
    private final FebsConfigure febsConfigure;
    private final RunVipGrowMapper runVipGrowMapper;
    @Override
    @Transactional(rollbackFor = Exception.class)
@@ -624,7 +625,11 @@
                BigDecimal V3 = BigDecimal.ZERO;
                if (flag) {
                    V2 = V1.divide(new BigDecimal("2"), 0, RoundingMode.DOWN);
                    V3 = new BigDecimal(RandomUtil.randomInt(V2.intValue(),V1.intValue())).setScale(0,RoundingMode.DOWN);
                    if(V1.intValue() <= V2.intValue()){
                        V3 = new BigDecimal(RandomUtil.randomInt(V1.intValue(),V2.intValue()+1)).setScale(0,RoundingMode.DOWN);
                    }else{
                        V3 = new BigDecimal(RandomUtil.randomInt(V2.intValue(),V1.intValue())).setScale(0,RoundingMode.DOWN);
                    }
                }else{
                    List<MallMoneyFlow> mallMoneyFlows = mallMoneyFlowMapper.selectList(
                            new LambdaQueryWrapper<MallMoneyFlow>()
@@ -641,7 +646,44 @@
                    }else{
                        V2 = V1.multiply(new BigDecimal("2")).setScale(0,RoundingMode.DOWN);
                    }
                    V3 = new BigDecimal(RandomUtil.randomInt(V1.intValue(),V2.intValue())).setScale(0,RoundingMode.DOWN);
                    if(V1.intValue() < V2.intValue()){
                        V3 = new BigDecimal(RandomUtil.randomInt(V1.intValue(),V2.intValue())).setScale(0,RoundingMode.DOWN);
                    }else if(V1.intValue() == V2.intValue()){
                        V3 = new BigDecimal(RandomUtil.randomInt(V1.intValue(),V2.intValue()+1)).setScale(0,RoundingMode.DOWN);
                    }else{
                        V3 = new BigDecimal(RandomUtil.randomInt(V2.intValue(),V1.intValue())).setScale(0,RoundingMode.DOWN);
                    }
                }
                //会员权益的收益
                RunVipGrow runVipGrow = runVipGrowMapper.selectList(
                        new LambdaQueryWrapper<RunVipGrow>()
                                .eq(RunVipGrow::getMemberId, item.getId())
                                .eq(RunVipGrow::getLevelNow, runVip.getVipCode())
                                .orderByDesc(RunVipGrow::getId)
                ).stream().findFirst().orElse(null);
                if(null != runVipGrow){
                    BigDecimal amountNow = runVipGrow.getAmountNow();
                    RunVip runVipNext = runVips.stream().filter(vipItem -> vipItem.getOrderNumber() == runVip.getOrderNumber() + 1).findFirst().orElse(null);
                    if(runVipNext != null){
                        BigDecimal presentPrice = runVip.getPresentPrice();
                        amountNow = amountNow.subtract(presentPrice);
                        BigDecimal presentPriceNext = runVipNext.getPresentPrice();
                        BigDecimal subtract = presentPriceNext.subtract(presentPrice);
                        BigDecimal divide = amountNow.divide(subtract, 4, RoundingMode.DOWN);
                        Integer growthCnt = runVip.getGrowthCnt();
                        Integer growthCntNext = runVipNext.getGrowthCnt();
                        int growthNum = growthCntNext - growthCnt;
                        BigDecimal growthAmountTotal = divide.multiply(new BigDecimal(growthNum));
                        BigDecimal growthAmount = growthAmountTotal.divide(new BigDecimal(C1), 0, RoundingMode.DOWN);
                        if(growthAmount.intValue() > 0){
                            V3 = V3.add(growthAmount);
                        }
                    }
                }
                //更新钱包数据
                if(V3.intValue() <= 0){
@@ -701,6 +743,7 @@
                    .collect(Collectors.toMap(MallMember::getId, member -> member));
            // 缓存直推成员
            Map<String, Set<MallMember>> directMembersCache = mallMembers.stream()
                    .filter(member -> StrUtil.isNotBlank(member.getReferrerId()))
                    .collect(Collectors.groupingBy(MallMember::getReferrerId, Collectors.toSet()));
@@ -857,24 +900,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);
        }