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