批量删除套餐功能实现
(28)SetmealServiceImpl完善
位置:sky-server/src/main/java/com/sky/service/impl/SetmealServiceImpl.java
添加的代码:
/**
* 批量删除套餐
* 1.删除套餐表数据
* 2.删除套餐菜品表数据
* 3.删除菜品表数据
* @param ids
*/
@Transactional//由于涉及到三个表的操作,需要事务控制
public void delete(List<Long> ids) {
//判断起售状态是否为0,如果为0,则不能删除
ids.forEach(id -> {
Setmeal setmeal = setmealMapper.getByID(id);
if (setmeal.getStatus() == StatusConstant.ENABLE) {
throw new DeletionNotAllowedException(MessageConstant.SETMEAL_ON_SALE);
}
});
//判断是否有菜品关联了套餐,如果有,则不能删除
ids.forEach(id -> {
setmealMapper.deleteByIDs(ids);//删除套餐表数据
setmealDishMapper.deleteBySetmealIds(ids);//删除套餐菜品表数据
});
}
示意图:
(29)SetmealController完善
位置:sky-server/src/main/java/com/sky/controller/admin/SetmealController.java
添加的代码:
/**
* 批量删除套餐
* @param ids
* @return
*/
@DeleteMapping
@ApiOperation("批量删除套餐")
public Result delete(@RequestParam List<Long> ids) {
log.info("批量删除套餐:{}", ids);
setmealService.delete(ids);
return Result.success();
}
示意图:
(30)SetmealService完善
位置:sky-server/src/main/java/com/sky/service/SetmealService.java
添加的代码:
/**
* 根据id删除套餐
* @param ids
*/
void delete(List<Long> ids);
示意图:
(31)SetmealDishMapper.xml完善
位置:sky-server/src/main/resources/mapper/SetmealDishMapper.xml
添加的代码:
<delete id="deleteBySetmealIds" parameterType="list">
DELETE FROM setmeal_dish
WHERE setmeal_id IN
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
<select id="getDishIdsBySetmealIds" resultType="java.lang.Long">
SELECT DISTINCT dish_id
FROM setmeal_dish
WHERE setmeal_id IN
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</select>
示意图:
(32)SetmealDishMapper.java完善
位置:sky-server/src/main/java/com/sky/mapper/SetmealDishMapper.java
添加的代码:
/**
* 根据套餐id删除套餐菜品
* @param ids
*/
void deleteBySetmealIds(List<Long> ids);
/**
* 根据套餐id获取菜品id
* @param ids
* @return
*/
List<Long> getDishIdsBySetmealIds(List<Long> ids);
示意图:
(33)SetmealMapper.java完善
位置:sky-server/src/main/java/com/sky/mapper/SetmealMapper.java
添加的代码:
/**
* 根据id删除套餐
* @param ids
*/
void deleteByIDs(List<Long> ids);
/**
* 根据id查询套餐
* @param id
* @return
*/
@Select("select * from setmeal where id = #{id}")
Setmeal getByID(Long id);
示意图:
(34)SetmealMapper.xml完善
位置:sky-server/src/main/resources/mapper/SetmealMapper.xml
添加的代码:
<delete id="deleteByIDs">
delete from setmeal
where id in
<foreach collection = "ids" item="id" index="index" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
示意图:
(35)功能测试
直接打开或调试项目,打开前端网页,选择需要删除的套餐,点击批量删除,删除成功则功能完成!
根据id获取套餐功能实现
(36)SetmealController
位置:sky-server/src/main/java/com/sky/controller/admin/SetmealController.java
添加的代码:
/**
* 根据id获取套餐
* @param id
* @return
*/
@GetMapping("/{id}")
@ApiOperation("根据id获取套餐")
public Result<SetmealVO> getById(@PathVariable("id") Long id){
log.info("根据id获取套餐:{}", id);
SetmealVO setmealVO = setmealService.getById(id);
return Result.success(setmealVO);
}
示意图:
(37)SetmealService
位置:sky-server/src/main/java/com/sky/service/SetmealService.java
添加的代码:
/**
* 根据id获取套餐详情
* @param id
* @return
*/
SetmealVO getById(Long id);
示意图:
(38)MessageConstant和SetmealServiceImpl
位置1:sky-common/src/main/java/com/sky/constant/MessageConstant.java
添加代码:
public static final String SETMEAL_NOT_FOUND = "套餐不存在";
示意图:
位置2:sky-server/src/main/java/com/sky/service/impl/SetmealServiceImpl.java
添加的代码:
/**
* 根据id查询套餐详情和菜品信息
* @param id
* @return
*/
public SetmealVO getById(Long id) {
//查询套餐信息,如果没有该菜品,则抛出异常
Setmeal setmeal = setmealMapper.getByID(id);
if (setmeal == null) {
throw new SetmealEnableFailedException(MessageConstant.SETMEAL_NOT_FOUND);
}
//查询套餐菜品信息
List<SetmealDish> setmealDishes = setmealDishMapper.getBySetmealId(id);
//创建套餐vo对象
SetmealVO setmealVO = new SetmealVO();
BeanUtils.copyProperties(setmeal, setmealVO);
//设置套餐菜品信息
setmealVO.setSetmealDishes(setmealDishes);
return setmealVO;
}
示意图:
(39)SetmealDishMapper.java
位置:sky-server/src/main/java/com/sky/mapper/SetmealDishMapper.java
添加的代码:
/**
* 根据id获取套餐及菜品关联关系
* @param id
* @return
*/
@Select("SELECT * FROM setmeal_dish WHERE id = #{id}")
List<SetmealDish> getBySetmealId(Long id);
示意图:
(40)功能测试
打开Swagger测试文档:苍穹外卖项目接口文档
查看数据库,找到套餐对应的id号,并输入到参数值中,如“32”,查看相应内容是否有对应的套餐信息,有则成功!
最后输入一个,数据库中没有的套餐id,如“1”,借此判断是否能正确抛出异常,
(41)SetmealController完善
位置:sky-server/src/main/java/com/sky/controller/admin/SetmealController.java
添加的代码:
/**
* 更新套餐
* @param setmealDTO
* @return
*/
@PutMapping
@ApiOperation("更新套餐")
public Result Update(@RequestBody SetmealDTO setmealDTO) {
log.info("更新套餐:{}", setmealDTO);
setmealService.update(setmealDTO);
return Result.success();
}
示意图:
(42)SetmealService完善
位置:sky-server/src/main/java/com/sky/service/SetmealService.java
添加的代码:
/**
* 更新套餐
* @param setmealDTO
*/
void update(SetmealDTO setmealDTO);
示意图:
(43)SetmealServiceImpl完善
位置:sky-server/src/main/java/com/sky/service/impl/SetmealServiceImpl.java
添加的代码:
/**
* 修改套餐
* @param setmealDTO
*/
@Transactional
public void update(SetmealDTO setmealDTO) {
Setmeal setmeal = new Setmeal();
BeanUtils.copyProperties(setmealDTO, setmeal);
//1、修改套餐表,执行update
setmealMapper.update(setmeal);
//套餐id
Long setmealId = setmealDTO.getId();
//2、删除套餐和菜品的关联关系,操作setmeal_dish表,执行delete
setmealDishMapper.deleteBySetmealId(setmealId);
//获取套餐菜品dto列表
List<SetmealDish> setmealDishes = setmealDTO.getSetmealDishes();
//执行循环,设置套餐id,然后保存到数据库,作用为保存套餐菜品的关联关系
setmealDishes.forEach(setmealDish -> {
setmealDish.setSetmealId(setmealId);
});
//3、重新插入套餐和菜品的关联关系,操作setmeal_dish表,执行insert
setmealDishMapper.insertBatch(setmealDishes);
}
示意图:
(44)SetmealDishMapper.java完善
位置:sky-server/src/main/java/com/sky/mapper/SetmealDishMapper.java
添加的代码:
/**
* 根据套餐id删除套餐菜品
* @param setmealId
*/
@Delete("delete from setmeal_dish where setmeal_id = #{setmealId}")
void deleteBySetmealId(Long setmealId);
示意图:
(45)功能测试
调试或者直接启动项目,打开前端网页,找到以下位置,任意选择一个套餐,点击“修改”,任意输入修改的数据,点击保存,跳出修改成功的信息,则说明功能完成!
查看数据库,数据库已发生变化