refactor: 优化selectPageList 基类方法,完善帐号搜索逻辑
diff --git a/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/repo/BaseJpaRepository.java b/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/repo/BaseJpaRepository.java
index ef0a932..2be2c31 100644
--- a/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/repo/BaseJpaRepository.java
+++ b/common/framework/src/main/java/com/supwisdom/institute/backend/common/framework/repo/BaseJpaRepository.java
@@ -6,6 +6,8 @@
 
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.jpa.domain.Specification;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.repository.NoRepositoryBean;
@@ -26,21 +28,38 @@
   public default String generateId() {
     return UUIDUtils.create();
   }
+  
+  public default Specification<E> convertToSpec(Map<String, Object> mapBean) {
+    return null;
+  }
+  public default Sort convertToSort(Map<String, String> orderBy) {
+    return null;
+  }
 
   public default Page<E> selectPageList(boolean loadAll, int pageIndex, int pageSize, Map<String, Object> mapBean, Map<String, String> orderBy) {
     
+    Specification<E> spec = convertToSpec(mapBean);
+    
     if (loadAll) {
       pageIndex = 0;
       pageSize = Integer.MAX_VALUE;
     }
+    
+    Sort sort = convertToSort(orderBy);
 
     PageRequest pageRequest = PageRequest.of(pageIndex, pageSize);
+    if (sort != null) {
+      pageRequest = PageRequest.of(pageIndex, pageSize, sort);
+    }
 
-    Page<E> page = this.findAll(pageRequest);
+    Page<E> page = this.findAll(spec, pageRequest);
 
     return page;
   }
   
+
+
+
   public default E selectById(String id) {
 
     try {
diff --git a/system/domain/src/main/java/com/supwisdom/institute/backend/system/domain/repo/AccountRepository.java b/system/domain/src/main/java/com/supwisdom/institute/backend/system/domain/repo/AccountRepository.java
index e23f46e..dcc27b1 100644
--- a/system/domain/src/main/java/com/supwisdom/institute/backend/system/domain/repo/AccountRepository.java
+++ b/system/domain/src/main/java/com/supwisdom/institute/backend/system/domain/repo/AccountRepository.java
@@ -1,15 +1,26 @@
 package com.supwisdom.institute.backend.system.domain.repo;
 
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
 import org.springframework.data.domain.Example;
 import org.springframework.data.domain.ExampleMatcher;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageRequest;
+import org.springframework.data.jpa.domain.Specification;
 import org.springframework.stereotype.Repository;
+import org.springframework.util.StringUtils;
 
 import com.supwisdom.institute.backend.common.framework.repo.BaseJpaRepository;
+import com.supwisdom.institute.backend.common.util.DateUtil;
 import com.supwisdom.institute.backend.common.util.MapBeanUtils;
 import com.supwisdom.institute.backend.system.domain.entity.Account;
 
@@ -31,35 +42,104 @@
 //    return page;
 //  }
   
+  
   @Override
-  public default Page<Account> selectPageList(boolean loadAll, int pageIndex, int pageSize, Map<String, Object> mapBean, Map<String, String> orderBy) {
-    if (loadAll) {
-      pageIndex = 0;
-      pageSize = Integer.MAX_VALUE;
-    }
+  public default Specification<Account> convertToSpec(Map<String, Object> mapBean) {
     
-    Account probe = new Account();
-    if (mapBean != null) {
-      probe.setDeleted(MapBeanUtils.getBoolean(mapBean, "deleted"));
-      probe.setUsername(MapBeanUtils.getString(mapBean, "username"));
-      probe.setName(MapBeanUtils.getString(mapBean, "name"));
-      probe.setStatus(MapBeanUtils.getString(mapBean, "status"));
-    }
+    Specification<Account> spec = new Specification<Account>() {
+
+      /**
+       * 
+       */
+      private static final long serialVersionUID = 9071470982419099273L;
+
+      @Override
+      public Predicate toPredicate(Root<Account> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
+        List<Predicate> predicates = new ArrayList<>();
+        
+        if (mapBean != null) {
+
+          if (MapBeanUtils.getBoolean(mapBean, "deleted") != null) {
+            predicates.add(criteriaBuilder.equal(root.get("deleted"), MapBeanUtils.getBoolean(mapBean, "deleted")));
+          }
+
+          if (!StringUtils.isEmpty(MapBeanUtils.getString(mapBean, "username"))) {
+            predicates.add(criteriaBuilder.like(root.get("username"), "%" + MapBeanUtils.getString(mapBean, "username") + "%"));
+          }
+          if (!StringUtils.isEmpty(MapBeanUtils.getString(mapBean, "name"))) {
+            predicates.add(criteriaBuilder.like(root.get("name"), "%" + MapBeanUtils.getString(mapBean, "name") + "%"));
+          }
+          
+          if (!StringUtils.isEmpty(MapBeanUtils.getString(mapBean, "status"))) {
+            predicates.add(criteriaBuilder.equal(root.get("status"), MapBeanUtils.getString(mapBean, "status")));
+          }
+          
+//          if (!StringUtils.isEmpty(MapBeanUtils.getString(mapBean, "grantTimeBegin"))) {
+//            String grantTimeBegin = MapBeanUtils.getString(mapBean, "grantTimeBegin");
+//            Date d = DateUtil.parseDate(grantTimeBegin+" 00:00:00", "yyyy-MM-dd HH:mm:ss");
+//            
+//            if (d != null) {
+//              predicates.add(criteriaBuilder.greaterThanOrEqualTo(root.get("grantTime"), d));
+//            }
+//          }
+//
+//          if (!StringUtils.isEmpty(MapBeanUtils.getString(mapBean, "grantTimeEnd"))) {
+//            String grantTimeEnd = MapBeanUtils.getString(mapBean, "grantTimeEnd");
+//            Date d = DateUtil.parseDate(grantTimeEnd+" 23:59:59", "yyyy-MM-dd HH:mm:ss");
+//            
+//            if (d != null) {
+//              predicates.add(criteriaBuilder.lessThanOrEqualTo(root.get("grantTime"), d));
+//            }
+//          }
+
+          List<Predicate> predicatesKeyword = new ArrayList<>();
+          if (!StringUtils.isEmpty(MapBeanUtils.getString(mapBean, "keyword"))) {
+            predicatesKeyword.add(criteriaBuilder.like(root.get("username"), "%" + MapBeanUtils.getString(mapBean, "keyword") + "%"));
+            predicatesKeyword.add(criteriaBuilder.like(root.get("name"), "%" + MapBeanUtils.getString(mapBean, "keyword") + "%"));
+            predicatesKeyword.add(criteriaBuilder.like(root.get("memo"), "%" + MapBeanUtils.getString(mapBean, "keyword") + "%"));
+            
+            predicates.add(criteriaBuilder.or(predicatesKeyword.toArray(new Predicate[predicatesKeyword.size()])));
+          }
+        }
+        
+        return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
+      }
+      
+    };
     
-    ExampleMatcher matcher = ExampleMatcher.matching()
-        .withMatcher("deleted", ExampleMatcher.GenericPropertyMatchers.exact())
-        .withMatcher("username", ExampleMatcher.GenericPropertyMatchers.contains())
-        .withMatcher("name", ExampleMatcher.GenericPropertyMatchers.contains())
-        .withMatcher("status", ExampleMatcher.GenericPropertyMatchers.exact());
-    
-    PageRequest pageRequest = PageRequest.of(pageIndex, pageSize);
-    Example<Account> example = Example.of(probe, matcher);
-    
-    Page<Account> page = this.findAll(example, pageRequest);
-    
-    return page;
+    return spec;
   }
   
+  
+//  @Override
+//  public default Page<Account> selectPageList(boolean loadAll, int pageIndex, int pageSize, Map<String, Object> mapBean, Map<String, String> orderBy) {
+//    if (loadAll) {
+//      pageIndex = 0;
+//      pageSize = Integer.MAX_VALUE;
+//    }
+//    
+//    Account probe = new Account();
+//    if (mapBean != null) {
+//      probe.setDeleted(MapBeanUtils.getBoolean(mapBean, "deleted"));
+//      probe.setUsername(MapBeanUtils.getString(mapBean, "username"));
+//      probe.setName(MapBeanUtils.getString(mapBean, "name"));
+//      probe.setStatus(MapBeanUtils.getString(mapBean, "status"));
+//    }
+//    
+//    ExampleMatcher matcher = ExampleMatcher.matching()
+//        .withMatcher("deleted", ExampleMatcher.GenericPropertyMatchers.exact())
+//        .withMatcher("username", ExampleMatcher.GenericPropertyMatchers.contains())
+//        .withMatcher("name", ExampleMatcher.GenericPropertyMatchers.contains())
+//        .withMatcher("status", ExampleMatcher.GenericPropertyMatchers.exact());
+//    
+//    PageRequest pageRequest = PageRequest.of(pageIndex, pageSize);
+//    Example<Account> example = Example.of(probe, matcher);
+//    
+//    Page<Account> page = this.findAll(example, pageRequest);
+//    
+//    return page;
+//  }
+  
   /*
   public default User selectById(String id) {