xiaoyong931011
2023-05-06 076f5a4f0a7c5a4d3a6d3a1a61ff96a0091e3320
src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java
@@ -52,6 +52,8 @@
    private final MallMoneyFlowMapper mallMoneyFlowMapper;
    private final MallMqRecordMapper mallMqRecordMapper;
    private final ICommonService commonService;
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void autoUpAgentLevel(Long memberId) {
@@ -241,12 +243,41 @@
         *  从最顶级级别的合伙人开始补贴
         *      补贴完,把已经补贴的合伙人加入下一个级别
         */
        List<MallMember> sevenLevelRecord = getStarRecord(null,  MemberLevelEnum.SEVEN_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_SEVEN.getValue());
        List<MallMember> sixLevelRecord = getStarRecord(sevenLevelRecord,  MemberLevelEnum.SIX_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_SIX.getValue());
        List<MallMember> fifthLevelRecord = getStarRecord(sixLevelRecord,  MemberLevelEnum.FIFTH_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_FIVE.getValue());
        List<MallMember> fourLevelRecord = getStarRecord(fifthLevelRecord,  MemberLevelEnum.FOUR_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_FOUR.getValue());
        List<MallMember> thirdLevelRecord = getStarRecord(fourLevelRecord,  MemberLevelEnum.THIRD_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_THREE.getValue());
        List<MallMember> secondLevelRecord = getStarRecord(thirdLevelRecord,  MemberLevelEnum.SECOND_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_TWO.getValue());
        DataDictionaryCustom perkAgentAchieveTotalDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                DataDictionaryEnum.PERK_AGENT_ACHIEVE_TOTAL.getType(),
                DataDictionaryEnum.PERK_AGENT_ACHIEVE_TOTAL.getCode());
        BigDecimal perkAgentAchieveTotal = new BigDecimal(perkAgentAchieveTotalDic.getValue());
        //星级奖励百分比等于每个级别的累计之和
        List<DataDictionaryCustom> starPerkDics = dataDictionaryCustomMapper.selectDicByType(
                "AGENT_LEVEL_REQUIRE");
        BigDecimal totalProfitProp = BigDecimal.ZERO;
        if(CollUtil.isNotEmpty(starPerkDics)){
            for(DataDictionaryCustom starPerkDic : starPerkDics){
                String starPerkStr = starPerkDic.getValue();
                AgentInfo agentInfo = JSONObject.parseObject(starPerkStr, AgentInfo.class);
                BigDecimal profitProp = agentInfo.getProfitProp().abs().divide(new BigDecimal(100));
                String code = starPerkDic.getCode();
                //存在当前级别的会员,则加上这个比例的补贴
                List<MallMember> mallMembers = memberMapper.selectByLevel(code);
                if(CollUtil.isNotEmpty(mallMembers)){
                    totalProfitProp = totalProfitProp.add(profitProp);
                }
            }
        }
        if(totalProfitProp.compareTo(BigDecimal.ZERO) > 0){
            BigDecimal perkTotal = amount.multiply(totalProfitProp).setScale(2,BigDecimal.ROUND_DOWN);
            perkAgentAchieveTotal = perkAgentAchieveTotal.add(perkTotal);
            perkAgentAchieveTotalDic.setValue(perkAgentAchieveTotal.toString());
            dataDictionaryCustomMapper.updateById(perkAgentAchieveTotalDic);
        }
//        List<MallMember> sevenLevelRecord = getStarRecord(null,  MemberLevelEnum.SEVEN_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_SEVEN.getValue());
//        List<MallMember> sixLevelRecord = getStarRecord(sevenLevelRecord,  MemberLevelEnum.SIX_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_SIX.getValue());
//        List<MallMember> fifthLevelRecord = getStarRecord(sixLevelRecord,  MemberLevelEnum.FIFTH_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_FIVE.getValue());
//        List<MallMember> fourLevelRecord = getStarRecord(fifthLevelRecord,  MemberLevelEnum.FOUR_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_FOUR.getValue());
//        List<MallMember> thirdLevelRecord = getStarRecord(fourLevelRecord,  MemberLevelEnum.THIRD_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_THREE.getValue());
//        List<MallMember> secondLevelRecord = getStarRecord(thirdLevelRecord,  MemberLevelEnum.SECOND_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_TWO.getValue());
        /**
         * 团队补贴
@@ -345,7 +376,8 @@
     * @return
     */
    public List<MallMember> getStarRecord(List<MallMember> mallMembersOlds,String LevelParam,BigDecimal amount,String orderNo,Long memberId,int starPerkType){
        //实际补贴总金额
        BigDecimal totalPerkAgentAmount = BigDecimal.ZERO;
        //根据用户的level获取用户
        List<MallMember> mallMemberStars = memberMapper.selectMemberWithLevel(LevelParam);
        if(CollUtil.isNotEmpty(mallMembersOlds)){
@@ -367,13 +399,32 @@
            if(starSum <= 0){
                return mallMemberStars;
            }
            BigDecimal totalProfitProp = BigDecimal.ZERO;
            List<DataDictionaryCustom> agentLevelRequireDics = dataDictionaryCustomMapper.selectDicByType("AGENT_LEVEL_REQUIRE");
            if(CollUtil.isNotEmpty(agentLevelRequireDics)){
                for(DataDictionaryCustom dic : agentLevelRequireDics){
                    String starPerkStr = dic.getValue();
                    AgentInfo agentInfo = JSONObject.parseObject(starPerkStr, AgentInfo.class);
                    //当前星级所占份数
                    BigDecimal profitProp = agentInfo.getProfitProp().abs();
                    List<MallMember> mallMembers = memberMapper.selectByLevel(dic.getCode());
                    if(CollUtil.isNotEmpty(mallMembers)){
                        totalProfitProp = profitProp.add(totalProfitProp);
                    }
                }
            }
            //星级补贴比例
            DataDictionaryCustom starPerkDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                    "AGENT_LEVEL_REQUIRE",
                    LevelParam);
            String starPerkStr = starPerkDic.getValue();
            AgentInfo agentInfo = JSONObject.parseObject(starPerkStr, AgentInfo.class);
            BigDecimal profitProp = agentInfo.getProfitProp().abs().divide(new BigDecimal(100));
//            BigDecimal profitProp = agentInfo.getProfitProp().abs().divide(new BigDecimal(100));
            //当前星级所占份数
            BigDecimal profitProp = agentInfo.getProfitProp().abs();
            //每一份多少钱
            amount = amount.divide(totalProfitProp,4,BigDecimal.ROUND_DOWN);
            //当前等级的星级补贴
            BigDecimal starPerkAmountSum = amount.multiply(profitProp);
            //当前等级的每一个贡献点的补贴金额
@@ -416,6 +467,7 @@
                        mallMoneyFlows.add(mallMoneyFlow);
                        reduceStar(mallMemberWallet.getMemberId(),starPerkAmount);
                        totalPerkAgentAmount = totalPerkAgentAmount.add(starPerkAmount);
                    }
                    count = count + 1;
                    if (count % 1000 == 0 || count == mallMemberWallets.size()) {
@@ -452,6 +504,16 @@
                }
            }
        }
        log.info("============实际补贴金额:{}",totalPerkAgentAmount.setScale(2,BigDecimal.ROUND_DOWN));
        DataDictionaryCustom totalPerkAgentAmountDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                DataDictionaryEnum.PERK_AGENT_ACHIEVE_TOTAL.getType(),
                DataDictionaryEnum.PERK_AGENT_ACHIEVE_TOTAL.getCode()
        );
        totalPerkAgentAmountDic.setValue(
                new BigDecimal(totalPerkAgentAmountDic.getValue()).subtract(totalPerkAgentAmount).setScale(2,BigDecimal.ROUND_DOWN).toString()
        );
        dataDictionaryCustomMapper.updateById(totalPerkAgentAmountDic);
        return mallMemberStars;
    }
@@ -591,15 +653,41 @@
        );
        List<MallMember> mallMembers = memberMapper.selectByLevel(MemberLevelEnum.SECOND_LEVEL.getType());
        BigDecimal jobAchieveReleasePercent = new BigDecimal(jobAchieveReleasePercentDic.getValue())
                .multiply(new BigDecimal(0.001));
        BigDecimal totalAchieve = BigDecimal.ZERO;
        Integer totalStar = 0;
        if(CollUtil.isNotEmpty(mallMembers)){
            for(MallMember mallMember : mallMembers){
                //总业绩
                BigDecimal sumAchieve = mallAchieveRecordMapper.selectSumAchieveByMemberId(mallMember.getId());
                BigDecimal jobAchieveReleasePercent = new BigDecimal(jobAchieveReleasePercentDic.getValue())
                        .multiply(new BigDecimal(0.001));
                //每个人的补贴额度
                BigDecimal multiply = sumAchieve.multiply(jobAchieveReleasePercent);
                BigDecimal achieve = mallAchieveRecordMapper.selectSumAchieveByMemberId(mallMember.getId());
                totalAchieve = totalAchieve.add(achieve);
                MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(mallMember.getId());
                Integer star = mallMemberWallet.getStar();
                totalStar = totalStar + star;
            }
        }
        if(BigDecimal.ZERO.compareTo(totalAchieve) >= 0){
            return;
        }
        //总释放=总业绩*一星每日业绩每日释放业绩到余额的千分比
        totalAchieve = totalAchieve.multiply(jobAchieveReleasePercent);
        if(totalStar <= 0){
            return;
        }
        //一个贡献点的价值
        BigDecimal divide = totalAchieve.divide(new BigDecimal(totalStar), 2, BigDecimal.ROUND_DOWN);
        if(CollUtil.isNotEmpty(mallMembers)){
            for(MallMember mallMember : mallMembers){
                MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(mallMember.getId());
                Integer star = mallMemberWallet.getStar();
                //每个人贡献值数量*一个贡献点的价值=获取的收益
                BigDecimal multiply = divide.multiply(new BigDecimal(star)).setScale(2,BigDecimal.ROUND_DOWN);
                BigDecimal totalScore = mallMemberWallet.getTotalScore();
                if(BigDecimal.ZERO.compareTo(multiply) < 0){
                    if(BigDecimal.ZERO.compareTo(totalScore) < 0){
@@ -623,6 +711,85 @@
                }
            }
        }
//        if(CollUtil.isNotEmpty(mallMembers)){
//            for(MallMember mallMember : mallMembers){
//                //总业绩
//                BigDecimal sumAchieve = mallAchieveRecordMapper.selectSumAchieveByMemberId(mallMember.getId());
//                //每个人的补贴额度
//                BigDecimal multiply = sumAchieve.multiply(jobAchieveReleasePercent);
//                MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(mallMember.getId());
//                BigDecimal totalScore = mallMemberWallet.getTotalScore();
//                if(BigDecimal.ZERO.compareTo(multiply) < 0){
//                    if(BigDecimal.ZERO.compareTo(totalScore) < 0){
//                        if(totalScore.compareTo(multiply) < 0){
//                            multiply = totalScore;
//                        }
//                        //减少补贴额度
//                        mallMemberWalletMapper.reduceTotalScoreById(multiply, mallMemberWallet.getId());
//
//                        reduceStar(mallMember.getId(),multiply);
//
//                        mallMemberWalletMapper.addBalanceById(multiply, mallMemberWallet.getId());
//
//                        mallMoneyFlowService.addMoneyFlow(
//                                mallMember.getId(),
//                                multiply,
//                                MoneyFlowTypeEnum.STATIC_BONUS.getValue(),
//                                MallUtils.getOrderNum(),
//                                FlowTypeEnum.BALANCE.getValue());
//                    }
//                }
//            }
//        }
    }
    @Override
    public void perkAgent() {
        DataDictionaryCustom totalAmountDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                DataDictionaryEnum.PERK_AGENT_ACHIEVE_TOTAL.getType(),
                DataDictionaryEnum.PERK_AGENT_ACHIEVE_TOTAL.getCode()
        );
        if(ObjectUtil.isEmpty(totalAmountDic)){
            return;
        }
        //星级补贴总数
        BigDecimal totalAmount = new BigDecimal(totalAmountDic.getValue()).setScale(2, BigDecimal.ROUND_DOWN);
        if(BigDecimal.ZERO.compareTo(totalAmount) >= 0){
            return;
        }
        DataDictionaryCustom perkAgentPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                DataDictionaryEnum.PERK_AGENT_ACHIEVE_PERCENT.getType(),
                DataDictionaryEnum.PERK_AGENT_ACHIEVE_PERCENT.getCode()
        );
        if(ObjectUtil.isEmpty(perkAgentPercentDic)){
            return;
        }
        //星级补贴百分比
        BigDecimal perkAgentPercent = new BigDecimal(perkAgentPercentDic.getValue()).abs().divide(new BigDecimal(100));
        BigDecimal amount = totalAmount.multiply(perkAgentPercent);
        if(BigDecimal.ZERO.compareTo(amount) >= 0){
            return;
        }
//        //星级补贴总数
//        totalAmountDic.setValue(totalAmount.subtract(amount).setScale(2,BigDecimal.ROUND_DOWN).toString());
//        dataDictionaryCustomMapper.updateById(totalAmountDic);
        String orderNo = MallUtils.getOrderNum("SPA");
        /**
         * 星级奖励
         *  从最顶级级别的合伙人开始补贴
         *      补贴完,把已经补贴的合伙人加入下一个级别
         */
        List<MallMember> sevenLevelRecord = getStarRecord(null,  MemberLevelEnum.SEVEN_LEVEL.name(), amount, orderNo, 0L,MoneyFlowTypeEnum.STAR_PERK_SEVEN.getValue());
        List<MallMember> sixLevelRecord = getStarRecord(sevenLevelRecord,  MemberLevelEnum.SIX_LEVEL.name(), amount, orderNo, 0L,MoneyFlowTypeEnum.STAR_PERK_SIX.getValue());
        List<MallMember> fifthLevelRecord = getStarRecord(sixLevelRecord,  MemberLevelEnum.FIFTH_LEVEL.name(), amount, orderNo, 0L,MoneyFlowTypeEnum.STAR_PERK_FIVE.getValue());
        List<MallMember> fourLevelRecord = getStarRecord(fifthLevelRecord,  MemberLevelEnum.FOUR_LEVEL.name(), amount, orderNo, 0L,MoneyFlowTypeEnum.STAR_PERK_FOUR.getValue());
        List<MallMember> thirdLevelRecord = getStarRecord(fourLevelRecord,  MemberLevelEnum.THIRD_LEVEL.name(), amount, orderNo, 0L,MoneyFlowTypeEnum.STAR_PERK_THREE.getValue());
        List<MallMember> secondLevelRecord = getStarRecord(thirdLevelRecord,  MemberLevelEnum.SECOND_LEVEL.name(), amount, orderNo, 0L,MoneyFlowTypeEnum.STAR_PERK_TWO.getValue());
    }