需求分析
用户点击删除按钮,可以删除对应的套餐,也可以通过复选框选择多个套餐,点击批量删除,一次性删除多个套餐。
注意:对于状态在售卖中的套餐不能删除,需要先停售,之后才能删除。
代码开发
前后端发交互
- 前端携带id发送请求,请求服务端。
- 服务端接收id,根据id删除对应的套餐。
观察删除的交互过程(单个删除和批量删除),可以发现两次请求的请求方式和请求地址都是相同的,不同的则是传递的id个数,所以可以在服务提供一个方法来做统一处理。
controller层
/**
* 根据id删除套餐信息。(删除一个或者批量删除) 需要删除关联表数据
*
* @param ids
* @return
*/
@DeleteMapping
public R<String> delete(@RequestParam List<Long> ids) {
// 接收的id成功。
log.info("根据id删除套餐信息{}", ids);
// 根据id删除对应的套餐和关联表数据。
setmealService.removeWithDish(ids);
return R.success("删除套餐成功");
}
Service层
/**
* 根据id删除对应的套餐,并且还要删除套餐关联的菜品。
* @param ids
*/
@Override
public void removeWithDish(List<Long> ids) {
// select count(*) from setmeal where id in () and status=1;
// 查询套餐状态是否可以删除
LambdaQueryWrapper<Setmeal> setmealLambdaQueryWrapper = new LambdaQueryWrapper<>();
setmealLambdaQueryWrapper.in(Setmeal::getId, ids);
setmealLambdaQueryWrapper.eq(Setmeal::getStatus, 1);
int count = this.count(setmealLambdaQueryWrapper);
if (count > 0) {
// 如果不能删除(为起售状态),则抛出一个业务异常。
throw new CustomException("套餐为起售状态,无法删除");
}
// 如果可以删除,则先删除套餐表数据。
this.removeByIds(ids);
//已知setmeal中的id,删除setmeal_dish中的记录。
// delete from setmeal_dish where setmeal_id in (ids)
LambdaQueryWrapper<SetmealDish> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.in(SetmealDish::getSetmealId, ids);
// 删除套餐关联表数据。
setmealDishService.remove(queryWrapper);
}
注意:
一定要在方法或service接口上加@Transactional注解。