@Override
 public ModelStaffAttendanceView getRecordByCondition(String staffId, Date day, String districtId)
     throws ServiceException {
   // TODO Auto-generated method stub
   DetachedCriteria criteria = DetachedCriteria.forClass(ModelStaffAttendanceView.class);
   if (UtilString.isNotEmpty(staffId)) {
     criteria.add(Restrictions.eq("staffId", staffId));
   }
   if (day != null) {
     criteria.add(Restrictions.eq("workDate", day));
   }
   if (UtilString.isNotEmpty(districtId)) {
     criteria.add(Restrictions.eq("districtId", districtId));
   }
   List<ModelStaffAttendanceView> list = null;
   try {
     list = this.getDaoStaffAttendanceView().getListByCriteria(criteria);
   } catch (DAOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
   }
   if (list != null && list.size() > 0) {
     return list.get(0);
   }
   return null;
 }
 /*
  * (non-Javadoc)
  * @see cn.trymore.core.dao.DAOGeneric#getListByCriteria(org.hibernate.criterion.DetachedCriteria, boolean)
  */
 @SuppressWarnings("unchecked")
 public List<T> getListByCriteria(final DetachedCriteria criteria, final boolean dataFilter)
     throws DAOException {
   if (dataFilter && UtilString.isNotEmpty(this.getQueryFilter())) {
     criteria.add(Restrictions.sqlRestriction(this.getQueryFilter()));
     this.setQueryFilter(null);
   }
   return (List<T>) getHibernateTemplate().findByCriteria(criteria);
 }
  // 封装检索条件
  private DetachedCriteria getCriterias(ModelStaffAttendanceView entity) {
    DetachedCriteria criteria = DetachedCriteria.forClass(ModelStaffAttendanceView.class);

    if (entity != null) {
      if (entity.getStaffName() != null && UtilString.isNotEmpty(entity.getStaffName())) {
        criteria.add(Restrictions.like("staffName", entity.getStaffName(), MatchMode.ANYWHERE));
      }

      if (entity.getWorkType() != null && UtilString.isNotEmpty(entity.getWorkType())) {
        criteria.add(Restrictions.eq("workType", entity.getWorkType()));
      }
      if (entity.getWorkStatus() != null && UtilString.isNotEmpty(entity.getWorkStatus())) {
        criteria.add(Restrictions.eq("workStatus", entity.getWorkStatus()));
      }
      if (entity.getWorkDate() != null) {
        criteria.add(Restrictions.eq("workDate", entity.getWorkDate()));
      }
      if (entity.getFilterStart() != null) {
        criteria.add(Restrictions.ge("workDate", entity.getFilterStart()));
      }
      if (entity.getFilterEnd() != null) {
        criteria.add(Restrictions.le("workDate", entity.getFilterEnd()));
      }
      if (entity.getAttendanceResult() != null
          && UtilString.isNotEmpty(entity.getAttendanceResult())) {
        criteria.add(Restrictions.eq("attendanceResult", entity.getAttendanceResult()));
      }
      if (entity.getException() != null && "1".equals(entity.getException())) {
        criteria.add(Restrictions.eq("exception", entity.getException()));
      }
    }
    criteria.addOrder(Order.asc("workDate"));
    criteria.addOrder(Order.asc("workTime"));
    criteria.addOrder(Order.asc("staffName"));

    return criteria;
  }
  /*
   * (non-Javadoc)
   * @see cn.trymore.core.dao.DAOGeneric#findPageByCriteria(org.hibernate.criterion.DetachedCriteria, int, int, boolean)
   */
  @SuppressWarnings({"unchecked"})
  public PaginationSupport<T> findPageByCriteria(
      final DetachedCriteria criteria,
      final int pageSize,
      final int startIndex,
      final boolean dataFilter)
      throws DAOException {
    if (dataFilter && UtilString.isNotEmpty(this.getQueryFilter())) {
      criteria.add(Restrictions.sqlRestriction(this.getQueryFilter()));
      this.setQueryFilter(null);
    }

    return (PaginationSupport<T>)
        getHibernateTemplate()
            .execute(
                new HibernateCallback() {
                  public Object doInHibernate(Session session)
                      throws HibernateException, SQLException {
                    Criteria execCriteria = criteria.getExecutableCriteria(session);

                    int rowCount =
                        ((Integer)
                                execCriteria.setProjection(Projections.rowCount()).uniqueResult())
                            .intValue();
                    execCriteria.setProjection(null);
                    execCriteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
                    // execCriteria.setResultTransformer(CriteriaSpecification.ROOT_ENTITY);
                    execCriteria.setFirstResult(startIndex);

                    if (pageSize > 0) {
                      execCriteria.setMaxResults(pageSize);
                    } else {
                      execCriteria.setMaxResults(rowCount);
                    }
                    List<T> items = execCriteria.list();
                    return rowCount > 0
                        ? new PaginationSupport<T>(
                            items, rowCount, startIndex, pageSize > 0 ? pageSize : rowCount)
                        : null;
                  }
                });
  }
  /*
   * (non-Javadoc)
   * @see cn.trymore.core.dao.DAOGeneric#getAffectedNumByQueryFilter(java.lang.String, java.lang.String)
   */
  @Override
  @SuppressWarnings("rawtypes")
  public int getAffectedNumByQueryFilter(Class clas, String whereCloud)
      throws DAOException, ClassNotFoundException {
    SingleTableEntityPersister entityPersister =
        (SingleTableEntityPersister) this.getSessionFactory().getClassMetadata(clas);

    StringBuilder nativeSql = new StringBuilder("SELECT COUNT(*) as count FROM ");
    nativeSql.append(entityPersister.getTableName());
    nativeSql.append(" WHERE 1=1 ");

    if (UtilString.isNotEmpty(whereCloud)) {
      if (!whereCloud.trim().toLowerCase().startsWith("and")) {
        nativeSql.append(" AND ");
      }

      nativeSql.append(whereCloud);
    }

    return getCountByNativeSQL(nativeSql.toString());
  }
  /**
   * <b>[WebAction]</b> <br>
   * 消息详细页面
   */
  public ActionForward dialogMessagePage(
      ActionMapping mapping,
      ActionForm form,
      HttpServletRequest request,
      HttpServletResponse response) {
    String msgId = request.getParameter("msgId");

    if (UtilString.isNotEmpty(msgId)) {
      if (this.isObjectIdValid(msgId)) {
        try {
          ModelShortMessage entity = this.serviceShortMessage.get(msgId);
          if (entity != null) {
            String msgInId = request.getParameter("msgInId");
            if (UtilString.isNotEmpty(msgInId)) {
              if (this.isObjectIdValid(msgInId)) {
                ModelInMessage msgIn = this.serviceInMessage.get(msgInId);
                if (msgIn == null) {
                  return ajaxPrint(response, getErrorCallback("消息不存在或者已删除..."));
                } else {
                  if (msgIn.getReadFlag().equals(ModelInMessage.FLAG_UNREAD)) {
                    msgIn.setReadFlag(ModelInMessage.FLAG_READ);
                    this.serviceInMessage.save(msgIn);

                    ModelAppUser user = this.serviceAppUser.get(String.valueOf(msgIn.getUserId()));
                    if (user != null) {
                      // 消息推送, 减少消息提醒数量
                      this.messagePush.pushMessage(
                          user.getEmployeeId(),
                          WebActionUtil.scriptMessageNotify,
                          WebActionUtil.scriptArgMessageKey,
                          -1);
                    }
                  }
                }
              } else {
                return ajaxPrint(response, getErrorCallback("需传入合法的接收消息Id..."));
              }
            }

            request.setAttribute("entity", entity);

            // 回复动作.
            String action = request.getParameter("op");
            if (UtilString.isNotEmpty(action) && "reply".equalsIgnoreCase(action)) {
              request.setAttribute("reply", true);

              ModelHrmEmployee employee =
                  this.serviceHrmEmployee.get(String.valueOf(entity.getSenderId()));
              if (employee != null) {
                StringBuilder receiver = new StringBuilder();
                receiver.append("[");
                receiver.append(
                    "{\"id\":\""
                        + employee.getId()
                        + "\", \"empName\":\""
                        + employee.getEmpName()
                        + "\", \"empNo\":\""
                        + employee.getEmpNo()
                        + "\"}");
                receiver.append("]");
                request.setAttribute("receiver", receiver.toString());
              }
            }
          } else {
            return ajaxPrint(response, getErrorCallback("消息(id:" + msgId + ")不存在..."));
          }
        } catch (Exception e) {
          LOGGER.error("Exception raised when open the dialog page of message.", e);
          return ajaxPrint(response, getErrorCallback("页面加载失败:" + e.getMessage()));
        }
      } else {
        return ajaxPrint(response, getErrorCallback("您传入的消息Id不合法..."));
      }

      request.setAttribute("msgId", msgId);
    } else {

      // 填充短消息内容...
      String msgSubject = request.getParameter("msubject");
      if (UtilString.isNotEmpty(msgSubject)) {
        if (msgSubject.indexOf("msg.subject.conference") == -1) {
          request.setAttribute("subject", this.getMessageFromResource(request, msgSubject, null));
        } else {
          String conferenceName = null;
          String mid = request.getParameter("mid");
          if (this.isObjectIdValid(mid)) {
            try {
              ModelConference conference = this.serviceConference.get(mid);
              if (conference != null) {
                conferenceName = conference.getConferenceName();

                ModelHrmEmployee employee = conference.getSponsor().getEmployee();

                StringBuilder receiver = new StringBuilder();
                receiver.append("[");
                receiver.append(
                    "{\"id\":\""
                        + employee.getId()
                        + "\", \"empName\":\""
                        + employee.getEmpName()
                        + "\", \"empNo\":\""
                        + employee.getEmpNo()
                        + "\"}");

                // Temporary solution and it should be enhanced in the future.
                // (Regarding to the entity field not defined employee object).
                List<ModelHrmEmployee> contractor =
                    this.serviceHrmEmployee.findByFullName(conference.getContactor());
                if (contractor != null && contractor.size() > 0) {
                  receiver.append(",");
                  receiver.append(
                      "{\"id\":\""
                          + contractor.get(0).getId()
                          + "\", \"empName\":\""
                          + contractor.get(0).getEmpName()
                          + "\"}");
                  receiver.append("]");
                } else {
                  receiver.append("]");
                }

                request.setAttribute("receiver", receiver.toString());
              }
            } catch (Exception e) {
              LOGGER.error("Exception raised when fetching conference object.", e);
            }
          }

          request.setAttribute(
              "subject",
              this.getMessageFromResource(
                  request,
                  msgSubject,
                  new Object[] {
                    ContextUtil.getCurrentUser().getEmployee().getEmpName(), conferenceName
                  }));
        }

        String msgBody = request.getParameter("mbody");
        if (UtilString.isNotEmpty(msgBody)) {
          request.setAttribute("body", this.getMessageFromResource(request, msgBody));
        }
      }

      try {
        // 设置为个人消息发送
        request.setAttribute("msgType", ModelShortMessage.EMessageType.TYPE_PERSONAL.getValue());

        this.loadOrganizationTree(request);
      } catch (Exception e) {
        LOGGER.error("Exception raised when open the dialog page of message..", e);
        return ajaxPrint(response, getErrorCallback("页面加载失败: " + e.getMessage()));
      }
    }

    return mapping.findForward("dialog.info.msg.page");
  }