@RequestMapping("download")
  public void download(ReportVo reportVo, HttpServletResponse response, HttpServletRequest request)
      throws IOException {
    if (reportVo != null) {
      String template = "config/templates/" + reportVo.getReportType() + ".html";
      PdfDocumentGenerator pdfGenerator = new PdfDocumentGenerator();
      List<User> users = userService.findAll();
      if (users != null) {
        List<DocumentVo> employeeReportVos = new ArrayList<DocumentVo>();
        for (User user : users) {
          EmployeeReportVo employeeReportVo = new EmployeeReportVo(user, reportVo.getReportType());
          if (employeeReportVo.getIsEmployee() != null && employeeReportVo.getIsEmployee()) {
            employeeReportVos.add(employeeReportVo);
          }
        }
        try {
          if (reportVo.getReportType().equals(ReportType.TimeCardReport.name())
              || reportVo.getReportType().equals(ReportType.ExceptionsReport.name())) {
            try {
              pdfGenerator.generate(
                  createTimeCardReport(reportVo, employeeReportVos), response.getOutputStream());
            } catch (Exception e) {
              e.printStackTrace();
            }
          } else {
            pdfGenerator.generate(template, employeeReportVos, response.getOutputStream());
          }

        } catch (DocumentGeneratingException e) {
          e.printStackTrace();
        }
      }
    }
  }
  private String createTimeCardReport(ReportVo reportVo, List<DocumentVo> documentVos) {
    if (documentVos == null) return "";
    HtmlGenerator htmlGenerator = new HtmlGenerator();
    Map<String, Object> variables = new HashMap<String, Object>();
    String timeCardReportHead = null;
    Template timeCardReportTable = null;
    Template timeCardReportTr = null;
    StringBuffer timeCardReportTableStrs = new StringBuffer();

    int index = 0;
    String templateHead = "config/templates/" + reportVo.getReportType() + "_head.html";
    String templateTable = "config/templates/" + reportVo.getReportType() + "_table.html";
    String templateTr = "config/templates/" + reportVo.getReportType() + "_tr.html";
    try {
      for (DocumentVo documentVo : documentVos) {
        variables = documentVo.fillDataMap();
        if (index == 0) {
          timeCardReportHead = htmlGenerator.generate(templateHead, variables);
          timeCardReportTable = htmlGenerator.generate(templateTable);
          timeCardReportTr = htmlGenerator.generate(templateTr);
        }
        String timeCardReportTableStr = htmlGenerator.generate(timeCardReportTable, variables);
        timeCardReportTableStrs.append(
            timeCardReportTableStr.replace(
                "#tr#", createTimeCardTrReport(timeCardReportTr, documentVo, htmlGenerator)));
      }
      return timeCardReportHead.replace("#table#", timeCardReportTableStrs.toString());
    } catch (IOException e) {
      e.printStackTrace();
    } catch (TemplateException e) {
      e.printStackTrace();
    }
    return "";
  }
 @RequestMapping("/save")
 public ModelAndView saveReport(
     ReportVo reportVo, HttpServletResponse response, HttpServletRequest request)
     throws Exception {
   User user = SessionUtils.getUser(request);
   ModelAndView view = new ModelAndView();
   Report report = new Report();
   if (StringUtils.isNotEmpty(reportVo.getId())) {
     report = reportLogService.findById(reportVo.getId());
   }
   if (StringUtils.isNotEmpty(reportVo.getPaging())) {
     report.setPaging(reportVo.getPaging());
   }
   if (StringUtils.isNotEmpty(reportVo.getSort())) {
     report.setSort(reportVo.getSort());
   }
   if (StringUtils.isNotEmpty(reportVo.getPayGroupId())) {
     PayGroup payGroup = tmsService.findPayGroupById(reportVo.getPayGroupId());
     if (payGroup != null) {
       report.setPayGroup(payGroup);
     }
   }
   if (StringUtils.isNotEmpty(reportVo.getReportType())) {
     report.setReportType(ReportType.valueOf(reportVo.getReportType()));
   }
   report.setUpdateTime(new Date());
   if (StringUtils.isNotEmpty(reportVo.getId())) {
     reportLogService.update(report);
   } else {
     report.setUser(user);
     report.setCompany(user.getCompany());
     reportLogService.save(report);
   }
   view.getModel().put("message", "success");
   return view;
 }