package com.ruoyi.system.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.system.domain.TFoundationConfig;
import com.ruoyi.system.domain.TFoundationPerson;
import com.ruoyi.system.dto.TFoundationPersonBatchDTO;
import com.ruoyi.system.dto.TFoundationPersonDTO;
import com.ruoyi.system.mapper.TFoundationPersonMapper;
import com.ruoyi.system.query.TFoundationPersonQuery;
import com.ruoyi.system.service.TFoundationConfigService;
import com.ruoyi.system.service.TFoundationPersonService;
import com.ruoyi.system.vo.SysUserVO;
import com.ruoyi.system.vo.TFoundationPersonVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.stream.Collectors;
/**
*
* 基础设置 服务实现类
*
*
* @author xiaochen
* @since 2024-08-15
*/
@Service
public class TFoundationPersonServiceImpl extends ServiceImpl implements TFoundationPersonService {
@Autowired
private TFoundationConfigService foundationConfigService;
@Override
@Transactional(rollbackFor = Exception.class)
public void add(TFoundationPersonBatchDTO dto) {
List foundationPersonDTOS = dto.getFoundationPersonDTOS();
boolean b = hasDuplicateId(foundationPersonDTOS);
if(b){
throw new ServiceException("设置存在重复用餐人数");
}
for (TFoundationPersonDTO tFoundationPersonDTO : foundationPersonDTOS) {
List foundationConfigs = tFoundationPersonDTO.getFoundationConfigs();
long count = foundationConfigs.stream().map(TFoundationConfig::getTypeId).distinct().count();
if(foundationConfigs.size()!=count){
throw new ServiceException("菜品重复设置");
}
this.save(tFoundationPersonDTO);
// 添加菜品
foundationConfigs.forEach(item -> {
item.setPersonId(tFoundationPersonDTO.getId());
});
foundationConfigService.saveBatch(foundationConfigs);
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void edit(TFoundationPersonBatchDTO dto) {
List foundationPersonDTOS = dto.getFoundationPersonDTOS();
boolean b = hasDuplicateId(foundationPersonDTOS);
if(b){
throw new ServiceException("设置存在重复用餐人数");
}
this.remove(Wrappers.lambdaQuery(TFoundationPerson.class)
.eq(TFoundationPerson::getMealType,dto.getMealType()));
for (TFoundationPersonDTO tFoundationPersonDTO : foundationPersonDTOS) {
List foundationConfigs = tFoundationPersonDTO.getFoundationConfigs();
long count = foundationConfigs.stream().map(TFoundationConfig::getTypeId).distinct().count();
if(foundationConfigs.size()!=count){
throw new ServiceException("菜品重复设置");
}
// 添加人数
this.saveOrUpdate(tFoundationPersonDTO);
// 删除菜品
foundationConfigService.remove(Wrappers.lambdaQuery(TFoundationConfig.class)
.eq(TFoundationConfig::getPersonId,tFoundationPersonDTO.getId()));
// 添加菜品
foundationConfigs.forEach(item -> {
item.setPersonId(tFoundationPersonDTO.getId());
});
foundationConfigService.saveBatch(foundationConfigs);
}
}
@Override
public PageInfo getList(TFoundationPersonQuery query) {
PageInfo pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
List list = this.baseMapper.getList(query,pageInfo);
List ids = list.stream().map(TFoundationPersonVO::getId).collect(Collectors.toList());
if(!CollectionUtils.isEmpty(ids)){
List list1 = foundationConfigService.list(Wrappers.lambdaQuery(TFoundationConfig.class)
.in(TFoundationConfig::getPersonId, ids));
list.forEach(item -> {
List collect = list1.stream().filter(item1 -> item1.getPersonId().equals(item.getId())).collect(Collectors.toList());
if(!CollectionUtils.isEmpty(collect)){
item.setMinDish(collect.stream().sorted(Comparator.comparingInt(TFoundationConfig::getMinCount)).findFirst().get().getMinCount());
item.setMaxDish(collect.stream().sorted(Comparator.comparingInt(TFoundationConfig::getMaxCount).reversed()).findFirst().get().getMaxCount());
item.setFoundationConfigs(collect);
}
});
}
pageInfo.setRecords(list);
return pageInfo;
}
@Override
public boolean hasDuplicateId(List list) {
HashSet countSet = new HashSet<>();
for (TFoundationPersonDTO dto : list) {
if (!countSet.add(dto.getMealCount())) {
return true; // 发现重复的人数
}
}
return false; // 没有发现重复的人数
}
@Override
public List getSetList() {
List list = new ArrayList<>();
List setList = this.baseMapper.getSetList();
for (int i = 1; i <= 2; i++) {
TFoundationPersonVO foundationPersonVO = new TFoundationPersonVO();
foundationPersonVO.setMealType(i);
int finalI = i;
List collect = setList.stream().filter(e -> e.getMealType() == finalI).collect(Collectors.toList());
if(!CollectionUtils.isEmpty(collect)){
Integer minPerson = collect.stream().sorted(Comparator.comparingInt(TFoundationPerson::getMealCount)).findFirst().get().getMealCount();
foundationPersonVO.setMinPerson(minPerson);
Integer maxPerson = collect.stream().sorted(Comparator.comparingInt(TFoundationPerson::getMealCount).reversed()).findFirst().get().getMealCount();
foundationPersonVO.setMaxPerson(maxPerson);
}
List ids = collect.stream().map(TFoundationPersonVO::getId).collect(Collectors.toList());
if(!CollectionUtils.isEmpty(ids)){
List list1 = foundationConfigService.list(Wrappers.lambdaQuery(TFoundationConfig.class)
.in(TFoundationConfig::getPersonId, ids));
list.forEach(item -> {
List collect1 = list1.stream().filter(item1 -> item1.getPersonId().equals(item.getId())).collect(Collectors.toList());
if(!CollectionUtils.isEmpty(collect1)){
item.setMinDish(collect1.stream().sorted(Comparator.comparingInt(TFoundationConfig::getMinCount)).findFirst().get().getMinCount());
item.setMaxDish(collect1.stream().sorted(Comparator.comparingInt(TFoundationConfig::getMaxCount).reversed()).findFirst().get().getMaxCount());
item.setFoundationConfigs(collect1);
}
});
}
list.add(foundationPersonVO);
}
return list;
}
@Override
public List getPersonList() {
return this.baseMapper.getSetList();
}
}