xiaoyong931011
2023-03-30 836e019db92b9871cba9d440c8159b35f79e1726
src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java
@@ -5,14 +5,14 @@
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 cc.mrbird.febs.rabbit.producter.AgentProducer;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime;
@@ -33,6 +33,7 @@
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import java.util.stream.Collectors;
/**
 * @author wzy
@@ -54,6 +55,10 @@
    private final MallAchieveRecordMapper mallAchieveRecordMapper;
    private final RedisUtils redisUtils;
    private final MallMemberWalletMapper mallMemberWalletMapper;
    private final IAgentService iAgentService;
    private final IMallMoneyFlowService mallMoneyFlowService;
    private final MallMqRecordMapper mallMqRecordMapper;
    private final AgentProducer agentProducer;
    @Override
    @Transactional(rollbackFor = Exception.class)
@@ -146,7 +151,8 @@
    @Override
    public void dynamicProfit(Long orderId) {
        dynamicProfit(orderId, 2);
        return;
//        dynamicProfit(orderId, 2);
    }
    /**
@@ -189,9 +195,9 @@
            }
            // 判断套餐或者普通商品,结算对应商品的动态分红
            if (!Objects.equals(item.getIsNormal(), isNormal)) {
                continue;
            }
//            if (!Objects.equals(item.getIsNormal(), isNormal)) {
//                continue;
//            }
            // =======直推返利== start =====
            // 直接奖励收益
@@ -284,7 +290,7 @@
        DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.AGENT_BONUS.getType(), DataDictionaryEnum.AGENT_BONUS.getCode());
        BigDecimal profit = totalIncome.multiply(new BigDecimal(dic.getValue()).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP));
        List<MallMember> agentMembers = mallMemberMapper.selectByIdAndNoLevel(null, AgentLevelEnum.FIRST_LEVEL.name());
        List<MallMember> agentMembers = mallMemberMapper.selectByIdAndNoLevel(null, AgentLevelEnum.SECOND_LEVEL.name());
        if (CollUtil.isEmpty(agentMembers)) {
            return;
        }
@@ -500,6 +506,13 @@
    @Override
    public void scorePool() {
        log.info("#####==积分池==start==######");
        String redisKey = "scorePool";
//        List<MallOrderInfo> mallOrderInfos = mallOrderInfoMapper.selectList(new QueryWrapper<>());
//        if(CollUtil.isEmpty(mallOrderInfos)){
//            redisUtils.set(redisKey,0,0L);
//            return;
//        }
        /**
         * 后一天2点,结算前一天的所有消费
         * 积分池增加每日消费的10%
@@ -517,8 +530,6 @@
        Date date = DateUtil.offsetDay(new Date(), -1);
        BigDecimal totalAmount = mallOrderInfoMapper.selectTotalAmountByPayDoneAndDataString(1, date);
        BigDecimal multiplyTotalAmount = totalAmount.multiply(everydayRatio);
        String redisKey = "scorePool";
        String scorePoolRedis = redisUtils.getString(redisKey);
        if(StrUtil.isBlank(scorePoolRedis)){
            redisUtils.set(redisKey,0,0L);
@@ -569,4 +580,213 @@
                +";人数:"+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());
                iAgentService.reduceStar(mallMemberWallet.getMemberId(),offLinePerkAmountSum);
                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());
                    iAgentService.reduceStar(mallMemberWallet.getMemberId(),teamEqualsPerkAmount);
                    mallMemberWalletMapper.addBalanceById(teamEqualsPerkAmount, mallMemberWallet.getId());
//
//                    mallMoneyFlowService.addMoneyFlow(
//                            adminTeamEqualsPerkVo.getRtMemberId(),
//                            teamEqualsPerkAmount,
//                            MoneyFlowTypeEnum.TEAM_EQUALS_PERK.getValue(),
//                            MallUtils.getOrderNum("TEP"),
//                            FlowTypeEnum.BALANCE.getValue());
                    mallMoneyFlowService.addMoneyFlow(
                            adminTeamEqualsPerkVo.getRtMemberId(),
                            teamEqualsPerkAmount,
                            MoneyFlowTypeEnum.TEAM_EQUALS_PERK.getValue(),
                            MallUtils.getOrderNum("TEP"),
                            "平级奖励补贴",
                            "补贴额度:"+mallMemberWallet.getTotalScore(),
                            adminTeamEqualsPerkVo.getMemberId(),
                            2,
                            FlowTypeEnum.BALANCE.getValue(),
                            1);
                }
            }
        }
    }
    @Override
    public void mqPerkRetryJob() {
        /**
         * 每次拿重试次数大于零
         * 按ID asc排序的十条数据
         */
        List<MallMqRecord> mallMqRecords = mallMqRecordMapper.selectByStateLimitTen(2);
        if(CollUtil.isEmpty(mallMqRecords)){
            return;
        }
        for(MallMqRecord mallMqRecord : mallMqRecords){
            Integer retryTimes = mallMqRecord.getRetryTimes();
            if(retryTimes <= 0){
                continue;
            }
            retryTimes = retryTimes - 1;
            mallMqRecord.setRetryTimes(retryTimes);
            mallMqRecordMapper.updateById(mallMqRecord);
            Long orderId = mallMqRecord.getOrderId();
            agentProducer.sendPerkMoneyMsg(orderId);
        }
    }
}