最新Springboot+mp核心技术外卖入门实战项目(三)
有关套餐的实体类
@Datapublic class Setmeal implements Serializable { private static final long serialVersionUID = 1L; private Long id; //分类id private Long categoryId; //套餐名称 private String name; //套餐价格 private BigDecimal price; //状态 0:停用 1:启用 private Integer status; //编码 private String code; //描述信息 private String description; //图片 private String image; @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; @TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; @TableField(fill = FieldFill.INSERT) private Long createUser; @TableField(fill = FieldFill.INSERT_UPDATE) private Long updateUser;}@Datapublic class SetmealDto extends Setmeal { private List<SetmealDish> setmealDishes; private String categoryName;}@Datapublic class SetmealDish implements Serializable { private static final long serialVersionUID = 1L; private Long id; //套餐id private Long setmealId; //菜品id private Long dishId; //菜品名称 (冗余字段) private String name; //菜品原价 private BigDecimal price; //份数 private Integer copies; //排序 private Integer sort; @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; @TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; @TableField(fill = FieldFill.INSERT) private Long createUser; @TableField(fill = FieldFill.INSERT_UPDATE) private Long updateUser; //是否删除 private Integer deleted;}@Datapublic class SetmealDto extends Setmeal { private List<SetmealDish> setmealDishes; private String categoryName;}
已经写出的接口
/** * @author William * @create 2022-04-22 16:04 */public interface IDishService extends IService<Dish> { //新增菜品,同时插入菜品对应的口味数据,需要操作dish和dish_flavor两张表 void saveWithFlavor(DishDto dishDto); Page<DishDto> page(int page, int pageSize, String name); //根据id查询菜品信息和对应的口味信息 DishDto getByIdWithFlavor(Long id); void updateWithFlavor(DishDto dishDto); //根据条件查询对应的菜品数据 List<Dish> list(Dish dish);}
服务层实现类
/** * @author William * @create 2022-04-22 16:12 */@Service@Slf4jpublic class SetmealServiceImpl extends ServiceImpl<SetmealDAO, Setmeal> implements ISetmealService { @Autowired private ISetmealDishService setmealDishService; @Autowired private ICategoryService categoryService; /** * 新增套餐,同时需要保存套餐和菜品的关联关系 *@Param [setmealDto] *@Return */ @Override @Transactional public void saveWithDish(SetmealDto setmealDto) { this.save(setmealDto);//因为这两个之间有映射关系 对应属性会自动保存 List<SetmealDish> setmealDishes = setmealDto.getSetmealDishes(); setmealDishes.stream().map((item) -> { item.setSetmealId(setmealDto.getId()); return item; }).collect(Collectors.toList()); //保存套餐和菜品的关联关系,操作setmeal_dish,执行insert操作 setmealDishService.saveBatch(setmealDishes); } /** * 套餐分页查询功能 *@Param [page, pageSize, name] *@Return */ @Override public Page page(int page, int pageSize, String name) { Page<Setmeal> pageInfo = new Page<>(page, pageSize); Page<SetmealDto> dtoPage = new Page<>(); LambdaQueryWrapper<Setmeal> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.like(name != null, Setmeal::getName, name) .orderByDesc(Setmeal::getUpdateTime); this.page(pageInfo, queryWrapper); //对象拷贝 BeanUtils.copyProperties(pageInfo, dtoPage, "records"); List<Setmeal> records = pageInfo.getRecords(); List<SetmealDto> list = records.stream().map((item) -> { SetmealDto setmealDto = new SetmealDto(); //对象拷贝 BeanUtils.copyProperties(item, setmealDto); Long categoryId = item.getCategoryId(); //根据分类id查询分类对象 Category category = categoryService.getById(categoryId); if (category != null) { //分类名称 String categoryName = category.getName(); setmealDto.setCategoryName(categoryName); } return setmealDto; }).collect(Collectors.toList()); dtoPage.setRecords(list); return dtoPage; } /** * 删除套餐,同时需要删除套餐和菜品的关联数据 *@Param [ids] *@Return */ @Override @Transactional public void removeWithDish(List<Long> ids) { //select count(*) from setmeal where id in(1, 2, 3) and status = 1 //查询套餐状态,确定是否可用删除 LambdaQueryWrapper<Setmeal> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.in(Setmeal::getId, ids) .eq(Setmeal::getStatus, 1); int count = this.count(queryWrapper); if(count > 0){ //如果不能删除,抛出一个业务异常 throw new CustomException("套餐正在售卖中,不能删除"); } //可以删除就先删除套餐表中的数据 -- setmeal this.removeByIds(ids); //删除关系表中的数据 -- setmeal_dish //此时不能直接使用setmealDishService.removeByIds(ids) 当前套餐id并不是关系表中的id //delete from setmeal_dish where setmeal_id in (1, 2, 3) LambdaQueryWrapper<SetmealDish> LambdaQueryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper.in(SetmealDish::getSetmealId, ids); setmealDishService.remove(LambdaQueryWrapper); }}
套餐controller层
/** * 套餐管理 * @author William * @create 2022-04-22 16:14 */@RestController@RequestMapping("/setmeal")@Slf4jpublic class SetmealController { @Autowired private ISetmealService setmealService; @Autowired private ISetmealDishService setmealDishService; @ApiOperation(value = "保存", notes = "新增套餐") @PostMapping public R<String> save(@RequestBody SetmealDto setmealDto){ log.info("套餐信息:{}", setmealDto); setmealService.saveWithDish(setmealDto); return R.success("新增套餐成功"); } @ApiOperation(value = "查询", notes = "套餐分页查询") @GetMapping("/page") public R<Page> page(int page, int pageSize, String name){ Page<Setmeal> pageInfo = setmealService.page(page, pageSize, name); return R.success(pageInfo); } @ApiOperation(value = "删除", notes = "删除单个或多个套餐") @DeleteMapping public R<String> delete(@RequestParam List<Long> ids){ log.info("ids:{}",ids); setmealService.removeWithDish(ids); return R.success("套餐数据删除成功"); }}
我们在完善套餐功能时还在dish中增加了一个功能,因为增加套餐时需要查询正在售卖的菜品,停售的菜品是不能加入到套餐中的
//根据条件查询对应的菜品数据 List<Dish> list(Dish dish);/** * 根据条件查询对应的菜品数据 *@Param [dish] *@Return */ @Override public List<Dish> list(Dish dish) { LambdaQueryWrapper<Dish> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(dish.getCategoryId() != null, Dish::getCategoryId, dish.getCategoryId()) .eq(Dish::getStatus, 1)//添加条件 状态为1(起售) .orderByAsc(Dish::getSort).orderByDesc(Dish::getUpdateTime); return this.list(queryWrapper); }@ApiOperation(value = "查询", notes = "根据条件查询对应的菜品数据") @GetMapping("/list") public R<List<Dish>> list(Dish dish){ List<Dish> list = dishService.list(dish); return R.success(list); }