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/rabbit/enumerates/RabbitQueueEnum.java   |    6 
 src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java       |   12 +
 src/main/java/cc/mrbird/febs/mall/entity/AgentInfo.java               |    4 
 src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java        |    2 
 src/main/java/cc/mrbird/febs/mall/mapper/MallMemberWalletMapper.java  |    6 
 src/test/java/cc/mrbird/febs/ProfitTest.java                          |    2 
 src/main/resources/mapper/modules/MallMemberMapper.xml                |    5 
 src/main/resources/application-prod.yml                               |    2 
 src/main/java/cc/mrbird/febs/mall/entity/MallMemberWallet.java        |    5 
 src/main/java/cc/mrbird/febs/common/enumerates/MemberLevelEnum.java   |   62 ++++++++
 src/main/java/cc/mrbird/febs/mall/service/IAgentService.java          |    2 
 src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java |   32 ++++
 src/main/java/cc/mrbird/febs/common/configure/RabbitConfigure.java    |   21 +++
 src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java  |  172 ++++++++++++++++++++++-
 src/main/resources/mapper/modules/MallMemberWalletMapper.xml          |   20 ++
 src/main/java/cc/mrbird/febs/rabbit/constants/QueueConstants.java     |    5 
 src/main/resources/application-dev.yml                                |    2 
 src/main/resources/mapper/modules/MallMoneyFlowMapper.xml             |   30 ++++
 src/main/java/cc/mrbird/febs/mall/mapper/MallMoneyFlowMapper.java     |    2 
 19 files changed, 372 insertions(+), 20 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/common/configure/RabbitConfigure.java b/src/main/java/cc/mrbird/febs/common/configure/RabbitConfigure.java
index 50797b6..8acc19d 100644
--- a/src/main/java/cc/mrbird/febs/common/configure/RabbitConfigure.java
+++ b/src/main/java/cc/mrbird/febs/common/configure/RabbitConfigure.java
@@ -122,4 +122,25 @@
         return BindingBuilder.bind(orderReturnMoneyQueue()).to(orderReturnMoneyExchange()).with(RabbitQueueEnum.ORDER_RETURN_MONEY.getRoute());
     }
 
+    /**
+     * 补贴金额
+     * @return
+     */
+    //补贴金额 start
+    @Bean
+    public DirectExchange perkMoneyExchange() {
+        return new DirectExchange(RabbitQueueEnum.PERK_MONEY.getExchange());
+    }
+
+    @Bean
+    public Queue perkMoneyQueue() {
+        return new Queue(QueueConstants.PERK_MONEY);
+    }
+
+    @Bean
+    public Binding perkMoneyBind() {
+        return BindingBuilder.bind(perkMoneyQueue()).to(perkMoneyExchange()).with(RabbitQueueEnum.PERK_MONEY.getRoute());
+    }
+    //补贴金额 end
+
 }
diff --git a/src/main/java/cc/mrbird/febs/common/enumerates/MemberLevelEnum.java b/src/main/java/cc/mrbird/febs/common/enumerates/MemberLevelEnum.java
new file mode 100644
index 0000000..d6758c1
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/common/enumerates/MemberLevelEnum.java
@@ -0,0 +1,62 @@
+package cc.mrbird.febs.common.enumerates;
+
+import lombok.Getter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Getter
+public enum MemberLevelEnum {
+    SEVEN_LEVEL("SEVEN_LEVEL",6),
+    SIX_LEVEL("SIX_LEVEL",5),
+    FIFTH_LEVEL("FIFTH_LEVEL",4),
+    FOUR_LEVEL("FOUR_LEVEL",3),
+    THIRD_LEVEL("THIRD_LEVEL",2),
+    SECOND_LEVEL("SECOND_LEVEL",1);
+
+
+    private String type;
+
+    private Integer code;
+
+    MemberLevelEnum(String type, Integer code) {
+        this.type = type;
+        this.code = code;
+    }
+
+    public List<String> getLevelType(){
+        List<String> strs = new ArrayList<>();
+        for (MemberLevelEnum value : MemberLevelEnum.values()) {
+            strs.add(value.type);
+        }
+        return strs;
+    }
+
+    public int getLevelCode(String Level){
+        int codeOne = 0;
+        for (MemberLevelEnum value : MemberLevelEnum.values()) {
+            if(value.type.equals(Level)){
+                codeOne = value.code;
+            }
+        }
+        return codeOne;
+    }
+
+    //比较两个级别的大小,levelOne大于levelTwo返回1,否则返回0
+    public int compareLevel(String levelOne ,String levelTwo) {
+        int codeOne = 0;
+        int codeTwo = 0;
+        for (MemberLevelEnum value : MemberLevelEnum.values()) {
+            if(value.type.equals(levelOne)){
+                codeOne = value.code;
+            }
+            if(value.type.equals(levelTwo)){
+                codeTwo = value.code;
+            }
+        }
+        if(codeOne > codeTwo){
+            return 1;
+        }
+        return 0;
+    }
+}
diff --git a/src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java b/src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java
index d560d5d..a3aa3d7 100644
--- a/src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java
+++ b/src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java
@@ -93,7 +93,37 @@
     /**
      * 积分池收益
      */
-    SCORE_POOL(18);
+    SCORE_POOL(18),
+
+    /**
+     * 星级奖励
+     */
+    STAR_PERK_TWO(19),
+
+    /**
+     * 星级奖励
+     */
+    STAR_PERK_THREE(20),
+
+    /**
+     * 星级奖励
+     */
+    STAR_PERK_FOUR(21),
+
+    /**
+     * 星级奖励
+     */
+    STAR_PERK_FIVE(22),
+
+    /**
+     * 星级奖励
+     */
+    STAR_PERK_SIX(23),
+
+    /**
+     * 星级奖励
+     */
+    STAR_PERK_SEVEN(24);
 
     private final int value;
 
diff --git a/src/main/java/cc/mrbird/febs/mall/entity/AgentInfo.java b/src/main/java/cc/mrbird/febs/mall/entity/AgentInfo.java
index 6918575..c15ebf6 100644
--- a/src/main/java/cc/mrbird/febs/mall/entity/AgentInfo.java
+++ b/src/main/java/cc/mrbird/febs/mall/entity/AgentInfo.java
@@ -14,12 +14,12 @@
 public class AgentInfo {
 
     /**
-     * 团队业绩
+     * 团队贡献值
      */
     private BigDecimal teamIncome;
 
     /**
-     * 代理收益比例
+     * 补贴比例
      */
     private BigDecimal profitProp;
 
diff --git a/src/main/java/cc/mrbird/febs/mall/entity/MallMemberWallet.java b/src/main/java/cc/mrbird/febs/mall/entity/MallMemberWallet.java
index 4efe753..cd46097 100644
--- a/src/main/java/cc/mrbird/febs/mall/entity/MallMemberWallet.java
+++ b/src/main/java/cc/mrbird/febs/mall/entity/MallMemberWallet.java
@@ -43,4 +43,9 @@
      * 佣金
      */
     private BigDecimal commission;
+
+    /**
+     * 贡献点
+     */
+    private Integer star;
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java
index 5c4787a..9230766 100644
--- a/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java
+++ b/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java
@@ -85,4 +85,6 @@
     List<MallMember> selectDirectorsOrStoreMaster(@Param("type") Integer type);
 
     List<MallMember> selectMemberWithLevel(String level);
+
+    List<Long> selectMemberIdWithLevel(String levelParam);
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberWalletMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberWalletMapper.java
index cea3a64..2195065 100644
--- a/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberWalletMapper.java
+++ b/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberWalletMapper.java
@@ -5,6 +5,8 @@
 import org.apache.ibatis.annotations.Param;
 
 import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
 
 public interface MallMemberWalletMapper extends BaseMapper<MallMemberWallet> {
 
@@ -25,4 +27,8 @@
     BigDecimal selectSumPrizeScore();
 
     BigDecimal selectSumCommission();
+
+    List<MallMemberWallet> selectSumStarByIds(@Param("list")List<Long> ids);
+
+    int updateStarByList(@Param("list")List<Map<String, Object>> result);
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/MallMoneyFlowMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/MallMoneyFlowMapper.java
index eaa05c6..32c1f62 100644
--- a/src/main/java/cc/mrbird/febs/mall/mapper/MallMoneyFlowMapper.java
+++ b/src/main/java/cc/mrbird/febs/mall/mapper/MallMoneyFlowMapper.java
@@ -37,4 +37,6 @@
     BigDecimal selectCommissionIncome(@Param("type") Integer type, @Param("date") Date date, @Param("memberId") Long memebrid);
 
     BigDecimal selectThankfulCommission(@Param("date") Date date, @Param("memberId") Long memberId);
+
+    void insertMoneyFlow(MallMoneyFlow mallMoneyFlow);
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/service/IAgentService.java b/src/main/java/cc/mrbird/febs/mall/service/IAgentService.java
index bccd530..8d3c118 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/IAgentService.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/IAgentService.java
@@ -7,4 +7,6 @@
     void returnMoneyToAgent(Long orderId);
 
     void rankReturnMoney(Long orderId);
+
+    void perkMoneyConsumer(long parseLong);
 }
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;
+    }
 }
diff --git a/src/main/java/cc/mrbird/febs/rabbit/constants/QueueConstants.java b/src/main/java/cc/mrbird/febs/rabbit/constants/QueueConstants.java
index 6e7dfd5..d3f9dc2 100644
--- a/src/main/java/cc/mrbird/febs/rabbit/constants/QueueConstants.java
+++ b/src/main/java/cc/mrbird/febs/rabbit/constants/QueueConstants.java
@@ -10,4 +10,9 @@
     public static final String AGENT_AUTO_LEVEL_UP = "hlm_queue_agent_auto_level_up";
     public static final String AGENT_RETURN_MONEY = "hlm_queue_agent_return_money";
     public static final String ORDER_RETURN_MONEY = "hlm_queue_order_return_money";
+    /**
+     * 补贴金额 ,
+     *      分享补贴,星级补贴
+     */
+    public static final String PERK_MONEY = "hlm_queue_perk_money";
 }
diff --git a/src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java b/src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java
index 27a395d..964ac30 100644
--- a/src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java
+++ b/src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java
@@ -72,4 +72,16 @@
             log.error("订单返利异常:", e);
         }
     }
+
+    @RabbitListener(queues = QueueConstants.PERK_MONEY)
+    public void perkMoneyConsumer(String id) {
+        log.info("收到补贴消息:{}", id);
+        try {
+            agentService.perkMoneyConsumer(Long.parseLong(id));
+        } catch (Exception e) {
+            log.error("用户补贴异常", e);
+            // todo 更新表
+
+        }
+    }
 }
diff --git a/src/main/java/cc/mrbird/febs/rabbit/enumerates/RabbitQueueEnum.java b/src/main/java/cc/mrbird/febs/rabbit/enumerates/RabbitQueueEnum.java
index 0b64030..79ca466 100644
--- a/src/main/java/cc/mrbird/febs/rabbit/enumerates/RabbitQueueEnum.java
+++ b/src/main/java/cc/mrbird/febs/rabbit/enumerates/RabbitQueueEnum.java
@@ -22,7 +22,11 @@
 
     ORDER_RETURN_MONEY("hlm_exchange_order_return_money",
             "hlm_route_key_order_return_money",
-            "hlm_queue_order_return_money");
+            "hlm_queue_order_return_money"),
+
+    PERK_MONEY("hlm_exchange_perk_money",
+            "hlm_route_key_perk_money",
+            "hlm_queue_perk_money");
 
     private String exchange;
 
diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml
index b0ccf0a..ebd771f 100644
--- a/src/main/resources/application-dev.yml
+++ b/src/main/resources/application-dev.yml
@@ -18,7 +18,7 @@
           username: db_mall_hongloumeng
           password: hongloumeng123!@#123
           driver-class-name: com.mysql.cj.jdbc.Driver
-          url: jdbc:mysql://47.111.90.145:3306/db_mall_hongloumeng?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2b8
+          url: jdbc:mysql://47.111.90.145:3306/db_mall_hongloumeng?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2b8&rewriteBatchedStatements=true&allowMultiQueries=true
 #          username: db_mall
 #          password: mall!@#123
 #          driver-class-name: com.mysql.cj.jdbc.Driver
diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml
index a88933d..46b0559 100644
--- a/src/main/resources/application-prod.yml
+++ b/src/main/resources/application-prod.yml
@@ -18,7 +18,7 @@
           username: db_mall_hongloumeng
           password: hongloumeng123!@#123
           driver-class-name: com.mysql.cj.jdbc.Driver
-          url: jdbc:mysql://127.0.0.1:3306/db_mall_hongloumeng?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2b8
+          url: jdbc:mysql://127.0.0.1:3306/db_mall_hongloumeng?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2b8&rewriteBatchedStatements=true&allowMultiQueries=true
 
   redis:
     # Redis数据库索引(默认为 0)
diff --git a/src/main/resources/mapper/modules/MallMemberMapper.xml b/src/main/resources/mapper/modules/MallMemberMapper.xml
index 060eb78..7727293 100644
--- a/src/main/resources/mapper/modules/MallMemberMapper.xml
+++ b/src/main/resources/mapper/modules/MallMemberMapper.xml
@@ -400,4 +400,9 @@
         select * from mall_member
         where level=#{level}
     </select>
+
+    <select id="selectMemberIdWithLevel" resultType="java.lang.Long">
+        select id from mall_member
+        where level = #{level}
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/modules/MallMemberWalletMapper.xml b/src/main/resources/mapper/modules/MallMemberWalletMapper.xml
index 35bbcb1..966088f 100644
--- a/src/main/resources/mapper/modules/MallMemberWalletMapper.xml
+++ b/src/main/resources/mapper/modules/MallMemberWalletMapper.xml
@@ -60,4 +60,24 @@
     <select id="selectSumCommission" resultType="java.math.BigDecimal">
         select ifnull(sum(commission),0) total from mall_member_wallet
     </select>
+
+    <select id="selectSumStarByIds" resultType="cc.mrbird.febs.mall.entity.MallMemberWallet">
+        select * from mall_member_wallet
+        where  member_id IN
+        <foreach collection = "list" item = "item"  separator=","  open = "(" close = ")" >
+            #{item}
+        </foreach >
+    </select>
+
+    <update id="updateStarByList" parameterType="java.util.List" >
+--         //注意sql语句应被;分隔开,否则批量更新多少条数据就有多少条sql拼在一起。
+        <foreach collection="list" item="item" index="index" open="" close="" separator=";">
+            update mall_member_wallet
+            <set>
+                balance = balance + #{item.starPerkAmount},
+            </set>
+            WHERE id =  #{item.id}
+        </foreach>
+    </update>
+
 </mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/modules/MallMoneyFlowMapper.xml b/src/main/resources/mapper/modules/MallMoneyFlowMapper.xml
index 8b00702..4fa7a82 100644
--- a/src/main/resources/mapper/modules/MallMoneyFlowMapper.xml
+++ b/src/main/resources/mapper/modules/MallMoneyFlowMapper.xml
@@ -132,4 +132,34 @@
           and date_format(created_time, '%Y-%m-%d') = date_format(#{date}, '%Y-%m-%d')
           and type in (2,3,4)
     </select>
+
+    <insert id="insertMoneyFlow" parameterType="cc.mrbird.febs.mall.entity.MallMoneyFlow">
+        insert into mall_money_flow(
+            REVISION,
+            CREATED_BY,
+            CREATED_TIME,
+            UPDATED_BY,
+            UPDATED_TIME,
+            member_id,
+            amount,
+            type,
+            order_no,
+            rt_member_id,
+            status,
+            flow_type) VALUES
+                (
+                    #{revision},
+                    #{createdBy},
+                    #{createdTime},
+                    #{updatedBy},
+                    #{updatedTime},
+                    #{memberId},
+                    #{amount},
+                    #{type},
+                    #{orderNo},
+                    #{rtMemberId},
+                    #{status},
+                    #{flowType}
+                )
+    </insert>
 </mapper>
\ No newline at end of file
diff --git a/src/test/java/cc/mrbird/febs/ProfitTest.java b/src/test/java/cc/mrbird/febs/ProfitTest.java
index 2530112..8e52d58 100644
--- a/src/test/java/cc/mrbird/febs/ProfitTest.java
+++ b/src/test/java/cc/mrbird/febs/ProfitTest.java
@@ -42,7 +42,7 @@
 
     @Test
     public void dynamicProfit() {
-        memberProfitService.dynamicProfit(21L);
+        agentService.perkMoneyConsumer(Long.parseLong("571"));
     }
     @Test
     public void agentProfit() {

--
Gitblit v1.9.1