| 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<MallVipConfigMapper, MallVipConfig> implements IMallVipConfigService { | 
|   | 
|     private final IMallVipConfigBenefitsService mallVipConfigBenefitsService; | 
|     private final MallMemberMapper mallMemberMapper; | 
|     private final DataDictionaryCustomMapper dataDictionaryCustomMapper; | 
|   | 
|     @Override | 
|     public IPage<MallVipConfig> vipConfigList(QueryRequest request) { | 
|         Page<MallVipConfig> page = new Page<>(request.getPageNum(), request.getPageSize()); | 
|         return this.baseMapper.findVipConfigListInPage(page); | 
|     } | 
|   | 
|     @Override | 
|     public List<MallVipConfig> findConfigList() { | 
|         List<MallVipConfig> configs = this.baseMapper.selectVipConfigList(); | 
|         configs.forEach(item -> { | 
|             List<MallVipBenefits> 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<MallVipConfig> 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<MallVipConfigBenefits> configBenefitsList = new ArrayList<>(); | 
|         List<String> 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<MallVipConfig> 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<MallMember> memberQuery = new LambdaQueryWrapper<>(); | 
|             memberQuery.eq(MallMember::getLevel, oldConfig.getCode()); | 
|             List<MallMember> mallMembers = mallMemberMapper.selectList(memberQuery); | 
|             if (CollUtil.isNotEmpty(mallMembers)) { | 
|                 throw new FebsException("会员编码绑定了客户,请调整后修改"); | 
|             } | 
|         } | 
|   | 
|   | 
|         this.baseMapper.updateById(config); | 
|   | 
|         LambdaQueryWrapper<MallVipConfigBenefits> delQuery = new LambdaQueryWrapper<>(); | 
|         delQuery.eq(MallVipConfigBenefits::getConfigId, config.getId()); | 
|         mallVipConfigBenefitsService.remove(delQuery); | 
|   | 
|         List<MallVipConfigBenefits> configBenefitsList = new ArrayList<>(); | 
|         List<String> 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<MallVipConfigBenefits> 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; | 
|         if (member.getBirthday() != null) { | 
|              isBirthday = member.getBirthday().compareTo(DateUtil.parseDate(today)) == 0; | 
|         } else { | 
|             isBirthday = false; | 
|         } | 
|         List<MallVipBenefits> benefits = vipConfig.getBenefits(); | 
|         Optional<MallVipBenefits> 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); | 
|     } | 
| } |