苍穹外卖-删除菜品

一.需求分析和设计

1.产品原型

2.业务规则

可以一次删除一个菜品,也可以批量删除菜品,起售中的菜品不能删除,被套餐关联的菜品不能删除,删除菜品后,关联的口味数据也需要删除掉。

3.接口设计

4.数据库设计

二.代码开发

1.控制层开发

控制层实现菜品批量删除功能的部分。@DeleteMapping注解表明这是一个处理HTTP DELETE请求的接口,用于删除指定的菜品。@RequestParam List<Long> ids接收前端传递的菜品ID集合,并将其传递给服务层的deleteBatch方法来执行具体的删除逻辑。操作完成后,通过Result.success()返回一个成功的响应,表示菜品删除操作完成。

2.服务层开发

通过@Transactional注解,确保该方法在执行过程中,若发生任何异常,则会自动回滚事务,保证数据的一致性。接下来,方法首先检查每个菜品的状态,通过dishMapper.getById(id)获取菜品信息,判断菜品是否处于"起售中"状态(StatusConstant.ENABLE)。如果菜品处于该状态,则抛出DeletionNotAllowedException异常,禁止删除操作。

方法检查这些菜品是否被套餐关联,通过setmealDishMapper.getSetmealIdsByDishIds(ids)查询菜品是否与套餐有关系。如果有任何菜品被套餐关联,则抛出DeletionNotAllowedException异常,禁止删除。

如果所有检查都通过,方法继续执行删除操作。通过dishMapper.deleteByIds(ids)批量删除菜品数据,同时使用dishFlavorMapper.deleteByDishIds(ids)删除与菜品相关的口味数据。

3.Mapper

getSetmealIdsByDishIds方法用于查询菜品ID集合中与套餐关联的套餐ID。通过foreach标签,菜品ID列表被转换为SQL中的IN子句,从setmeal_dish表中查询关联的套餐ID。若查询返回结果,表示菜品已被套餐使用,因此不能删除。这一逻辑确保在删除菜品之前,首先检查其是否已被套餐关联,以防止不合规的删除操作。

deleteByIds方法则是实现菜品批量删除操作的关键,它通过IN子句批量删除指定ID的菜品。在foreach标签的帮助下,菜品ID集合被转换为适合SQL执行的格式,确保可以一次性删除多个菜品。这个操作会删除菜品数据以及与菜品关联的口味数据,从而清理相关的所有数据。持久层通过这种方式高效地处理数据的删除操作,确保数据的清理工作能够准确执行。

三.功能测试

相关推荐
程序猿乐锅8 小时前
从0-1一文详解RabbitMQ
java·分布式·后端·中间件·rabbitmq·ruby
考虑考虑11 小时前
JDK26中的List.ofLazy()
java·后端·java ee
小蒜学长11 小时前
基于SpringBoot的公寓报修管理系统的设计与实现(代码+数据库+LW)
java·spring boot·后端·公寓报修管理系统·多角色协同
for_ever_love__11 小时前
MySQL 主从复制讲透:binlog 原理、搭建步骤与读写分离
java·数据库·mysql·binlog·读写分离·原理·主从复制
小π军14 小时前
操作系统面试题
java·linux·服务器
倔强的石头10614 小时前
应用账号最小权限实践:读写账号、报表账号、运维账号分层
java·运维·开发语言
Shaoshing14 小时前
ThreadLocal
java·jvm·threadlocal
写后端的胖头鱼15 小时前
一文详解CAS
java·jvm·spring·cas·乐观锁·自旋
鱼宵15 小时前
Spring AI 提示词模板:{变量} 参数化 + few-shot,一条提示词反复用
java·人工智能·spring·few-shot·提示词工程·springai