drew 5 anni fa
parent
commit
71d5e6bb1e

+ 104 - 7
src/main/java/com/izouma/awesomeAdmin/web/BaseController.java

@@ -2,16 +2,25 @@ package com.izouma.awesomeAdmin.web;
 
 
 import com.izouma.awesomeAdmin.annotations.Searchable;
 import com.izouma.awesomeAdmin.annotations.Searchable;
 import com.izouma.awesomeAdmin.dto.PageQuery;
 import com.izouma.awesomeAdmin.dto.PageQuery;
+import com.izouma.awesomeAdmin.utils.DateTimeUtils;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.data.domain.Sort;
 import org.springframework.data.domain.Sort;
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.data.jpa.domain.Specification;
 
 
+import javax.annotation.Nonnull;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Predicate;
 import java.lang.reflect.Field;
 import java.lang.reflect.Field;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 import java.util.List;
+import java.util.regex.Pattern;
 
 
+@SuppressWarnings("ALL")
+@Slf4j
 public class BaseController {
 public class BaseController {
     public PageRequest toPageRequest(PageQuery pageQuery) {
     public PageRequest toPageRequest(PageQuery pageQuery) {
         PageRequest pageRequest;
         PageRequest pageRequest;
@@ -33,7 +42,7 @@ public class BaseController {
         return pageRequest;
         return pageRequest;
     }
     }
 
 
-    public <T> Specification<T> toSpecification(PageQuery pageQuery, Class queryClass) {
+    public <T> Specification<T> toSpecification(PageQuery pageQuery, Class<?> queryClass) {
         return (Specification<T>) (root, criteriaQuery, criteriaBuilder) -> {
         return (Specification<T>) (root, criteriaQuery, criteriaBuilder) -> {
             List<Predicate> and = new ArrayList<>();
             List<Predicate> and = new ArrayList<>();
             pageQuery.getQuery().forEach((property, value) -> {
             pageQuery.getQuery().forEach((property, value) -> {
@@ -45,15 +54,90 @@ public class BaseController {
                         return;
                         return;
                     }
                     }
                 }
                 }
-                and.add(criteriaBuilder.and(criteriaBuilder.equal(root.get(property), value)));
+                Field field = getDeclaredField(queryClass, property);
+                if (field == null) return;
+
+                Class fieldType = field.getType();
+                if (Enum.class.isAssignableFrom(fieldType)) {
+                    if (value instanceof Collection) {
+                        if (!((Collection) value).isEmpty()) {
+                            List list = new ArrayList();
+                            for (Object o : ((Collection) value)) {
+                                list.add(Enum.valueOf(fieldType, String.valueOf(o)));
+                            }
+                            and.add(root.get(property).in(list));
+                        }
+                    } else if (value instanceof String && StringUtils.isNotEmpty((String) value)) {
+                        if (((String) value).contains(",")) {
+                            String[] arr = ((String) value).split(",");
+                            List list = new ArrayList();
+                            for (String s : arr) {
+                                list.add(Enum.valueOf(fieldType, s));
+                            }
+                            and.add(root.get(property).in(list));
+                        } else {
+                            and.add(criteriaBuilder.and(criteriaBuilder
+                                    .equal(root.get(property), Enum.valueOf(fieldType, String.valueOf(value)))));
+                        }
+                    }
+                } else if (LocalDateTime.class == fieldType) {
+                    if (value instanceof List) {
+                        List list = (List) value;
+                        if (list.size() == 1) {
+                            LocalDateTime start = DateTimeUtils
+                                    .toLocalDateTime((String) list.get(0), "yyyy-MM-dd HH:mm:ss");
+                            and.add(criteriaBuilder.greaterThanOrEqualTo(root.get(property), start));
+                        } else if (list.size() == 2) {
+                            LocalDateTime end = DateTimeUtils
+                                    .toLocalDateTime((String) list.get(1), "yyyy-MM-dd HH:mm:ss");
+                            and.add(criteriaBuilder.lessThanOrEqualTo(root.get(property), end));
+                        }
+                    } else if (value instanceof String && Pattern
+                            .matches("^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2},\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$", (String) value)) {
+                        String[] arr = ((String) value).split(",");
+                        LocalDateTime start = DateTimeUtils.toLocalDateTime(arr[0], "yyyy-MM-dd HH:mm:ss");
+                        and.add(criteriaBuilder.greaterThanOrEqualTo(root.get(property), start));
+                        LocalDateTime end = DateTimeUtils.toLocalDateTime(arr[1], "yyyy-MM-dd HH:mm:ss");
+                        and.add(criteriaBuilder.lessThanOrEqualTo(root.get(property), end));
+                    } else {
+                        and.add(criteriaBuilder.and(criteriaBuilder.equal(root.get(property), DateTimeUtils
+                                .toLocalDateTime((String) value, "yyyy-MM-dd HH:mm:ss"))));
+                    }
+                } else if (LocalDate.class == fieldType) {
+                    if (value instanceof List) {
+                        List list = (List) value;
+                        if (list.size() == 1) {
+                            LocalDate start = DateTimeUtils
+                                    .toLocalDate((String) list.get(0), "yyyy-MM-dd");
+                            and.add(criteriaBuilder.greaterThanOrEqualTo(root.get(property), start));
+                        } else if (list.size() == 2) {
+                            LocalDate end = DateTimeUtils
+                                    .toLocalDate((String) list.get(1), "yyyy-MM-dd");
+                            and.add(criteriaBuilder.lessThanOrEqualTo(root.get(property), end));
+                        }
+                    } else if (value instanceof String && Pattern
+                            .matches("^\\d{4}-\\d{2}-\\d{2},\\d{4}-\\d{2}-\\d{2}$", (String) value)) {
+                        String[] arr = ((String) value).split(",");
+                        LocalDate start = DateTimeUtils.toLocalDate(arr[0], "yyyy-MM-dd");
+                        and.add(criteriaBuilder.greaterThanOrEqualTo(root.get(property), start));
+                        LocalDate end = DateTimeUtils.toLocalDate(arr[1], "yyyy-MM-dd");
+                        and.add(criteriaBuilder.lessThanOrEqualTo(root.get(property), end));
+                    } else {
+                        and.add(criteriaBuilder.and(criteriaBuilder.equal(root.get(property), DateTimeUtils
+                                .toLocalDateTime((String) value, "yyyy-MM-dd"))));
+                    }
+                } else {
+                    and.add(criteriaBuilder.and(criteriaBuilder.equal(root.get(property), value)));
+                }
             });
             });
             if (StringUtils.isNotEmpty(pageQuery.getSearch())) {
             if (StringUtils.isNotEmpty(pageQuery.getSearch())) {
                 Field[] fields = queryClass.getDeclaredFields();
                 Field[] fields = queryClass.getDeclaredFields();
                 List<Predicate> or = new ArrayList<>();
                 List<Predicate> or = new ArrayList<>();
                 try {
                 try {
-
-                    or.add(criteriaBuilder.equal(root.get("id"), pageQuery.getSearch()));
-                } catch (Exception e) {
+                    if (StringUtils.isNumeric(pageQuery.getSearch())) {
+                        or.add(criteriaBuilder.equal(root.get("id"), Long.parseLong(pageQuery.getSearch())));
+                    }
+                } catch (Exception ignored) {
                 }
                 }
                 for (Field field : fields) {
                 for (Field field : fields) {
                     Searchable annotation = field.getAnnotation(Searchable.class);
                     Searchable annotation = field.getAnnotation(Searchable.class);
@@ -65,9 +149,22 @@ public class BaseController {
                     }
                     }
                     or.add(criteriaBuilder.like(root.get(field.getName()), "%" + pageQuery.getSearch() + "%"));
                     or.add(criteriaBuilder.like(root.get(field.getName()), "%" + pageQuery.getSearch() + "%"));
                 }
                 }
-                and.add(criteriaBuilder.or(or.stream().toArray(Predicate[]::new)));
+                and.add(criteriaBuilder.or(or.toArray(new Predicate[0])));
             }
             }
-            return criteriaBuilder.and(and.stream().toArray(Predicate[]::new));
+            return criteriaBuilder.and(and.toArray(new Predicate[0]));
         };
         };
     }
     }
+
+    private Field getDeclaredField(Class<?> clazz, String property) {
+        String className = clazz.getName();
+        while (clazz != null && clazz != Object.class) {
+            try {
+                return clazz.getDeclaredField(property);
+            } catch (NoSuchFieldException ignored) {
+            }
+            clazz = clazz.getSuperclass();
+        }
+        log.error("no such field [{}] in class [{}]", property, className);
+        return null;
+    }
 }
 }

+ 5 - 2
src/test/java/com/izouma/awesomeAdmin/CommonTest.java

@@ -127,7 +127,10 @@ public class CommonTest {
     }
     }
 
 
     @Test
     @Test
-    public void testEnum() throws ClassNotFoundException, InvocationTargetException, IllegalAccessException, NoSuchMethodException {
-
+    public void testEnum() {
+        System.out.println(String.class.getName());
+        System.out.println(String.class.getSimpleName());
+        System.out.println(String.class.getCanonicalName());
+        System.out.println(String.class.getTypeName());
     }
     }
 }
 }