删除菜品接口
需求分析
点击单个菜品的删除按钮或这边多选后点击批量删除可以将菜品进行删除。
接口涉及到的表
dish菜品表
dish_flavor口味表
setmeal_dish菜品与套餐的关系表
代码实现:
controller
@RequestParam:通过mvc框架动态解析前端传过来的字符串,比如这个ids时1,2,3,那么通过这个注解可以动态的将每个id提取出来。
@DeleteMapping
public Result DishDelete(@RequestParam List<Long> ids){
log.info("批量或单个删除菜品参数:{}",ids);
dishService.DishDelete(ids);
return Result.success();
}
实现类
/**
* 菜品批量或单个删除
* @param ids
*/
@Override
public void DishDelete(List<Long> ids) {
//判断当前菜品是否能够删除--是否存在起售中的菜品
for (Long id : ids){
Dish dish = dishMapper.getDishbyId(id);
if (dish.getStatus() == StatusConstant.ENABLE){
throw new DeletionNotAllowedException(MessageConstant.DISH_ON_SALE);
}
}
//判断当前菜品是否能够被删除--是否被关联的套餐
//用菜品的id数组去查询菜品和套餐的关联表,如果返回一个套餐List类型的数组,如果这个数组中有值就代表有关联套餐的菜品,直接抛出异常
List<Long> setmealIds = setMealsDishMapper.getSetMealByDishId(ids);
if (setmealIds != null && setmealIds.size() > 0){
throw new DeletionNotAllowedException(MessageConstant.CATEGORY_BE_RELATED_BY_SETMEAL);
}
//删除菜品
for (Long id : ids){
dishMapper.deleteBySetmealIds(id);
//删除菜品关联的口味数据
dishFlavorMapper.deleteByDishId(id);
}
}
第一个查询:查询dish表,根据菜品id查询菜品内容对象,实现类中根据这个菜品对象查看菜品的状态。
第二个查询:查询套菜和菜品的关系表,如果返回结果有内容说明有菜品关联了套餐,就不能删除。
在动态sql中注意循环的使用,还有返回值
第三个sql:根据dishid在菜品表里删除菜品
第四个sql:根据dishid在口味表里删除对应的口味