菜谱管理

This commit is contained in:
sxu 2025-06-01 23:29:20 +08:00
parent 45bdb1d8c4
commit b1cd6849e9
4 changed files with 90 additions and 33 deletions

View File

@ -4,6 +4,7 @@ import java.util.List;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import cn.hutool.core.util.ObjectUtil;
import com.bonus.canteen.core.cook.dto.CookRecipeBindDTO;
import com.bonus.canteen.core.cook.dto.CookRecipeDTO;
import com.bonus.canteen.core.cook.dto.CookRecipeDetailDTO;
@ -14,12 +15,8 @@ import com.bonus.common.log.enums.OperaType;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import com.bonus.common.log.annotation.SysLog;
import com.bonus.canteen.core.cook.domain.CookRecipe;
import com.bonus.canteen.core.cook.service.ICookRecipeService;
@ -27,6 +24,7 @@ import com.bonus.common.core.web.controller.BaseController;
import com.bonus.common.core.web.domain.AjaxResult;
import com.bonus.common.core.utils.poi.ExcelUtil;
import com.bonus.common.core.web.page.TableDataInfo;
import org.springframework.web.multipart.MultipartFile;
/**
* 菜品计划信息Controller
@ -148,6 +146,23 @@ public class CookRecipeController extends BaseController {
return AjaxResult.success();
}
@PostMapping({"/recipe/import/dishes"})
@ApiOperation("批量导入菜谱中的菜品信息")
@Transactional
public AjaxResult recipeImportDishes(@RequestParam("file") MultipartFile excel, @RequestParam("recipeId") Long recipeId) {
try{
return ObjectUtil.isNull(excel) ? AjaxResult.error("请选择导入文件 ^_^") :
AjaxResult.success(this.cookRecipeService.recipeImportDishes(excel, recipeId));
}catch (Exception e){
String message = e.toString();
//取倒数第二个之后的信息
String finalMessage = message.substring(message.lastIndexOf(":") - 7);
String errorMes = finalMessage.replace("Error:", "");
System.err.println("errorMes="+errorMes);
return error("导入失败:"+errorMes);
}
}
/**
* 删除菜品计划信息
*/

View File

@ -1,12 +1,15 @@
package com.bonus.canteen.core.cook.service;
import java.util.List;
import java.util.Set;
import com.bonus.canteen.core.cook.domain.CookRecipe;
import com.bonus.canteen.core.cook.dto.CookRecipeBindDTO;
import com.bonus.canteen.core.cook.dto.CookRecipeDTO;
import com.bonus.canteen.core.cook.dto.CookRecipeDetailDTO;
import com.bonus.canteen.core.cook.vo.CookRecipeDetailVO;
import com.bonus.canteen.core.cook.vo.CookRecipeVO;
import org.springframework.web.multipart.MultipartFile;
/**
* 菜品计划信息Service接口
@ -57,6 +60,8 @@ public interface ICookRecipeService {
public void bindCookRecipe(CookRecipeBindDTO cookRecipeDTO);
public Set<String> recipeImportDishes(MultipartFile excel, Long recipeId);
/**
* 批量删除菜品计划信息
*

View File

@ -9,6 +9,10 @@ import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.read.metadata.ReadSheet;
import com.bonus.canteen.core.android.vo.CookMealtimeTypeEnum;
import com.bonus.canteen.core.common.utils.DateUtil;
import com.bonus.canteen.core.common.utils.MqUtil;
import com.bonus.canteen.core.cook.domain.CookAppRecipe;
@ -21,6 +25,7 @@ import com.bonus.canteen.core.cook.enums.RecipeDetailTypeEnum;
import com.bonus.canteen.core.cook.enums.RecipeTypeEnum;
import com.bonus.canteen.core.cook.mapper.CookRecipeDetailMapper;
import com.bonus.canteen.core.cook.mapper.CookRecipeDishesMapper;
import com.bonus.canteen.core.cook.utils.CookRecipeImportListener;
import com.bonus.canteen.core.cook.vo.*;
import com.bonus.common.core.exception.ServiceException;
import com.bonus.common.core.utils.DateUtils;
@ -37,6 +42,7 @@ import com.bonus.canteen.core.cook.domain.CookRecipe;
import com.bonus.canteen.core.cook.service.ICookRecipeService;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.web.multipart.MultipartFile;
/**
* 菜品计划信息Service业务层处理
@ -423,6 +429,42 @@ public class CookRecipeServiceImpl implements ICookRecipeService {
}
}
@Override
public Set<String> recipeImportDishes(MultipartFile excel, Long recipeId) {
ExcelReader excelReader = null;
try {
Set<String> notImportDishesNames = new HashSet();
List<CookRecipeImportListener> listeners = new ArrayList();
excelReader = EasyExcel.read(excel.getInputStream()).build();
List<ReadSheet> readSheets = excelReader.excelExecutor().sheetList();
for (ReadSheet readSheet : readSheets) {
String sheetName = readSheet.getSheetName();
Integer mealtimeType = CookMealtimeTypeEnum.getKeyByDesc(sheetName);
if (!Objects.isNull(mealtimeType)) {
CookRecipeImportListener cookRecipeImportListener = new CookRecipeImportListener(sheetName, recipeId, mealtimeType.longValue());
listeners.add(cookRecipeImportListener);
readSheet.getCustomReadListenerList().add(cookRecipeImportListener);
}
}
excelReader.read(readSheets);
notImportDishesNames.addAll(
listeners.stream()
.flatMap(listener -> listener.getNotImportDishesNames().stream())
.collect(Collectors.toList())
);
return notImportDishesNames;
}catch (Exception e) {
throw new ServiceException(e.toString());
} finally {
if (excelReader != null) {
excelReader.finish();
}
}
}
/**
* 批量删除菜品计划信息
*

View File

@ -13,14 +13,9 @@ import com.bonus.canteen.core.cook.dto.ImportRecipeDishesDTO;
import com.bonus.canteen.core.cook.mapper.CookDishesMapper;
import com.bonus.canteen.core.cook.mapper.CookRecipeDetailMapper;
import com.bonus.canteen.core.cook.mapper.CookRecipeDishesMapper;
import com.bonus.canteen.core.cook.service.ICookDishesService;
import com.bonus.canteen.core.cook.service.ICookRecipeDetailService;
import com.bonus.canteen.core.cook.service.ICookRecipeDishesService;
import com.bonus.common.core.exception.ServiceException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.*;
@ -109,7 +104,7 @@ public class CookRecipeImportListener extends AnalysisEventListener<Map<Integer,
try {
HashSet<LocalDate> dates = new HashSet(this.dateMap.values());
if (!dates.isEmpty()) {
ICookRecipeDetailService menuRecipeDetailService = SpringContextHolder.getBean(ICookRecipeDetailService.class);
//ICookRecipeDetailService menuRecipeDetailService = SpringContextHolder.getBean(ICookRecipeDetailService.class);
CookRecipeDetailMapper cookRecipeDetailMapper = SpringContextHolder.getBean(CookRecipeDetailMapper.class);
CookRecipeDishesMapper cookRecipeDishesMapper = SpringContextHolder.getBean(CookRecipeDishesMapper.class);
//List<CookRecipeDetail> byRecipeIdAndDates = menuRecipeDetailService.getByRecipeIdAndDatesAndIntervalId(this.recipeId, dates, this.mealtimeType);
@ -123,50 +118,50 @@ public class CookRecipeImportListener extends AnalysisEventListener<Map<Integer,
CookDishesMapper cookDishesMapper = SpringContextHolder.getBean(CookDishesMapper.class);
CookDishes cookDishes = new CookDishes();
cookDishes.setDishesNames(this.dishesNames);
List<CookDishes> menuDishesList = cookDishesMapper.selectCookDishesList(cookDishes);
List<CookDishes> cookDishesList = cookDishesMapper.selectCookDishesList(cookDishes);
Set<String> difference = DifferenceCalculator.calculateDifference(this.dishesNames, menuDishesList);
Set<String> difference = DifferenceCalculator.calculateDifference(this.dishesNames, cookDishesList);
System.out.println("差集结果: " + difference);
if (difference != null && difference.size() > 0) {
throw new ServiceException("以下菜品不存在:" + difference);
}
Map<String, CookDishes> nameMap = menuDishesList.stream().collect(Collectors.groupingBy(CookDishes::getDishesName, Collectors.collectingAndThen(Collectors.toList(), (list) -> {
Map<String, CookDishes> nameMap = cookDishesList.stream().collect(Collectors.groupingBy(CookDishes::getDishesName, Collectors.collectingAndThen(Collectors.toList(), (list) -> {
return list.get(0);
})));
ICookRecipeDishesService menuRecipeDishesService = SpringContextHolder.getBean(ICookRecipeDishesService.class);
//ICookRecipeDishesService menuRecipeDishesService = SpringContextHolder.getBean(ICookRecipeDishesService.class);
List<CookRecipeDishes> inserData = new ArrayList<>();
for (LocalDate date : dates) {
CookRecipeDetail menuRecipeDetail = dateDetailMap.get(date);
if (menuRecipeDetail == null) {
menuRecipeDetail = new CookRecipeDetail();
menuRecipeDetail.setRecipeId(this.recipeId);
menuRecipeDetail.setApplyDate(date);
menuRecipeDetail.setMealtimeType(this.mealtimeType);
CookRecipeDetail cookRecipeDetail = dateDetailMap.get(date);
if (cookRecipeDetail == null) {
cookRecipeDetail = new CookRecipeDetail();
cookRecipeDetail.setRecipeId(this.recipeId);
cookRecipeDetail.setApplyDate(date);
cookRecipeDetail.setMealtimeType(this.mealtimeType);
//menuRecipeDetail.setDetailId(Id.next());
//menuRecipeDetailService.save(menuRecipeDetail);
cookRecipeDetailMapper.insertCookRecipeDetail(menuRecipeDetail);
cookRecipeDetailMapper.insertCookRecipeDetail(cookRecipeDetail);
} else {
//menuRecipeDishesService.deleteByDetailId(menuRecipeDetail.getDetailId());
Long[] recipeDetailIds = {menuRecipeDetail.getRecipeDetailId()};
Long[] recipeDetailIds = {cookRecipeDetail.getRecipeDetailId()};
cookRecipeDishesMapper.deleteCookRecipeDishesByCookRecipeDetailIds(recipeDetailIds);
}
List<ImportRecipeDishesDTO> importRecipeDishesDtos = this.datas.get(date);
CookRecipeDetail finalMenuRecipeDetail = menuRecipeDetail;
CookRecipeDetail finalCookRecipeDetail = cookRecipeDetail;
List<CookRecipeDishes> saveDatas = importRecipeDishesDtos.stream().filter(distinctByKey(ImportRecipeDishesDTO::getDishesName)).map((importRecipeDishesDto) -> {
CookRecipeDishes menuRecipeDishes = null;
CookDishes menuDishes = nameMap.get(importRecipeDishesDto.getDishesName());
if (menuDishes != null) {
menuRecipeDishes = BeanUtil.copyProperties(importRecipeDishesDto, CookRecipeDishes.class, new String[0]);
menuRecipeDishes.setRecipeDetailId(finalMenuRecipeDetail.getRecipeDetailId());
menuRecipeDishes.setSizeType(menuDishes.getSizeType());
menuRecipeDishes.setDishesId(menuDishes.getDishesId());
CookRecipeDishes cookRecipeDishes = null;
CookDishes cookDishesValue = nameMap.get(importRecipeDishesDto.getDishesName());
if (cookDishesValue != null) {
cookRecipeDishes = BeanUtil.copyProperties(importRecipeDishesDto, CookRecipeDishes.class, new String[0]);
cookRecipeDishes.setRecipeDetailId(finalCookRecipeDetail.getRecipeDetailId());
cookRecipeDishes.setSizeType(cookDishesValue.getSizeType());
cookRecipeDishes.setDishesId(cookDishesValue.getDishesId());
} else {
this.notImportDishesNames.add(importRecipeDishesDto.getDishesName());
}
return menuRecipeDishes;
return cookRecipeDishes;
}).filter(Objects::nonNull).collect(Collectors.toList());
inserData.addAll(saveDatas);
}