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.MallMember;
|
import cc.mrbird.febs.mall.entity.MallOrderInfo;
|
import cc.mrbird.febs.mall.entity.MallOrderItem;
|
import cc.mrbird.febs.mall.mapper.MallMemberMapper;
|
import cc.mrbird.febs.mall.mapper.MallOrderInfoMapper;
|
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.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.StrUtil;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
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.util.Date;
|
import java.util.List;
|
|
@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;
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public void getScore(Long orderId) {
|
MallOrderInfo mallOrderInfo = mallOrderInfoMapper.selectOrderDetailsById(orderId);
|
if (mallOrderInfo == null) {
|
return;
|
}
|
|
Long memberId = mallOrderInfo.getMemberId();
|
MallVipBenefits mallVipBenefits = mallVipConfigService.hasVipBenefits(memberId);
|
|
BigDecimal multiple = BigDecimal.ONE;
|
String name = "";
|
if (mallVipBenefits != null) {
|
multiple = mallVipBenefits.getScoreMultiple();
|
name = mallVipBenefits.getName();
|
}
|
|
double sum = mallOrderInfo.getItems().stream().map(MallOrderItem::getAmount).mapToDouble(BigDecimal::doubleValue).sum();
|
|
int score = multiple.multiply(BigDecimal.valueOf(sum)).intValue();
|
|
mallMoneyFlowService.addMoneyFlow(memberId, new BigDecimal(score), ScoreFlowTypeEnum.BUY.getValue(), mallOrderInfo.getOrderNo(), FlowTypeEnum.PRIZE_SCORE.getValue(), name, 2);
|
mallMemberWalletService.add(new BigDecimal(score), memberId, "prizeScore");
|
}
|
|
@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);
|
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;
|
}
|
}
|
}
|