0
点赞
收藏
分享

微信扫一扫

最新Springboot+mp核心技术外卖入门实战项目(三)

40dba2f2a596 2022-05-03 阅读 59

有关套餐的实体类

@Data
public 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;
}

@Data
public class SetmealDto extends Setmeal {

    private List<SetmealDish> setmealDishes;

    private String categoryName;
}

@Data
public 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;
}

@Data
public 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
@Slf4j
public 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")
@Slf4j
public 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);
    }
举报

相关推荐

0 条评论