xiaoyong931011
2023-03-14 7655547b449a79a9330fd03440a616b3d6ef8362
代理商补贴,线下服务中心补贴,平级奖励补贴
11 files modified
332 ■■■■ changed files
src/main/java/cc/mrbird/febs/mall/mapper/MallAchieveRecordMapper.java 10 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java 6 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java 28 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/IAgentService.java 15 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/IMemberProfitService.java 6 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallMemberServiceImpl.java 10 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java 46 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java 178 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MallAchieveRecordMapper.xml 10 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MallMemberMapper.xml 20 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MallMoneyFlowMapper.xml 3 ●●●● patch | view | raw | blame | history
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 &gt;= 19
          and a.type &lt;= 27
          and date_format(a.created_time, '%Y-%m-%d') = date_format(#{date}, '%Y-%m-%d')
        group by a.member_id;
    </select>