目录
套餐管理业务开发
17、新增套餐
17.1、需求分析
17.2、代码开发
18、套餐分页查询
18.1、需求分析
18.2、代码开发
19、删除、起售、停售、修改套餐
19.1、需求分析
19.2、代码开发
--后台系统中可以管理套餐信息,通过新增套餐功能来添加一个新的套餐,在添加套餐时需要选择当前套餐所属的套餐分类和包含的菜品,并且需要上传套餐对应的图片,在移动端会按照套餐分类来展示对应的套餐。
--套餐管理,其实就是菜品的集合。
--数据模型:涉及到两个表:套餐信息插入到setmeal表,插入套餐和菜品关联数据到setmeal_dish表
--从资料中导入套餐表和套餐菜品关系表,创建相关接口和类以及控制器方法
--因涉及多表操作,需导入Dto
--从前端页面得知:
之前已做过此功能
/**
* 根据分类id查询对应的菜品,并回显数据
* @param dish
* @return
*/
@GetMapping("/list")
public R> list(Dish dish){
//构造查询条件
LambdaQueryWrapper lambdaQueryWrapper=new LambdaQueryWrapper<>();
//添加条件,查询状态为1的(起售状态)
lambdaQueryWrapper.eq(Dish::getStatus,1);
lambdaQueryWrapper.eq(dish.getCategoryId()!=null,Dish::getCategoryId,dish.getCategoryId());
//条件排序条件
lambdaQueryWrapper.orderByAsc(Dish::getSort).orderByDesc(Dish::getUpdateTime);
List list=dishService.list(lambdaQueryWrapper);
return R.success(list);
}
--设计多表操作:基本信息添加到套餐表setmeal表,关联的菜品信息添加到套餐菜品关系表setmeal_dish表
--在controller中自定义方法:saveWithDish
@PostMapping
public RsaveMealDto(@RequestBody SetmealDto setmealDto){
setmealService.saveWithDish(setmealDto);
return R.success("添加套餐成功");
}
--在对应的实现类中编写具体实现操作:
/**
* 添加套餐数据到setmeal表和setmeal_dish表中
* @param setmealDto
*/
@Override
public void saveWithDish(SetmealDto setmealDto){
//添加基本信息到setmeal表
this.save(setmealDto);
//从前端返回提交的参数中获取关联的菜品信息
List setmealDishes = setmealDto.getSetmealDishes();
setmealDishes.stream().map((item) -> {
Long id = setmealDto.getId();
item.setSetmealId(id);
return item;
}).collect(Collectors.toList());
//保存套餐和菜品的关联信息
setmealDishService.saveBatch(setmealDishes);
}
--将套餐信息进行分页展示,需要注意的是其中个别信息需要手动转换,分类id---->分类名称
--页面发送ajax请求,将分页查询参数(page、pageSize、name)提交到服务端,获取分页数据
操作如下:
@GetMapping("/page")
public RgetMealDto(int page,int pageSize,String name){
//此页面展示的信息为套餐信息,信息里面的套餐分类为分类名称,实体类里面的为id,需转换
Page pageInfo = new Page<>(page,pageSize);
Page dtoPageInfo = new Page<>();
LambdaQueryWrapper qw = new LambdaQueryWrapper<>();
qw.eq(StringUtils.isNotEmpty(name),Setmeal::getName,name);
qw.orderByDesc(Setmeal::getCode);
setmealService.page(pageInfo,qw);
//页面信息拷贝---其中records为页面集合数据因缺少categoryName并且泛型类型不一致不需要复制
BeanUtils.copyProperties(pageInfo,dtoPageInfo,"records");
//对原records进行改造----改泛型类型,加categoryName
//1、获取原records
List records = pageInfo.getRecords();
//用List接收改泛型类型
List nowRecores = records.stream().map((item) -> {
SetmealDto setmealDto = new SetmealDto();
BeanUtils.copyProperties(item,setmealDto);
Long categoryId = item.getCategoryId();
Category category = categoryService.getById(categoryId);
if (category!=null) {
String categoryName = category.getName();
//2、加categoryName
setmealDto.setCategoryName(categoryName);
}
return setmealDto;
}).collect(Collectors.toList());
dtoPageInfo.setRecords(nowRecores);
return R.success(dtoPageInfo);
}
在套餐管理列表页面点击删除按钮,可以删除对应的套餐信息。也可以通过复选框选择多个套餐,点击批量删除按钮一次删除多个套餐。注意,对于状态为售卖中的套餐不能删除,需要先停售,然后才能删除。
操作如下:
删除:直接看实现类中自定义的方法
/**
* 删除套餐,起售状态不可删除
* @param ids
*/
@Transactional
@Override
public void removeWithDish(List ids) {
//判断是否可删除 起售不可
LambdaQueryWrapper qw = new LambdaQueryWrapper<>();
qw.in(Setmeal::getId,ids);
qw.eq(Setmeal::getStatus,1);
int count = this.count(qw);
if (count > 0) {
throw new CustomExpection("商品正在起售,不能删除");
}
//停售,可删除
this.removeByIds(ids);
//删除关系表中信息SetmealDto
LambdaQueryWrapper qwDish = new LambdaQueryWrapper<>();
qwDish.in(SetmealDish::getSetmealId,ids);
setmealDishService.remove(qwDish);
}
起售,停售:
操作如下:
/**
* 更改成功套餐状态status
* @param status
* @param ids
* @return
*/
@PostMapping("/status/{status}")
public Rstop(@PathVariable int status,String[] ids){
for (String id:ids){
Setmeal setmeal = setmealService.getById(id);
setmeal.setStatus(status);
setmealService.updateById(setmeal);
}
return R.success("套餐状态更改成功");
}
修改套餐:
操作如下:
controller中
/**
* 修改套餐:1、回显数据
* @param ids
* @return
*/
@GetMapping("/{ids}")
public Rupdate1(@PathVariable Long ids){
//回显数据
SetmealDto setmealDto = setmealService.getByIdWithDish(ids);
return R.success(setmealDto);
}
/**
* 修改套餐:2、更改数据提交保存
* @param setmealDto
* @return
*/
@PutMapping
public Rupdate2(@RequestBody SetmealDto setmealDto){
setmealService.updateWithDish(setmealDto);
return R.success("套餐内容修改成功");
}
Impl中
@Override
public SetmealDto getByIdWithDish(Long ids) {
//回显基本信息
Setmeal setmeal = this.getById(ids);
SetmealDto setmealDto = new SetmealDto();
BeanUtils.copyProperties(setmeal,setmealDto);
//回显添加的菜品信息
LambdaQueryWrapper qw = new LambdaQueryWrapper<>();
qw.eq(SetmealDish::getSetmealId,ids);
//此时qw信息应该用list集合接收,可能含有多个
List setmealDishes = setmealDishService.list(qw);
setmealDto.setSetmealDishes(setmealDishes);
return setmealDto;
}
/**
* 修改信息------1删除之前关系表中信息 2、添加修改后的信息
* @param setmealDto
*/
@Override
public void updateWithDish(SetmealDto setmealDto) {
//修改基本信息Setmeal
this.updateById(setmealDto);
//修改关系表信息SetmealDish:1、删除之前信息
LambdaQueryWrapper qwDish = new LambdaQueryWrapper<>();
qwDish.eq(SetmealDish::getSetmealId,setmealDto.getId());
setmealDishService.remove(qwDish);
//修改关系表信息SetmealDish:2、更新修改之后的信息
List setmealDishes = setmealDto.getSetmealDishes();
//缺少sermealId
setmealDishes = setmealDishes.stream().map((item) -> {
item.setSetmealId(setmealDto.getId());
return item;
}).collect(Collectors.toList());
setmealDishService.saveBatch(setmealDishes);
}