From 076f5a4f0a7c5a4d3a6d3a1a61ff96a0091e3320 Mon Sep 17 00:00:00 2001 From: xiaoyong931011 <15274802129@163.com> Date: Sat, 06 May 2023 15:04:21 +0800 Subject: [PATCH] 星级补贴逻辑修改 --- src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java | 193 +++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 180 insertions(+), 13 deletions(-) diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java index 2e1f3a1..7f0f76c 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java +++ b/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()); } -- Gitblit v1.9.1