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<MallMemberLevel> 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<MallMemberLevel> 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<MallVipConfig> configQuery = new LambdaQueryWrapper<>();
|
// configQuery.gt(MallVipConfig::getLevel, config.getLevel())
|
// .orderByAsc(MallVipConfig::getLevel)
|
// .last("limit 1");
|
// MallVipConfig nextLevel = mallVipConfigMapper.selectOne(configQuery);
|
|
List<MallVipConfig> 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<MallOrderInfo> query = new LambdaQueryWrapper<>();
|
query.ge(MallOrderInfo::getReceivingTime, startTime)
|
.le(MallOrderInfo::getReceivingTime, endTime)
|
.eq(MallOrderInfo::getStatus, 4)
|
.eq(MallOrderInfo::getMemberId, member.getId());
|
List<MallOrderInfo> 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;
|
}
|
}
|
}
|