需求分析
- (同套餐删除)
观察删除的交互过程(单个删除和批量删除),可以发现两次请求的请求方式和请求地址都是相同的,不同的则是传递的id个数,所以可以在服务提供一个方法来做统一处理。
代码开发
controller层
/**
* 根据id删除一个或批量删除菜品。
*
* @param ids 待删除的菜品id。
* @return
*/
@DeleteMapping
public R<String> delete(@RequestParam List<Long> ids) {
// 增加日志验证是否接收到前端参数。
log.info("根据id删除一个菜品:{}", ids);
//执行删除。
dishService.deleteWithFlavor(ids);
return R.success("删除菜品成功");
}
Service层
/**
* 根据id删除对应的菜品信息, 同时还要删除关联表dish_flavor中的数据。
* 注意:如果菜品为起售则不能删除菜品,只有先停售后才能删除。
*
* @param ids
*/
@Override
public void deleteWithFlavor(List<Long> ids) {
// 判断当前菜品的状态。
// select count(*) from dish where id in (ids) and state=1;
LambdaQueryWrapper<Dish> dishLambdaQueryWrapper = new LambdaQueryWrapper<>();
dishLambdaQueryWrapper.in(Dish::getId, ids);
dishLambdaQueryWrapper.eq(Dish::getStatus, 1);
int count = dishService.count(dishLambdaQueryWrapper);
if (count>0){
// 如果不能删除,则抛出异常
throw new CustomException("菜品为起售状态,无法删除");
}
// 如果能删除(status=0) , 删除菜品信息
this.removeByIds(ids);
// 删除对应的口味信息 delete from dish_flavor where dish_id in (ids)
LambdaQueryWrapper<DishFlavor> dishFlavorLambdaQueryWrapper = new LambdaQueryWrapper<>();
dishFlavorLambdaQueryWrapper.in(DishFlavor::getDishId,ids);
//执行删除口味。
dishFlavorService.remove(dishFlavorLambdaQueryWrapper);
}
注意:
一定要在方法或service接口上加@Transactional注解。