/**
   * 更新新菜品分类
   *
   * @param categoryVO 菜品分类值对象,包含需要更新的数据
   * @return 更新后的菜品分类值对象
   * @throws DuplicateNameException 菜品分类命名重复异常
   * @throws CategoryNotFoundException 菜品分类不存在异常
   */
  @Transactional(
      propagation = Propagation.REQUIRED,
      readOnly = false,
      rollbackFor = Exception.class)
  public Category updateCategory(CategoryVO categoryVO)
      throws DuplicateNameException, CategoryNotFoundException {
    // 1. 检查需要更新的菜品分类是否存在
    Category category = this.getCategoryById(categoryVO.getId());

    Category checkedCategory = categoryDao.getCategoryByName(categoryVO.getName());
    // 2. 检查是否有同名菜品分类
    if (checkedCategory != null && checkedCategory.getId() != categoryVO.getId()) {
      throw new DuplicateNameException(
          MessageUtil.getMessage("category_name_msg", categoryVO.getName()));
    } else {
      // 3. 更新菜品分类
      category.setName(categoryVO.getName());
      category.setPicPath(categoryVO.getPicPath());
      category.setUpdateDate(new Date());

      categoryDao.update(category);
    }

    return category;
  }