From 7655547b449a79a9330fd03440a616b3d6ef8362 Mon Sep 17 00:00:00 2001 From: xiaoyong931011 <15274802129@163.com> Date: Tue, 14 Mar 2023 14:30:10 +0800 Subject: [PATCH] 代理商补贴,线下服务中心补贴,平级奖励补贴 --- src/main/resources/mapper/modules/MallAchieveRecordMapper.xml | 10 + src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java | 46 ------- src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java | 6 + src/main/java/cc/mrbird/febs/mall/mapper/MallAchieveRecordMapper.java | 10 + src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java | 178 +++++++++++++++++++++++++++++ src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java | 28 ++++ src/main/resources/mapper/modules/MallMemberMapper.xml | 20 +++ src/main/resources/mapper/modules/MallMoneyFlowMapper.xml | 3 src/main/java/cc/mrbird/febs/mall/service/IMemberProfitService.java | 6 + src/main/java/cc/mrbird/febs/mall/service/IAgentService.java | 15 ++ src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallMemberServiceImpl.java | 10 + 11 files changed, 279 insertions(+), 53 deletions(-) diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/MallAchieveRecordMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/MallAchieveRecordMapper.java index 314d2e1..86dd69b 100644 --- a/src/main/java/cc/mrbird/febs/mall/mapper/MallAchieveRecordMapper.java +++ b/src/main/java/cc/mrbird/febs/mall/mapper/MallAchieveRecordMapper.java @@ -6,8 +6,16 @@ import java.math.BigDecimal; import java.util.Date; +import java.util.List; public interface MallAchieveRecordMapper extends BaseMapper<MallAchieveRecord> { - + /** + * 根据日期获取总业绩 + * @param type D:某一天;M:某一月 + * @param date + * @return + */ BigDecimal selectAchieveTotal(@Param("type") String type, @Param("date") Date date); + + BigDecimal selectSumAchieveByMemberIds(@Param("list")List<Long> mallMembersOffLinePerkIds, @Param("date") Date date); } diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java index 9230766..6e486ac 100644 --- a/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java +++ b/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java @@ -87,4 +87,10 @@ List<MallMember> selectMemberWithLevel(String level); List<Long> selectMemberIdWithLevel(String levelParam); + + List<MallMember> selectAllChildAgentListByInviteIdAndStoreMaster(@Param("inviteId")String inviteId,@Param("state")Integer state); + + List<MallMember> selectMemberByDirector(@Param("state")Integer state); + + List<MallMember> selectMemberByStoreMaster(@Param("state")Integer state); } diff --git a/src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java b/src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java index a34ab2a..4beac7f 100644 --- a/src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java +++ b/src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java @@ -50,12 +50,36 @@ // memberProfitService.storeAndDirectorProfit(null); // } +// /** +// * 线下服务中心补贴 +// */ +// @Scheduled(cron = "0 0 1 * * ?") +// public void thankfulJob() { +// memberProfitService.thankfulProfit(null); +// } + + /** + * 代理商补贴 + */ + @Scheduled(cron = "0 0 1 * * ?") + public void agentPerkJob() { + memberProfitService.agentPerkJob(null); + } + /** * 线下服务中心补贴 */ @Scheduled(cron = "0 0 1 * * ?") - public void thankfulJob() { - memberProfitService.thankfulProfit(null); + public void offLinePerkJob() { + memberProfitService.offLinePerkJob(null); + } + + /** + * 平级奖励补贴 + */ + @Scheduled(cron = "0 0 1 * * ?") + public void teamEqualsPerkJob() { + memberProfitService.teamEqualsPerkJob(null); } diff --git a/src/main/java/cc/mrbird/febs/mall/service/IAgentService.java b/src/main/java/cc/mrbird/febs/mall/service/IAgentService.java index 8d3c118..3eee0c9 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/IAgentService.java +++ b/src/main/java/cc/mrbird/febs/mall/service/IAgentService.java @@ -1,5 +1,10 @@ package cc.mrbird.febs.mall.service; +import cc.mrbird.febs.mall.entity.MallMemberWallet; + +import java.math.BigDecimal; +import java.util.List; + public interface IAgentService { void autoUpAgentLevel(Long memberId); @@ -9,4 +14,14 @@ void rankReturnMoney(Long orderId); void perkMoneyConsumer(long parseLong); + /** + * 统一处理补贴,流水,余额 + * 增加的余额是一样的 + * @param mallMemberWallets + * @param amount + * @param flowType + * @param orderNo + * @param memberId + */ + void flowTotalScoreBalance(List<MallMemberWallet> mallMemberWallets, BigDecimal amount, int flowType, String orderNo, Long memberId); } diff --git a/src/main/java/cc/mrbird/febs/mall/service/IMemberProfitService.java b/src/main/java/cc/mrbird/febs/mall/service/IMemberProfitService.java index abb14d5..0512651 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/IMemberProfitService.java +++ b/src/main/java/cc/mrbird/febs/mall/service/IMemberProfitService.java @@ -41,4 +41,10 @@ void storeAndDirectorProfit(Date profitDate); void scorePool(); + + void agentPerkJob(Date profitDate); + + void offLinePerkJob(Date profitDate); + + void teamEqualsPerkJob(Date profitDate); } diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallMemberServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallMemberServiceImpl.java index c6e98d3..c06f4c7 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallMemberServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallMemberServiceImpl.java @@ -36,6 +36,7 @@ import java.math.BigDecimal; import java.util.Date; import java.util.List; +import java.util.stream.Collectors; /** * @author wzy @@ -110,6 +111,15 @@ if (type == 1) { mallMember.setDirector(value); } else if (type == 2){ + /** + * 线下服务商设置 + * 团队下没有线下服务商,才能成为线下服务商 + */ + List<MallMember> mallMembers = mallMemberMapper.selectAllChildAgentListByInviteIdAndStoreMaster(mallMember.getInviteId(), 1); + if(CollUtil.isNotEmpty(mallMembers)){ + List<String> phoneList = mallMembers.stream().map(MallMember::getPhone).collect(Collectors.toList()); + throw new FebsException("团队存在线下服务中心,账号为【"+phoneList.toString()+"】"); + } mallMember.setStoreMaster(value); } else { throw new FebsException("参数错误"); 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 e253eae..9f9d2c8 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 @@ -425,6 +425,7 @@ * @param orderNo * @param memberId */ + @Override public void flowTotalScoreBalance(List<MallMemberWallet> mallMemberWallets,BigDecimal amount,int flowType,String orderNo,Long memberId){ //给当前等级的每个用户发放星级奖励 int count = 0; @@ -488,50 +489,5 @@ } } - /** - * 平级奖励补贴 - */ - public void getPeerPerk(){ - /** - * 全体用户 - * 对象:产生了收益的用户的直属上级 - * 条件:等级和用户等级一样 - * 补贴:每日补贴的10%,例如用户当日的补贴总额为100,直属上级拿100*10%=10, - * 限制:直推收益除外。 - */ - //平级补贴百分比 - DataDictionaryCustom teamEqualsPerkDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( - DataDictionaryEnum.TEAM_EQUALS_PERK.getType(), - DataDictionaryEnum.TEAM_EQUALS_PERK.getCode()); - BigDecimal teamEqualsPerkPercent = new BigDecimal(teamEqualsPerkDic.getValue()).abs().multiply(BigDecimal.valueOf(0.01)); - //产生了收益的用户和直属上级 - List<AdminTeamEqualsPerkVo> adminTeamEqualsPerkVos = mallMoneyFlowMapper.selectTeamEqualsMemberByDate(new Date()); - if(CollUtil.isNotEmpty(adminTeamEqualsPerkVos)){ - for(AdminTeamEqualsPerkVo adminTeamEqualsPerkVo : adminTeamEqualsPerkVos){ - BigDecimal sumAmount = adminTeamEqualsPerkVo.getSumAmount(); - //平级补贴 - BigDecimal teamEqualsPerkAmount = teamEqualsPerkPercent.multiply(sumAmount).setScale(2, BigDecimal.ROUND_DOWN); - - MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(adminTeamEqualsPerkVo.getRtMemberId()); - BigDecimal totalScore = mallMemberWallet.getTotalScore(); - if(totalScore.compareTo(teamEqualsPerkAmount) < 0){ - teamEqualsPerkAmount = totalScore; - } - if(BigDecimal.ZERO.compareTo(teamEqualsPerkAmount) < 0){ - //减少补贴额度 - mallMemberWalletMapper.reduceTotalScoreById(teamEqualsPerkAmount, mallMemberWallet.getId()); - - mallMemberWalletMapper.addBalanceById(teamEqualsPerkAmount, mallMemberWallet.getId()); - - mallMoneyFlowService.addMoneyFlow( - adminTeamEqualsPerkVo.getRtMemberId(), - teamEqualsPerkAmount, - MoneyFlowTypeEnum.TEAM_EQUALS_PERK.getValue(), - MallUtils.getOrderNum("TEP"), - FlowTypeEnum.BALANCE.getValue()); - } - } - } - } } diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java index b93bc9e..57f047a 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java @@ -5,14 +5,13 @@ import cc.mrbird.febs.common.enumerates.FlowTypeEnum; import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum; import cc.mrbird.febs.common.utils.AppContants; +import cc.mrbird.febs.common.utils.MallUtils; import cc.mrbird.febs.common.utils.RedisUtils; import cc.mrbird.febs.mall.dto.ScorePoorDto; import cc.mrbird.febs.mall.entity.*; import cc.mrbird.febs.mall.mapper.*; -import cc.mrbird.febs.mall.service.IApiMallMemberWalletService; -import cc.mrbird.febs.mall.service.IMallAchieveService; -import cc.mrbird.febs.mall.service.IMallMoneyFlowService; -import cc.mrbird.febs.mall.service.IMemberProfitService; +import cc.mrbird.febs.mall.service.*; +import cc.mrbird.febs.mall.vo.AdminTeamEqualsPerkVo; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateField; import cn.hutool.core.date.DateTime; @@ -33,6 +32,7 @@ import java.math.BigDecimal; import java.math.RoundingMode; import java.util.*; +import java.util.stream.Collectors; /** * @author wzy @@ -54,6 +54,8 @@ private final MallAchieveRecordMapper mallAchieveRecordMapper; private final RedisUtils redisUtils; private final MallMemberWalletMapper mallMemberWalletMapper; + private final IAgentService iAgentService; + private final IMallMoneyFlowService mallMoneyFlowService; @Override @Transactional(rollbackFor = Exception.class) @@ -574,4 +576,172 @@ +";人数:"+cnt); } + @Override + public void agentPerkJob(Date profitDate) { + /** + * 代理商补贴 + * 全体代理商 + * 前一天全部业绩的百分比用来平分 + */ + log.info("######==代理商补贴==start==####"); + + List<MallMember> mallMembersAgentPerkList = mallMemberMapper.selectMemberByDirector(1); + if (CollUtil.isEmpty(mallMembersAgentPerkList)) { + return; + } + if (profitDate == null) { + profitDate = DateUtil.offset(new Date(), DateField.DAY_OF_YEAR, -1); + } + //前一天的总业绩 + BigDecimal agentPerkAmountSum = mallAchieveRecordMapper.selectAchieveTotal("D", profitDate); + //补贴百分比 + DataDictionaryCustom agentPerkDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + DataDictionaryEnum.AGENT_PERK.getType(), + DataDictionaryEnum.AGENT_PERK.getCode() + ); + if(ObjectUtil.isEmpty(agentPerkDic)){ + return; + } + BigDecimal agentPerk = new BigDecimal(agentPerkDic.getValue()).multiply(new BigDecimal("0.01")); + agentPerkAmountSum = agentPerkAmountSum.multiply(agentPerk); + + BigDecimal agentPerkAmount = agentPerkAmountSum.divide(new BigDecimal(mallMembersAgentPerkList.size()), BigDecimal.ROUND_DOWN).setScale(2, BigDecimal.ROUND_DOWN); + List<Long> mallMembersAgentPerkIds = mallMembersAgentPerkList.stream().map(MallMember::getId).collect(Collectors.toList()); + List<MallMemberWallet> mallMemberWallets = mallMemberWalletMapper.selectMemberWalletsByIds(mallMembersAgentPerkIds); + iAgentService.flowTotalScoreBalance( + mallMemberWallets, + agentPerkAmount, + MoneyFlowTypeEnum.AGENT_PERK.getValue(), + MallUtils.getOrderNum("AP"), + 1L + ); + + log.info("#####==代理商补贴==end==######" + + "今日总补贴###" + agentPerkAmountSum.setScale(2, RoundingMode.HALF_UP) + +"###人均###"+agentPerkAmount.setScale(2, RoundingMode.HALF_UP) + +"###人数###"+mallMemberWallets.size()); + + + } + + @Override + public void offLinePerkJob(Date profitDate) { + /** + * 线下服务中心补贴 + * 全体线下服务商 + * 前一天团队业绩的百分比用来平分 + */ + log.info("######==线下服务中心补贴==start==####"); + + List<MallMember> mallMembersOffLinePerkList = mallMemberMapper.selectMemberByStoreMaster(1); + if (CollUtil.isEmpty(mallMembersOffLinePerkList)) { + return; + } + + //补贴百分比 + DataDictionaryCustom offLinePerkDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + DataDictionaryEnum.OFFLINE_PERK.getType(), + DataDictionaryEnum.OFFLINE_PERK.getCode() + ); + if(ObjectUtil.isEmpty(offLinePerkDic)){ + return; + } + BigDecimal offLinePerk = new BigDecimal(offLinePerkDic.getValue()).multiply(new BigDecimal("0.01")); + + if (profitDate == null) { + profitDate = DateUtil.offset(new Date(), DateField.DAY_OF_YEAR, -1); + } + for(MallMember mallMembersOffLinePerk : mallMembersOffLinePerkList){ + String inviteId = mallMembersOffLinePerk.getInviteId(); + //获取团队下所有成员 + List<MallMember> allMallMemberList = mallMemberMapper.selectAllChildAgentListByInviteId(inviteId); + //子团队中是否有线下服务商 + List<MallMember> storeMasterMallMemberList = mallMemberMapper.selectAllChildAgentListByInviteIdAndStoreMaster(inviteId, 1); + if(CollUtil.isNotEmpty(storeMasterMallMemberList)){ + //如果有,该子团队成员不算业绩 + List<MallMember> storeMasterMallMembers = new ArrayList<>(); + for(MallMember storeMasterMallMember : storeMasterMallMemberList){ + List<MallMember> storeMasterList = mallMemberMapper.selectAllChildAgentListByInviteId(storeMasterMallMember.getInviteId()); + storeMasterMallMembers.addAll(storeMasterList); + } + allMallMemberList.removeAll(storeMasterMallMembers); + } + + //团队下所有人的业绩 + List<Long> mallMembersOffLinePerkIds = allMallMemberList.stream().map(MallMember::getId).collect(Collectors.toList()); + + BigDecimal offLinePerkAmountSum = mallAchieveRecordMapper.selectSumAchieveByMemberIds(mallMembersOffLinePerkIds,profitDate); + //该团队产生的业绩金额 + offLinePerkAmountSum = offLinePerkAmountSum.multiply(offLinePerk).setScale(2,BigDecimal.ROUND_DOWN); + + //所有合伙人补贴至消费礼包的三倍额度需要复购一次。 + MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(mallMembersOffLinePerk.getId()); + BigDecimal totalScore = mallMemberWallet.getTotalScore(); + if(totalScore.compareTo(offLinePerkAmountSum) < 0){ + offLinePerkAmountSum = totalScore; + } + if(BigDecimal.ZERO.compareTo(offLinePerkAmountSum) < 0){ + //减少补贴额度 + mallMemberWalletMapper.reduceTotalScoreById(offLinePerkAmountSum, mallMemberWallet.getId()); + + mallMemberWalletMapper.addBalanceById(offLinePerkAmountSum, mallMemberWallet.getId()); + + mallMoneyFlowService.addMoneyFlow( + mallMembersOffLinePerk.getId(), + offLinePerkAmountSum, + MoneyFlowTypeEnum.OFFLINE_PERK.getValue(), + MallUtils.getOrderNum("OLP"), + FlowTypeEnum.BALANCE.getValue()); + } + } + } + + @Override + public void teamEqualsPerkJob(Date profitDate) { + /** + * 全体用户 + * 对象:产生了收益的用户的直属上级 + * 条件:等级和用户等级一样 + * 补贴:每日补贴的10%,例如用户当日的补贴总额为100,直属上级拿100*10%=10, + * 限制:直推收益除外。 + */ + if (profitDate == null) { + profitDate = DateUtil.offset(new Date(), DateField.DAY_OF_YEAR, -1); + } + //平级补贴百分比 + DataDictionaryCustom teamEqualsPerkDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + DataDictionaryEnum.TEAM_EQUALS_PERK.getType(), + DataDictionaryEnum.TEAM_EQUALS_PERK.getCode()); + BigDecimal teamEqualsPerkPercent = new BigDecimal(teamEqualsPerkDic.getValue()).abs().multiply(BigDecimal.valueOf(0.01)); + + //产生了收益的用户和直属上级 + List<AdminTeamEqualsPerkVo> adminTeamEqualsPerkVos = mallMoneyFlowMapper.selectTeamEqualsMemberByDate(profitDate); + if(CollUtil.isNotEmpty(adminTeamEqualsPerkVos)){ + for(AdminTeamEqualsPerkVo adminTeamEqualsPerkVo : adminTeamEqualsPerkVos){ + BigDecimal sumAmount = adminTeamEqualsPerkVo.getSumAmount(); + //平级补贴 + BigDecimal teamEqualsPerkAmount = teamEqualsPerkPercent.multiply(sumAmount).setScale(2, BigDecimal.ROUND_DOWN); + + MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(adminTeamEqualsPerkVo.getRtMemberId()); + BigDecimal totalScore = mallMemberWallet.getTotalScore(); + if(totalScore.compareTo(teamEqualsPerkAmount) < 0){ + teamEqualsPerkAmount = totalScore; + } + if(BigDecimal.ZERO.compareTo(teamEqualsPerkAmount) < 0){ + //减少补贴额度 + mallMemberWalletMapper.reduceTotalScoreById(teamEqualsPerkAmount, mallMemberWallet.getId()); + + mallMemberWalletMapper.addBalanceById(teamEqualsPerkAmount, mallMemberWallet.getId()); + + mallMoneyFlowService.addMoneyFlow( + adminTeamEqualsPerkVo.getRtMemberId(), + teamEqualsPerkAmount, + MoneyFlowTypeEnum.TEAM_EQUALS_PERK.getValue(), + MallUtils.getOrderNum("TEP"), + FlowTypeEnum.BALANCE.getValue()); + } + } + } + } + } diff --git a/src/main/resources/mapper/modules/MallAchieveRecordMapper.xml b/src/main/resources/mapper/modules/MallAchieveRecordMapper.xml index 53af5db..0825990 100644 --- a/src/main/resources/mapper/modules/MallAchieveRecordMapper.xml +++ b/src/main/resources/mapper/modules/MallAchieveRecordMapper.xml @@ -13,4 +13,14 @@ </if> </select> + <select id="selectSumAchieveByMemberIds" resultType="cc.mrbird.febs.mall.entity.MallAchieveRecord"> + select IFNULL(sum(IFNULL(amount,0)),0) + from mall_achieve_record + where member_id IN + <foreach collection = "list" item = "item" separator="," open = "(" close = ")" > + #{item} + </foreach > + and date_format(achieve_time, '%Y-%m-%d') = date_format(#{date}, '%Y-%m-%d'); + </select> + </mapper> \ No newline at end of file diff --git a/src/main/resources/mapper/modules/MallMemberMapper.xml b/src/main/resources/mapper/modules/MallMemberMapper.xml index 655f2e6..29afe0a 100644 --- a/src/main/resources/mapper/modules/MallMemberMapper.xml +++ b/src/main/resources/mapper/modules/MallMemberMapper.xml @@ -405,4 +405,24 @@ select id from mall_member where level = #{level} </select> + + <select id="selectAllChildAgentListByInviteIdAndStoreMaster" resultType="cc.mrbird.febs.mall.entity.MallMember"> + select * + from mall_member + where + find_in_set(#{inviteId}, referrer_ids) + and store_master = #{state} + </select> + + <select id="selectMemberByDirector" resultType="cc.mrbird.febs.mall.entity.MallMember"> + select * + from mall_member + where director = #{state} + </select> + + <select id="selectMemberByStoreMaster" resultType="cc.mrbird.febs.mall.entity.MallMember"> + select * + from mall_member + where store_master = #{state} + </select> </mapper> \ No newline at end of file diff --git a/src/main/resources/mapper/modules/MallMoneyFlowMapper.xml b/src/main/resources/mapper/modules/MallMoneyFlowMapper.xml index b40f23a..7179b65 100644 --- a/src/main/resources/mapper/modules/MallMoneyFlowMapper.xml +++ b/src/main/resources/mapper/modules/MallMoneyFlowMapper.xml @@ -172,7 +172,8 @@ inner join mall_member b on b.id = a.member_id inner join mall_member c on c.invite_id = b.referrer_id and c.level = b.level where - a.type in (1, 2) + a.type >= 19 + and a.type <= 27 and date_format(a.created_time, '%Y-%m-%d') = date_format(#{date}, '%Y-%m-%d') group by a.member_id; </select> -- Gitblit v1.9.1