@Override
  public User loadUserByUsername(String fullUsername) throws UsernameNotFoundException {
    String username = null;
    String accountShortName = null;
    if (fullUsername.contains("@")) {
      username = fullUsername.split("@")[0];
      accountShortName = fullUsername.split("@")[1];
    } else {
      username = fullUsername;
    }
    Search search = new Search(User.class);
    search.addFilterEqual("username", username);
    if (StringUtils.isNotBlank(accountShortName)) {
      search.addFilterEqual("account.shortName", accountShortName);
    } else {
      search.addFilterNull("account");
    }

    List<User> users = userRepository.search(search);
    if (users.size() == 0) {
      // TODO 记录LOG
      throw new UsernameNotFoundException("用户" + fullUsername + "不存在");
    }
    return users.get(0);
  }
  @Override
  public SearchResult<UserVO> searchUser(StoreUserSearch userSearch) {
    Search search = new Search(User.class);
    search.setFirstResult(userSearch.getStart());
    search.setMaxResults(userSearch.getCount());

    if (userSearch.getAccountId() != null) {
      search.addFilterEqual("account.id", userSearch.getAccountId());
    }

    if (userSearch.getEmail() != null) {
      search.addFilterEqual("email", userSearch.getEmail());
    }

    if (userSearch.getUsername() != null) {
      search.addFilterEqual("username", userSearch.getUsername());
    }
    if (userSearch.getRoleId() != null) {
      search.addFilterEqual("userRole.id", userSearch.getRoleId());
    }
    if (userSearch.getSortBy() != null && userSearch.getSortDesc() != null) {
      if (userSearch.getSortDesc()) {
        search.addSortDesc(userSearch.getSortBy());
      } else {
        search.addSortAsc(userSearch.getSortBy());
      }
    }

    search
        .addField("id", "id")
        .addField("username", "username")
        .addField("account.id", "accountId")
        .addField("account.name", "accountName")
        .addField("userRole.id", "roleId")
        .addField("userRole.name", "roleName")
        .addField("email", "email")
        .addField("fullName", "fullName")
        .addField("realName", "realName")
        .addField("createDate", "createDate")
        .addField("modifyDate", "modifyDate")
        .addField("isEnabled", "isEnabled")
        .addField("isLocked", "isLocked")
        .addField("editable", "editable");

    SearchResult<Map<String, Object>> searchResult = userRepository.searchAndCount(search);
    List<UserVO> results = new ArrayList<UserVO>();
    for (Map<String, Object> map : searchResult.getResult()) {
      UserVO vo = new UserVO(map);
      results.add(vo);
    }

    SearchResult<UserVO> res = new SearchResult<UserVO>();
    res.setTotalCount(searchResult.getTotalCount());
    res.setResult(results);
    return res;
  }
 @Override
 public void removeUserById(String id) {
   userRepository.removeById(id);
 }
 @Override
 public Integer countUser(String accountId) {
   Search search = new Search(User.class);
   search.addFilterEqual("account.id", accountId);
   return userRepository.count(search);
 }
 @Override
 @Transactional
 public User loadUserById(String id) {
   return userRepository.find(id);
 }
 @Override
 @Transactional
 public void updateUser(User user) {
   userRepository.merge(user);
 }
 @Override
 @Transactional
 public void addUser(User user) {
   userRepository.save(user);
 }