From be59d6b2adbadc491015e1f7386de24bc6c42e01 Mon Sep 17 00:00:00 2001
From: hujunbo <9094908@qq.com>
Date: Sun, 28 Aug 2022 23:36:29 +0800
Subject: [PATCH] =?UTF-8?q?mongodb=E5=85=88=E6=B3=A8=E9=87=8A=20es?=
 =?UTF-8?q?=E6=B5=8B=E8=AF=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 ruoyi-admin/pom.xml                           |    6 +
 .../main/java/com/ruoyi/RuoYiApplication.java |    5 +-
 .../src/main/java/com/ruoyi}/Test.java        |    4 +-
 .../src/main/resources/application-druid.yml  |    3 +
 ruoyi-biemo/pom.xml                           |   29 +-
 .../biemo/elasticsearch/annotation/EsId.java  |   14 +
 .../controller/TestESController.java          |   39 +
 .../biemo/elasticsearch/entity/Topic.java     |   30 +
 .../elasticsearch/function/GFunction.java     |   44 +
 .../elasticsearch/service/TestService.java    |   32 +
 .../biemo/elasticsearch/util/EsService.java   |  352 +++
 .../mongodb/config/MongoConverterConfig.java  |   72 +-
 .../biemo/mongodb/config/ScanNewField.java    |  240 +-
 .../biemo/mongodb/utils/ImportExportUtil.java |  274 +--
 .../biemo/mongodb/utils/MongoHelper.java      | 1934 ++++++++---------
 15 files changed, 1814 insertions(+), 1264 deletions(-)
 rename {ruoyi-biemo/src/main/java/com/ruoyi/biemo/nlp => ruoyi-admin/src/main/java/com/ruoyi}/Test.java (87%)
 create mode 100644 ruoyi-biemo/src/main/java/com/ruoyi/biemo/elasticsearch/annotation/EsId.java
 create mode 100644 ruoyi-biemo/src/main/java/com/ruoyi/biemo/elasticsearch/controller/TestESController.java
 create mode 100644 ruoyi-biemo/src/main/java/com/ruoyi/biemo/elasticsearch/entity/Topic.java
 create mode 100644 ruoyi-biemo/src/main/java/com/ruoyi/biemo/elasticsearch/function/GFunction.java
 create mode 100644 ruoyi-biemo/src/main/java/com/ruoyi/biemo/elasticsearch/service/TestService.java
 create mode 100644 ruoyi-biemo/src/main/java/com/ruoyi/biemo/elasticsearch/util/EsService.java

diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml
index f78ca87..0d5abe5 100644
--- a/ruoyi-admin/pom.xml
+++ b/ruoyi-admin/pom.xml
@@ -60,6 +60,12 @@
             <groupId>com.ruoyi</groupId>
             <artifactId>ruoyi-generator</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-biemo</artifactId>
+            <version>3.8.3</version>
+            <scope>compile</scope>
+        </dependency>
 
     </dependencies>
 
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java b/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java
index 32eb6f1..8c79619 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java
@@ -3,13 +3,14 @@ package com.ruoyi;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
 
 /**
  * 启动程序
- * 
+ *
  * @author ruoyi
  */
-@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
+@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class , MongoAutoConfiguration.class})
 public class RuoYiApplication
 {
     public static void main(String[] args)
diff --git a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/nlp/Test.java b/ruoyi-admin/src/main/java/com/ruoyi/Test.java
similarity index 87%
rename from ruoyi-biemo/src/main/java/com/ruoyi/biemo/nlp/Test.java
rename to ruoyi-admin/src/main/java/com/ruoyi/Test.java
index 72f63e9..3437020 100644
--- a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/nlp/Test.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/Test.java
@@ -1,4 +1,6 @@
-package com.ruoyi.biemo.nlp;
+package com.ruoyi;
+
+import com.ruoyi.biemo.nlp.NamedEntity;
 
 public class Test {
 
diff --git a/ruoyi-admin/src/main/resources/application-druid.yml b/ruoyi-admin/src/main/resources/application-druid.yml
index 9a7cba2..beaff32 100644
--- a/ruoyi-admin/src/main/resources/application-druid.yml
+++ b/ruoyi-admin/src/main/resources/application-druid.yml
@@ -1,5 +1,8 @@
 # 数据源配置
 spring:
+    elasticsearch:
+        rest:
+            uris: http://59.110.45.20:10000
     datasource:
         type: com.alibaba.druid.pool.DruidDataSource
         driverClassName: com.mysql.cj.jdbc.Driver
diff --git a/ruoyi-biemo/pom.xml b/ruoyi-biemo/pom.xml
index 3e449b5..1e1bca9 100644
--- a/ruoyi-biemo/pom.xml
+++ b/ruoyi-biemo/pom.xml
@@ -56,7 +56,34 @@
             <artifactId>hutool-all</artifactId>
             <version>${huTool.version}</version>
         </dependency>
-
+        <dependency>
+            <groupId>org.elasticsearch.client</groupId>
+            <artifactId>elasticsearch-rest-client</artifactId>
+            <version>7.9.3</version>
+        </dependency>
+        <dependency>
+            <groupId>org.elasticsearch.client</groupId>
+            <artifactId>elasticsearch-rest-high-level-client</artifactId>
+            <version>7.9.3</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.elasticsearch</groupId>
+            <artifactId>elasticsearch</artifactId>
+            <version>7.9.3</version>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.4</version>
+        </dependency>
     </dependencies>
 
 </project>
diff --git a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/elasticsearch/annotation/EsId.java b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/elasticsearch/annotation/EsId.java
new file mode 100644
index 0000000..dec6424
--- /dev/null
+++ b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/elasticsearch/annotation/EsId.java
@@ -0,0 +1,14 @@
+package com.ruoyi.biemo.elasticsearch.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * @author zcw
+ * @version 1.0
+ * @date 2021/1/14 11:54
+ */
+@Target({ElementType.FIELD})
+@Retention(RetentionPolicy.RUNTIME)
+@Inherited
+public @interface EsId {
+}
diff --git a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/elasticsearch/controller/TestESController.java b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/elasticsearch/controller/TestESController.java
new file mode 100644
index 0000000..23b43f4
--- /dev/null
+++ b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/elasticsearch/controller/TestESController.java
@@ -0,0 +1,39 @@
+package com.ruoyi.biemo.elasticsearch.controller;
+
+import com.ruoyi.biemo.elasticsearch.entity.Topic;
+import com.ruoyi.biemo.elasticsearch.service.TestService;
+import org.elasticsearch.search.builder.SearchSourceBuilder;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+
+/**
+ * @author zcw
+ * @version 1.0
+ * @date 2021/1/14 11:19
+ */
+@RestController
+@RequestMapping(value = "/es")
+public class TestESController {
+
+    @Autowired
+    private TestService testService;
+
+    @PostMapping(value = "insert")
+    public void insertOrUpdateOne(@RequestBody Topic entity) {
+        testService.insertOrUpdateOne(entity);
+    }
+
+    @GetMapping(value = "/get")
+    public List<Topic> get() {
+        return testService.search(new SearchSourceBuilder());
+    }
+
+    @GetMapping(value = "/test111")
+    public List<Topic> test(){
+        return testService.test();
+    }
+
+}
diff --git a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/elasticsearch/entity/Topic.java b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/elasticsearch/entity/Topic.java
new file mode 100644
index 0000000..e4f95da
--- /dev/null
+++ b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/elasticsearch/entity/Topic.java
@@ -0,0 +1,30 @@
+package com.ruoyi.biemo.elasticsearch.entity;
+
+import com.ruoyi.biemo.elasticsearch.annotation.EsId;
+import lombok.Data;
+import org.springframework.data.elasticsearch.annotations.Document;
+
+@Data
+@Document(indexName = "topic")
+public class Topic {
+
+  @EsId
+  private Long id;
+  private Long subject;
+  private Long type;
+  private String img;
+  private String content;
+  private String contentStr;
+  private Long score;
+  private String audio;
+  private String video;
+  private Boolean disabled;
+  private Boolean deleted;
+  private String createdAt;
+  private String updatedAt;
+  private String answer;
+  private String three;
+  private String checkvalue;
+
+
+}
diff --git a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/elasticsearch/function/GFunction.java b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/elasticsearch/function/GFunction.java
new file mode 100644
index 0000000..c70ca98
--- /dev/null
+++ b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/elasticsearch/function/GFunction.java
@@ -0,0 +1,44 @@
+package com.ruoyi.biemo.elasticsearch.function;
+
+import lombok.SneakyThrows;
+
+import java.io.Serializable;
+import java.lang.invoke.SerializedLambda;
+import java.lang.reflect.Method;
+import java.util.function.Function;
+
+/**
+ * @author zcw
+ * @version 1.0
+ * @date 2021/1/14 13:50
+ */
+@FunctionalInterface
+public interface GFunction<T, R> extends Function<T, R>, Serializable {
+
+    String get = "get";
+
+    String is = "is";
+
+    @SneakyThrows
+    default SerializedLambda getSerializedLambda() {
+        Method write = this.getClass().getDeclaredMethod("writeReplace");
+        write.setAccessible(true);
+        return (SerializedLambda) write.invoke(this);
+    }
+
+    default String field() {
+        SerializedLambda serializedLambda = this.getSerializedLambda();
+        String methodName = serializedLambda.getImplMethodName();
+        return resolveFieldName(methodName);
+    }
+    default String resolveFieldName(String getMethodName) {
+        if (getMethodName.startsWith(get)) {
+            getMethodName = getMethodName.substring(3);
+        } else if (getMethodName.startsWith(is)) {
+            getMethodName = getMethodName.substring(2);
+        }
+        getMethodName = getMethodName.substring(0, 1).toLowerCase() + getMethodName.substring(1);
+        return getMethodName;
+    }
+
+}
diff --git a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/elasticsearch/service/TestService.java b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/elasticsearch/service/TestService.java
new file mode 100644
index 0000000..6b092a9
--- /dev/null
+++ b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/elasticsearch/service/TestService.java
@@ -0,0 +1,32 @@
+package com.ruoyi.biemo.elasticsearch.service;
+
+import com.ruoyi.biemo.elasticsearch.entity.Topic;
+import com.ruoyi.biemo.elasticsearch.util.EsService;
+import org.elasticsearch.common.unit.Fuzziness;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @author zcw
+ * @version 1.0
+ * @date 2021/1/14 11:59
+ */
+@Service
+public class TestService extends EsService<Topic> {
+
+    public List<Topic> test() {
+        esLambdaQuery().notIn(Topic::getId, 1, 2).delete();
+        List<Topic> topics = esLambdaQuery().between(Topic::getId, 2, 3).query();
+        return topics;
+    }
+
+    public List<Topic> match() {
+        return esLambdaQuery().fuzzyAll(Topic::getContent, Fuzziness.TWO, "abc").query();
+    }
+
+    public void delete() {
+        esLambdaQuery().eq(Topic::getId,1).delete();
+    }
+
+}
diff --git a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/elasticsearch/util/EsService.java b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/elasticsearch/util/EsService.java
new file mode 100644
index 0000000..927a2b4
--- /dev/null
+++ b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/elasticsearch/util/EsService.java
@@ -0,0 +1,352 @@
+package com.ruoyi.biemo.elasticsearch.util;
+
+import com.alibaba.fastjson.JSON;
+import com.ruoyi.biemo.elasticsearch.annotation.EsId;
+import com.ruoyi.biemo.elasticsearch.function.GFunction;
+import lombok.Data;
+import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
+import org.elasticsearch.action.bulk.BulkRequest;
+import org.elasticsearch.action.delete.DeleteRequest;
+import org.elasticsearch.action.index.IndexRequest;
+import org.elasticsearch.action.search.SearchRequest;
+import org.elasticsearch.action.search.SearchResponse;
+import org.elasticsearch.client.RequestOptions;
+import org.elasticsearch.client.RestHighLevelClient;
+import org.elasticsearch.client.indices.GetIndexRequest;
+import org.elasticsearch.common.unit.Fuzziness;
+import org.elasticsearch.common.xcontent.XContentType;
+import org.elasticsearch.index.query.BoolQueryBuilder;
+import org.elasticsearch.index.query.QueryBuilder;
+import org.elasticsearch.index.query.QueryBuilders;
+import org.elasticsearch.index.reindex.DeleteByQueryRequest;
+import org.elasticsearch.search.SearchHit;
+import org.elasticsearch.search.builder.SearchSourceBuilder;
+import org.elasticsearch.search.sort.SortOrder;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.elasticsearch.annotations.Document;
+
+import java.lang.reflect.*;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author zcw
+ * @version 1.0
+ * @date 2021/1/14 10:47
+ */
+public abstract class EsService<T> {
+
+    @Autowired
+    private RestHighLevelClient client;
+
+    private String index;
+
+    private Class<T> entity;
+
+    private Method getId;
+
+    protected EsService() {
+        Type type = this.getClass().getGenericSuperclass();
+        ParameterizedType parameterizedType = (ParameterizedType) type;
+        Type[] t = parameterizedType.getActualTypeArguments();
+        this.entity = (Class<T>) t[0];
+        if (this.entity.isAnnotationPresent(Document.class)) {
+            this.index = this.entity.getAnnotation(Document.class).indexName();
+        }
+        Field[] fields = this.entity.getDeclaredFields();
+        for (Field field : fields) {
+            if (field.isAnnotationPresent(EsId.class)) {
+                String fieldName = field.getName();
+                String FieldName = fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
+                String methodName = GFunction.get + FieldName;
+                Method getMethod = null;
+                try {
+                    getMethod = this.entity.getMethod(methodName, null);
+                } catch (NoSuchMethodException e) {
+                    e.printStackTrace();
+                }
+                this.getId = getMethod;
+            }
+        }
+    }
+
+    public boolean indexExist() throws Exception {
+        GetIndexRequest request = new GetIndexRequest(index);
+        request.local(false);
+        request.humanReadable(true);
+        request.includeDefaults(false);
+        return client.indices().exists(request, RequestOptions.DEFAULT);
+    }
+
+    public void insertOrUpdateOne(T entity) {
+        IndexRequest request = new IndexRequest(index);
+        try {
+            request.id(this.getId.invoke(entity, null).toString());
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        } catch (InvocationTargetException e) {
+            e.printStackTrace();
+        }
+        request.source(JSON.toJSONString(entity), XContentType.JSON);
+        try {
+            client.index(request, RequestOptions.DEFAULT);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public void insertBatch(List<T> list) {
+        BulkRequest request = new BulkRequest();
+        list.forEach(item -> {
+            try {
+                request.add(new IndexRequest(index).id(getId.invoke(item, null).toString())
+                        .source(JSON.toJSONString(item), XContentType.JSON));
+            } catch (IllegalAccessException e) {
+                e.printStackTrace();
+            } catch (InvocationTargetException e) {
+                e.printStackTrace();
+            }
+        });
+        try {
+            client.bulk(request, RequestOptions.DEFAULT);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public void deleteBatch(List<Long> idList) {
+        BulkRequest request = new BulkRequest();
+        idList.forEach(item -> request.add(new DeleteRequest(index, item.toString())));
+        try {
+            client.bulk(request, RequestOptions.DEFAULT);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public List<T> search(SearchSourceBuilder builder) {
+        SearchRequest request = new SearchRequest(index);
+        request.source(builder);
+        try {
+            SearchResponse response = client.search(request, RequestOptions.DEFAULT);
+            SearchHit[] hits = response.getHits().getHits();
+            List<T> res = new ArrayList<>(hits.length);
+            for (SearchHit hit : hits) {
+                res.add(JSON.parseObject(hit.getSourceAsString(), entity));
+            }
+            return res;
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public void deleteIndex() {
+        try {
+            client.indices().delete(new DeleteIndexRequest(index), RequestOptions.DEFAULT);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public void deleteByQuery(QueryBuilder builder) {
+        DeleteByQueryRequest request = new DeleteByQueryRequest(index);
+        request.setQuery(builder);
+        request.setBatchSize(10000);
+        request.setConflicts("proceed");
+        try {
+            client.deleteByQuery(request, RequestOptions.DEFAULT);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    protected EsQueryBuilder esLambdaQuery() {
+        return new EsQueryBuilder();
+    }
+
+    @Data
+    protected class EsQueryBuilder {
+
+        private SearchSourceBuilder searchSourceBuilder;
+
+        private BoolQueryBuilder boolQueryBuilder;
+
+        private EsQueryBuilder() {
+            if (this.searchSourceBuilder == null) {
+                this.searchSourceBuilder = new SearchSourceBuilder();
+            }
+            if (this.boolQueryBuilder == null) {
+                this.boolQueryBuilder = QueryBuilders.boolQuery();
+            }
+        }
+
+        public EsQueryBuilder eq(GFunction<? extends T, Object> gFunction, Object value) {
+            String field = gFunction.field();
+            this.searchSourceBuilder.postFilter(QueryBuilders.termQuery(field, value));
+            this.boolQueryBuilder.filter(QueryBuilders.termQuery(field, value));
+            return this;
+        }
+
+        public EsQueryBuilder notEq(GFunction<? extends T, Object> gFunction, Object value) {
+            String field = gFunction.field();
+            this.searchSourceBuilder.postFilter(QueryBuilders.boolQuery().mustNot(QueryBuilders.termQuery(field, value)));
+            this.boolQueryBuilder.mustNot(QueryBuilders.termQuery(field, value));
+            return this;
+        }
+
+        public EsQueryBuilder in(GFunction<? extends T, Object> gFunction, Object... values) {
+            String field = gFunction.field();
+            BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
+            for (Object value : values) {
+                boolQueryBuilder.should(QueryBuilders.termQuery(field, value));
+                this.boolQueryBuilder.should(QueryBuilders.termQuery(field, value));
+            }
+            this.searchSourceBuilder.postFilter(boolQueryBuilder);
+            return this;
+        }
+
+        public EsQueryBuilder notIn(GFunction<? extends T, Object> gFunction, Object... values) {
+            String field = gFunction.field();
+            BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
+            for (Object value : values) {
+                boolQueryBuilder.mustNot(QueryBuilders.termQuery(field, value));
+                this.boolQueryBuilder.mustNot(QueryBuilders.termQuery(field, value));
+            }
+            this.searchSourceBuilder.postFilter(boolQueryBuilder);
+            return this;
+        }
+
+        public EsQueryBuilder between(GFunction<? extends T, Object> gFunction, Object begin, Object end) {
+            String field = gFunction.field();
+            this.searchSourceBuilder.postFilter(QueryBuilders.boolQuery().filter(QueryBuilders.rangeQuery(field).from(begin).to(end)));
+            this.boolQueryBuilder.filter(QueryBuilders.rangeQuery(field).from(begin).to(end));
+            return this;
+        }
+
+        public EsQueryBuilder notBetween(GFunction<? extends T, Object> gFunction, Object begin, Object end) {
+            String field = gFunction.field();
+            this.searchSourceBuilder.postFilter(QueryBuilders.boolQuery().mustNot(QueryBuilders.rangeQuery(field).from(begin).to(end)));
+            this.boolQueryBuilder.mustNot(QueryBuilders.rangeQuery(field).from(begin).to(end));
+            return this;
+        }
+
+        public EsQueryBuilder gt(GFunction<? extends T, Object> gFunction, Object value) {
+            String field = gFunction.field();
+            this.searchSourceBuilder.postFilter(QueryBuilders.rangeQuery(field).gt(value));
+            this.boolQueryBuilder.filter(QueryBuilders.rangeQuery(field).gt(value));
+            return this;
+        }
+
+        public EsQueryBuilder lt(GFunction<? extends T, Object> gFunction, Object value) {
+            String field = gFunction.field();
+            this.searchSourceBuilder.postFilter(QueryBuilders.rangeQuery(field).lt(value));
+            this.boolQueryBuilder.filter(QueryBuilders.rangeQuery(field).lt(value));
+            return this;
+        }
+
+        public EsQueryBuilder ge(GFunction<? extends T, Object> gFunction, Object value) {
+            String field = gFunction.field();
+            this.searchSourceBuilder.postFilter(QueryBuilders.rangeQuery(field).gte(value));
+            this.boolQueryBuilder.filter(QueryBuilders.rangeQuery(field).gte(value));
+            return this;
+        }
+
+        public EsQueryBuilder le(GFunction<? extends T, Object> gFunction, Object value) {
+            String field = gFunction.field();
+            this.searchSourceBuilder.postFilter(QueryBuilders.rangeQuery(field).lte(value));
+            this.boolQueryBuilder.filter(QueryBuilders.rangeQuery(field).lte(value));
+            return this;
+        }
+
+        public EsQueryBuilder sort(GFunction<? extends T, Object> gFunction, SortOrder value) {
+            this.searchSourceBuilder.sort(gFunction.field(), value);
+            return this;
+        }
+
+        public EsQueryBuilder page(Integer pageNo, Integer pageSize) {
+            pageNo = (pageNo - 1) * pageSize;
+            this.searchSourceBuilder.from(pageNo).size(pageSize);
+            return this;
+        }
+
+        public EsQueryBuilder matchAll(GFunction<? extends T, Object> gFunction, Object... values) {
+            BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
+            String field = gFunction.field();
+            for (Object value : values) {
+                boolQueryBuilder.filter(QueryBuilders.matchPhrasePrefixQuery(field, value));
+                this.boolQueryBuilder.filter(QueryBuilders.matchPhrasePrefixQuery(field, value));
+            }
+            this.searchSourceBuilder.postFilter(boolQueryBuilder);
+            return this;
+        }
+
+        public EsQueryBuilder matchOne(GFunction<? extends T, Object> gFunction, Object... values) {
+            BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
+            String field = gFunction.field();
+            for (Object value : values) {
+                boolQueryBuilder.should(QueryBuilders.matchPhrasePrefixQuery(field, value));
+                this.boolQueryBuilder.should(QueryBuilders.matchPhrasePrefixQuery(field, value));
+            }
+            this.searchSourceBuilder.postFilter(boolQueryBuilder);
+            return this;
+        }
+
+        public EsQueryBuilder notMatch(GFunction<? extends T, Object> gFunction, Object value) {
+            String field = gFunction.field();
+            this.boolQueryBuilder.mustNot(QueryBuilders.matchPhrasePrefixQuery(field, value));
+            this.searchSourceBuilder.postFilter(QueryBuilders.boolQuery().mustNot(QueryBuilders.matchPhrasePrefixQuery(field, value)));
+            return this;
+        }
+
+        public EsQueryBuilder fuzzyAll(GFunction<? extends T, Object> gFunction, Fuzziness fuzziness, Object... values) {
+            String field = gFunction.field();
+            for (Object value : values) {
+                this.searchSourceBuilder.postFilter(QueryBuilders.fuzzyQuery(field, value).fuzziness(fuzziness));
+                this.boolQueryBuilder.filter(QueryBuilders.fuzzyQuery(field, value).fuzziness(fuzziness));
+            }
+            return this;
+        }
+
+        public EsQueryBuilder fuzzyOne(GFunction<? extends T, Object> gFunction, Fuzziness fuzziness, Object... values) {
+            String field = gFunction.field();
+            BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
+            for (Object value : values) {
+                boolQueryBuilder.should(QueryBuilders.fuzzyQuery(field, value).fuzziness(fuzziness));
+                this.boolQueryBuilder.should(QueryBuilders.fuzzyQuery(field, value).fuzziness(fuzziness));
+            }
+            this.searchSourceBuilder.postFilter(boolQueryBuilder);
+            return this;
+        }
+
+        public EsQueryBuilder notFuzzy(GFunction<? extends T, Object> gFunction, Fuzziness fuzziness, Object value) {
+            String field = gFunction.field();
+            this.boolQueryBuilder.mustNot(QueryBuilders.fuzzyQuery(field, value).fuzziness(fuzziness));
+            this.searchSourceBuilder.postFilter(QueryBuilders.boolQuery().mustNot(QueryBuilders.fuzzyQuery(field, value).fuzziness(fuzziness)));
+            return this;
+        }
+
+        public EsQueryBuilder isNull(GFunction<? extends T, Object> gFunction) {
+            String field = gFunction.field();
+            this.boolQueryBuilder.filter(QueryBuilders.boolQuery().mustNot(QueryBuilders.existsQuery(field)));
+            this.searchSourceBuilder.postFilter(QueryBuilders.boolQuery().mustNot(QueryBuilders.existsQuery(field)));
+            return this;
+        }
+
+        public EsQueryBuilder isNotNull(GFunction<? extends T, Object> gFunction) {
+            String field = gFunction.field();
+            this.boolQueryBuilder.filter(QueryBuilders.existsQuery(field));
+            this.searchSourceBuilder.postFilter(QueryBuilders.existsQuery(field));
+            return this;
+        }
+
+        public List<T> query() {
+            return search(this.searchSourceBuilder);
+        }
+
+        public void delete() {
+            deleteByQuery(this.boolQueryBuilder);
+        }
+
+    }
+
+}
diff --git a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/mongodb/config/MongoConverterConfig.java b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/mongodb/config/MongoConverterConfig.java
index 9832135..960d489 100644
--- a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/mongodb/config/MongoConverterConfig.java
+++ b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/mongodb/config/MongoConverterConfig.java
@@ -1,36 +1,36 @@
-package com.ruoyi.biemo.mongodb.config;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.data.mongodb.MongoDatabaseFactory;
-import org.springframework.data.mongodb.core.convert.DbRefResolver;
-import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver;
-import org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper;
-import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
-import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
-
-/**
- * 配置去掉_class字段
- *
- * @author 陈钇蒙
- *
- */
-@Configuration
-public class MongoConverterConfig {
-	@Autowired
-	private MongoDatabaseFactory mongoDatabaseFactory;
-
-	@Autowired
-	private MongoMappingContext mongoMappingContext;
-
-	@Bean
-	public MappingMongoConverter mappingMongoConverter() {
-		DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoDatabaseFactory);
-		MappingMongoConverter converter = new MappingMongoConverter(dbRefResolver, mongoMappingContext);
-		// 此处是去除插入数据库的 _class 字段
-		converter.setTypeMapper(new DefaultMongoTypeMapper(null));
-
-		return converter;
-	}
-}
+//package com.ruoyi.biemo.mongodb.config;
+//
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.context.annotation.Bean;
+//import org.springframework.context.annotation.Configuration;
+//import org.springframework.data.mongodb.MongoDatabaseFactory;
+//import org.springframework.data.mongodb.core.convert.DbRefResolver;
+//import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver;
+//import org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper;
+//import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
+//import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
+//
+///**
+// * 配置去掉_class字段
+// *
+// * @author 陈钇蒙
+// *
+// */
+//@Configuration
+//public class MongoConverterConfig {
+//	@Autowired
+//	private MongoDatabaseFactory mongoDatabaseFactory;
+//
+//	@Autowired
+//	private MongoMappingContext mongoMappingContext;
+//
+//	@Bean
+//	public MappingMongoConverter mappingMongoConverter() {
+//		DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoDatabaseFactory);
+//		MappingMongoConverter converter = new MappingMongoConverter(dbRefResolver, mongoMappingContext);
+//		// 此处是去除插入数据库的 _class 字段
+//		converter.setTypeMapper(new DefaultMongoTypeMapper(null));
+//
+//		return converter;
+//	}
+//}
diff --git a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/mongodb/config/ScanNewField.java b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/mongodb/config/ScanNewField.java
index 7612ef9..35ae542 100644
--- a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/mongodb/config/ScanNewField.java
+++ b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/mongodb/config/ScanNewField.java
@@ -1,120 +1,120 @@
-package com.ruoyi.biemo.mongodb.config;
-
-import java.lang.reflect.Field;
-import java.util.Set;
-
-import javax.annotation.PostConstruct;
-
-import com.ruoyi.biemo.mongodb.bean.IgnoreDocument;
-import com.ruoyi.biemo.mongodb.bean.InitValue;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.mongodb.core.MongoTemplate;
-import org.springframework.data.mongodb.core.index.IndexOperations;
-import org.springframework.data.mongodb.core.index.IndexResolver;
-import org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexResolver;
-import org.springframework.data.mongodb.core.mapping.Document;
-import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
-import org.springframework.data.mongodb.core.query.Criteria;
-import org.springframework.data.mongodb.core.query.Query;
-import org.springframework.data.mongodb.core.query.Update;
-import org.springframework.stereotype.Service;
-
-import com.mongodb.client.result.UpdateResult;
-
-import com.ruoyi.biemo.mongodb.utils.PackageUtil;
-import cn.hutool.core.util.ClassUtil;
-import cn.hutool.core.util.ReflectUtil;
-
-/**
- * 启动时将表初始化
- *
- */
-@Service
-public class ScanNewField {
-	@Autowired
-	PackageUtil packageUtil;
-	// 写链接(写到主库,可使用事务)
-	@Autowired
-	private MongoTemplate mongoTemplate;
-
-	@Autowired
-	MongoMappingContext mongoMappingContext;
-
-	@PostConstruct
-	public void scan() {
-		// 找到主程序包
-		Set<Class<?>> set = ClassUtil.scanPackage(packageUtil.getMainPackage());
-		for (Class<?> clazz : set) {
-			IgnoreDocument ignoreDocument = clazz.getAnnotation(IgnoreDocument.class);
-			if (ignoreDocument != null) {
-				continue;
-			}
-
-			Document document = clazz.getAnnotation(Document.class);
-			if (document == null) {
-				continue;
-			}
-
-			// 创建表
-			if (!mongoTemplate.collectionExists(clazz)) {
-				mongoTemplate.createCollection(clazz);
-				System.out.println("创建了" + clazz.getSimpleName() + "表");
-			}
-
-			// 创建索引
-			IndexOperations indexOps = mongoTemplate.indexOps(clazz);
-			IndexResolver resolver = new MongoPersistentEntityIndexResolver(mongoMappingContext);
-			resolver.resolveIndexFor(clazz).forEach(indexOps::ensureIndex);
-
-			Field[] fields = ReflectUtil.getFields(clazz);
-			for (Field field : fields) {
-				// 获取注解
-				if (field.isAnnotationPresent(InitValue.class)) {
-					InitValue initValue = field.getAnnotation(InitValue.class);
-					if (initValue.value() != null) {
-
-						// 更新表默认值
-						Query query = new Query();
-						query.addCriteria(Criteria.where(field.getName()).is(null));
-
-						Long count = mongoTemplate.count(query, clazz);
-						if (count > 0) {
-							Object value = null;
-							Class<?> type = field.getType();
-
-							if (type.equals(String.class)) {
-								value = initValue.value();
-							}
-							if (type.equals(Short.class)) {
-								value = Short.parseShort(initValue.value());
-							}
-							if (type.equals(Integer.class)) {
-								value = Integer.parseInt(initValue.value());
-							}
-							if (type.equals(Long.class)) {
-								value =  Long.parseLong(initValue.value());
-							}
-							if (type.equals(Float.class)) {
-								value =  Float.parseFloat(initValue.value());
-							}
-							if (type.equals(Double.class)) {
-								value = Double.parseDouble(initValue.value());
-							}
-							if (type.equals(Boolean.class)) {
-								value =  Boolean.parseBoolean(initValue.value());
-							}
-
-							Update update = new Update().set(field.getName(), value);
-							UpdateResult updateResult = mongoTemplate.updateMulti(query, update, clazz);
-
-							System.out.println(clazz.getSimpleName() + "表更新了" + updateResult.getModifiedCount() + "条默认值");
-						}
-					}
-				}
-
-			}
-
-		}
-	}
-
-}
+//package com.ruoyi.biemo.mongodb.config;
+//
+//import java.lang.reflect.Field;
+//import java.util.Set;
+//
+//import javax.annotation.PostConstruct;
+//
+//import com.ruoyi.biemo.mongodb.bean.IgnoreDocument;
+//import com.ruoyi.biemo.mongodb.bean.InitValue;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.data.mongodb.core.MongoTemplate;
+//import org.springframework.data.mongodb.core.index.IndexOperations;
+//import org.springframework.data.mongodb.core.index.IndexResolver;
+//import org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexResolver;
+//import org.springframework.data.mongodb.core.mapping.Document;
+//import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
+//import org.springframework.data.mongodb.core.query.Criteria;
+//import org.springframework.data.mongodb.core.query.Query;
+//import org.springframework.data.mongodb.core.query.Update;
+//import org.springframework.stereotype.Service;
+//
+//import com.mongodb.client.result.UpdateResult;
+//
+//import com.ruoyi.biemo.mongodb.utils.PackageUtil;
+//import cn.hutool.core.util.ClassUtil;
+//import cn.hutool.core.util.ReflectUtil;
+//
+///**
+// * 启动时将表初始化
+// *
+// */
+//@Service
+//public class ScanNewField {
+//	@Autowired
+//	PackageUtil packageUtil;
+//	// 写链接(写到主库,可使用事务)
+//	@Autowired
+//	private MongoTemplate mongoTemplate;
+//
+//	@Autowired
+//	MongoMappingContext mongoMappingContext;
+//
+//	@PostConstruct
+//	public void scan() {
+//		// 找到主程序包
+//		Set<Class<?>> set = ClassUtil.scanPackage(packageUtil.getMainPackage());
+//		for (Class<?> clazz : set) {
+//			IgnoreDocument ignoreDocument = clazz.getAnnotation(IgnoreDocument.class);
+//			if (ignoreDocument != null) {
+//				continue;
+//			}
+//
+//			Document document = clazz.getAnnotation(Document.class);
+//			if (document == null) {
+//				continue;
+//			}
+//
+//			// 创建表
+//			if (!mongoTemplate.collectionExists(clazz)) {
+//				mongoTemplate.createCollection(clazz);
+//				System.out.println("创建了" + clazz.getSimpleName() + "表");
+//			}
+//
+//			// 创建索引
+//			IndexOperations indexOps = mongoTemplate.indexOps(clazz);
+//			IndexResolver resolver = new MongoPersistentEntityIndexResolver(mongoMappingContext);
+//			resolver.resolveIndexFor(clazz).forEach(indexOps::ensureIndex);
+//
+//			Field[] fields = ReflectUtil.getFields(clazz);
+//			for (Field field : fields) {
+//				// 获取注解
+//				if (field.isAnnotationPresent(InitValue.class)) {
+//					InitValue initValue = field.getAnnotation(InitValue.class);
+//					if (initValue.value() != null) {
+//
+//						// 更新表默认值
+//						Query query = new Query();
+//						query.addCriteria(Criteria.where(field.getName()).is(null));
+//
+//						Long count = mongoTemplate.count(query, clazz);
+//						if (count > 0) {
+//							Object value = null;
+//							Class<?> type = field.getType();
+//
+//							if (type.equals(String.class)) {
+//								value = initValue.value();
+//							}
+//							if (type.equals(Short.class)) {
+//								value = Short.parseShort(initValue.value());
+//							}
+//							if (type.equals(Integer.class)) {
+//								value = Integer.parseInt(initValue.value());
+//							}
+//							if (type.equals(Long.class)) {
+//								value =  Long.parseLong(initValue.value());
+//							}
+//							if (type.equals(Float.class)) {
+//								value =  Float.parseFloat(initValue.value());
+//							}
+//							if (type.equals(Double.class)) {
+//								value = Double.parseDouble(initValue.value());
+//							}
+//							if (type.equals(Boolean.class)) {
+//								value =  Boolean.parseBoolean(initValue.value());
+//							}
+//
+//							Update update = new Update().set(field.getName(), value);
+//							UpdateResult updateResult = mongoTemplate.updateMulti(query, update, clazz);
+//
+//							System.out.println(clazz.getSimpleName() + "表更新了" + updateResult.getModifiedCount() + "条默认值");
+//						}
+//					}
+//				}
+//
+//			}
+//
+//		}
+//	}
+//
+//}
diff --git a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/mongodb/utils/ImportExportUtil.java b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/mongodb/utils/ImportExportUtil.java
index 1309f97..c022292 100644
--- a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/mongodb/utils/ImportExportUtil.java
+++ b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/mongodb/utils/ImportExportUtil.java
@@ -1,137 +1,137 @@
-package com.ruoyi.biemo.mongodb.utils;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import com.ruoyi.biemo.mongodb.bean.Page;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.context.ApplicationContext;
-import org.springframework.data.mongodb.core.MongoTemplate;
-import org.springframework.data.mongodb.core.mapping.Document;
-import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
-import org.springframework.stereotype.Service;
-
-import cn.hutool.core.io.FileUtil;
-import cn.hutool.core.io.IoUtil;
-import cn.hutool.core.util.ClassUtil;
-import cn.hutool.core.util.StrUtil;
-import cn.hutool.core.util.ZipUtil;
-import cn.hutool.json.JSONArray;
-import cn.hutool.json.JSONObject;
-import cn.hutool.json.JSONUtil;
-
-/**
- * 数据库导入导出工具
- *
- */
-@Service
-public class ImportExportUtil {
-	// 写链接(写到主库,可使用事务)
-	@Autowired
-	private MongoTemplate mongoTemplate;
-
-	@Autowired
-	private MongoHelper mongoHelper;
-
-	@Autowired
-	PackageUtil packageUtil;
-	public void exportDb(String path) {
-		path = path.replace(".zip", "");
-		FileUtil.del(path);
-		FileUtil.del(path + ".zip");
-		try {
-
-			// 找到主程序包
-			Set<Class<?>> set = ClassUtil.scanPackage(packageUtil.getMainPackage());
-			Page page = new Page();
-			page.setLimit(1000);
-
-			for (Class<?> clazz : set) {
-				Document document = clazz.getAnnotation(Document.class);
-				if (document == null) {
-					continue;
-				}
-
-				page.setCurr(1);
-				while (true) {
-					page = mongoHelper.findPage(page, clazz);
-					if (page.getList().size() == 0) {
-						break;
-					}
-
-					List<String> lines = new ArrayList<String>();
-					for (Object object : page.getList()) {
-						lines.add(JSONUtil.toJsonStr(object));
-					}
-					FileUtil.appendLines(lines, path + File.separator + clazz.getSimpleName() + ".json", "UTF-8");
-					System.out.println(clazz.getSimpleName() + "表导出了" + page.getList().size() + "条数据");
-					page.setCurr(page.getCurr() + 1);
-				}
-			}
-			ZipUtil.zip(path);
-
-		} catch (Exception e) {
-			e.printStackTrace();
-			FileUtil.del(path + ".zip");
-		}
-
-		FileUtil.del(path);
-	}
-
-	public void importDb(String path) {
-		if (!FileUtil.exist(path)) {
-			System.out.println(path + "文件不存在");
-			return;
-		}
-		BufferedReader reader = null;
-
-		path = path.replace(".zip", "");
-		FileUtil.del(path);
-		ZipUtil.unzip(path + ".zip");
-		try {
-
-			// 找到主程序包
-			Set<Class<?>> set = ClassUtil.scanPackage(packageUtil.getMainPackage());
-			for (Class<?> clazz : set) {
-				Document document = clazz.getAnnotation(Document.class);
-				if (document == null) {
-					continue;
-				}
-
-				File file = new File(path + File.separator + clazz.getSimpleName() + ".json");
-				if (file.exists()) {
-					mongoTemplate.dropCollection(clazz);
-
-					reader = FileUtil.getReader(file, "UTF-8");
-					List<Object> list = new ArrayList<Object>();
-					while (true) {
-						String json = reader.readLine();
-						if (StrUtil.isEmpty(json)) {
-							mongoTemplate.insertAll(list);
-							System.out.println(clazz.getSimpleName() + "表导入了" + list.size() + "条数据");
-							list.clear();
-							break;
-						}
-						list.add(JSONUtil.toBean(json, clazz));
-						if (list.size() == 1000) {
-							mongoTemplate.insertAll(list);
-							System.out.println(clazz.getSimpleName() + "表导入了" + list.size() + "条数据");
-							list.clear();
-						}
-					}
-				}
-			}
-		} catch (Exception e) {
-			e.printStackTrace();
-		} finally {
-			IoUtil.close(reader);
-		}
-		FileUtil.del(path);
-	}
-}
+//package com.ruoyi.biemo.mongodb.utils;
+//
+//import java.io.BufferedReader;
+//import java.io.File;
+//import java.util.ArrayList;
+//import java.util.List;
+//import java.util.Map;
+//import java.util.Set;
+//
+//import com.ruoyi.biemo.mongodb.bean.Page;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.beans.factory.annotation.Value;
+//import org.springframework.boot.autoconfigure.SpringBootApplication;
+//import org.springframework.context.ApplicationContext;
+//import org.springframework.data.mongodb.core.MongoTemplate;
+//import org.springframework.data.mongodb.core.mapping.Document;
+//import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
+//import org.springframework.stereotype.Service;
+//
+//import cn.hutool.core.io.FileUtil;
+//import cn.hutool.core.io.IoUtil;
+//import cn.hutool.core.util.ClassUtil;
+//import cn.hutool.core.util.StrUtil;
+//import cn.hutool.core.util.ZipUtil;
+//import cn.hutool.json.JSONArray;
+//import cn.hutool.json.JSONObject;
+//import cn.hutool.json.JSONUtil;
+//
+///**
+// * 数据库导入导出工具
+// *
+// */
+//@Service
+//public class ImportExportUtil {
+//	// 写链接(写到主库,可使用事务)
+//	@Autowired
+//	private MongoTemplate mongoTemplate;
+//
+//	@Autowired
+//	private MongoHelper mongoHelper;
+//
+//	@Autowired
+//	PackageUtil packageUtil;
+//	public void exportDb(String path) {
+//		path = path.replace(".zip", "");
+//		FileUtil.del(path);
+//		FileUtil.del(path + ".zip");
+//		try {
+//
+//			// 找到主程序包
+//			Set<Class<?>> set = ClassUtil.scanPackage(packageUtil.getMainPackage());
+//			Page page = new Page();
+//			page.setLimit(1000);
+//
+//			for (Class<?> clazz : set) {
+//				Document document = clazz.getAnnotation(Document.class);
+//				if (document == null) {
+//					continue;
+//				}
+//
+//				page.setCurr(1);
+//				while (true) {
+//					page = mongoHelper.findPage(page, clazz);
+//					if (page.getList().size() == 0) {
+//						break;
+//					}
+//
+//					List<String> lines = new ArrayList<String>();
+//					for (Object object : page.getList()) {
+//						lines.add(JSONUtil.toJsonStr(object));
+//					}
+//					FileUtil.appendLines(lines, path + File.separator + clazz.getSimpleName() + ".json", "UTF-8");
+//					System.out.println(clazz.getSimpleName() + "表导出了" + page.getList().size() + "条数据");
+//					page.setCurr(page.getCurr() + 1);
+//				}
+//			}
+//			ZipUtil.zip(path);
+//
+//		} catch (Exception e) {
+//			e.printStackTrace();
+//			FileUtil.del(path + ".zip");
+//		}
+//
+//		FileUtil.del(path);
+//	}
+//
+//	public void importDb(String path) {
+//		if (!FileUtil.exist(path)) {
+//			System.out.println(path + "文件不存在");
+//			return;
+//		}
+//		BufferedReader reader = null;
+//
+//		path = path.replace(".zip", "");
+//		FileUtil.del(path);
+//		ZipUtil.unzip(path + ".zip");
+//		try {
+//
+//			// 找到主程序包
+//			Set<Class<?>> set = ClassUtil.scanPackage(packageUtil.getMainPackage());
+//			for (Class<?> clazz : set) {
+//				Document document = clazz.getAnnotation(Document.class);
+//				if (document == null) {
+//					continue;
+//				}
+//
+//				File file = new File(path + File.separator + clazz.getSimpleName() + ".json");
+//				if (file.exists()) {
+//					mongoTemplate.dropCollection(clazz);
+//
+//					reader = FileUtil.getReader(file, "UTF-8");
+//					List<Object> list = new ArrayList<Object>();
+//					while (true) {
+//						String json = reader.readLine();
+//						if (StrUtil.isEmpty(json)) {
+//							mongoTemplate.insertAll(list);
+//							System.out.println(clazz.getSimpleName() + "表导入了" + list.size() + "条数据");
+//							list.clear();
+//							break;
+//						}
+//						list.add(JSONUtil.toBean(json, clazz));
+//						if (list.size() == 1000) {
+//							mongoTemplate.insertAll(list);
+//							System.out.println(clazz.getSimpleName() + "表导入了" + list.size() + "条数据");
+//							list.clear();
+//						}
+//					}
+//				}
+//			}
+//		} catch (Exception e) {
+//			e.printStackTrace();
+//		} finally {
+//			IoUtil.close(reader);
+//		}
+//		FileUtil.del(path);
+//	}
+//}
diff --git a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/mongodb/utils/MongoHelper.java b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/mongodb/utils/MongoHelper.java
index a6f7be8..ec3dfd3 100644
--- a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/mongodb/utils/MongoHelper.java
+++ b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/mongodb/utils/MongoHelper.java
@@ -1,967 +1,967 @@
-package com.ruoyi.biemo.mongodb.utils;
-
-import java.lang.reflect.Field;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import javax.annotation.PostConstruct;
-
-import com.ruoyi.biemo.mongodb.bean.*;
-import com.ruoyi.biemo.mongodb.config.Constant;
-import com.ruoyi.biemo.mongodb.reflection.ReflectionUtil;
-import com.ruoyi.biemo.mongodb.reflection.SerializableFunction;
-import org.bson.Document;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.data.domain.Sort.Direction;
-import org.springframework.data.mongodb.core.MongoTemplate;
-import org.springframework.data.mongodb.core.convert.MongoConverter;
-import org.springframework.data.mongodb.core.convert.QueryMapper;
-import org.springframework.data.mongodb.core.convert.UpdateMapper;
-import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity;
-import org.springframework.data.mongodb.core.query.Query;
-import org.springframework.stereotype.Service;
-import cn.hutool.core.bean.BeanUtil;
-import cn.hutool.core.date.DateUtil;
-import cn.hutool.core.util.ReflectUtil;
-import cn.hutool.core.util.StrUtil;
-import cn.hutool.json.JSONObject;
-import cn.hutool.json.JSONUtil;
-
-/**
- * mongodb操作器
- *
- */
-@Service("mongoHelper")
-public class MongoHelper {
-	Logger logger = LoggerFactory.getLogger(this.getClass());
-
-	@Autowired
-	protected MongoConverter mongoConverter;
-
-	protected QueryMapper queryMapper;
-	protected UpdateMapper updateMapper;
-
-	@Autowired
-	protected MongoTemplate mongoTemplate;
-
-	public MongoTemplate getMongoTemplate() {
-		return mongoTemplate;
-	}
-
-	@Value("${spring.data.mongodb.print:false}")
-	protected Boolean print;
-
-	@Value("${spring.data.mongodb.slowQuery:false}")
-	protected Boolean slowQuery;
-
-	@Value("${spring.data.mongodb.slowTime:1000}")
-	protected Long slowTime;
-
-	@PostConstruct
-	public void init() {
-		queryMapper = new QueryMapper(mongoConverter);
-		updateMapper = new UpdateMapper(mongoConverter);
-	}
-
-	private void insertSlowQuery(String log, Long queryTime) {
-		if (slowQuery) {
-			SlowQuery slowQuery = new SlowQuery();
-			slowQuery.setQuery(log);
-			slowQuery.setTime(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
-			slowQuery.setQueryTime(queryTime);
-			slowQuery.setSystem(SystemTool.getSystem());
-			StackTraceElement stack[] = Thread.currentThread().getStackTrace();
-
-			// 保存堆栈
-			String stackStr = "";
-			for (int i = 0; i < stack.length; i++) {
-				stackStr += stack[i].getClassName() + "." + stack[i].getMethodName() + ":" + stack[i].getLineNumber() + "\n";
-			}
-			slowQuery.setStack(stackStr);
-
-			mongoTemplate.insert(slowQuery);
-		}
-	}
-
-	/**
-	 * 打印查询语句
-	 *
-	 * @param query
-	 */
-	private void logQuery(Class<?> clazz, Query query, Long startTime) {
-
-		MongoPersistentEntity<?> entity = mongoConverter.getMappingContext().getPersistentEntity(clazz);
-		Document mappedQuery = queryMapper.getMappedObject(query.getQueryObject(), entity);
-		Document mappedField = queryMapper.getMappedObject(query.getFieldsObject(), entity);
-		Document mappedSort = queryMapper.getMappedObject(query.getSortObject(), entity);
-
-		String log = "\ndb." + getCollectionName(clazz) + ".find(";
-
-		log += FormatUtils.bson(mappedQuery.toJson()) + ")";
-
-		if (!query.getFieldsObject().isEmpty()) {
-			log += ".projection(";
-			log += FormatUtils.bson(mappedField.toJson()) + ")";
-		}
-
-		if (query.isSorted()) {
-			log += ".sort(";
-			log += FormatUtils.bson(mappedSort.toJson()) + ")";
-		}
-
-		if (query.getLimit() != 0l) {
-			log += ".limit(" + query.getLimit() + ")";
-		}
-
-		if (query.getSkip() != 0l) {
-			log += ".skip(" + query.getSkip() + ")";
-		}
-		log += ";";
-
-		// 记录慢查询
-		Long queryTime = System.currentTimeMillis() - startTime;
-		if (queryTime > slowTime) {
-			insertSlowQuery(log, queryTime);
-		}
-		if (print) {
-			// 打印语句
-			logger.info(log + "\n执行时间:" + queryTime + "ms");
-		}
-
-	}
-
-	private String getCollectionName(Class<?> clazz) {
-		org.springframework.data.mongodb.core.mapping.Document document = clazz.getAnnotation(org.springframework.data.mongodb.core.mapping.Document.class);
-		if (document != null) {
-			if (StrUtil.isNotEmpty(document.value())) {
-				return document.value();
-			}
-			if (StrUtil.isNotEmpty(document.collection())) {
-				return document.collection();
-			}
-		}
-
-		return StrUtil.lowerFirst(clazz.getSimpleName());
-	}
-
-	/**
-	 * 打印查询语句
-	 *
-	 * @param query
-	 */
-	private void logCount(Class<?> clazz, Query query, Long startTime) {
-
-		MongoPersistentEntity<?> entity = mongoConverter.getMappingContext().getPersistentEntity(clazz);
-		Document mappedQuery = queryMapper.getMappedObject(query.getQueryObject(), entity);
-
-		String log = "\ndb." + getCollectionName(clazz) + ".find(";
-		log += FormatUtils.bson(mappedQuery.toJson()) + ")";
-		log += ".count();";
-
-		// 记录慢查询
-		Long queryTime = System.currentTimeMillis() - startTime;
-		if (queryTime > slowTime) {
-			insertSlowQuery(log, queryTime);
-		}
-		if (print) {
-			// 打印语句
-			logger.info(log + "\n执行时间:" + queryTime + "ms");
-		}
-
-	}
-
-	/**
-	 * 打印查询语句
-	 *
-	 * @param query
-	 */
-	private void logDelete(Class<?> clazz, Query query, Long startTime) {
-
-		MongoPersistentEntity<?> entity = mongoConverter.getMappingContext().getPersistentEntity(clazz);
-		Document mappedQuery = queryMapper.getMappedObject(query.getQueryObject(), entity);
-
-		String log = "\ndb." + getCollectionName(clazz) + ".remove(";
-		log += FormatUtils.bson(mappedQuery.toJson()) + ")";
-		log += ";";
-
-		// 记录慢查询
-		Long queryTime = System.currentTimeMillis() - startTime;
-		if (queryTime > slowTime) {
-			insertSlowQuery(log, queryTime);
-		}
-		if (print) {
-			// 打印语句
-			logger.info(log + "\n执行时间:" + queryTime + "ms");
-		}
-
-	}
-
-	/**
-	 * 打印查询语句
-	 *
-	 * @param query
-	 */
-	private void logUpdate(Class<?> clazz, Query query, UpdateBuilder updateBuilder, boolean multi, Long startTime) {
-
-		MongoPersistentEntity<?> entity = mongoConverter.getMappingContext().getPersistentEntity(clazz);
-		Document mappedQuery = queryMapper.getMappedObject(query.getQueryObject(), entity);
-		Document mappedUpdate = updateMapper.getMappedObject(updateBuilder.toUpdate().getUpdateObject(), entity);
-
-		String log = "\ndb." + getCollectionName(clazz) + ".update(";
-		log += FormatUtils.bson(mappedQuery.toJson()) + ",";
-		log += FormatUtils.bson(mappedUpdate.toJson()) + ",";
-		log += FormatUtils.bson("{multi:" + multi + "})");
-		log += ";";
-
-		// 记录慢查询
-		Long queryTime = System.currentTimeMillis() - startTime;
-		if (queryTime > slowTime) {
-			insertSlowQuery(log, queryTime);
-		}
-		if (print) {
-			// 打印语句
-			logger.info(log + "\n执行时间:" + queryTime + "ms");
-		}
-
-	}
-
-	/**
-	 * 打印查询语句
-	 *
-	 * @param object
-	 *
-	 * @param query
-	 */
-	private void logSave(Object object, Long startTime, Boolean isInsert) {
-		JSONObject jsonObject = JSONUtil.parseObj(object);
-
-		if (isInsert) {
-			jsonObject.remove(Constant.ID);
-		}
-
-		String log = "\ndb." + getCollectionName(object.getClass()) + ".save(";
-		log += JSONUtil.toJsonPrettyStr(jsonObject);
-		log += ");";
-
-		// 记录慢查询
-		Long queryTime = System.currentTimeMillis() - startTime;
-		if (queryTime > slowTime) {
-			insertSlowQuery(log, queryTime);
-		}
-		if (print) {
-			// 打印语句
-			logger.info(log + "\n执行时间:" + queryTime + "ms");
-		}
-	}
-
-	/**
-	 * 打印查询语句
-	 *
-	 * @param object
-	 *
-	 * @param query
-	 */
-	private void logSave(List<?> list, Long startTime) {
-		List<JSONObject> cloneList = new ArrayList<>();
-		for (Object item : list) {
-			JSONObject jsonObject = JSONUtil.parseObj(item);
-
-			jsonObject.remove(Constant.ID);
-			cloneList.add(jsonObject);
-		}
-
-		Object object = list.get(0);
-		String log = "\ndb." + getCollectionName(object.getClass()) + ".save(";
-		log += JSONUtil.toJsonPrettyStr(cloneList);
-		log += ");";
-
-		// 记录慢查询
-		Long queryTime = System.currentTimeMillis() - startTime;
-		if (queryTime > slowTime) {
-			insertSlowQuery(log, queryTime);
-		}
-		if (print) {
-			// 打印语句
-			logger.info(log + "\n执行时间:" + queryTime + "ms");
-		}
-	}
-
-	/**
-	 * 插入或更新
-	 *
-	 * @param object 对象
-	 */
-	public String insertOrUpdate(Object object) {
-
-		Long time = System.currentTimeMillis();
-		String id = (String) ReflectUtil.getFieldValue(object, Constant.ID);
-		Object objectOrg = StrUtil.isNotEmpty(id) ? findById(id, object.getClass()) : null;
-
-		if (objectOrg == null) {
-			// 插入
-			// 设置插入时间
-			setCreateTime(object, time);
-			// 设置更新时间
-			setUpdateTime(object, time);
-
-			// 设置默认值
-			setDefaultVaule(object);
-			// 去除id值
-			ReflectUtil.setFieldValue(object, Constant.ID, null);
-
-			// 克隆一个@IgnoreColumn的字段设为null的对象;
-			Object objectClone = BeanUtil.copyProperties(object, object.getClass());
-			ignoreColumn(objectClone);
-
-			mongoTemplate.save(objectClone);
-			id = (String) ReflectUtil.getFieldValue(objectClone, Constant.ID);
-
-			// 设置id值
-			ReflectUtil.setFieldValue(object, Constant.ID, id);
-
-			logSave(objectClone, time, true);
-
-		} else {
-			// 更新
-			Field[] fields = ReflectUtil.getFields(object.getClass());
-			// 拷贝属性
-			for (Field field : fields) {
-				if (!field.getName().equals(Constant.ID) && ReflectUtil.getFieldValue(object, field) != null) {
-					ReflectUtil.setFieldValue(objectOrg, field, ReflectUtil.getFieldValue(object, field));
-				}
-			}
-
-			// 设置更新时间
-			setUpdateTime(objectOrg, time);
-			// 克隆一个@IgnoreColumn的字段设为null的对象;
-			Object objectClone = BeanUtil.copyProperties(objectOrg, object.getClass());
-			ignoreColumn(objectClone);
-
-			mongoTemplate.save(objectClone);
-			logSave(objectClone, time, false);
-		}
-
-		return id;
-	}
-
-	/**
-	 * 插入
-	 *
-	 * @param object 对象
-	 */
-	public String insert(Object object) {
-		ReflectUtil.setFieldValue(object, Constant.ID, null);
-		insertOrUpdate(object);
-		return (String) ReflectUtil.getFieldValue(object, Constant.ID);
-	}
-
-	/**
-	 * 批量插入
-	 *
-	 * @param <T>
-	 *
-	 * @param object 对象
-	 */
-	public <T> void insertAll(List<T> list) {
-		Long time = System.currentTimeMillis();
-
-		List listClone = new ArrayList<>();
-		for (Object object : list) {
-
-			// 去除id以便插入
-			ReflectUtil.setFieldValue(object, Constant.ID, null);
-			// 设置插入时间
-			setCreateTime(object, time);
-			// 设置更新时间
-			setUpdateTime(object, time);
-			// 设置默认值
-			setDefaultVaule(object);
-			// 克隆一个@IgnoreColumn的字段设为null的对象;
-			Object objectClone = BeanUtil.copyProperties(object, object.getClass());
-			ignoreColumn(objectClone);
-			listClone.add(objectClone);
-		}
-
-		mongoTemplate.insertAll(listClone);
-		logSave(listClone, time);
-
-	}
-
-	/**
-	 * 设置更新时间
-	 *
-	 * @param object 对象
-	 */
-	private void setUpdateTime(Object object, Long time) {
-		Field[] fields = ReflectUtil.getFields(object.getClass());
-		for (Field field : fields) {
-			// 获取注解
-			if (field.isAnnotationPresent(UpdateTime.class) && field.getType().equals(Long.class)) {
-				ReflectUtil.setFieldValue(object, field, time);
-			}
-		}
-	}
-
-	/**
-	 * 设置创建时间
-	 *
-	 * @param object 对象
-	 */
-	private void setCreateTime(Object object, Long time) {
-		Field[] fields = ReflectUtil.getFields(object.getClass());
-		for (Field field : fields) {
-			// 获取注解
-			if (field.isAnnotationPresent(CreateTime.class) && field.getType().equals(Long.class)) {
-				ReflectUtil.setFieldValue(object, field, time);
-			}
-		}
-	}
-
-	/**
-	 * 将带有@IgnoreColumn的字段设为null;
-	 *
-	 * @param object 对象
-	 */
-	private void ignoreColumn(Object object) {
-		Field[] fields = ReflectUtil.getFields(object.getClass());
-		for (Field field : fields) {
-			// 获取注解
-			if (field.isAnnotationPresent(IgnoreColumn.class)) {
-				ReflectUtil.setFieldValue(object, field, null);
-			}
-		}
-	}
-
-	/**
-	 * 根据id更新
-	 *
-	 * @param object 对象
-	 */
-	public void updateById(Object object) {
-		if (StrUtil.isEmpty((String) ReflectUtil.getFieldValue(object, Constant.ID))) {
-			return;
-		}
-		if (findById((String) ReflectUtil.getFieldValue(object, Constant.ID), object.getClass()) == null) {
-			return;
-		}
-		insertOrUpdate(object);
-	}
-
-	/**
-	 * 根据id更新全部字段
-	 *
-	 * @param object 对象
-	 */
-	public void updateAllColumnById(Object object) {
-
-		if (StrUtil.isEmpty((String) ReflectUtil.getFieldValue(object, Constant.ID))) {
-			return;
-		}
-		if (findById((String) ReflectUtil.getFieldValue(object, Constant.ID), object.getClass()) == null) {
-			return;
-		}
-		Long time = System.currentTimeMillis();
-		setUpdateTime(object, time);
-		mongoTemplate.save(object);
-		logSave(object, time, false);
-	}
-
-	/**
-	 * 更新查到的第一项
-	 *
-	 * @param criteria 查询
-	 * @param update   更新
-	 * @param clazz    类
-	 */
-	public void updateFirst(CriteriaWrapper criteriaWrapper, UpdateBuilder updateBuilder, Class<?> clazz) {
-		Long time = System.currentTimeMillis();
-		Query query = new Query(criteriaWrapper.build());
-
-		mongoTemplate.updateFirst(query, updateBuilder.toUpdate(), clazz);
-		logUpdate(clazz, query, updateBuilder, false, time);
-	}
-
-	/**
-	 * 更新查到的全部项
-	 *
-	 * @param criteria 查询
-	 * @param update   更新
-	 * @param clazz    类
-	 */
-	public void updateMulti(CriteriaWrapper criteriaWrapper, UpdateBuilder updateBuilder, Class<?> clazz) {
-
-		Long time = System.currentTimeMillis();
-		Query query = new Query(criteriaWrapper.build());
-		mongoTemplate.updateMulti(new Query(criteriaWrapper.build()), updateBuilder.toUpdate(), clazz);
-		logUpdate(clazz, query, updateBuilder, true, time);
-	}
-
-	/**
-	 * 根据id删除
-	 *
-	 * @param id    对象
-	 * @param clazz 类
-	 */
-	public void deleteById(String id, Class<?> clazz) {
-
-		if (StrUtil.isEmpty(id)) {
-			return;
-		}
-		deleteByQuery(new CriteriaAndWrapper().eq(Constant::getId, id), clazz);
-	}
-
-	/**
-	 * 根据id删除
-	 *
-	 * @param id    对象
-	 * @param clazz 类
-	 */
-	public void deleteByIds(List<String> ids, Class<?> clazz) {
-
-		if (ids == null || ids.size() == 0) {
-			return;
-		}
-
-		deleteByQuery(new CriteriaAndWrapper().in(Constant::getId, ids), clazz);
-	}
-
-	/**
-	 * 根据条件删除
-	 *
-	 * @param criteria 查询
-	 * @param clazz    类
-	 */
-	public void deleteByQuery(CriteriaWrapper criteriaWrapper, Class<?> clazz) {
-		Long time = System.currentTimeMillis();
-		Query query = new Query(criteriaWrapper.build());
-		mongoTemplate.remove(query, clazz);
-		logDelete(clazz, query, time);
-	}
-
-	/**
-	 * 设置默认值
-	 *
-	 * @param object 对象
-	 */
-	private void setDefaultVaule(Object object) {
-		Field[] fields = ReflectUtil.getFields(object.getClass());
-		for (Field field : fields) {
-			// 获取注解
-			if (field.isAnnotationPresent(InitValue.class)) {
-				InitValue defaultValue = field.getAnnotation(InitValue.class);
-
-				String value = defaultValue.value();
-
-				if (ReflectUtil.getFieldValue(object, field) == null) {
-					// 获取字段类型
-					Class<?> type = field.getType();
-					if (type.equals(String.class)) {
-						ReflectUtil.setFieldValue(object, field, value);
-					}
-					if (type.equals(Short.class)) {
-						ReflectUtil.setFieldValue(object, field, Short.parseShort(value));
-					}
-					if (type.equals(Integer.class)) {
-						ReflectUtil.setFieldValue(object, field, Integer.parseInt(value));
-					}
-					if (type.equals(Long.class)) {
-						ReflectUtil.setFieldValue(object, field, Long.parseLong(value));
-					}
-					if (type.equals(Float.class)) {
-						ReflectUtil.setFieldValue(object, field, Float.parseFloat(value));
-					}
-					if (type.equals(Double.class)) {
-						ReflectUtil.setFieldValue(object, field, Double.parseDouble(value));
-					}
-					if (type.equals(Boolean.class)) {
-						ReflectUtil.setFieldValue(object, field, Boolean.parseBoolean(value));
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * 累加某一个字段的数量,原子操作
-	 *
-	 * @param object
-	 */
-	public <R, E> void addCountById(String id, SerializableFunction<E, R> property, Number count, Class<?> clazz) {
-		UpdateBuilder updateBuilder = new UpdateBuilder().inc(property, count);
-
-		updateFirst(new CriteriaAndWrapper().eq(Constant::getId, id), updateBuilder, clazz);
-	}
-
-	/**
-	 * 按查询条件获取Page
-	 *
-	 * @param criteria 查询
-	 * @param page     分页
-	 * @param clazz    类
-	 * @return Page 分页
-	 */
-	public <T> Page<T> findPage(CriteriaWrapper criteriaWrapper, Page<?> page, Class<T> clazz) {
-		SortBuilder sortBuilder = new SortBuilder(Constant::getId, Direction.DESC);
-		return findPage(criteriaWrapper, sortBuilder, page, clazz);
-	}
-
-	/**
-	 * 按查询条件获取Page
-	 *
-	 * @param criteria 查询
-	 * @param sort     排序
-	 * @param clazz    类
-	 * @return Page 分页
-	 */
-	public <T> Page<T> findPage(CriteriaWrapper criteriaWrapper, SortBuilder sortBuilder, Page<?> page, Class<T> clazz) {
-
-		Page<T> pageResp = new Page<T>();
-		pageResp.setCurr(page.getCurr());
-		pageResp.setLimit(page.getLimit());
-
-		// 查询出总条数
-		if (page.getQueryCount()) {
-			Long count = findCountByQuery(criteriaWrapper, clazz);
-			pageResp.setCount(count);
-		}
-
-		// 查询List
-		Query query = new Query(criteriaWrapper.build());
-		query.with(sortBuilder.toSort());
-		query.skip((page.getCurr() - 1) * page.getLimit());// 从那条记录开始
-		query.limit(page.getLimit());// 取多少条记录
-
-		Long systemTime = System.currentTimeMillis();
-		List<T> list = mongoTemplate.find(query, clazz);
-		logQuery(clazz, query, systemTime);
-
-		pageResp.setList(list);
-
-		return pageResp;
-	}
-
-	/**
-	 * 按查询条件获取Page
-	 *
-	 * @param criteria 查询
-	 * @param sort     排序
-	 * @param clazz    类
-	 * @return Page 分页
-	 */
-	public <T> Page<T> findPage(SortBuilder sortBuilder, Page<?> page, Class<T> clazz) {
-		return findPage(new CriteriaAndWrapper(), sortBuilder, page, clazz);
-	}
-
-	/**
-	 * 获取Page
-	 *
-	 * @param page  分页
-	 * @param clazz 类
-	 * @return Page 分页
-	 */
-	public <T> Page<T> findPage(Page<?> page, Class<T> clazz) {
-		return findPage(new CriteriaAndWrapper(), page, clazz);
-	}
-
-	/**
-	 * 根据id查找
-	 *
-	 * @param id    id
-	 * @param clazz 类
-	 * @return T 对象
-	 */
-	public <T> T findById(String id, Class<T> clazz) {
-
-		if (StrUtil.isEmpty(id)) {
-			return null;
-		}
-		Long systemTime = System.currentTimeMillis();
-
-		T t = (T) mongoTemplate.findById(id, clazz);
-
-		CriteriaAndWrapper criteriaAndWrapper = new CriteriaAndWrapper().eq(Constant::getId, id);
-		logQuery(clazz, new Query(criteriaAndWrapper.build()), systemTime);
-		return t;
-	}
-
-	/**
-	 * 根据条件查找单个
-	 *
-	 * @param <T>      类型
-	 * @param criteria
-	 * @param clazz    类
-	 * @return T 对象
-	 */
-	public <T> T findOneByQuery(CriteriaWrapper criteriaWrapper, Class<T> clazz) {
-		SortBuilder sortBuilder = new SortBuilder(Constant::getId, Direction.DESC);
-		return (T) findOneByQuery(criteriaWrapper, sortBuilder, clazz);
-	}
-
-	/**
-	 * 根据条件查找单个
-	 *
-	 * @param query 查询
-	 * @param clazz 类
-	 * @return T 对象
-	 */
-	public <T> T findOneByQuery(CriteriaWrapper criteriaWrapper, SortBuilder sortBuilder, Class<T> clazz) {
-
-		Query query = new Query(criteriaWrapper.build());
-		query.limit(1);
-		query.with(sortBuilder.toSort());
-
-		Long systemTime = System.currentTimeMillis();
-		T t = (T) mongoTemplate.findOne(query, clazz);
-		logQuery(clazz, query, systemTime);
-
-		return t;
-
-	}
-
-	/**
-	 * 根据条件查找单个
-	 *
-	 * @param query 查询
-	 * @param clazz 类
-	 * @return T 对象
-	 */
-	public <T> T findOneByQuery(SortBuilder sortBuilder, Class<T> clazz) {
-		return (T) findOneByQuery(new CriteriaAndWrapper(), sortBuilder, clazz);
-	}
-
-	/**
-	 * 根据条件查找List
-	 *
-	 * @param <T>      类型
-	 * @param criteria 查询
-	 * @param clazz    类
-	 * @return List 列表
-	 */
-	public <T> List<T> findListByQuery(CriteriaWrapper criteriaWrapper, Class<T> clazz) {
-		SortBuilder sortBuilder = new SortBuilder().add(Constant::getId, Direction.DESC);
-		return findListByQuery(criteriaWrapper, sortBuilder, clazz);
-
-	}
-
-	/**
-	 * 根据条件查找List
-	 *
-	 * @param <T>      类型
-	 * @param criteria 查询
-	 * @param sort     排序
-	 * @param clazz    类
-	 * @return List 列表
-	 */
-	public <T> List<T> findListByQuery(CriteriaWrapper criteriaWrapper, SortBuilder sortBuilder, Class<T> clazz) {
-		Query query = new Query(criteriaWrapper.build());
-		query.with(sortBuilder.toSort());
-
-		Long systemTime = System.currentTimeMillis();
-		List<T> list = mongoTemplate.find(query, clazz);
-		logQuery(clazz, query, systemTime);
-		return list;
-
-	}
-
-	/**
-	 * 根据条件查找某个属性
-	 *
-	 * @param <T>           类型
-	 * @param criteria      查询
-	 * @param documentClass 类
-	 * @param property      属性
-	 * @param propertyClass 属性类
-	 * @return List 列表
-	 */
-	public <T, R, E> List<T> findPropertiesByQuery(CriteriaWrapper criteriaWrapper, Class<?> documentClass, SerializableFunction<E, R> property, Class<T> propertyClass) {
-		Query query = new Query(criteriaWrapper.build());
-		query.fields().include(ReflectionUtil.getFieldName(property));
-
-		Long systemTime = System.currentTimeMillis();
-		List<?> list = mongoTemplate.find(query, documentClass);
-		logQuery(documentClass, query, systemTime);
-
-		List<T> propertyList = extractProperty(list, ReflectionUtil.getFieldName(property), propertyClass);
-		return propertyList;
-	}
-
-	/**
-	 * 根据条件查找某个属性
-	 *
-	 * @param <T>           类型
-	 * @param criteria      查询
-	 * @param documentClass 类
-	 * @param property      属性
-	 * @return List 列表
-	 */
-	public <R, E> List<String> findPropertiesByQuery(CriteriaWrapper criteriaWrapper, Class<?> documentClass, SerializableFunction<E, R> property) {
-		return findPropertiesByQuery(criteriaWrapper, documentClass, property, String.class);
-	}
-
-	/**
-	 * 根据id查找某个属性
-	 *
-	 * @param <T>           类型
-	 * @param criteria      查询
-	 * @param documentClass 类
-	 * @param property      属性
-	 * @return List 列表
-	 */
-	public <R, E> List<String> findPropertiesByIds(List<String> ids, Class<?> clazz, SerializableFunction<E, R> property) {
-		CriteriaAndWrapper criteriaAndWrapper = new CriteriaAndWrapper().in(Constant::getId, ids);
-		return findPropertiesByQuery(criteriaAndWrapper, clazz, property);
-	}
-
-	/**
-	 * 根据条件查找id
-	 *
-	 * @param criteria 查询
-	 * @param clazz    类
-	 * @return List 列表
-	 */
-	public List<String> findIdsByQuery(CriteriaWrapper criteriaWrapper, Class<?> clazz) {
-		return findPropertiesByQuery(criteriaWrapper, clazz, Constant::getId);
-	}
-
-	/**
-	 * 根据id集合查找
-	 *
-	 * @param List  ids id集合
-	 * @param clazz 类
-	 * @return List 列表
-	 */
-	public <T> List<T> findListByIds(Collection<String> ids, Class<T> clazz) {
-		CriteriaAndWrapper criteriaAndWrapper = new CriteriaAndWrapper().in(Constant::getId, ids);
-		return findListByQuery(criteriaAndWrapper, clazz);
-	}
-
-	/**
-	 * 根据id集合查找
-	 *
-	 * @param List  ids id集合
-	 * @param clazz 类
-	 * @return List 列表
-	 */
-	public <T> List<T> findListByIds(Collection<String> ids, SortBuilder sortBuilder, Class<T> clazz) {
-		CriteriaAndWrapper criteriaAndWrapper = new CriteriaAndWrapper().in(Constant::getId, ids);
-		return findListByQuery(criteriaAndWrapper, sortBuilder, clazz);
-	}
-
-	/**
-	 * 根据id集合查找
-	 *
-	 * @param Array ids id集合
-	 * @param clazz 类
-	 * @return List 列表
-	 */
-	public <T> List<T> findListByIds(String[] ids, SortBuilder sortBuilder, Class<T> clazz) {
-		return findListByIds(Arrays.asList(ids), sortBuilder, clazz);
-	}
-
-	/**
-	 * 根据id集合查找
-	 *
-	 * @param Array ids id集合
-	 * @param clazz 类
-	 * @return List 列表
-	 */
-	public <T> List<T> findListByIds(String[] ids, Class<T> clazz) {
-		SortBuilder sortBuilder = new SortBuilder(Constant::getId, Direction.DESC);
-		return findListByIds(ids, sortBuilder, clazz);
-	}
-
-	/**
-	 * 查询全部
-	 *
-	 * @param <T>   类型
-	 * @param clazz 类
-	 * @return List 列表
-	 */
-	public <T> List<T> findAll(Class<T> clazz) {
-		SortBuilder sortBuilder = new SortBuilder(Constant::getId, Direction.DESC);
-		return findListByQuery(new CriteriaAndWrapper(), sortBuilder, clazz);
-	}
-
-	/**
-	 * 查询全部
-	 *
-	 * @param <T>   类型
-	 * @param clazz 类
-	 * @return List 列表
-	 */
-	public <T> List<T> findAll(SortBuilder sortBuilder, Class<T> clazz) {
-		return findListByQuery(new CriteriaAndWrapper(), sortBuilder, clazz);
-	}
-
-	/**
-	 * 查找全部的id
-	 *
-	 * @param clazz 类
-	 * @return List 列表
-	 */
-	public List<String> findAllIds(Class<?> clazz) {
-		return findIdsByQuery(new CriteriaAndWrapper(), clazz);
-	}
-
-	/**
-	 * 查找数量
-	 *
-	 * @param criteria 查询
-	 * @param clazz    类
-	 * @return Long 数量
-	 */
-	public Long findCountByQuery(CriteriaWrapper criteriaWrapper, Class<?> clazz) {
-		Long systemTime = System.currentTimeMillis();
-		Long count = null;
-
-		Query query = new Query(criteriaWrapper.build());
-		if (query.getQueryObject().isEmpty()) {
-			count = mongoTemplate.getCollection(mongoTemplate.getCollectionName(clazz)).estimatedDocumentCount();
-		} else {
-			count = mongoTemplate.count(query, clazz);
-		}
-
-		logCount(clazz, query, systemTime);
-		return count;
-	}
-
-	/**
-	 * 查找全部数量
-	 *
-	 * @param clazz 类
-	 * @return Long 数量
-	 */
-	public Long findAllCount(Class<?> clazz) {
-		return findCountByQuery(new CriteriaAndWrapper(), clazz);
-	}
-
-	/**
-	 * 获取list中对象某个属性,组成新的list
-	 *
-	 * @param list     列表
-	 * @param clazz    类
-	 * @param property 属性
-	 * @return List<T> 列表
-	 */
-	@SuppressWarnings("unchecked")
-	private <T> List<T> extractProperty(List<?> list, String property, Class<T> clazz) {
-		Set<T> rs = new HashSet<T>();
-		for (Object object : list) {
-			Object value = ReflectUtil.getFieldValue(object, property);
-			if (value != null && value.getClass().equals(clazz)) {
-				rs.add((T) value);
-			}
-		}
-
-		return new ArrayList<T>(rs);
-	}
-
-}
+//package com.ruoyi.biemo.mongodb.utils;
+//
+//import java.lang.reflect.Field;
+//import java.util.ArrayList;
+//import java.util.Arrays;
+//import java.util.Collection;
+//import java.util.Date;
+//import java.util.HashSet;
+//import java.util.List;
+//import java.util.Set;
+//
+//import javax.annotation.PostConstruct;
+//
+//import com.ruoyi.biemo.mongodb.bean.*;
+//import com.ruoyi.biemo.mongodb.config.Constant;
+//import com.ruoyi.biemo.mongodb.reflection.ReflectionUtil;
+//import com.ruoyi.biemo.mongodb.reflection.SerializableFunction;
+//import org.bson.Document;
+//import org.slf4j.Logger;
+//import org.slf4j.LoggerFactory;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.beans.factory.annotation.Value;
+//import org.springframework.data.domain.Sort.Direction;
+//import org.springframework.data.mongodb.core.MongoTemplate;
+//import org.springframework.data.mongodb.core.convert.MongoConverter;
+//import org.springframework.data.mongodb.core.convert.QueryMapper;
+//import org.springframework.data.mongodb.core.convert.UpdateMapper;
+//import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity;
+//import org.springframework.data.mongodb.core.query.Query;
+//import org.springframework.stereotype.Service;
+//import cn.hutool.core.bean.BeanUtil;
+//import cn.hutool.core.date.DateUtil;
+//import cn.hutool.core.util.ReflectUtil;
+//import cn.hutool.core.util.StrUtil;
+//import cn.hutool.json.JSONObject;
+//import cn.hutool.json.JSONUtil;
+//
+///**
+// * mongodb操作器
+// *
+// */
+//@Service("mongoHelper")
+//public class MongoHelper {
+//	Logger logger = LoggerFactory.getLogger(this.getClass());
+//
+//	@Autowired
+//	protected MongoConverter mongoConverter;
+//
+//	protected QueryMapper queryMapper;
+//	protected UpdateMapper updateMapper;
+//
+//	@Autowired
+//	protected MongoTemplate mongoTemplate;
+//
+//	public MongoTemplate getMongoTemplate() {
+//		return mongoTemplate;
+//	}
+//
+//	@Value("${spring.data.mongodb.print:false}")
+//	protected Boolean print;
+//
+//	@Value("${spring.data.mongodb.slowQuery:false}")
+//	protected Boolean slowQuery;
+//
+//	@Value("${spring.data.mongodb.slowTime:1000}")
+//	protected Long slowTime;
+//
+//	@PostConstruct
+//	public void init() {
+//		queryMapper = new QueryMapper(mongoConverter);
+//		updateMapper = new UpdateMapper(mongoConverter);
+//	}
+//
+//	private void insertSlowQuery(String log, Long queryTime) {
+//		if (slowQuery) {
+//			SlowQuery slowQuery = new SlowQuery();
+//			slowQuery.setQuery(log);
+//			slowQuery.setTime(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
+//			slowQuery.setQueryTime(queryTime);
+//			slowQuery.setSystem(SystemTool.getSystem());
+//			StackTraceElement stack[] = Thread.currentThread().getStackTrace();
+//
+//			// 保存堆栈
+//			String stackStr = "";
+//			for (int i = 0; i < stack.length; i++) {
+//				stackStr += stack[i].getClassName() + "." + stack[i].getMethodName() + ":" + stack[i].getLineNumber() + "\n";
+//			}
+//			slowQuery.setStack(stackStr);
+//
+//			mongoTemplate.insert(slowQuery);
+//		}
+//	}
+//
+//	/**
+//	 * 打印查询语句
+//	 *
+//	 * @param query
+//	 */
+//	private void logQuery(Class<?> clazz, Query query, Long startTime) {
+//
+//		MongoPersistentEntity<?> entity = mongoConverter.getMappingContext().getPersistentEntity(clazz);
+//		Document mappedQuery = queryMapper.getMappedObject(query.getQueryObject(), entity);
+//		Document mappedField = queryMapper.getMappedObject(query.getFieldsObject(), entity);
+//		Document mappedSort = queryMapper.getMappedObject(query.getSortObject(), entity);
+//
+//		String log = "\ndb." + getCollectionName(clazz) + ".find(";
+//
+//		log += FormatUtils.bson(mappedQuery.toJson()) + ")";
+//
+//		if (!query.getFieldsObject().isEmpty()) {
+//			log += ".projection(";
+//			log += FormatUtils.bson(mappedField.toJson()) + ")";
+//		}
+//
+//		if (query.isSorted()) {
+//			log += ".sort(";
+//			log += FormatUtils.bson(mappedSort.toJson()) + ")";
+//		}
+//
+//		if (query.getLimit() != 0l) {
+//			log += ".limit(" + query.getLimit() + ")";
+//		}
+//
+//		if (query.getSkip() != 0l) {
+//			log += ".skip(" + query.getSkip() + ")";
+//		}
+//		log += ";";
+//
+//		// 记录慢查询
+//		Long queryTime = System.currentTimeMillis() - startTime;
+//		if (queryTime > slowTime) {
+//			insertSlowQuery(log, queryTime);
+//		}
+//		if (print) {
+//			// 打印语句
+//			logger.info(log + "\n执行时间:" + queryTime + "ms");
+//		}
+//
+//	}
+//
+//	private String getCollectionName(Class<?> clazz) {
+//		org.springframework.data.mongodb.core.mapping.Document document = clazz.getAnnotation(org.springframework.data.mongodb.core.mapping.Document.class);
+//		if (document != null) {
+//			if (StrUtil.isNotEmpty(document.value())) {
+//				return document.value();
+//			}
+//			if (StrUtil.isNotEmpty(document.collection())) {
+//				return document.collection();
+//			}
+//		}
+//
+//		return StrUtil.lowerFirst(clazz.getSimpleName());
+//	}
+//
+//	/**
+//	 * 打印查询语句
+//	 *
+//	 * @param query
+//	 */
+//	private void logCount(Class<?> clazz, Query query, Long startTime) {
+//
+//		MongoPersistentEntity<?> entity = mongoConverter.getMappingContext().getPersistentEntity(clazz);
+//		Document mappedQuery = queryMapper.getMappedObject(query.getQueryObject(), entity);
+//
+//		String log = "\ndb." + getCollectionName(clazz) + ".find(";
+//		log += FormatUtils.bson(mappedQuery.toJson()) + ")";
+//		log += ".count();";
+//
+//		// 记录慢查询
+//		Long queryTime = System.currentTimeMillis() - startTime;
+//		if (queryTime > slowTime) {
+//			insertSlowQuery(log, queryTime);
+//		}
+//		if (print) {
+//			// 打印语句
+//			logger.info(log + "\n执行时间:" + queryTime + "ms");
+//		}
+//
+//	}
+//
+//	/**
+//	 * 打印查询语句
+//	 *
+//	 * @param query
+//	 */
+//	private void logDelete(Class<?> clazz, Query query, Long startTime) {
+//
+//		MongoPersistentEntity<?> entity = mongoConverter.getMappingContext().getPersistentEntity(clazz);
+//		Document mappedQuery = queryMapper.getMappedObject(query.getQueryObject(), entity);
+//
+//		String log = "\ndb." + getCollectionName(clazz) + ".remove(";
+//		log += FormatUtils.bson(mappedQuery.toJson()) + ")";
+//		log += ";";
+//
+//		// 记录慢查询
+//		Long queryTime = System.currentTimeMillis() - startTime;
+//		if (queryTime > slowTime) {
+//			insertSlowQuery(log, queryTime);
+//		}
+//		if (print) {
+//			// 打印语句
+//			logger.info(log + "\n执行时间:" + queryTime + "ms");
+//		}
+//
+//	}
+//
+//	/**
+//	 * 打印查询语句
+//	 *
+//	 * @param query
+//	 */
+//	private void logUpdate(Class<?> clazz, Query query, UpdateBuilder updateBuilder, boolean multi, Long startTime) {
+//
+//		MongoPersistentEntity<?> entity = mongoConverter.getMappingContext().getPersistentEntity(clazz);
+//		Document mappedQuery = queryMapper.getMappedObject(query.getQueryObject(), entity);
+//		Document mappedUpdate = updateMapper.getMappedObject(updateBuilder.toUpdate().getUpdateObject(), entity);
+//
+//		String log = "\ndb." + getCollectionName(clazz) + ".update(";
+//		log += FormatUtils.bson(mappedQuery.toJson()) + ",";
+//		log += FormatUtils.bson(mappedUpdate.toJson()) + ",";
+//		log += FormatUtils.bson("{multi:" + multi + "})");
+//		log += ";";
+//
+//		// 记录慢查询
+//		Long queryTime = System.currentTimeMillis() - startTime;
+//		if (queryTime > slowTime) {
+//			insertSlowQuery(log, queryTime);
+//		}
+//		if (print) {
+//			// 打印语句
+//			logger.info(log + "\n执行时间:" + queryTime + "ms");
+//		}
+//
+//	}
+//
+//	/**
+//	 * 打印查询语句
+//	 *
+//	 * @param object
+//	 *
+//	 * @param query
+//	 */
+//	private void logSave(Object object, Long startTime, Boolean isInsert) {
+//		JSONObject jsonObject = JSONUtil.parseObj(object);
+//
+//		if (isInsert) {
+//			jsonObject.remove(Constant.ID);
+//		}
+//
+//		String log = "\ndb." + getCollectionName(object.getClass()) + ".save(";
+//		log += JSONUtil.toJsonPrettyStr(jsonObject);
+//		log += ");";
+//
+//		// 记录慢查询
+//		Long queryTime = System.currentTimeMillis() - startTime;
+//		if (queryTime > slowTime) {
+//			insertSlowQuery(log, queryTime);
+//		}
+//		if (print) {
+//			// 打印语句
+//			logger.info(log + "\n执行时间:" + queryTime + "ms");
+//		}
+//	}
+//
+//	/**
+//	 * 打印查询语句
+//	 *
+//	 * @param object
+//	 *
+//	 * @param query
+//	 */
+//	private void logSave(List<?> list, Long startTime) {
+//		List<JSONObject> cloneList = new ArrayList<>();
+//		for (Object item : list) {
+//			JSONObject jsonObject = JSONUtil.parseObj(item);
+//
+//			jsonObject.remove(Constant.ID);
+//			cloneList.add(jsonObject);
+//		}
+//
+//		Object object = list.get(0);
+//		String log = "\ndb." + getCollectionName(object.getClass()) + ".save(";
+//		log += JSONUtil.toJsonPrettyStr(cloneList);
+//		log += ");";
+//
+//		// 记录慢查询
+//		Long queryTime = System.currentTimeMillis() - startTime;
+//		if (queryTime > slowTime) {
+//			insertSlowQuery(log, queryTime);
+//		}
+//		if (print) {
+//			// 打印语句
+//			logger.info(log + "\n执行时间:" + queryTime + "ms");
+//		}
+//	}
+//
+//	/**
+//	 * 插入或更新
+//	 *
+//	 * @param object 对象
+//	 */
+//	public String insertOrUpdate(Object object) {
+//
+//		Long time = System.currentTimeMillis();
+//		String id = (String) ReflectUtil.getFieldValue(object, Constant.ID);
+//		Object objectOrg = StrUtil.isNotEmpty(id) ? findById(id, object.getClass()) : null;
+//
+//		if (objectOrg == null) {
+//			// 插入
+//			// 设置插入时间
+//			setCreateTime(object, time);
+//			// 设置更新时间
+//			setUpdateTime(object, time);
+//
+//			// 设置默认值
+//			setDefaultVaule(object);
+//			// 去除id值
+//			ReflectUtil.setFieldValue(object, Constant.ID, null);
+//
+//			// 克隆一个@IgnoreColumn的字段设为null的对象;
+//			Object objectClone = BeanUtil.copyProperties(object, object.getClass());
+//			ignoreColumn(objectClone);
+//
+//			mongoTemplate.save(objectClone);
+//			id = (String) ReflectUtil.getFieldValue(objectClone, Constant.ID);
+//
+//			// 设置id值
+//			ReflectUtil.setFieldValue(object, Constant.ID, id);
+//
+//			logSave(objectClone, time, true);
+//
+//		} else {
+//			// 更新
+//			Field[] fields = ReflectUtil.getFields(object.getClass());
+//			// 拷贝属性
+//			for (Field field : fields) {
+//				if (!field.getName().equals(Constant.ID) && ReflectUtil.getFieldValue(object, field) != null) {
+//					ReflectUtil.setFieldValue(objectOrg, field, ReflectUtil.getFieldValue(object, field));
+//				}
+//			}
+//
+//			// 设置更新时间
+//			setUpdateTime(objectOrg, time);
+//			// 克隆一个@IgnoreColumn的字段设为null的对象;
+//			Object objectClone = BeanUtil.copyProperties(objectOrg, object.getClass());
+//			ignoreColumn(objectClone);
+//
+//			mongoTemplate.save(objectClone);
+//			logSave(objectClone, time, false);
+//		}
+//
+//		return id;
+//	}
+//
+//	/**
+//	 * 插入
+//	 *
+//	 * @param object 对象
+//	 */
+//	public String insert(Object object) {
+//		ReflectUtil.setFieldValue(object, Constant.ID, null);
+//		insertOrUpdate(object);
+//		return (String) ReflectUtil.getFieldValue(object, Constant.ID);
+//	}
+//
+//	/**
+//	 * 批量插入
+//	 *
+//	 * @param <T>
+//	 *
+//	 * @param object 对象
+//	 */
+//	public <T> void insertAll(List<T> list) {
+//		Long time = System.currentTimeMillis();
+//
+//		List listClone = new ArrayList<>();
+//		for (Object object : list) {
+//
+//			// 去除id以便插入
+//			ReflectUtil.setFieldValue(object, Constant.ID, null);
+//			// 设置插入时间
+//			setCreateTime(object, time);
+//			// 设置更新时间
+//			setUpdateTime(object, time);
+//			// 设置默认值
+//			setDefaultVaule(object);
+//			// 克隆一个@IgnoreColumn的字段设为null的对象;
+//			Object objectClone = BeanUtil.copyProperties(object, object.getClass());
+//			ignoreColumn(objectClone);
+//			listClone.add(objectClone);
+//		}
+//
+//		mongoTemplate.insertAll(listClone);
+//		logSave(listClone, time);
+//
+//	}
+//
+//	/**
+//	 * 设置更新时间
+//	 *
+//	 * @param object 对象
+//	 */
+//	private void setUpdateTime(Object object, Long time) {
+//		Field[] fields = ReflectUtil.getFields(object.getClass());
+//		for (Field field : fields) {
+//			// 获取注解
+//			if (field.isAnnotationPresent(UpdateTime.class) && field.getType().equals(Long.class)) {
+//				ReflectUtil.setFieldValue(object, field, time);
+//			}
+//		}
+//	}
+//
+//	/**
+//	 * 设置创建时间
+//	 *
+//	 * @param object 对象
+//	 */
+//	private void setCreateTime(Object object, Long time) {
+//		Field[] fields = ReflectUtil.getFields(object.getClass());
+//		for (Field field : fields) {
+//			// 获取注解
+//			if (field.isAnnotationPresent(CreateTime.class) && field.getType().equals(Long.class)) {
+//				ReflectUtil.setFieldValue(object, field, time);
+//			}
+//		}
+//	}
+//
+//	/**
+//	 * 将带有@IgnoreColumn的字段设为null;
+//	 *
+//	 * @param object 对象
+//	 */
+//	private void ignoreColumn(Object object) {
+//		Field[] fields = ReflectUtil.getFields(object.getClass());
+//		for (Field field : fields) {
+//			// 获取注解
+//			if (field.isAnnotationPresent(IgnoreColumn.class)) {
+//				ReflectUtil.setFieldValue(object, field, null);
+//			}
+//		}
+//	}
+//
+//	/**
+//	 * 根据id更新
+//	 *
+//	 * @param object 对象
+//	 */
+//	public void updateById(Object object) {
+//		if (StrUtil.isEmpty((String) ReflectUtil.getFieldValue(object, Constant.ID))) {
+//			return;
+//		}
+//		if (findById((String) ReflectUtil.getFieldValue(object, Constant.ID), object.getClass()) == null) {
+//			return;
+//		}
+//		insertOrUpdate(object);
+//	}
+//
+//	/**
+//	 * 根据id更新全部字段
+//	 *
+//	 * @param object 对象
+//	 */
+//	public void updateAllColumnById(Object object) {
+//
+//		if (StrUtil.isEmpty((String) ReflectUtil.getFieldValue(object, Constant.ID))) {
+//			return;
+//		}
+//		if (findById((String) ReflectUtil.getFieldValue(object, Constant.ID), object.getClass()) == null) {
+//			return;
+//		}
+//		Long time = System.currentTimeMillis();
+//		setUpdateTime(object, time);
+//		mongoTemplate.save(object);
+//		logSave(object, time, false);
+//	}
+//
+//	/**
+//	 * 更新查到的第一项
+//	 *
+//	 * @param criteria 查询
+//	 * @param update   更新
+//	 * @param clazz    类
+//	 */
+//	public void updateFirst(CriteriaWrapper criteriaWrapper, UpdateBuilder updateBuilder, Class<?> clazz) {
+//		Long time = System.currentTimeMillis();
+//		Query query = new Query(criteriaWrapper.build());
+//
+//		mongoTemplate.updateFirst(query, updateBuilder.toUpdate(), clazz);
+//		logUpdate(clazz, query, updateBuilder, false, time);
+//	}
+//
+//	/**
+//	 * 更新查到的全部项
+//	 *
+//	 * @param criteria 查询
+//	 * @param update   更新
+//	 * @param clazz    类
+//	 */
+//	public void updateMulti(CriteriaWrapper criteriaWrapper, UpdateBuilder updateBuilder, Class<?> clazz) {
+//
+//		Long time = System.currentTimeMillis();
+//		Query query = new Query(criteriaWrapper.build());
+//		mongoTemplate.updateMulti(new Query(criteriaWrapper.build()), updateBuilder.toUpdate(), clazz);
+//		logUpdate(clazz, query, updateBuilder, true, time);
+//	}
+//
+//	/**
+//	 * 根据id删除
+//	 *
+//	 * @param id    对象
+//	 * @param clazz 类
+//	 */
+//	public void deleteById(String id, Class<?> clazz) {
+//
+//		if (StrUtil.isEmpty(id)) {
+//			return;
+//		}
+//		deleteByQuery(new CriteriaAndWrapper().eq(Constant::getId, id), clazz);
+//	}
+//
+//	/**
+//	 * 根据id删除
+//	 *
+//	 * @param id    对象
+//	 * @param clazz 类
+//	 */
+//	public void deleteByIds(List<String> ids, Class<?> clazz) {
+//
+//		if (ids == null || ids.size() == 0) {
+//			return;
+//		}
+//
+//		deleteByQuery(new CriteriaAndWrapper().in(Constant::getId, ids), clazz);
+//	}
+//
+//	/**
+//	 * 根据条件删除
+//	 *
+//	 * @param criteria 查询
+//	 * @param clazz    类
+//	 */
+//	public void deleteByQuery(CriteriaWrapper criteriaWrapper, Class<?> clazz) {
+//		Long time = System.currentTimeMillis();
+//		Query query = new Query(criteriaWrapper.build());
+//		mongoTemplate.remove(query, clazz);
+//		logDelete(clazz, query, time);
+//	}
+//
+//	/**
+//	 * 设置默认值
+//	 *
+//	 * @param object 对象
+//	 */
+//	private void setDefaultVaule(Object object) {
+//		Field[] fields = ReflectUtil.getFields(object.getClass());
+//		for (Field field : fields) {
+//			// 获取注解
+//			if (field.isAnnotationPresent(InitValue.class)) {
+//				InitValue defaultValue = field.getAnnotation(InitValue.class);
+//
+//				String value = defaultValue.value();
+//
+//				if (ReflectUtil.getFieldValue(object, field) == null) {
+//					// 获取字段类型
+//					Class<?> type = field.getType();
+//					if (type.equals(String.class)) {
+//						ReflectUtil.setFieldValue(object, field, value);
+//					}
+//					if (type.equals(Short.class)) {
+//						ReflectUtil.setFieldValue(object, field, Short.parseShort(value));
+//					}
+//					if (type.equals(Integer.class)) {
+//						ReflectUtil.setFieldValue(object, field, Integer.parseInt(value));
+//					}
+//					if (type.equals(Long.class)) {
+//						ReflectUtil.setFieldValue(object, field, Long.parseLong(value));
+//					}
+//					if (type.equals(Float.class)) {
+//						ReflectUtil.setFieldValue(object, field, Float.parseFloat(value));
+//					}
+//					if (type.equals(Double.class)) {
+//						ReflectUtil.setFieldValue(object, field, Double.parseDouble(value));
+//					}
+//					if (type.equals(Boolean.class)) {
+//						ReflectUtil.setFieldValue(object, field, Boolean.parseBoolean(value));
+//					}
+//				}
+//			}
+//		}
+//	}
+//
+//	/**
+//	 * 累加某一个字段的数量,原子操作
+//	 *
+//	 * @param object
+//	 */
+//	public <R, E> void addCountById(String id, SerializableFunction<E, R> property, Number count, Class<?> clazz) {
+//		UpdateBuilder updateBuilder = new UpdateBuilder().inc(property, count);
+//
+//		updateFirst(new CriteriaAndWrapper().eq(Constant::getId, id), updateBuilder, clazz);
+//	}
+//
+//	/**
+//	 * 按查询条件获取Page
+//	 *
+//	 * @param criteria 查询
+//	 * @param page     分页
+//	 * @param clazz    类
+//	 * @return Page 分页
+//	 */
+//	public <T> Page<T> findPage(CriteriaWrapper criteriaWrapper, Page<?> page, Class<T> clazz) {
+//		SortBuilder sortBuilder = new SortBuilder(Constant::getId, Direction.DESC);
+//		return findPage(criteriaWrapper, sortBuilder, page, clazz);
+//	}
+//
+//	/**
+//	 * 按查询条件获取Page
+//	 *
+//	 * @param criteria 查询
+//	 * @param sort     排序
+//	 * @param clazz    类
+//	 * @return Page 分页
+//	 */
+//	public <T> Page<T> findPage(CriteriaWrapper criteriaWrapper, SortBuilder sortBuilder, Page<?> page, Class<T> clazz) {
+//
+//		Page<T> pageResp = new Page<T>();
+//		pageResp.setCurr(page.getCurr());
+//		pageResp.setLimit(page.getLimit());
+//
+//		// 查询出总条数
+//		if (page.getQueryCount()) {
+//			Long count = findCountByQuery(criteriaWrapper, clazz);
+//			pageResp.setCount(count);
+//		}
+//
+//		// 查询List
+//		Query query = new Query(criteriaWrapper.build());
+//		query.with(sortBuilder.toSort());
+//		query.skip((page.getCurr() - 1) * page.getLimit());// 从那条记录开始
+//		query.limit(page.getLimit());// 取多少条记录
+//
+//		Long systemTime = System.currentTimeMillis();
+//		List<T> list = mongoTemplate.find(query, clazz);
+//		logQuery(clazz, query, systemTime);
+//
+//		pageResp.setList(list);
+//
+//		return pageResp;
+//	}
+//
+//	/**
+//	 * 按查询条件获取Page
+//	 *
+//	 * @param criteria 查询
+//	 * @param sort     排序
+//	 * @param clazz    类
+//	 * @return Page 分页
+//	 */
+//	public <T> Page<T> findPage(SortBuilder sortBuilder, Page<?> page, Class<T> clazz) {
+//		return findPage(new CriteriaAndWrapper(), sortBuilder, page, clazz);
+//	}
+//
+//	/**
+//	 * 获取Page
+//	 *
+//	 * @param page  分页
+//	 * @param clazz 类
+//	 * @return Page 分页
+//	 */
+//	public <T> Page<T> findPage(Page<?> page, Class<T> clazz) {
+//		return findPage(new CriteriaAndWrapper(), page, clazz);
+//	}
+//
+//	/**
+//	 * 根据id查找
+//	 *
+//	 * @param id    id
+//	 * @param clazz 类
+//	 * @return T 对象
+//	 */
+//	public <T> T findById(String id, Class<T> clazz) {
+//
+//		if (StrUtil.isEmpty(id)) {
+//			return null;
+//		}
+//		Long systemTime = System.currentTimeMillis();
+//
+//		T t = (T) mongoTemplate.findById(id, clazz);
+//
+//		CriteriaAndWrapper criteriaAndWrapper = new CriteriaAndWrapper().eq(Constant::getId, id);
+//		logQuery(clazz, new Query(criteriaAndWrapper.build()), systemTime);
+//		return t;
+//	}
+//
+//	/**
+//	 * 根据条件查找单个
+//	 *
+//	 * @param <T>      类型
+//	 * @param criteria
+//	 * @param clazz    类
+//	 * @return T 对象
+//	 */
+//	public <T> T findOneByQuery(CriteriaWrapper criteriaWrapper, Class<T> clazz) {
+//		SortBuilder sortBuilder = new SortBuilder(Constant::getId, Direction.DESC);
+//		return (T) findOneByQuery(criteriaWrapper, sortBuilder, clazz);
+//	}
+//
+//	/**
+//	 * 根据条件查找单个
+//	 *
+//	 * @param query 查询
+//	 * @param clazz 类
+//	 * @return T 对象
+//	 */
+//	public <T> T findOneByQuery(CriteriaWrapper criteriaWrapper, SortBuilder sortBuilder, Class<T> clazz) {
+//
+//		Query query = new Query(criteriaWrapper.build());
+//		query.limit(1);
+//		query.with(sortBuilder.toSort());
+//
+//		Long systemTime = System.currentTimeMillis();
+//		T t = (T) mongoTemplate.findOne(query, clazz);
+//		logQuery(clazz, query, systemTime);
+//
+//		return t;
+//
+//	}
+//
+//	/**
+//	 * 根据条件查找单个
+//	 *
+//	 * @param query 查询
+//	 * @param clazz 类
+//	 * @return T 对象
+//	 */
+//	public <T> T findOneByQuery(SortBuilder sortBuilder, Class<T> clazz) {
+//		return (T) findOneByQuery(new CriteriaAndWrapper(), sortBuilder, clazz);
+//	}
+//
+//	/**
+//	 * 根据条件查找List
+//	 *
+//	 * @param <T>      类型
+//	 * @param criteria 查询
+//	 * @param clazz    类
+//	 * @return List 列表
+//	 */
+//	public <T> List<T> findListByQuery(CriteriaWrapper criteriaWrapper, Class<T> clazz) {
+//		SortBuilder sortBuilder = new SortBuilder().add(Constant::getId, Direction.DESC);
+//		return findListByQuery(criteriaWrapper, sortBuilder, clazz);
+//
+//	}
+//
+//	/**
+//	 * 根据条件查找List
+//	 *
+//	 * @param <T>      类型
+//	 * @param criteria 查询
+//	 * @param sort     排序
+//	 * @param clazz    类
+//	 * @return List 列表
+//	 */
+//	public <T> List<T> findListByQuery(CriteriaWrapper criteriaWrapper, SortBuilder sortBuilder, Class<T> clazz) {
+//		Query query = new Query(criteriaWrapper.build());
+//		query.with(sortBuilder.toSort());
+//
+//		Long systemTime = System.currentTimeMillis();
+//		List<T> list = mongoTemplate.find(query, clazz);
+//		logQuery(clazz, query, systemTime);
+//		return list;
+//
+//	}
+//
+//	/**
+//	 * 根据条件查找某个属性
+//	 *
+//	 * @param <T>           类型
+//	 * @param criteria      查询
+//	 * @param documentClass 类
+//	 * @param property      属性
+//	 * @param propertyClass 属性类
+//	 * @return List 列表
+//	 */
+//	public <T, R, E> List<T> findPropertiesByQuery(CriteriaWrapper criteriaWrapper, Class<?> documentClass, SerializableFunction<E, R> property, Class<T> propertyClass) {
+//		Query query = new Query(criteriaWrapper.build());
+//		query.fields().include(ReflectionUtil.getFieldName(property));
+//
+//		Long systemTime = System.currentTimeMillis();
+//		List<?> list = mongoTemplate.find(query, documentClass);
+//		logQuery(documentClass, query, systemTime);
+//
+//		List<T> propertyList = extractProperty(list, ReflectionUtil.getFieldName(property), propertyClass);
+//		return propertyList;
+//	}
+//
+//	/**
+//	 * 根据条件查找某个属性
+//	 *
+//	 * @param <T>           类型
+//	 * @param criteria      查询
+//	 * @param documentClass 类
+//	 * @param property      属性
+//	 * @return List 列表
+//	 */
+//	public <R, E> List<String> findPropertiesByQuery(CriteriaWrapper criteriaWrapper, Class<?> documentClass, SerializableFunction<E, R> property) {
+//		return findPropertiesByQuery(criteriaWrapper, documentClass, property, String.class);
+//	}
+//
+//	/**
+//	 * 根据id查找某个属性
+//	 *
+//	 * @param <T>           类型
+//	 * @param criteria      查询
+//	 * @param documentClass 类
+//	 * @param property      属性
+//	 * @return List 列表
+//	 */
+//	public <R, E> List<String> findPropertiesByIds(List<String> ids, Class<?> clazz, SerializableFunction<E, R> property) {
+//		CriteriaAndWrapper criteriaAndWrapper = new CriteriaAndWrapper().in(Constant::getId, ids);
+//		return findPropertiesByQuery(criteriaAndWrapper, clazz, property);
+//	}
+//
+//	/**
+//	 * 根据条件查找id
+//	 *
+//	 * @param criteria 查询
+//	 * @param clazz    类
+//	 * @return List 列表
+//	 */
+//	public List<String> findIdsByQuery(CriteriaWrapper criteriaWrapper, Class<?> clazz) {
+//		return findPropertiesByQuery(criteriaWrapper, clazz, Constant::getId);
+//	}
+//
+//	/**
+//	 * 根据id集合查找
+//	 *
+//	 * @param List  ids id集合
+//	 * @param clazz 类
+//	 * @return List 列表
+//	 */
+//	public <T> List<T> findListByIds(Collection<String> ids, Class<T> clazz) {
+//		CriteriaAndWrapper criteriaAndWrapper = new CriteriaAndWrapper().in(Constant::getId, ids);
+//		return findListByQuery(criteriaAndWrapper, clazz);
+//	}
+//
+//	/**
+//	 * 根据id集合查找
+//	 *
+//	 * @param List  ids id集合
+//	 * @param clazz 类
+//	 * @return List 列表
+//	 */
+//	public <T> List<T> findListByIds(Collection<String> ids, SortBuilder sortBuilder, Class<T> clazz) {
+//		CriteriaAndWrapper criteriaAndWrapper = new CriteriaAndWrapper().in(Constant::getId, ids);
+//		return findListByQuery(criteriaAndWrapper, sortBuilder, clazz);
+//	}
+//
+//	/**
+//	 * 根据id集合查找
+//	 *
+//	 * @param Array ids id集合
+//	 * @param clazz 类
+//	 * @return List 列表
+//	 */
+//	public <T> List<T> findListByIds(String[] ids, SortBuilder sortBuilder, Class<T> clazz) {
+//		return findListByIds(Arrays.asList(ids), sortBuilder, clazz);
+//	}
+//
+//	/**
+//	 * 根据id集合查找
+//	 *
+//	 * @param Array ids id集合
+//	 * @param clazz 类
+//	 * @return List 列表
+//	 */
+//	public <T> List<T> findListByIds(String[] ids, Class<T> clazz) {
+//		SortBuilder sortBuilder = new SortBuilder(Constant::getId, Direction.DESC);
+//		return findListByIds(ids, sortBuilder, clazz);
+//	}
+//
+//	/**
+//	 * 查询全部
+//	 *
+//	 * @param <T>   类型
+//	 * @param clazz 类
+//	 * @return List 列表
+//	 */
+//	public <T> List<T> findAll(Class<T> clazz) {
+//		SortBuilder sortBuilder = new SortBuilder(Constant::getId, Direction.DESC);
+//		return findListByQuery(new CriteriaAndWrapper(), sortBuilder, clazz);
+//	}
+//
+//	/**
+//	 * 查询全部
+//	 *
+//	 * @param <T>   类型
+//	 * @param clazz 类
+//	 * @return List 列表
+//	 */
+//	public <T> List<T> findAll(SortBuilder sortBuilder, Class<T> clazz) {
+//		return findListByQuery(new CriteriaAndWrapper(), sortBuilder, clazz);
+//	}
+//
+//	/**
+//	 * 查找全部的id
+//	 *
+//	 * @param clazz 类
+//	 * @return List 列表
+//	 */
+//	public List<String> findAllIds(Class<?> clazz) {
+//		return findIdsByQuery(new CriteriaAndWrapper(), clazz);
+//	}
+//
+//	/**
+//	 * 查找数量
+//	 *
+//	 * @param criteria 查询
+//	 * @param clazz    类
+//	 * @return Long 数量
+//	 */
+//	public Long findCountByQuery(CriteriaWrapper criteriaWrapper, Class<?> clazz) {
+//		Long systemTime = System.currentTimeMillis();
+//		Long count = null;
+//
+//		Query query = new Query(criteriaWrapper.build());
+//		if (query.getQueryObject().isEmpty()) {
+//			count = mongoTemplate.getCollection(mongoTemplate.getCollectionName(clazz)).estimatedDocumentCount();
+//		} else {
+//			count = mongoTemplate.count(query, clazz);
+//		}
+//
+//		logCount(clazz, query, systemTime);
+//		return count;
+//	}
+//
+//	/**
+//	 * 查找全部数量
+//	 *
+//	 * @param clazz 类
+//	 * @return Long 数量
+//	 */
+//	public Long findAllCount(Class<?> clazz) {
+//		return findCountByQuery(new CriteriaAndWrapper(), clazz);
+//	}
+//
+//	/**
+//	 * 获取list中对象某个属性,组成新的list
+//	 *
+//	 * @param list     列表
+//	 * @param clazz    类
+//	 * @param property 属性
+//	 * @return List<T> 列表
+//	 */
+//	@SuppressWarnings("unchecked")
+//	private <T> List<T> extractProperty(List<?> list, String property, Class<T> clazz) {
+//		Set<T> rs = new HashSet<T>();
+//		for (Object object : list) {
+//			Object value = ReflectUtil.getFieldValue(object, property);
+//			if (value != null && value.getClass().equals(clazz)) {
+//				rs.add((T) value);
+//			}
+//		}
+//
+//		return new ArrayList<T>(rs);
+//	}
+//
+//}