KKSU
2024-07-30 c1af5cf94920702b6aa962881365116542e88ab0
src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java
@@ -51,26 +51,30 @@
        List<MallMember> parentMembers = memberMapper.selectByInviteIds(ids);
        for (MallMember parent : parentMembers) {
            //level为v6,升级董事,则看直属团队下有没有两个V6
            List<MallMember> mallMemberChilds = memberMapper.selectByRefererId(parent.getInviteId());
            if(CollUtil.isNotEmpty(mallMemberChilds)){
                int directorSize = 0;
                for(MallMember mallMemberChild : mallMemberChilds){
                    List<MallMember> mallMemberTeamMembers = memberMapper.selectAllChildAgentListByInviteId(mallMemberChild.getInviteId());
                    if(CollUtil.isNotEmpty(mallMemberTeamMembers)){
                        List<MallMember> levelV6List = mallMemberTeamMembers.stream()
                                .filter(teamMember -> teamMember.getLevel().equals(MemberLevelEnum.V6.getType()))
                                .collect(Collectors.toList());
                        if(CollUtil.isNotEmpty(levelV6List)){
                            directorSize = directorSize +1;
                        }
                    }
                }
                if(directorSize >= 2){
                    parent.setLevel(MemberLevelEnum.V_DIRECTOR.getType());
                    parent.setDirector(AppContants.OPTION_YES);
                    memberMapper.updateById(parent);
                    continue;
                }
//            List<MallMember> mallMemberChilds = memberMapper.selectByRefererId(parent.getInviteId());
//            if(CollUtil.isNotEmpty(mallMemberChilds)){
//                int directorSize = 0;
//                for(MallMember mallMemberChild : mallMemberChilds){
//                    List<MallMember> mallMemberTeamMembers = memberMapper.selectAllChildAgentListByInviteId(mallMemberChild.getInviteId());
//                    if(CollUtil.isNotEmpty(mallMemberTeamMembers)){
//                        List<MallMember> levelV6List = mallMemberTeamMembers.stream()
//                                .filter(teamMember -> teamMember.getLevel().equals(MemberLevelEnum.V6.getType()))
//                                .collect(Collectors.toList());
//                        if(CollUtil.isNotEmpty(levelV6List)){
//                            directorSize = directorSize +1;
//                        }
//                    }
//                }
//                if(directorSize >= 2){
//                    parent.setLevel(MemberLevelEnum.V_DIRECTOR.getType());
//                    parent.setDirector(AppContants.OPTION_YES);
//                    memberMapper.updateById(parent);
//                    continue;
//                }
//            }
            //V6不能再升级了
            if(parent.getLevel().equals(MemberLevelEnum.V6.getType())){
                continue;
            }
            /**
@@ -210,6 +214,12 @@
         * 4、董事享受全公司入单分红2%加权(现金)
         * 5、合伙人享全公司入单分红5%加权(现金)
         * 6、入单后,50%入现金池 35%的H金劵入H金劵池,更新价格
         *
         *
         * 新增购买套餐返佣逻辑
         * 1、买了套餐增加权益额度
         * 2、权益额度每次提现会减少对应的数额
         * 3、增加每天返佣固定比例的余额
         */
        //获取当前订单子表信息
        List<MallOrderItem> mallOrderItemList = mallOrderItemMapper.selectbyOrderId(orderId);
@@ -226,6 +236,26 @@
        if(BigDecimal.ZERO.compareTo(amountTCAll) >= 0){
            return;
        }
        MallOrderInfo mallOrderInfo = mallOrderInfoMapper.selectById(orderId);
        String orderNo = mallOrderInfo.getOrderNo();
        //购买人
        Long memberId = mallOrderInfo.getMemberId();
        DataDictionaryCustom equityLimitTimesDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                DataDictionaryEnum.EQUITY_LIMIT_TIMES.getType(),
                DataDictionaryEnum.EQUITY_LIMIT_TIMES.getCode());
        BigDecimal equityLimitTimes = new BigDecimal(equityLimitTimesDic.getValue());
        BigDecimal equityLimit = amountTCAll.multiply(equityLimitTimes);
        if(BigDecimal.ZERO.compareTo(equityLimit) < 0){
            addWalletInfoAndMoneyFlow(equityLimit,
                    memberId,
                    "equityLimit",
                    MoneyFlowTypeEnum.TC_TO_EQUITY_LIMIT.getValue(),
                    memberId,
                    FlowTypeEnum.BALANCE.getValue(),
                    orderNo);
        }
        BigDecimal amountTC = new BigDecimal(100);
        //购买套餐按照1000的基数去补贴,如5000,则补贴5次1000
        int times = amountTCAll.divideToIntegralValue(amountTC).intValue();
@@ -234,10 +264,6 @@
        }
        for(int i = 0; i < times; i++){
            MallOrderInfo mallOrderInfo = mallOrderInfoMapper.selectById(orderId);
            String orderNo = mallOrderInfo.getOrderNo();
            //购买人
            Long memberId = mallOrderInfo.getMemberId();
            /**
             * 1、购买人获得固定比例的H金劵
@@ -320,66 +346,63 @@
                String referrerIds = mallMember.getReferrerIds();
                List<String> referrerIdList = StrUtil.splitTrim(referrerIds, ",");
                if(CollUtil.isNotEmpty(referrerIdList)){
                    List<MallMember> mallMemberTeamPerk = mallMemberMapper.selectByInviteIds(referrerIdList);
                    if(CollUtil.isNotEmpty(mallMemberTeamPerk)){
                        String levelNormal = MemberLevelEnum.V1.getType();
                        BigDecimal cashPercentNormal = BigDecimal.ZERO;
                        BigDecimal scorePercentNormal = BigDecimal.ZERO;
                    String levelNormal = MemberLevelEnum.V1.getType();
                    BigDecimal cashPercentNormal = BigDecimal.ZERO;
                    BigDecimal scorePercentNormal = BigDecimal.ZERO;
                        DataDictionaryCustom poolScorePriceDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                                PerkEnum.POOL_SCORE_PRICE.getType(),
                                PerkEnum.POOL_SCORE_PRICE.getCode());
                        BigDecimal poolScorePrice = new BigDecimal(poolScorePriceDic.getValue() == null ? "1" : poolScorePriceDic.getValue());
                        for(MallMember teamPerkMember : mallMemberTeamPerk){
                            String level = teamPerkMember.getLevel();
                            //比较两个级别的大小,level大于levelNormal返回1
                            int compareMin = MemberLevelEnum.V1.compareLevel(level, levelNormal);
                            int compareMax = MemberLevelEnum.V1.compareLevel(MemberLevelEnum.V6.getType(), level);
                            if(compareMin >= 1 && compareMax >= 1){
                                Long teamPerkMemberId = teamPerkMember.getId();
                                DataDictionaryCustom teamPerkMemberDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                                        "AGENT_PERK_SET", level);
                    DataDictionaryCustom poolScorePriceDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                            PerkEnum.POOL_SCORE_PRICE.getType(),
                            PerkEnum.POOL_SCORE_PRICE.getCode());
                    BigDecimal poolScorePrice = new BigDecimal(poolScorePriceDic.getValue() == null ? "1" : poolScorePriceDic.getValue());
                    for(String teamPerkMemberInviteId : referrerIdList){
                        MallMember teamPerkMember = mallMemberMapper.selectInfoByInviteId(teamPerkMemberInviteId);
//                    for(MallMember teamPerkMember : mallMemberTeamPerk){
                        String level = teamPerkMember.getLevel();
                        //比较两个级别的大小,level大于levelNormal返回1
                        int compareMin = MemberLevelEnum.V1.compareLevel(level, levelNormal);
                        int compareMax = MemberLevelEnum.V1.compareLevel(MemberLevelEnum.V6.getType(), level);
                        if(compareMin >= 1 && compareMax >= 1){
                            Long teamPerkMemberId = teamPerkMember.getId();
                            DataDictionaryCustom teamPerkMemberDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                                    "AGENT_PERK_SET", level);
                                AdminAgentInfo adminAgentInfo = JSONObject.parseObject(teamPerkMemberDic.getValue(), AdminAgentInfo.class);
                                BigDecimal cashPercent = adminAgentInfo.getCashPercent().multiply(AppContants.PERCENTAGE);
                                BigDecimal scorePercent = adminAgentInfo.getScorePercent().multiply(AppContants.PERCENTAGE);
                                //极差
                                cashPercent = cashPercent.subtract(cashPercentNormal);
                                scorePercent = scorePercent.subtract(scorePercentNormal);
                            AdminAgentInfo adminAgentInfo = JSONObject.parseObject(teamPerkMemberDic.getValue(), AdminAgentInfo.class);
                            BigDecimal cashPercent = adminAgentInfo.getCashPercent().multiply(AppContants.PERCENTAGE);
                            BigDecimal scorePercent = adminAgentInfo.getScorePercent().multiply(AppContants.PERCENTAGE);
                            //极差
                            cashPercent = cashPercent.subtract(cashPercentNormal);
                            scorePercent = scorePercent.subtract(scorePercentNormal);
                                BigDecimal cashAmount = amountTC.multiply(cashPercent).setScale(2, BigDecimal.ROUND_DOWN);
                            BigDecimal cashAmount = amountTC.multiply(cashPercent).setScale(2, BigDecimal.ROUND_DOWN);
                                //如果是H金劵,除以当前价格,得到数量。
                                BigDecimal scoreCnt = amountTC.multiply(scorePercent).setScale(2, BigDecimal.ROUND_DOWN);
                                scoreCnt = scoreCnt.divide(poolScorePrice, 2 ,BigDecimal.ROUND_DOWN);
                                if(cashAmount.compareTo(BigDecimal.ZERO) > 0){
                                    addWalletInfoAndMoneyFlow(cashAmount,
                                            teamPerkMemberId,
                                            "balance",
                                            MoneyFlowTypeEnum.AGENT_CASH_PERK.getValue(),
                                            memberId,
                                            FlowTypeEnum.BALANCE.getValue(),
                                            orderNo);
                                }
                                if(scoreCnt.compareTo(BigDecimal.ZERO) > 0){
                                    addWalletInfoAndMoneyFlow(scoreCnt,
                                            teamPerkMemberId,
                                            "score",
                                            MoneyFlowTypeEnum.AGENT_SCORE_PERK.getValue(),
                                            memberId,
                                            FlowTypeEnum.SCORE.getValue(),
                                            orderNo);
                                }
                                levelNormal = level;
                                cashPercentNormal = adminAgentInfo.getCashPercent().multiply(AppContants.PERCENTAGE);
                                scorePercentNormal = adminAgentInfo.getScorePercent().multiply(AppContants.PERCENTAGE);
                            //如果是H金劵,除以当前价格,得到数量。
                            BigDecimal scoreCnt = amountTC.multiply(scorePercent).setScale(2, BigDecimal.ROUND_DOWN);
                            scoreCnt = scoreCnt.divide(poolScorePrice, 2 ,BigDecimal.ROUND_DOWN);
                            if(cashAmount.compareTo(BigDecimal.ZERO) > 0){
                                addWalletInfoAndMoneyFlow(cashAmount,
                                        teamPerkMemberId,
                                        "balance",
                                        MoneyFlowTypeEnum.AGENT_CASH_PERK.getValue(),
                                        memberId,
                                        FlowTypeEnum.BALANCE.getValue(),
                                        orderNo);
                            }
                            if(scoreCnt.compareTo(BigDecimal.ZERO) > 0){
                                addWalletInfoAndMoneyFlow(scoreCnt,
                                        teamPerkMemberId,
                                        "score",
                                        MoneyFlowTypeEnum.AGENT_SCORE_PERK.getValue(),
                                        memberId,
                                        FlowTypeEnum.SCORE.getValue(),
                                        orderNo);
                            }
                            levelNormal = level;
                            cashPercentNormal = adminAgentInfo.getCashPercent().multiply(AppContants.PERCENTAGE);
                            scorePercentNormal = adminAgentInfo.getScorePercent().multiply(AppContants.PERCENTAGE);
                        }
                    }
                }
            }
            /**
@@ -428,7 +451,7 @@
                );
                if(poolScore.compareTo(BigDecimal.ZERO) > 0 && poolCash.compareTo(BigDecimal.ZERO) > 0){
                    BigDecimal divide = poolCash.divide(poolScore, 7, BigDecimal.ROUND_DOWN);
                    BigDecimal divide = poolCash.divide(poolScore, 8, BigDecimal.ROUND_DOWN);
                    dataDictionaryCustomMapper.updateDicValueByTypeAndCode(
                            PerkEnum.POOL_SCORE_PRICE.getType(),
                            PerkEnum.POOL_SCORE_PRICE.getCode(),
@@ -529,28 +552,12 @@
    }
    public static void main(String[] args) {
        BigDecimal total = new BigDecimal(100000);
        BigDecimal amountTotal = BigDecimal.ZERO;
        BigDecimal scoreTotal = BigDecimal.ZERO;
        BigDecimal amountBasic = new BigDecimal(100);
        BigDecimal price = new BigDecimal(0.01);
        BigDecimal amountPercent = new BigDecimal(0.5);
        BigDecimal scorePercent = new BigDecimal(0.35);
        int times = total.divideToIntegralValue(amountBasic).intValue();
        System.out.println("循环次数:"+times);
        for(int i = 0; i < times; i++){
            BigDecimal amount = amountBasic.multiply(amountPercent);
            amountTotal = amountTotal.add(amount);
            BigDecimal score = amountBasic.multiply(scorePercent).divide(price, 2 ,BigDecimal.ROUND_DOWN);
            scoreTotal = scoreTotal.add(score);
            price = amountTotal.divide(scoreTotal, 7 ,BigDecimal.ROUND_DOWN);
            System.out.println("现金池:"+amountTotal+",积分池:"+scoreTotal+",增长现金:"+amount+"增长积分:"+score+",价格:"+price);
        String referrerIds = "23430963,23420267,23330438,23320976,23310921,23290922,23280413,23270439,23250764,23240756,23230123,23210557,23190725,23180251,23170775,23160156,23150596,23130696,23140691,23120183,22990699,22980499,23110722,20656426";
        List<String> referrerIdList = StrUtil.splitTrim(referrerIds, ",");
        for(String reId : referrerIdList){
            System.out.println(reId);
        }
    }
}