| | |
| | | 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; |
| | | |
| | |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | | * @author wzy |
| | |
| | | |
| | | 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) |
| | |
| | | /** |
| | | * 团队业绩是否达标 |
| | | * |
| | | * @param mallMember |
| | | * @param agentInfo |
| | | * @return |
| | | */ |
| | |
| | | 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; |
| | | } |
| | | } |