Java Web项目—餐饮管理系统Day07-套餐管理(二)

文章目录

      • 1. 套餐的分页查询
      • 2. 更新套餐![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/209298cf3b4349c5a2fed56a3d33350e.png)
        • 第一步, 依据套餐id查询到套餐的基本信息以及关联菜品信息.
        • 第2步, 将请求数据进行保存(更新).
      • 3. 批量的停售启售

这部分开发剩下的部分功能, 包括分页查询、更新套餐、批量停售/启售, 继续熟悉业务代码编写.

1. 套餐的分页查询

请求路径与请求参数(示例):
http://localhost:8080/setmeal/page?page=1&pageSize=10
同样为了得到 分类名称, 这里需要查询多个表(一般每个表都会建立对应的 mapper 和 service):

@GetMapping("page")
public R<Page> page(int page, int pageSize, String name){
    log.info("page={}, pageSize={}, name={}", page, pageSize, name);
    Page<Setmeal> setmealPage = new Page<>(page, pageSize);
    LambdaQueryWrapper<Setmeal> setmealWrapper = new LambdaQueryWrapper<>();
    setmealWrapper.like(name!=null, Setmeal::getName, name);
    setmealWrapper.orderByDesc(Setmeal::getUpdateTime);
    mealService.page(setmealPage, setmealWrapper);

    Page<SetmealDto> dtoPage = new Page<>();
    BeanUtils.copyProperties(setmealPage, dtoPage, "records");
    List<Setmeal> setmealList = setmealPage.getRecords();
    dtoPage.setRecords(setmealList.stream().map((item)->{
        SetmealDto setmealDto = new SetmealDto();
        BeanUtils.copyProperties(item, setmealDto);
        Category category = categoryService.getById(setmealDto.getCategoryId());
        setmealDto.setCategoryName(category.getName());
        return setmealDto;
    }).collect(Collectors.toList()));

    return R.success(dtoPage);
}

2. 更新套餐在这里插入图片描述

如上图所示为更新的页面(完成后)

第一步, 依据套餐id查询到套餐的基本信息以及关联菜品信息.

请求路径(示例):
http://localhost:8080/setmeal/1744602992542199810
请求方式:
GET
这里依旧需要查询两个表:

// SetmealController
@GetMapping("/{setMealId}")
public R<SetmealDto> getById(@PathVariable Long setMealId){
    log.info("依据套餐ID查询基本信息以及套餐包含的菜品: {}", setMealId);
    SetmealDto dto = mealService.getSetmealWithDish(setMealId);
    return R.success(dto);
}
// SetmealServiceImpl
@Override
public SetmealDto getSetmealWithDish(Long setMealId) {
    Setmeal meal = this.getById(setMealId);
    SetmealDto dto = new SetmealDto();
    BeanUtils.copyProperties(meal, dto);

    LambdaQueryWrapper<SetmealDish> dishWrapper = new LambdaQueryWrapper<>();
    dishWrapper.eq(SetmealDish::getSetmealId, setMealId);
    dishWrapper.orderByAsc(SetmealDish::getSort).orderByDesc(SetmealDish::getUpdateTime);
    List<SetmealDish> setmealDishList = setMealDishService.list(dishWrapper);

    dto.setSetmealDishes(setmealDishList);

    return dto;
}
第2步, 将请求数据进行保存(更新).

同样更新操作存在于两个表, 所以需要事务特性
请求路径:
http://localhost:8080/setmeal
请求方式:
PUT

SetmealController

@PutMapping
public R<String> update(@RequestBody SetmealDto dto){
    log.info("修改套餐信息: {}", dto);
    mealService.updateWithMealDishes(dto);
    return R.success("修改成功");
}

SetmealDishServicelmpl

@Transactional
@Override
public void updateWithMealDishes(SetmealDto dto) {
    this.updateById(dto);   // 修改基本信息
    // 修改套餐-菜品关联信息: 先删再加
    List<SetmealDish> dishList = dto.getSetmealDishes();
    LambdaQueryWrapper<SetmealDish> wrapper = new LambdaQueryWrapper<>();
    wrapper.eq(SetmealDish::getSetmealId, dto.getId());
    setMealDishService.remove(wrapper);
    dishList = dishList.stream().map((item)->{
        item.setSetmealId(dto.getId());
        return item;
    }).collect(Collectors.toList());
    setMealDishService.saveBatch(dishList);
}

3. 批量的停售启售

请求路径及参数示例如下:
停售
http://localhost:8080/dish/status/0?ids=1397851668262465537
启售
http://localhost:8080/setmeal/status/1?ids=1744602992542199810

于是, 无论是对批量的或者单个的套餐进行启售或者停售操作, 它们都可以集中到一个请求处理方法中:

@PostMapping("/status/{st}")
public R<String> updateStatusBatch(@PathVariable Integer st, String ids){
    List<Long> setmealIdList = Arrays.stream(ids.split(",")).map(Long::parseLong).toList();
    mealService.updateStatusBatch(st, setmealIdList);
    return R.success("状态修改成功");
}

其中一个比较复杂的情况是这里有一个路径参数 st = 0/1 以及套餐的 id 列表, 接收时一是使用 String 类型接收, 二是名字不要弄错, 要和请求参数名一致: ids. 这里先把字符串分割成列表再转为 Long 的整数类型.

@Transactional
@Override
public void updateStatusBatch(Integer st, List<Long> setmealIdList) {
    // 批量停售/启售套餐
    LambdaQueryWrapper<SetmealDish> setmealDishWrapper = new LambdaQueryWrapper<>();
    // 注意启售套餐时, 套餐内不可有停售的菜品
    List<Setmeal> setmealList = setmealIdList.stream().map((item) -> {
        Setmeal setmeal = this.getById(item);
        setmeal.setStatus(st);
        if (st == 1) {
            setmealDishWrapper.eq(SetmealDish::getSetmealId, setmeal.getId());
            List<SetmealDish> dishList = setMealDishService.list(setmealDishWrapper);
            for (SetmealDish setmealDish : dishList) {
                Dish dish = dishService.getById(setmealDish.getDishId());
                if (dish.getStatus() == 0)
                    throw new BusinessException("套餐内" + dish.getName() + "处于停售状态, 套餐无法启售");
            }
        }
        return setmeal;
    }).toList();
    this.updateBatchById(setmealList);
}

如若不考虑 启售套餐时, 套餐内不可有停售的菜品 的条件, 则实际上只需要更改 setmeal 表即可. 然而, 在考虑该条件后, 涉及到更多的表, 过程是先依据 setmeal 的 id 查询 setmeal_dish 表得到 SetmealDish 的列表, 遍历该列表, 依据其中的 dishId 查询 dish 表, 得到 Dish 对象, 查看该对象的 status 是否为 0 (停售), 若为0, 则抛出业务异常, 信息中提示菜品名称.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/463865.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CSS Module

CSS Module的作用&#xff1a;将CSS样式作用域限制在特定的组件范围内&#xff0c;以避免全局样式污染和命名冲突。 Vue中如何实现样式模块…

SVN修改已提交版本的注释

目录 一、需求分析 二、问题分析 三、解决办法 一、需求分析 ​开发过程中&#xff0c;在SVN提交文件后&#xff0c;发现注释写的不完整或不够明确&#xff0c;想再修改之前的注释文字​。 使用环境&#xff1a; SVN服务器操作系统&#xff1a;Ubuntu 20.04.6 LTS SVN版本&…

物理隔离条件下,如何安全高效地进行内外网文件导入导出?

内外网文件导入导出通常指的是在内部网络&#xff08;内网&#xff09;和外部网络&#xff08;外网&#xff09;之间传输文件的过程。这在企业环境中尤其常见&#xff0c;因为内部网络通常包含敏感数据&#xff0c;而外部网络&#xff08;如互联网&#xff09;则允许更广泛的访…

计算机网络实验——学习记录

1. tun/tap模块&#xff1a;为Linux系统提供网络虚拟功能&#xff0c;tun位于网络OSI模型的三层&#xff08;网络层&#xff09;&#xff0c;tap位于网络的二层&#xff08;数据链路层&#xff09;。 1.1 验证是否包含tun/tap模块&#xff1a;modinfo tun&#xff1b; 1.2 验…

8:00面试,8:06就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到9月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

echarts散点图自定义tooltip,鼠标放上去展示多行数据

先放效果图 如图&#xff0c;就是鼠标悬停在散点上&#xff08;这里的散点我替换成了图片&#xff0c;具体做法参考这篇文章&#xff1a;echarts散点图的散点用自定义图片替代-CSDN博客&#xff09;时&#xff0c;可以展示多行数据。之前查找资料的时候&#xff0c;很多用字符串…

封装哈希表

本文旨在讲解哈希表的封装&#xff0c;我们以哈希桶的结构来进行封装unorderedmap/set。要想实现封装哈希表&#xff0c;我们首先得先将哈希表的结构给搭建出来&#xff0c;然后再根据哈希桶的结构进一步封装unorderedmap/set&#xff01; 下面我们先来实现哈希桶的结构&#x…

12_Linux内核结构

Linux内核结构 1.内核的主要组成部分 Linux 内核主要的 5 个部分&#xff1a;进程调度、内存管理、虚拟文件系统、网络接口、进程通信。在系统移植的时候&#xff0c;它们是内核的基本元素&#xff0c;这 5 个部分之间的关系&#xff0c;如图所示&#xff1a; 进程调度&#…

V-JEPA模型,非LLM另外的选择,AGI的未来:迈向Yann LeCun先进机器智能(AMI)愿景的下一步

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

小怂爱水洼DFS

分析&#xff1a; 非常明显的搜索问题&#xff0c;当时我在写的时候遇到了两个问题&#xff0c;就一直没过。 1.忘记判断临界条件&#xff0c;x&#xff0c;t不能越界的问题&#xff1b; 2.最后有两个案例一直不能过&#xff0c;就是因为我用的int型的接受结果范围太小了&#…

前端学习从0到1第一天:初见html

阅读须知&#xff1a; 探索者安全团队技术文章仅供参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作,由于传播、利用本公众号所提供的技术和信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者 本人负责&#xff0c;作者不为此承担任何责任,如…

【C++中日期类的实现】

一路&#xff0c;一路&#xff0c;一路从泥泞到风景............................................................................................... 目录 前言 一、【什么是日期类】 二、【代码实现】 1.【Date.h】部分&#xff1a; 2.【Date.cpp】部分&#xff1a;…

关于ffmpeg height not divisible by 2的错误

在我们线上视频生产过程中&#xff0c;我们用ffmpeg对视频做了resize&#xff0c;讲原有的分辨率resize到1280p&#xff0c;使用了参数 -vf "scale1280:-1"&#xff0c;作用是将原始视频宽度缩放成1280&#xff0c;-1是指高度等比例缩放。 之前一直运行的好好的&…

储能技术发展

一、政策背景 “十三五”是我国储能产业化发展的起点。自“十四五”之后&#xff0c;各类储能支持政策更是以极快的速度不断更新完善。 2023年1月17日&#xff0c;工业和信息化部等六部门发布了《关于推动能源电子产业发展的指导意见》&#xff0c;其中明确提出要在2025年实现…

吴恩达prompt 笔记2:迭代提示开发(Iterative Prompt Develelopment)

1 前言 我们很难在初次尝试中就设计出最佳的提示&#xff0c;因此需要根据ChatGPT的反馈进行分析&#xff0c;分析输出具体在哪里不符合期望&#xff0c;然后不断思考和优化提示。如果有条件的话&#xff0c;最好是利用批量的样本来改善提示&#xff0c;这样可以对你的优化结…

代码随想录阅读笔记-哈希表【三数之和】

题目 给你一个包含 n 个整数的数组 nums&#xff0c;判断 nums 中是否存在三个元素 a&#xff0c;b&#xff0c;c &#xff0c;使得 a b c 0 &#xff1f;请你找出所有满足条件且不重复的三元组。 注意&#xff1a; 答案中不可以包含重复的三元组。 示例&#xff1a; 给定数…

Python之Web开发中级教程----搭建虚拟环境

Python之Web开发中级教程----搭建Web框架二 搭建虚拟环境 虚拟环境的作用 虚拟环境可以搭建独立的python运行环境, 使得单个项目的运行环境与其它项目互不影响. 搭建虚拟环境 &#xff08;1&#xff09;安装 sudo pip install virtualenv sudo pip install virtualenvwra…

一起学数据分析_2

写在前面&#xff1a;代码运行环境为jupyter&#xff0c;如果结果显示不出来的地方就加一个print()函数。 一、数据基本处理 缺失值处理&#xff1a; import numpy as np import pandas as pd#加载数据train.csv df pd.read_csv(train_chinese.csv) df.head()# 查看数据基本…

Vue3-响应式基础:单文件和组合式文件

单文件&#xff1a;html <!DOCTYPE html> <html> <head><title>响应式基础</title> </head> <body><div id"app" ><!-- dynamic parameter:同样在指令参数上也可以使用一个 JavaScript 表达式&#xff0c;需要包…

简易版 RPC 框架实现 1.0 -http实现

RPC 是“远程过程调用&#xff08;Remote Procedure Call&#xff09;”的缩写形式&#xff0c;比较通俗的解释是&#xff1a;像本地方法调用一样调用远程的服务。虽然 RPC 的定义非常简单&#xff0c;但是相对完整的、通用的 RPC 框架涉及很多方面的内容&#xff0c;例如注册发…