2025.4.16 菜品管理

This commit is contained in:
zhangsan 2025-04-16 14:24:50 +08:00
parent 21626b0663
commit 4dd7b78917
10 changed files with 187 additions and 98 deletions

View File

@ -28,7 +28,7 @@ public class DishController {
@ApiOperation("新增菜品") @ApiOperation("新增菜品")
public Result addDish(@RequestBody DishDTO dishDTO){ public Result addDish(@RequestBody DishDTO dishDTO){
log.info("新增菜品"); log.info("新增菜品");
dishService.addDish(dishDTO); dishService.saveWithFlavor(dishDTO);
//清理缓存数据 //清理缓存数据
String key = "dish_" + dishDTO.getCategoryId(); String key = "dish_" + dishDTO.getCategoryId();
@ -43,7 +43,7 @@ public class DishController {
} }
@DeleteMapping @DeleteMapping
@ApiOperation("删除菜品") @ApiOperation("删除菜品")
public Result deleteDish(Long[] ids){ public Result deleteDish(@RequestParam List<Long> ids){
log.info("批量删除菜品"); log.info("批量删除菜品");
dishService.deleteBatch(ids); dishService.deleteBatch(ids);
@ -54,14 +54,14 @@ public class DishController {
@GetMapping("/{id}") @GetMapping("/{id}")
@ApiOperation("根据id查询菜品") @ApiOperation("根据id查询菜品")
public Result<DishVO> queryByIdWithFlavor(@PathVariable Long id){ public Result<DishVO> queryByIdWithFlavor(@PathVariable Long id){
DishVO dishVO=dishService.queryByIdWithFlavor(id); DishVO dishVO=dishService.getByIdWithFlavor(id);
return Result.success(dishVO); return Result.success(dishVO);
} }
@PutMapping @PutMapping
@ApiOperation("更新菜品") @ApiOperation("更新菜品")
public Result update(@RequestBody DishDTO dishDTO){ public Result update(@RequestBody DishDTO dishDTO){
log.info("修改菜品:{}", dishDTO); log.info("更新菜品:{}", dishDTO);
dishService.update(dishDTO); dishService.updateWithFlavor(dishDTO);
//将所有的菜品缓存数据清理掉所有以dish_开头的key //将所有的菜品缓存数据清理掉所有以dish_开头的key
cleanCache("dish_*"); cleanCache("dish_*");
@ -79,11 +79,10 @@ public class DishController {
@GetMapping("/list") @GetMapping("/list")
@ApiOperation("根据分类id查询菜品") @ApiOperation("根据分类id查询菜品")
public Result<List<Dish>> list(Long categoryId) { public Result<List<Dish>> list(Long categoryId) {
Dish dish=new Dish(); List<Dish> list = dishService.list(categoryId);
dish.setCategoryId(categoryId); return Result.success(list);
List<Dish> dishList=dishService.list(dish);
return Result.success(dishList);
} }
private void cleanCache(String pattern){ private void cleanCache(String pattern){
Set keys = redisTemplate.keys(pattern); Set keys = redisTemplate.keys(pattern);
redisTemplate.delete(keys); redisTemplate.delete(keys);

View File

@ -14,6 +14,6 @@ public interface DishFlavorMapper {
@Delete("delete from dish_flavor where dish_id=#{id}") @Delete("delete from dish_flavor where dish_id=#{id}")
void deleteByDishId(Long id); void deleteByDishId(Long id);
@Select("select * from dish_flavor where dish_id=#{id}") @Select("select * from dish_flavor where dish_id=#{id}")
List<DishFlavor> queryByDishId(Long id); List<DishFlavor> getByDishId(Long id);
} }

View File

@ -1,5 +1,6 @@
package com.sky.mapper; package com.sky.mapper;
import com.github.pagehelper.Page;
import com.sky.annotation.AutoFill; import com.sky.annotation.AutoFill;
import com.sky.dto.DishPageQueryDTO; import com.sky.dto.DishPageQueryDTO;
import com.sky.entity.Dish; import com.sky.entity.Dish;
@ -13,23 +14,43 @@ import java.util.List;
@Mapper @Mapper
public interface DishMapper { public interface DishMapper {
/**
* 插入菜品数据
*/
@AutoFill(OperationType.INSERT) @AutoFill(OperationType.INSERT)
void insert(Dish dish); void insert(Dish dish);
/**
* 根据主键查询菜品
*/
@Select("select * from dish where id=#{id}")
Dish getById(Long id);
/** /**
* 分类查询 * 根据主键删除菜品数据
* @param dishPageQueryDTO
* @return
*/ */
List<DishVO> list(DishPageQueryDTO dishPageQueryDTO);
@Select("select * from dish where id=#{id}")
Dish queryById(Long id);
@Delete("delete from dish where id=#{id}") @Delete("delete from dish where id=#{id}")
void deleteById(Long id); void deleteById(Long id);
/**
* 根据id动态修改菜品数据
*/
@AutoFill(OperationType.UPDATE) @AutoFill(OperationType.UPDATE)
void update(Dish dish); void update(Dish dish);
List<Dish> listByType(Dish dish);
/**
* 动态条件查询菜品
*/
List<Dish> list(Dish dish);
/**
* 根据套餐id查询菜品
*/
@Select("select a.* from dish a left join setmeal_dish b on a.id = b.dish_id where b.setmeal_id = #{setmealId}") @Select("select a.* from dish a left join setmeal_dish b on a.id = b.dish_id where b.setmeal_id = #{setmealId}")
List<Dish> getBySetmealId(Long setmealId); List<Dish> getBySetmealId(Long setmealId);
/**
* 菜品分页查询
*/
Page<DishVO> pageQuery(DishPageQueryDTO dishPageQueryDTO);
} }

View File

@ -8,9 +8,9 @@ import org.apache.ibatis.annotations.Select;
import java.util.List; import java.util.List;
@Mapper @Mapper
public interface Setmeal_dishMapper { public interface SetmealDishMapper {
@Select("select setmeal_id from setmeal_dish where dish_id=#{id}") // @Select("select setmeal_id from setmeal_dish where dish_id=#{id}")
List<Long> queryByDishId(Long id); // List<Long> queryByDishId(Long id);
void add(SetmealDish setmealDish); void add(SetmealDish setmealDish);
@Delete("delete from setmeal_dish where setmeal_id=#{id}") @Delete("delete from setmeal_dish where setmeal_id=#{id}")
@ -18,4 +18,10 @@ public interface Setmeal_dishMapper {
@Select("select * from setmeal_dish where setmeal_id = #{setmealId}") @Select("select * from setmeal_dish where setmeal_id = #{setmealId}")
List<SetmealDish> getBySetmealId(Long setmealId); List<SetmealDish> getBySetmealId(Long setmealId);
/**
* 根据菜品id查询对应的套餐id
*/
//select setmeal_id from setmeal_dish where dish_id in (1,2,3,4)
List<Long> getSetmealIdsByDishIds(List<Long> dishIds);
} }

View File

@ -9,19 +9,19 @@ import com.sky.vo.DishVO;
import java.util.List; import java.util.List;
public interface DishService { public interface DishService {
void addDish(DishDTO dishDTO); void saveWithFlavor(DishDTO dishDTO);
PageResult pageQuery(DishPageQueryDTO dishPageQueryDTO); PageResult pageQuery(DishPageQueryDTO dishPageQueryDTO);
void deleteBatch(Long[] ids); void deleteBatch(List<Long> ids);
DishVO queryByIdWithFlavor(Long id); DishVO getByIdWithFlavor(Long id);
void update(DishDTO dishDTO); void updateWithFlavor(DishDTO dishDTO);
void startOrStop(Integer status, Long id); void startOrStop(Integer status, Long id);
List<Dish> list(Dish dish); List<Dish> list(Long categoryId);
List<DishVO> listWithFlavor(Dish dish); List<DishVO> listWithFlavor(Dish dish);
} }

View File

@ -9,13 +9,11 @@ import com.sky.dto.DishPageQueryDTO;
import com.sky.entity.Dish; import com.sky.entity.Dish;
import com.sky.entity.DishFlavor; import com.sky.entity.DishFlavor;
import com.sky.entity.Setmeal; import com.sky.entity.Setmeal;
import com.sky.entity.SetmealDish;
import com.sky.exception.DeletionNotAllowedException; import com.sky.exception.DeletionNotAllowedException;
import com.sky.exception.SetmealEnableFailedException;
import com.sky.mapper.DishFlavorMapper; import com.sky.mapper.DishFlavorMapper;
import com.sky.mapper.DishMapper; import com.sky.mapper.DishMapper;
import com.sky.mapper.SetmealMapper; import com.sky.mapper.SetmealMapper;
import com.sky.mapper.Setmeal_dishMapper; import com.sky.mapper.SetmealDishMapper;
import com.sky.result.PageResult; import com.sky.result.PageResult;
import com.sky.service.DishService; import com.sky.service.DishService;
import com.sky.vo.DishVO; import com.sky.vo.DishVO;
@ -34,66 +32,96 @@ public class DishServiceImpl implements DishService {
@Autowired @Autowired
private DishFlavorMapper dishFlavorMapper; private DishFlavorMapper dishFlavorMapper;
@Autowired @Autowired
private Setmeal_dishMapper setmeal_dishMapper; private SetmealDishMapper setmealDishMapper;
@Autowired @Autowired
private SetmealMapper setmealMapper; private SetmealMapper setmealMapper;
@Override @Override
public void addDish(DishDTO dishDTO) { /**
* 新增菜品和对应的口味
*/
@Transactional //对两表及以上表操作时需添加@Transactional
public void saveWithFlavor(DishDTO dishDTO) {
Dish dish=new Dish(); Dish dish=new Dish();
BeanUtils.copyProperties(dishDTO,dish); BeanUtils.copyProperties(dishDTO,dish);
//向菜品表插入1条数据
dishMapper.insert(dish); dishMapper.insert(dish);
Long dishId=dish.getId();
List<DishFlavor> flavorList=dishDTO.getFlavors();
for(DishFlavor flavor:flavorList){
flavor.setDishId(dishId);
}
dishFlavorMapper.insertBatch(flavorList);
}
//获取insert语句生成的主键值
Long dishId=dish.getId();
List<DishFlavor> flavors=dishDTO.getFlavors();
if (flavors != null && flavors.size() > 0) {
flavors.forEach(dishFlavor -> {
dishFlavor.setDishId(dishId);
});
//向口味表插入n条数据
dishFlavorMapper.insertBatch(flavors);//后绪步骤实现
}
}
/**
* 菜品分页查询
*/
@Override @Override
public PageResult pageQuery(DishPageQueryDTO dishPageQueryDTO) { public PageResult pageQuery(DishPageQueryDTO dishPageQueryDTO) {
PageHelper.startPage(dishPageQueryDTO.getPage(), dishPageQueryDTO.getPageSize()); PageHelper.startPage(dishPageQueryDTO.getPage(), dishPageQueryDTO.getPageSize());
List<DishVO> dishVOList=dishMapper.list(dishPageQueryDTO); Page<DishVO> page = dishMapper.pageQuery(dishPageQueryDTO);
Page<DishVO> p= (Page<DishVO>) dishVOList; return new PageResult(page.getTotal(), page.getResult());
PageResult pageResult=new PageResult(p.getTotal(),p.getResult());
return pageResult;
} }
/**
* 菜品批量删除
*/
@Override @Override
@Transactional @Transactional
public void deleteBatch(Long[] ids) { public void deleteBatch(List<Long> ids) {
for (Long id : ids) { for (Long id : ids) {
Dish dish=dishMapper.queryById(id); Dish dish = dishMapper.getById(id);//后绪步骤实现
if(dish.getStatus()== StatusConstant.ENABLE) if (dish.getStatus() == StatusConstant.ENABLE) {
//当前菜品处于起售中不能删除
throw new DeletionNotAllowedException(MessageConstant.DISH_ON_SALE); throw new DeletionNotAllowedException(MessageConstant.DISH_ON_SALE);
else{ }
List<Long> setmealids=setmeal_dishMapper.queryByDishId(id); }
if(setmealids!=null && setmealids.size() > 0) //判断当前菜品是否能够删除---是否被套餐关联了
List<Long> setmealIds = setmealDishMapper.getSetmealIdsByDishIds(ids);
if (setmealIds != null && setmealIds.size() > 0) {
//当前菜品被套餐关联了不能删除
throw new DeletionNotAllowedException(MessageConstant.DISH_BE_RELATED_BY_SETMEAL); throw new DeletionNotAllowedException(MessageConstant.DISH_BE_RELATED_BY_SETMEAL);
else { }
dishMapper.deleteById(id); //删除菜品表中的菜品数据
dishFlavorMapper.deleteByDishId(id); for (Long id : ids) {
dishMapper.deleteById(id);//后绪步骤实现
//删除菜品关联的口味数据
dishFlavorMapper.deleteByDishId(id);//后绪步骤实现
} }
} }
} /**
} * 根据id查询菜品和对应的口味数据
*/
@Override @Override
public DishVO queryByIdWithFlavor(Long id) { public DishVO getByIdWithFlavor(Long id) {
Dish dish=dishMapper.queryById(id); //根据id查询菜品数据
Dish dish=dishMapper.getById(id);
//根据菜品id查询口味数据
List<DishFlavor> dishFlavors=dishFlavorMapper.getByDishId(id);
//将查询到的数据封装到VO
DishVO dishVO=new DishVO(); DishVO dishVO=new DishVO();
BeanUtils.copyProperties(dish,dishVO); BeanUtils.copyProperties(dish,dishVO);
List<DishFlavor> dishFlavors=dishFlavorMapper.queryByDishId(id);
dishVO.setFlavors(dishFlavors); dishVO.setFlavors(dishFlavors);
return dishVO; return dishVO;
} }
/**
* 根据id修改菜品基本信息和对应的口味信息
*/
@Override @Override
public void update(DishDTO dishDTO) { public void updateWithFlavor(DishDTO dishDTO) {
Dish dish=new Dish(); Dish dish=new Dish();
BeanUtils.copyProperties(dishDTO,dish); BeanUtils.copyProperties(dishDTO,dish);
//修改菜品表基本信息
dishMapper.update(dish); dishMapper.update(dish);
dishFlavorMapper.deleteByDishId(dishDTO.getId()); //先删再添加口味不要在原来的上面修改原来可能2种口味现在3种也无法修改
//删除原有的口味数据
dishFlavorMapper.deleteByDishId(dishDTO.getId());
//重新插入口味数据
List<DishFlavor> flavors = dishDTO.getFlavors(); List<DishFlavor> flavors = dishDTO.getFlavors();
if (flavors != null && flavors.size() > 0) { if (flavors != null && flavors.size() > 0) {
flavors.forEach(dishFlavor -> { flavors.forEach(dishFlavor -> {
@ -105,27 +133,41 @@ public class DishServiceImpl implements DishService {
} }
@Override @Override
@Transactional
public void startOrStop(Integer status, Long id) { public void startOrStop(Integer status, Long id) {
Dish dish=new Dish(); Dish dish = Dish.builder()
dish.setId(id); .id(id)
dish.setStatus(status); .status(status)
if(status==StatusConstant.DISABLE){ //如果菜品停售正在起售的套餐也要停售 .build();
List<Long> setmealids=setmeal_dishMapper.queryByDishId(id); dishMapper.update(dish);
for(Long setmealid:setmealids){
Setmeal setmeal=setmealMapper.getById(setmealid); if (status == StatusConstant.DISABLE) {
if(StatusConstant.ENABLE == setmeal.getStatus()){ //若菜品停售则套餐起售失败 // 如果是停售操作还需要将包含当前菜品的套餐也停售
setmeal.setStatus(StatusConstant.DISABLE); List<Long> dishIds = new ArrayList<>();
dishIds.add(id);
// select setmeal_id from setmeal_dish where dish_id in (?,?,?)
List<Long> setmealIds = setmealDishMapper.getSetmealIdsByDishIds(dishIds);
if (setmealIds != null && setmealIds.size() > 0) {
for (Long setmealId : setmealIds) {
Setmeal setmeal = Setmeal.builder()
.id(setmealId)
.status(StatusConstant.DISABLE)
.build();
setmealMapper.update(setmeal); setmealMapper.update(setmeal);
} }
} }
} }
dishMapper.update(dish);
} }
/**
* 根据分类id查询菜品
*/
@Override @Override
public List<Dish> list(Dish dish) { public List<Dish> list(Long categoryId) {
List<Dish> dishList=dishMapper.listByType(dish); Dish dish = Dish.builder()
return dishList; .categoryId(categoryId)
.status(StatusConstant.ENABLE)
.build();
return dishMapper.list(dish);
} }
@Override @Override
@ -135,7 +177,7 @@ public class DishServiceImpl implements DishService {
* @return * @return
*/ */
public List<DishVO> listWithFlavor(Dish dish) { public List<DishVO> listWithFlavor(Dish dish) {
List<Dish> dishList = dishMapper.listByType(dish); List<Dish> dishList = dishMapper.list(dish);
List<DishVO> dishVOList = new ArrayList<>(); List<DishVO> dishVOList = new ArrayList<>();
@ -144,7 +186,7 @@ public class DishServiceImpl implements DishService {
BeanUtils.copyProperties(d,dishVO); BeanUtils.copyProperties(d,dishVO);
//根据菜品id查询对应的口味 //根据菜品id查询对应的口味
List<DishFlavor> flavors = dishFlavorMapper.queryByDishId(d.getId()); List<DishFlavor> flavors = dishFlavorMapper.getByDishId(d.getId());
dishVO.setFlavors(flavors); dishVO.setFlavors(flavors);
dishVOList.add(dishVO); dishVOList.add(dishVO);

View File

@ -13,7 +13,7 @@ import com.sky.exception.DeletionNotAllowedException;
import com.sky.exception.SetmealEnableFailedException; import com.sky.exception.SetmealEnableFailedException;
import com.sky.mapper.DishMapper; import com.sky.mapper.DishMapper;
import com.sky.mapper.SetmealMapper; import com.sky.mapper.SetmealMapper;
import com.sky.mapper.Setmeal_dishMapper; import com.sky.mapper.SetmealDishMapper;
import com.sky.result.PageResult; import com.sky.result.PageResult;
import com.sky.service.SetmealService; import com.sky.service.SetmealService;
import com.sky.vo.DishItemVO; import com.sky.vo.DishItemVO;
@ -30,7 +30,7 @@ public class SetmealServiceImpl implements SetmealService {
@Autowired @Autowired
private SetmealMapper setmealMapper; private SetmealMapper setmealMapper;
@Autowired @Autowired
private Setmeal_dishMapper setmeal_dishMapper; private SetmealDishMapper setmeal_dishMapper;
@Autowired @Autowired
private DishMapper dishMapper; private DishMapper dishMapper;
@Override @Override

View File

@ -43,7 +43,7 @@ public class ShoppingCartServiceImpl implements ShoppingCartService {
Long dishId = shoppingCartDTO.getDishId(); Long dishId = shoppingCartDTO.getDishId();
if (dishId != null) { if (dishId != null) {
//添加到购物车的是菜品 //添加到购物车的是菜品
Dish dish = dishMapper.queryById(dishId); Dish dish = dishMapper.getById(dishId);
shoppingCart.setName(dish.getName()); shoppingCart.setName(dish.getName());
shoppingCart.setImage(dish.getImage()); shoppingCart.setImage(dish.getImage());
shoppingCart.setAmount(dish.getPrice()); shoppingCart.setAmount(dish.getPrice());

View File

@ -6,21 +6,6 @@
insert into dish (name, category_id, price, image, description, create_time, update_time, create_user,update_user, status) insert into dish (name, category_id, price, image, description, create_time, update_time, create_user,update_user, status)
values (#{name}, #{categoryId}, #{price}, #{image}, #{description}, #{createTime}, #{updateTime}, #{createUser}, #{updateUser}, #{status}) values (#{name}, #{categoryId}, #{price}, #{image}, #{description}, #{createTime}, #{updateTime}, #{createUser}, #{updateUser}, #{status})
</insert> </insert>
<select id="list" resultType="com.sky.vo.DishVO">
select d.* , c.name as categoryName from dish d left outer join category c on d.category_id = c.id
<where>
<if test="name != null">
and d.name like concat('%',#{name},'%')
</if>
<if test="categoryId != null">
and d.category_id = #{categoryId}
</if>
<if test="status != null">
and d.status = #{status}
</if>
</where>
order by d.create_time desc
</select>
<select id="listByType" resultType="com.sky.entity.Dish"> <select id="listByType" resultType="com.sky.entity.Dish">
select * from dish select * from dish
<where> <where>
@ -42,4 +27,34 @@
</set> </set>
where id=#{id} where id=#{id}
</update> </update>
<select id="pageQuery" resultType="com.sky.vo.DishVO">
select d.* , c.name as categoryName from dish d left outer join category c on d.category_id = c.id
<where>
<if test="name != null">
and d.name like concat('%',#{name},'%')
</if>
<if test="categoryId != null">
and d.category_id = #{categoryId}
</if>
<if test="status != null">
and d.status = #{status}
</if>
</where>
order by d.create_time desc
</select>
<select id="list" resultType="com.sky.entity.Dish">
select * from dish
<where>
<if test="name != null">
and name like concat('%',#{name},'%')
</if>
<if test="categoryId != null">
and category_id = #{categoryId}
</if>
<if test="status != null">
and status = #{status}
</if>
</where>
order by create_time desc
</select>
</mapper> </mapper>

View File

@ -1,10 +1,16 @@
<?xml version="1.0" encoding="UTF-8" ?> <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd" > "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.sky.mapper.Setmeal_dishMapper"> <mapper namespace="com.sky.mapper.SetmealDishMapper">
<insert id="add"> <insert id="add">
insert into setmeal_dish (setmeal_id,dish_id,name,price,copies) insert into setmeal_dish (setmeal_id,dish_id,name,price,copies)
values (#{setmealId},#{dishId},#{name},#{price},#{copies}) values (#{setmealId},#{dishId},#{name},#{price},#{copies})
</insert> </insert>
<select id="getSetmealIdsByDishIds" resultType="java.lang.Long">
select setmeal_id from setmeal_dish where dish_id in
<foreach collection="dishIds" item="dishId" separator="," open="(" close=")">
#{dishId}
</foreach>
</select>
</mapper> </mapper>