From 7ef244df1339c9f4ab0e94d8fe6cdd5c5879aec1 Mon Sep 17 00:00:00 2001
From: xiaoyong931011 <15274802129@163.com>
Date: Thu, 09 Mar 2023 11:52:34 +0800
Subject: [PATCH] 星级补贴、分享补贴的mq消费,使用批量更新和插入流水

---
 src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java |  172 +++++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 159 insertions(+), 13 deletions(-)

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 eb14dd2..cc45a65 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
@@ -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;
+    }
 }

--
Gitblit v1.9.1