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); } 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); } 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); } 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); } 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); } 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("参数错误"); 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()); } } } } } 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()); } } } } } 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> 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> 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>