package cc.mrbird.febs.vip.service.impl; import cc.mrbird.febs.common.enumerates.FlowTypeEnum; import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum; import cc.mrbird.febs.common.enumerates.ScoreFlowTypeEnum; import cc.mrbird.febs.mall.entity.*; import cc.mrbird.febs.mall.mapper.MallMemberLevelMapper; import cc.mrbird.febs.mall.mapper.MallMemberMapper; import cc.mrbird.febs.mall.mapper.MallOrderInfoMapper; import cc.mrbird.febs.mall.service.IApiMallGoodsService; import cc.mrbird.febs.mall.service.IApiMallMemberWalletService; import cc.mrbird.febs.mall.service.IApiMallOrderInfoService; import cc.mrbird.febs.mall.service.IMallMoneyFlowService; import cc.mrbird.febs.rabbit.producter.AgentProducer; import cc.mrbird.febs.vip.entity.MallVipBenefits; import cc.mrbird.febs.vip.entity.MallVipConfig; import cc.mrbird.febs.vip.mapper.MallVipConfigMapper; import cc.mrbird.febs.vip.service.IMallVipConfigService; import cc.mrbird.febs.vip.service.IVipCommonService; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.logging.Handler; import java.util.stream.Collectors; @Slf4j @Service @RequiredArgsConstructor public class VipCommonServiceImpl implements IVipCommonService { private final MallOrderInfoMapper mallOrderInfoMapper; private final IMallVipConfigService mallVipConfigService; private final IMallMoneyFlowService mallMoneyFlowService; private final IApiMallMemberWalletService mallMemberWalletService; private final MallMemberMapper mallMemberMapper; private final MallVipConfigMapper mallVipConfigMapper; private final AgentProducer agentProducer; private final IApiMallGoodsService mallGoodsService; private final MallMemberLevelMapper mallMemberLevelMapper; @Override @Transactional(rollbackFor = Exception.class) public void getScore(Long orderId) { MallOrderInfo mallOrderInfo = mallOrderInfoMapper.selectOrderDetailsById(orderId); if (mallOrderInfo == null) { return; } BigDecimal amount = mallOrderInfo.getAmount(); Long memberId = mallOrderInfo.getMemberId(); MallMember member = mallMemberMapper.selectById(memberId); /** * 一级返佣 */ String referrerId = member.getReferrerId(); if(StrUtil.isEmpty(referrerId)){ return; } MallMember mallMemberRef = mallMemberMapper.selectInfoByInviteId(referrerId); QueryWrapper mallMemberLevelQueryWrapper = new QueryWrapper<>(); mallMemberLevelQueryWrapper.eq("member_id",mallMemberRef.getId()); MallMemberLevel mallMemberLevelRef = mallMemberLevelMapper.selectOne(mallMemberLevelQueryWrapper); if(ObjectUtil.isNotEmpty(mallMemberLevelRef)){ BigDecimal levelPercent = mallMemberLevelRef.getLevelPercent(); BigDecimal refAmount = amount.multiply(levelPercent.multiply(new BigDecimal(0.01))).setScale(2, BigDecimal.ROUND_DOWN); mallMemberWalletService.addBalance(refAmount,mallMemberRef.getId()); mallMoneyFlowService.addMoneyFlow( mallMemberRef.getId(), refAmount, ScoreFlowTypeEnum.LEVEL_PERK.getValue(), mallOrderInfo.getOrderNo(), FlowTypeEnum.BALANCE.getValue(), StrUtil.format(ScoreFlowTypeEnum.LEVEL_PERK.getDesc(),mallOrderInfo.getOrderNo()), 2); } /** * 两级返佣 */ String referrerIdRef = mallMemberRef.getReferrerId(); if(StrUtil.isEmpty(referrerIdRef)){ return; } MallMember mallMemberRefTwo = mallMemberMapper.selectInfoByInviteId(referrerIdRef); QueryWrapper mallMemberLevelQueryWrapperTwo = new QueryWrapper<>(); mallMemberLevelQueryWrapperTwo.eq("member_id",mallMemberRefTwo.getId()); MallMemberLevel mallMemberLevelRefTwo = mallMemberLevelMapper.selectOne(mallMemberLevelQueryWrapperTwo); if(ObjectUtil.isNotEmpty(mallMemberLevelRefTwo)){ BigDecimal levelPercentTwo = mallMemberLevelRefTwo.getLevelPercent(); BigDecimal refAmountTwo = amount.multiply(levelPercentTwo.multiply(new BigDecimal(0.01))).setScale(2, BigDecimal.ROUND_DOWN); mallMemberWalletService.addBalance(refAmountTwo,mallMemberRefTwo.getId()); mallMoneyFlowService.addMoneyFlow( mallMemberRefTwo.getId(), refAmountTwo, ScoreFlowTypeEnum.LEVEL_PERK.getValue(), mallOrderInfo.getOrderNo(), FlowTypeEnum.BALANCE.getValue(), StrUtil.format(ScoreFlowTypeEnum.LEVEL_PERK.getDesc(),mallOrderInfo.getOrderNo()), 2); } } @Override public void levelUp(Long orderId) { MallOrderInfo mallOrderInfo = mallOrderInfoMapper.selectOrderDetailsById(orderId); if (mallOrderInfo == null) { return; } MallMember member = mallMemberMapper.selectById(mallOrderInfo.getMemberId()); if (member == null) { log.info("会员不存在"); return; } MallVipConfig config = mallVipConfigMapper.selectVipConfigByCode(member.getLevel()); if (config == null) { log.info("会员等级配置不存在"); return; } // LambdaQueryWrapper configQuery = new LambdaQueryWrapper<>(); // configQuery.gt(MallVipConfig::getLevel, config.getLevel()) // .orderByAsc(MallVipConfig::getLevel) // .last("limit 1"); // MallVipConfig nextLevel = mallVipConfigMapper.selectOne(configQuery); List configs = mallVipConfigMapper.selectVipConfigList(); String nextLevelCode = ""; for (MallVipConfig nextLevel : configs) { if (config.getLevel() >= nextLevel.getLevel()) { continue; } // 指定商品 if (nextLevel.getType() == 1) { boolean hasMatch = mallOrderInfo.getItems().stream().anyMatch(item -> { return item.getGoodsId().equals(nextLevel.getTargetId()); }); if (hasMatch) { nextLevelCode = nextLevel.getCode(); continue; } } // 时间区间内金额 if (nextLevel.getType() == 2) { Date endTime = DateUtil.endOfDay(new Date()); Date startTime = getStartTime(nextLevel.getValidType()); LambdaQueryWrapper query = new LambdaQueryWrapper<>(); query.ge(MallOrderInfo::getReceivingTime, startTime) .le(MallOrderInfo::getReceivingTime, endTime) .eq(MallOrderInfo::getStatus, 4) .eq(MallOrderInfo::getMemberId, member.getId()); List orderList = mallOrderInfoMapper.selectList(query); if (CollUtil.isEmpty(orderList)) { continue; } double totalAmount = orderList.stream().mapToDouble(item -> { return item.getAmount().doubleValue(); }).sum(); if (nextLevel.getAmount().compareTo(BigDecimal.valueOf(totalAmount)) <= 0) { nextLevelCode = nextLevel.getCode(); } } } if (StrUtil.isNotBlank(nextLevelCode)) { MallMember update = new MallMember(); update.setId(member.getId()); update.setLevel(nextLevelCode); update.setVipLevelTime(new Date()); mallMemberMapper.updateById(update); } } private Date getStartTime(String type) { Date date = new Date(); switch (type) { case "day" : return DateUtil.beginOfDay(date); case "month": return DateUtil.beginOfMonth(date); case "year": return DateUtil.beginOfYear(date); default: return date; } } }