xiaoyong931011
2023-03-09 7ef244df1339c9f4ab0e94d8fe6cdd5c5879aec1
src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java
@@ -1,23 +1,21 @@
package cc.mrbird.febs.mall.service.impl;
import cc.mrbird.febs.common.enumerates.AgentLevelEnum;
import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum;
import cc.mrbird.febs.common.utils.AppContants;
import cc.mrbird.febs.mall.entity.AgentInfo;
import cc.mrbird.febs.mall.entity.DataDictionaryCustom;
import cc.mrbird.febs.mall.entity.MallMember;
import cc.mrbird.febs.mall.entity.MallOrderInfo;
import cc.mrbird.febs.common.enumerates.*;
import cc.mrbird.febs.mall.entity.*;
import cc.mrbird.febs.mall.mapper.*;
import cc.mrbird.febs.mall.service.IAgentService;
import cc.mrbird.febs.mall.service.IApiMallMemberService;
import cc.mrbird.febs.mall.service.IApiMallMemberWalletService;
import cc.mrbird.febs.mall.service.IMallAchieveService;
import cc.mrbird.febs.mall.service.*;
import cc.mrbird.febs.system.mapper.UserMapper;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONObject;
import jdk.nashorn.internal.ir.IfNode;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -27,6 +25,7 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
 * @author wzy
@@ -39,6 +38,12 @@
    private final DataDictionaryCustomMapper dataDictionaryCustomMapper;
    private final MallMemberMapper memberMapper;
    private final MallOrderInfoMapper mallOrderInfoMapper;
    private final IApiMallMemberWalletService iApiMallMemberWalletService;
    private final IMallMoneyFlowService mallMoneyFlowService;
    private final MallMemberWalletMapper mallMemberWalletMapper;
    private final SqlSessionTemplate sqlSessionTemplate;
    @Override
    @Transactional(rollbackFor = Exception.class)
@@ -136,7 +141,6 @@
    /**
     * 团队业绩是否达标
     *
     * @param mallMember
     * @param agentInfo
     * @return
     */
@@ -161,4 +165,146 @@
    public void rankReturnMoney(Long orderId) {
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void perkMoneyConsumer(long orderId) {
        MallOrderInfo mallOrderInfo = mallOrderInfoMapper.selectById(orderId);
        if(ObjectUtil.isEmpty(mallOrderInfo)){
            return;
        }
        if(2 != mallOrderInfo.getStatus()){
            return;
        }
        /**
         * 分享补贴 直推消费额10%
         */
        BigDecimal amount = mallOrderInfo.getAmount();
        Long memberId = mallOrderInfo.getMemberId();
        MallMember mallMember = memberMapper.selectById(memberId);
        //补贴对象 直属上级
        MallMember mallMemberUp = memberMapper.selectInfoByInviteId(mallMember.getReferrerId());
        if(ObjectUtil.isNotEmpty(mallMemberUp)){
            //分享补贴百分比
            DataDictionaryCustom sharePerkDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                    DataDictionaryEnum.SHARE_PERK.getType(),
                    DataDictionaryEnum.SHARE_PERK.getCode());
            String sharePerk = ObjectUtil.isEmpty(sharePerkDic.getValue()) ? "0" : sharePerkDic.getValue();
            BigDecimal sharePerkPercent = new BigDecimal(sharePerk).abs().divide(new BigDecimal(100));
            //分享补贴金额
            BigDecimal sharePerkAmount = amount.multiply(sharePerkPercent);
            iApiMallMemberWalletService.addBalance(sharePerkAmount, mallMemberUp.getId());
            mallMoneyFlowService.addMoneyFlow(
                    mallMemberUp.getId(),
                    sharePerkAmount,
                    MoneyFlowTypeEnum.DYNAMIC_ACHIEVE.getValue(),
                    mallOrderInfo.getOrderNo(),
                    FlowTypeEnum.BALANCE.getValue());
        }
        /**
         * 星级奖励
         *  从最顶级级别的合伙人开始补贴
         *      补贴完,把已经补贴的合伙人加入下一个级别
         */
        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());
    }
    /**
     *
     * @param mallMembersOlds 高一级别的用户
     * @param LevelParam    当前级别
     * @param amount    补贴金额的基数
     * @param orderNo   订单编号
     * @param memberId  会员id
     * @return
     */
    public List<MallMember> getStarRecord(List<MallMember> mallMembersOlds,String LevelParam,BigDecimal amount,String orderNo,Long memberId,int starPerkType){
        //根据用户的level获取用户
        List<MallMember> mallMemberStars = memberMapper.selectMemberWithLevel(LevelParam);
        if(CollUtil.isNotEmpty(mallMembersOlds)){
            for(MallMember mallMemberOld : mallMembersOlds){
                mallMemberStars.add(mallMemberOld);
            }
        }
        if(CollUtil.isNotEmpty(mallMemberStars)){
            List<Long> mallMemberStarIds = mallMemberStars.stream().map(MallMember::getId).collect(Collectors.toList());
            //当前等级的总贡献点
            List<MallMemberWallet> mallMemberWallets = mallMemberWalletMapper.selectSumStarByIds(mallMemberStarIds);
            Integer starSum = mallMemberWallets.stream().mapToInt(MallMemberWallet::getStar).sum();
            //星级补贴比例
            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 starPerkAmountSum = amount.multiply(profitProp);
            //当前等级的每一个贡献点的补贴金额
            BigDecimal starPerkAmountAva = starPerkAmountSum.divide(new BigDecimal(starSum),BigDecimal.ROUND_DOWN).setScale(2, BigDecimal.ROUND_DOWN);
            /**
             * 给当前等级的每个用户发放星级奖励
             * 生成星级奖励的流水
             */
            if(CollUtil.isNotEmpty(mallMemberWallets)){
                //给当前等级的每个用户发放星级奖励
                int count = 0;
                List<Map<String,Object>> result = new ArrayList<>();
                List<MallMoneyFlow> mallMoneyFlows = new ArrayList<>();
                for(MallMemberWallet mallMemberWallet : mallMemberWallets){
                    Map<String,Object> hashMap = new HashMap<>();
                    Integer starCnt = mallMemberWallet.getStar();
                    //当前用户的星级奖励
                    BigDecimal starPerkAmount = starPerkAmountAva
                            .multiply(new BigDecimal(starCnt)).abs().setScale(2, BigDecimal.ROUND_DOWN);
                    hashMap.put("id",mallMemberWallet.getId());
                    hashMap.put("starPerkAmount",starPerkAmount);
                    result.add(hashMap);
                    //生成星级奖励的流水对象
                    MallMoneyFlow mallMoneyFlow = new MallMoneyFlow();
                    mallMoneyFlow.setMemberId(mallMemberWallet.getMemberId());
                    mallMoneyFlow.setAmount(starPerkAmount);
                    mallMoneyFlow.setType(starPerkType);
                    mallMoneyFlow.setOrderNo(orderNo);
                    mallMoneyFlow.setRtMemberId(memberId);
                    mallMoneyFlow.setStatus(2);
                    mallMoneyFlow.setFlowType(FlowTypeEnum.BALANCE.getValue());
                    mallMoneyFlows.add(mallMoneyFlow);
                    count = count + 1;
                    if (count % 1000 == 0 || count == mallMemberWallets.size()) {
                        int updateCount = mallMemberWalletMapper.updateStarByList(result);
                        if(updateCount>0){
                            log.info("============更新============第{}条数据===========",count);
                        }
                        //每更新完一批数据,在result内进行删除操作。
                        result.clear();
                    }
                }
                SqlSession sqlSession = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH,false);
                MallMoneyFlowMapper mallMoneyFlowMapper = sqlSession.getMapper(MallMoneyFlowMapper.class);
                long start = System.currentTimeMillis();
                for(int i = 1; i <= mallMoneyFlows.size(); i++){
                    mallMoneyFlowMapper.insertMoneyFlow(mallMoneyFlows.get(i-1));
                    if (i % 1000 == 0 || i == mallMoneyFlows.size()) {
                        long end = System.currentTimeMillis();
                        log.info("============插入============第{}条数据,时间:{}===========",mallMoneyFlows.size(),(end - start)/1000);
                        sqlSession.commit();
                        sqlSession.clearCache();
                    }
                }
                sqlSession.close();
            }
        }
        return mallMemberStars;
    }
}