@RequestMapping(value = "/excel", method = RequestMethod.GET)
  public void excel(HttpServletResponse response) throws Exception {
    Workbook wb = new HSSFWorkbook();
    //        CreationHelper createHelper = wb.getCreationHelper();
    Sheet sheet = wb.createSheet("new sheet");
    org.apache.poi.ss.usermodel.Row row = sheet.createRow((short) 0);
    row = sheet.createRow((short) 1);
    row.createCell(0).setCellValue("Mã");
    row.createCell(1).setCellValue("Tên");
    row.createCell(2).setCellValue("Mã Path");
    row.createCell(3).setCellValue("Tên path");
    row.createCell(4).setCellValue("Cấp danh mục");

    int i = 1;
    List<Category> listAll = categoryService.listAll();
    for (Category print : listAll) {
      if (print.getName().length() > 19) {
        i++;
        row = sheet.createRow((short) i);
        row.createCell(0).setCellValue(String.valueOf(print.getId()));
        row.createCell(1).setCellValue(String.valueOf(print.getName()));
        row.createCell(2).setCellValue(String.valueOf(print.getPath()));
        String path = "";
        for (String categoryId : print.getPath()) {
          Category get = categoryService.get(categoryId);
          path += get.getName() + " >>";
        }
        row.createCell(3).setCellValue(String.valueOf(path));
        row.createCell(4).setCellValue(String.valueOf(print.getLevel()));
      }
    }
    response.setContentType("application/vnd.ms-excel");
    response.setHeader("Content-Disposition", "attachment; filename=Danh-sach-danh-muc.xls");
    wb.write(response.getOutputStream());
  }
 public void getAncestors(ItemSearch itemSearch, Map<String, Object> parentCategorys) {
   List<Object> cats = new ArrayList<>();
   if (itemSearch.getCategoryIds() == null || itemSearch.getCategoryIds().isEmpty()) {
     parentCategorys.put("cats", cats);
   } else {
     try {
       List<Category> ancestors = categoryService.getAncestors(itemSearch.getCategoryIds().get(0));
       for (Category cat : ancestors) {
         cats.add(categoryService.getChilds(cat.getId()));
       }
       parentCategorys.put("cats", cats);
       parentCategorys.put("ancestors", ancestors);
     } catch (Exception ex) {
     }
   }
 }
 /**
  * Thêm thuộc tính mới.
  *
  * @param categoryProperty
  * @return
  */
 @ResponseBody
 @RequestMapping(value = "/addproperty", method = RequestMethod.POST)
 public Response addProperty(@RequestBody CategoryProperty categoryProperty) {
   try {
     return categoryService.addProperty(categoryProperty);
   } catch (Exception e) {
     return new Response(false, e.getMessage());
   }
 }
 /**
  * Xóa danh mục
  *
  * @param id
  * @return
  */
 @ResponseBody
 @RequestMapping(value = "/del", method = RequestMethod.GET)
 public Response del(@RequestParam(value = "id", defaultValue = "") String id) {
   try {
     categoryService.remove(id);
   } catch (Exception e) {
     return new Response(false, e.getMessage());
   }
   return new Response(true, "Đã xóa thành công");
 }
 /**
  * Sửa thông tin giá trị thuộc tính
  *
  * @param categoryPropertyValue
  * @return
  */
 @ResponseBody
 @RequestMapping(value = "/editpropertyvalue", method = RequestMethod.POST)
 public Response editPropertyValue(@RequestBody CategoryPropertyValue categoryPropertyValue) {
   try {
     categoryService.editPropertyValue(categoryPropertyValue);
   } catch (Exception e) {
     return new Response(false, e.getMessage());
   }
   return new Response(true, "Sửa thành công");
 }
  /**
   * Lấy thông tin thuộc tính model theo id
   *
   * @param id
   * @return
   */
  @RequestMapping(value = "/getproperties", method = RequestMethod.GET)
  @ResponseBody
  public Response getProperties(@RequestParam(value = "id", defaultValue = "") String id)
      throws Exception {
    Model model = modelService.getModel(id);
    if (model == null) {
      throw new Exception("Model không tồn tại");
    }
    HashMap<String, Object> data = new HashMap<>();
    List<ModelProperty> properties = modelService.getProperties(id);
    data.put("model", model);
    data.put("properties", properties);
    data.put("categoryProperties", categoryService.getProperties(model.getCategoryId()));
    data.put(
        "categoryPropertyValues",
        categoryService.getPropertyValuesWithCategoryId(model.getCategoryId()));

    return new Response(true, "Thông tin model", data);
  }
 /**
  * Service Sửa thông tin danh mục
  *
  * @param category
  * @param categoryFrom
  * @return
  * @throws Exception
  */
 @RequestMapping(value = "/update", method = RequestMethod.POST)
 @ResponseBody
 public Response update(@RequestBody Category category) throws Exception {
   return categoryService.edit(category);
 }
 /**
  * @param category
  * @return
  * @throws Exception
  */
 @RequestMapping(value = "/add", method = RequestMethod.POST)
 @ResponseBody
 public Response add(@RequestBody Category category) throws Exception {
   return categoryService.addCategory(category);
 }
 /**
  * Xóa toàn bộ index
  *
  * @return
  * @throws Exception
  */
 @RequestMapping(value = "/unindex")
 @ResponseBody
 public Response unindex() throws Exception {
   categoryService.unindex();
   return new Response(true, "Xóa index thành công");
 }
 /**
  * Index toàn bộ category
  *
  * @throws Exception
  */
 @RequestMapping(value = "/index")
 @ResponseBody
 public Response index() throws Exception {
   categoryService.index();
   return new Response(true, "Đang xử lý index ...");
 }
  /**
   * Danh sách sản phẩm cần review
   *
   * @param modelMap
   * @param session
   * @param page
   * @return
   */
  @RequestMapping(
      value = {"/reviewitem"},
      method = RequestMethod.GET)
  public String reviewList(
      ModelMap modelMap,
      HttpSession session,
      @RequestParam(value = "page", defaultValue = "0") int page) {

    ItemSearch itemSearch = new ItemSearch();
    itemSearch.setStatus(4);
    List<String> cateIds = new ArrayList<>();
    List<String> shopCateIds = new ArrayList<>();
    List<String> manufIds = new ArrayList<>();
    List<String> modelIds = new ArrayList<>();
    if (itemSearch.getCategoryIds() == null) {
      itemSearch.setCategoryIds(new ArrayList<String>());
    }
    itemSearch.setSource(ItemSource.SELLER);
    long createTime = 1388509200 * 1000L;
    itemSearch.setCreateTimeFrom(createTime);
    itemSearch.setCreateTimeTo(System.currentTimeMillis());
    if (session.getAttribute("itemSearch") != null && page != 0) {
      itemSearch = (ItemSearch) session.getAttribute("itemSearch");
    } else {
      session.setAttribute("itemSearch", itemSearch);
    }
    Map<String, Object> parentCategorys = new HashMap<>();
    getAncestors(itemSearch, parentCategorys);

    if (page > 0) {
      itemSearch.setPageIndex(page - 1);
    } else {
      itemSearch.setPageIndex(0);
    }
    itemSearch.setPageSize(50);

    DataPage<Item> itemPage = itemService.searchMongo(itemSearch);
    for (Item item : itemPage.getData()) {
      if (item.getCategoryId() != null
          && !item.getCategoryId().equals("")
          && !cateIds.contains(item.getCategoryId())) {
        cateIds.add(item.getCategoryId());
      }
      if (item.getShopCategoryId() != null
          && !item.getShopCategoryId().equals("")
          && !shopCateIds.contains(item.getShopCategoryId())) {
        shopCateIds.add(item.getShopCategoryId());
      }
      if (item.getManufacturerId() != null
          && !item.getManufacturerId().equals("")
          && !manufIds.contains(item.getManufacturerId())) {
        manufIds.add(item.getManufacturerId());
      }
      if (item.getModelId() != null
          && !item.getModelId().equals("")
          && !modelIds.contains(item.getModelId())) {
        modelIds.add(item.getModelId());
      }
    }
    for (Item item : itemPage.getData()) {
      List<String> images = new ArrayList<>();
      if (item != null && item.getImages() != null && !item.getImages().isEmpty()) {
        for (String img : item.getImages()) {
          images.add(
              imageService.getUrl(img).thumbnail(200, 200, "outbound").getUrl(item.getName()));
        }
        item.setImages(images);
      }
      if (item.getSellerName() == null || item.getSellerName().equals("")) {
        try {
          User seller = userService.get(item.getSellerId());
          item.setSellerName(seller.getEmail());
        } catch (Exception ex) {
        }
      }
    }
    List<City> cities = cityService.list();
    modelMap.put("itemSearch", itemSearch);
    modelMap.put("itemPage", itemPage);
    modelMap.put("cities", cities);
    modelMap.put("itemCates", categoryService.getCategories(cateIds));
    modelMap.put("itemShopCates", shopCategoryService.get(shopCateIds));
    modelMap.put("itemManuf", manufacturerService.getManufacturers(manufIds));
    modelMap.put("itemModels", modelService.getModels(modelIds));
    modelMap.put(
        "clientScript",
        "category = "
            + gson.toJson(categoryService.getChilds(null))
            + ",cities="
            + gson.toJson(cities)
            + ";reviewitem.init({parentCategorys:"
            + gson.toJson(parentCategorys)
            + ", categoryId:'"
            + (itemSearch.getCategoryIds().isEmpty() ? "" : itemSearch.getCategoryIds().get(0))
            + "'});");
    return "cp.item.review";
  }
  /**
   * Tìm kiếm tất cả sản phẩm
   *
   * @param itemSearch
   * @param session
   * @param modelMap
   * @return
   */
  @RequestMapping(
      value = {"/reviewitem"},
      method = RequestMethod.POST)
  public String reviewSearch(
      @ModelAttribute("itemSearch") ItemSearch itemSearch, HttpSession session, ModelMap modelMap) {
    Map<String, Object> parentCategorys = new HashMap<>();
    List<String> cateIds = new ArrayList<>();
    List<String> shopCateIds = new ArrayList<>();
    List<String> manufIds = new ArrayList<>();
    List<String> modelIds = new ArrayList<>();

    itemSearch.setPageIndex(0);
    itemSearch.setPageSize(50);
    if (itemSearch.getCategoryId() != null && !itemSearch.getCategoryId().equals("")) {
      itemSearch.setCategoryIds(new ArrayList<String>());
      itemSearch.getCategoryIds().add(itemSearch.getCategoryId());
    }
    getAncestors(itemSearch, parentCategorys);
    session.setAttribute("itemSearch", itemSearch);
    DataPage<Item> itemPage = itemService.searchMongo(itemSearch);
    for (Item item : itemPage.getData()) {
      if (item.getCategoryId() != null
          && !item.getCategoryId().equals("")
          && !cateIds.contains(item.getCategoryId())) {
        cateIds.add(item.getCategoryId());
      }
      if (item.getShopCategoryId() != null
          && !item.getShopCategoryId().equals("")
          && !shopCateIds.contains(item.getShopCategoryId())) {
        shopCateIds.add(item.getShopCategoryId());
      }
      if (item.getManufacturerId() != null
          && !item.getManufacturerId().equals("")
          && !manufIds.contains(item.getManufacturerId())) {
        manufIds.add(item.getManufacturerId());
      }
      if (item.getModelId() != null
          && !item.getModelId().equals("")
          && !modelIds.contains(item.getModelId())) {
        modelIds.add(item.getModelId());
      }
    }
    for (Item item : itemPage.getData()) {
      List<String> images = new ArrayList<>();
      if (item != null && item.getImages() != null && !item.getImages().isEmpty()) {
        for (String img : item.getImages()) {
          images.add(
              imageService.getUrl(img).thumbnail(200, 200, "outbound").getUrl(item.getName()));
        }
        item.setImages(images);
      }
      if (item.getSellerName() == null || item.getSellerName().equals("")) {
        try {
          User seller = userService.get(item.getSellerId());
          item.setSellerName(seller.getEmail());
        } catch (Exception ex) {
        }
      }
    }
    if (itemSearch.getCategoryIds() == null) {
      itemSearch.setCategoryIds(new ArrayList<String>());
    }
    List<City> cities = cityService.list();
    modelMap.put("itemSearch", itemSearch);
    modelMap.put("itemPage", itemPage);
    modelMap.put("cities", cities);
    modelMap.put("itemCates", categoryService.getCategories(cateIds));
    modelMap.put("itemShopCates", shopCategoryService.get(shopCateIds));
    modelMap.put("itemManuf", manufacturerService.getManufacturers(manufIds));
    modelMap.put("itemModels", modelService.getModels(modelIds));
    modelMap.put(
        "clientScript",
        "category = "
            + gson.toJson(categoryService.getChilds(null))
            + ",cities="
            + gson.toJson(cities)
            + ";reviewitem.init({parentCategorys:"
            + gson.toJson(parentCategorys)
            + ", categoryId:'"
            + (itemSearch.getCategoryIds().isEmpty() ? "" : itemSearch.getCategoryIds().get(0))
            + "'});");
    return "cp.item.review";
  }