package cc.mrbird.febs.vip.service.impl; import cc.mrbird.febs.common.entity.QueryRequest; import cc.mrbird.febs.common.enumerates.DataDictionaryEnum; import cc.mrbird.febs.common.exception.FebsException; import cc.mrbird.febs.mall.entity.DataDictionaryCustom; import cc.mrbird.febs.mall.entity.MallMember; import cc.mrbird.febs.mall.mapper.DataDictionaryCustomMapper; import cc.mrbird.febs.mall.mapper.MallMemberMapper; import cc.mrbird.febs.vip.entity.MallVipBenefits; import cc.mrbird.febs.vip.entity.MallVipConfig; import cc.mrbird.febs.vip.entity.MallVipConfigBenefits; import cc.mrbird.febs.vip.mapper.MallVipConfigBenefitsMapper; import cc.mrbird.febs.vip.mapper.MallVipConfigMapper; import cc.mrbird.febs.vip.service.IMallVipConfigBenefitsService; import cc.mrbird.febs.vip.service.IMallVipConfigService; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.*; import java.util.stream.Collectors; @Slf4j @Service @RequiredArgsConstructor public class MallVipConfigServiceImpl extends ServiceImpl implements IMallVipConfigService { private final IMallVipConfigBenefitsService mallVipConfigBenefitsService; private final MallMemberMapper mallMemberMapper; private final DataDictionaryCustomMapper dataDictionaryCustomMapper; @Override public IPage vipConfigList(QueryRequest request) { Page page = new Page<>(request.getPageNum(), request.getPageSize()); return this.baseMapper.findVipConfigListInPage(page); } @Override public List findConfigList() { List configs = this.baseMapper.selectVipConfigList(); configs.forEach(item -> { List data = item.getBenefits().stream().filter(benefit -> { return benefit.getIsShow() == 1; }).peek(benefits -> { benefits.setIsJump(CollUtil.isEmpty(benefits.getDetails()) ? 2 : 1); }).collect(Collectors.toList()); item.setBenefits(data); }); return configs; } @Override @Transactional(rollbackFor = Exception.class) public void addVipConfig(MallVipConfig config) { List configs = this.baseMapper.selectVipConfigList(); boolean b = configs.stream().anyMatch(item -> { return (item.getLevel().equals(config.getLevel()) || config.getCode().equals(item.getCode())); }); if (b) { throw new FebsException("会员等级或编码已存在"); } this.baseMapper.insert(config); List configBenefitsList = new ArrayList<>(); List benefitsIds = StrUtil.split(config.getBenefitsIds(), ','); benefitsIds.forEach(item -> { MallVipConfigBenefits configBenefits = new MallVipConfigBenefits(); configBenefits.setConfigId(config.getId()); configBenefits.setBenefitsId(Long.parseLong(item)); configBenefitsList.add(configBenefits); }); mallVipConfigBenefitsService.saveBatch(configBenefitsList); } @Override public void editVipConfig(MallVipConfig config) { MallVipConfig oldConfig = this.baseMapper.selectById(config.getId()); List configs = this.baseMapper.selectVipConfigList(); boolean b = configs.stream().anyMatch(item -> { return !item.getId().equals(config.getId()) && (item.getLevel().equals(config.getLevel()) || config.getCode().equals(item.getCode())); }); if (b) { throw new FebsException("会员等级或编码已存在"); } if (!config.getCode().equals(oldConfig.getCode())) { LambdaQueryWrapper memberQuery = new LambdaQueryWrapper<>(); memberQuery.eq(MallMember::getLevel, oldConfig.getCode()); List mallMembers = mallMemberMapper.selectList(memberQuery); if (CollUtil.isNotEmpty(mallMembers)) { throw new FebsException("会员编码绑定了客户,请调整后修改"); } } this.baseMapper.updateById(config); LambdaQueryWrapper delQuery = new LambdaQueryWrapper<>(); delQuery.eq(MallVipConfigBenefits::getConfigId, config.getId()); mallVipConfigBenefitsService.remove(delQuery); List configBenefitsList = new ArrayList<>(); List benefitsIds = StrUtil.split(config.getBenefitsIds(), ','); benefitsIds.forEach(item -> { MallVipConfigBenefits configBenefits = new MallVipConfigBenefits(); configBenefits.setConfigId(config.getId()); configBenefits.setBenefitsId(Long.parseLong(item)); configBenefitsList.add(configBenefits); }); mallVipConfigBenefitsService.saveBatch(configBenefitsList); } @Override @Transactional public void delVipConfig(Long id) { this.baseMapper.deleteById(id); LambdaQueryWrapper delQuery = new LambdaQueryWrapper<>(); delQuery.eq(MallVipConfigBenefits::getConfigId, id); this.mallVipConfigBenefitsService.remove(delQuery); } @Override public MallVipBenefits hasVipBenefits(Long memberId) { MallMember member = mallMemberMapper.selectById(memberId); if (member == null) { throw new FebsException("会员不存在"); } MallVipConfig vipConfig = this.baseMapper.selectVipConfigByCode(member.getLevel()); if (vipConfig == null) { throw new FebsException("会员配置不存在"); } String today = DateUtil.format(new Date(), DatePattern.NORM_DATE_PATTERN); boolean isBirthday = member.getBirthday().compareTo(DateUtil.parseDate(today)) == 0; List benefits = vipConfig.getBenefits(); Optional max = benefits.stream().filter(item -> { if (item.getScoreMultiple() == null) { return false; } if (item.getGainType() == 3 && item.getScoreMultiple() != null) { return true; } // 生日权益 if (item.getGainType() == 2 && isBirthday) { return true; } DataDictionaryCustom data = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.VIP_DATE.getType(), DataDictionaryEnum.VIP_DATE.getCode()); String todayTime = DateUtil.format(new Date(), "MM-dd"); // 会员日 return item.getGainType() == 1 && StrUtil.equals(data.getValue(), todayTime); }).max(Comparator.comparing(MallVipBenefits::getScoreMultiple)); return max.orElse(null); } }