lwhhszx 1 éve
szülő
commit
8ec2dd1d3d

+ 1 - 1
src/main/java/cn/cslg/pas/common/dto/QuerySplitDTO.java

@@ -5,5 +5,5 @@ import lombok.Data;
 @Data
 public class QuerySplitDTO {
 private Integer projectId;
-private Integer patentNo;
+private String patentNo;
 }

+ 45 - 0
src/main/java/cn/cslg/pas/common/dto/es/EsCustomFieldDTO.java

@@ -0,0 +1,45 @@
+package cn.cslg.pas.common.dto.es;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+@Data
+public class EsCustomFieldDTO {
+
+    /**
+     * 专题库或报告id
+     */
+    Integer projectId;
+
+    /**
+     * 任务id
+     */
+    Integer taskId;
+
+
+    /**
+     * 栏位类型
+     */
+    Integer fieldType;
+
+    /**
+     * 栏位
+     */
+    String fieldId;
+
+    /**
+     * 栏位值
+     */
+    List<String> fieldValue;
+
+    /**
+     * 操作类型 0取消 1增加 2覆盖
+     */
+
+    Integer optionType;
+
+    String patentNo;
+}

+ 25 - 0
src/main/java/cn/cslg/pas/common/dto/es/FieldHistoryDTO.java

@@ -0,0 +1,25 @@
+package cn.cslg.pas.common.dto.es;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class FieldHistoryDTO {
+
+
+    Integer projectId;
+
+
+    /**
+     * 栏位类型
+     */
+    Integer fieldType;
+
+    /**
+     * 栏位
+     */
+    String fieldId;
+
+    String patentNo;
+}

+ 32 - 0
src/main/java/cn/cslg/pas/common/dto/es/QueryEsCustomFieldDTO.java

@@ -0,0 +1,32 @@
+package cn.cslg.pas.common.dto.es;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class QueryEsCustomFieldDTO {
+
+    /**
+     * 专题库或报告id
+     */
+    Integer projectId;
+
+
+
+
+    /**
+     * 栏位类型
+     */
+    Integer fieldType;
+
+    /**
+     * 栏位
+     */
+    String fieldId;
+
+
+
+
+    String patentNo;
+}

+ 46 - 8
src/main/java/cn/cslg/pas/common/utils/FormatUtil.java

@@ -1,16 +1,21 @@
 package cn.cslg.pas.common.utils;
 
 
-
 import org.springframework.beans.BeanWrapper;
 import org.springframework.beans.BeanWrapperImpl;
 
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 
 public class FormatUtil {
+
+    private List<String> s;
+    private List<String> strs;
+
     public static String toString(Object o) {
         return o == null ? "" : o.toString();
     }
@@ -57,15 +62,48 @@ public class FormatUtil {
 
     }
 
-    public  static String getPictureFormat(String appAn){
-        return appAn+"_p";
+    public static String getPictureFormat(String appAn) {
+        return appAn + "_p";
+
+    }
+
+    public static String getPDFFormat(String appAn, Integer type) {
+        if (type.equals(0)) {
+            return appAn + "_public";
+        } else {
+            return appAn + "_grant";
+        }
+    }
+
+    public static List<String> getDistinctList(List<String> a, List<String> b) {
+        if (a == null || a.size() == 0 &&(b==null||b.size()==0)) {
+            return null;
+        } else if (b == null || b.size() == 0) {
+            return  new ArrayList<>(a);
+        }
+        else if(a==null||a.size()==0){
+            return new ArrayList<>(b);
+        }
+        a.addAll(b);
+        List<String> newList = new ArrayList<>(new HashSet<>(a));
+        return newList;
+    }
+
 
+    public static List<Integer> StringTOIntegerList(List<String> strs) {
+        List<Integer> integers =new ArrayList<>();
+        strs.forEach(item->{
+            integers.add(Integer.parseInt(item));
+        });
+        return  integers;
     }
 
-    public  static String getPDFFormat(String appAn,Integer type){
-        if(type.equals(0))
-        {     return appAn+"_public";}
-       else
-        {     return appAn+"_grant";}
+    public static List<String> IntegerTOStringList(List<Integer> integers) {
+        List<String> strs =new ArrayList<>();
+        integers.forEach(item->{
+            strs.add(item.toString());
+        });
+        return  strs;
     }
+
 }

+ 1 - 0
src/main/java/cn/cslg/pas/common/vo/QuerySplitVO.java

@@ -8,4 +8,5 @@ import lombok.experimental.Accessors;
 public class QuerySplitVO {
 private Integer splitBy;
 private Integer splitType;
+private Boolean ifFirst;
 }

+ 59 - 0
src/main/java/cn/cslg/pas/common/vo/es/FieldHistoryVO.java

@@ -0,0 +1,59 @@
+package cn.cslg.pas.common.vo.es;
+
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.List;
+
+@Component
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class FieldHistoryVO {
+
+
+
+    /**
+     * 栏位类型
+     */
+    @JsonProperty("field_type")
+    Integer fieldType;
+
+    /**
+     * 栏位
+     */
+    @JsonProperty("field")
+    String field;
+
+    /**
+     * 栏位值
+     */
+    @JsonProperty("field_value")
+    List<String> fieldValue;
+
+    /**
+     * 创建人id
+     */
+    @JsonProperty("person_id")
+    String personId;
+
+    /**
+     * 创建时间
+     */
+    @JsonProperty("createTime")
+    Date createTime;
+
+    /**
+     * 历史类型 0取消1添加2覆盖3回退
+     */
+    @JsonProperty("history_type")
+    Integer historyType;
+
+    String backToId;
+
+}

+ 16 - 14
src/main/java/cn/cslg/pas/domain/es/CustomFieldValue.java

@@ -1,4 +1,4 @@
-package cn.cslg.pas.domain.es;
+package cn.cslg.pas.common.vo.es;
 
 
 import com.fasterxml.jackson.annotation.JsonProperty;
@@ -7,38 +7,40 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 import org.springframework.stereotype.Component;
 
+import java.util.Date;
 import java.util.List;
 
 @Component
 @Data
 @AllArgsConstructor
 @NoArgsConstructor
-public class CustomFieldValue {
+public class QueryESCustomFieldVO {
 
     /**
-     * 
+     * 专题库或报告id
      */
-    @JsonProperty("value")
-    String value;
+    Integer projectId;
+
 
     /**
-     * 创建人id
+     * 栏位类型
      */
-    @JsonProperty("person_id")
-    String person_id;
+    Integer fieldType;
 
+    /**
+     * 栏位
+     */
+    String field;
 
     /**
-     * 任务id
+     * 栏位值
      */
-    @JsonProperty("task_id")
-    Integer taskId;
+    List<String> fieldValue;
 
     /**
-     * 创建时间
+     * 统计值
      */
-    @JsonProperty("create_time")
-    Integer create_time;
+    List<String> statsValue;
 
 
 

+ 12 - 0
src/main/java/cn/cslg/pas/controller/FeatureController.java

@@ -64,4 +64,16 @@ public class FeatureController {
         }
 
     }
+    @Operation(summary = "查询权要树")
+    @GetMapping("/getPatentRightTree")
+    public Response getPatentRightTree(String patentNo) throws Exception {
+        try {
+            Records records = new Records();
+            records.setData(featureService.getPatentRightTree(patentNo));
+            return Response.success(records);
+        } catch (Exception e) {
+            return Response.error(e.getMessage());
+        }
+
+    }
 }

+ 3 - 2
src/main/java/cn/cslg/pas/domain/es/ESCustomField.java

@@ -7,6 +7,7 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 import org.springframework.stereotype.Component;
 
+import java.util.Date;
 import java.util.List;
 
 @Component
@@ -56,13 +57,13 @@ public class ESCustomField {
      * 创建人id
      */
     @JsonProperty("person_id")
-    String person_id;
+    String personId;
 
 
     /**
      * 创建时间
      */
     @JsonProperty("create_time")
-    Integer create_time;
+    Date createTime;
 
 }

+ 73 - 0
src/main/java/cn/cslg/pas/domain/es/ESCustomFieldHistory.java

@@ -0,0 +1,73 @@
+package cn.cslg.pas.domain.es;
+
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.List;
+
+@Component
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ESCustomFieldHistory {
+
+    /**
+     * 专题库或报告id
+     */
+    @JsonProperty("project_id")
+    Integer projectId;
+
+    /**
+     * 任务id
+     */
+    @JsonProperty("task_id")
+    Integer taskId;
+
+
+    /**
+     * 栏位类型
+     */
+    @JsonProperty("field_type")
+    Integer fieldType;
+
+    /**
+     * 栏位
+     */
+    @JsonProperty("field")
+    String field;
+
+    /**
+     * 栏位值
+     */
+    @JsonProperty("field_value")
+    List<String> fieldValue;
+
+    /**
+     * 创建人id
+     */
+    @JsonProperty("person_id")
+    String personId;
+
+    /**
+     * 创建时间
+     */
+    @JsonProperty("createTime")
+    Date createTime;
+
+    /**
+     * 历史类型 0取消1添加2覆盖3回退
+     */
+    @JsonProperty("history_type")
+    Integer historyType;
+
+    @JsonProperty("back_to_id")
+    String backToId;
+
+    @JsonProperty("custom_field_id")
+    String customFieldId;
+}

+ 1 - 1
src/main/java/cn/cslg/pas/domain/es/Patent.java

@@ -349,7 +349,7 @@ public class Patent {
      * 自定义栏位
      */
     @JsonProperty("custom_field")
-    List<ESCustomField> ESCustomField;
+    ESCustomField ESCustomField;
     /**
      * 扩展同族数量
      */

+ 401 - 0
src/main/java/cn/cslg/pas/service/business/es/EsCustomFieldService.java

@@ -0,0 +1,401 @@
+package cn.cslg.pas.service.business.es;
+
+import cn.cslg.pas.common.dto.es.EsCustomFieldDTO;
+import cn.cslg.pas.common.dto.es.FieldHistoryDTO;
+import cn.cslg.pas.common.dto.es.QueryEsCustomFieldDTO;
+import cn.cslg.pas.common.utils.FormatUtil;
+import cn.cslg.pas.common.vo.PatentWithIdVO;
+import cn.cslg.pas.common.vo.es.FieldHistoryVO;
+import cn.cslg.pas.common.vo.es.QueryESCustomFieldVO;
+import cn.cslg.pas.domain.business.CustomField;
+import cn.cslg.pas.domain.business.TreeNode;
+import cn.cslg.pas.domain.es.*;
+import cn.cslg.pas.exception.XiaoShiException;
+import cn.cslg.pas.service.business.TreeNodeService;
+import co.elastic.clients.elasticsearch.ElasticsearchClient;
+import co.elastic.clients.elasticsearch._types.SortOrder;
+import co.elastic.clients.elasticsearch._types.query_dsl.Query;
+import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders;
+import co.elastic.clients.elasticsearch.core.IndexResponse;
+import co.elastic.clients.elasticsearch.core.SearchRequest;
+import co.elastic.clients.elasticsearch.core.SearchResponse;
+import co.elastic.clients.elasticsearch.core.search.Hit;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.lang.reflect.Array;
+import java.util.*;
+
+@Service
+@RequiredArgsConstructor(onConstructor_ = {@Lazy})
+public class EsCustomFieldService {
+    private final ElasticsearchClient client;
+    private final EsService esService;
+    private final TreeNodeService treeNodeService;
+
+    //添加自定义栏位值
+    public void addCustomField(EsCustomFieldDTO esCustomFieldDTO) throws Exception {
+        ESCustomField esCustomField = new ESCustomField();
+        String id = "";
+        //判断类型
+        Integer fieldType = esCustomFieldDTO.getFieldType();
+        Integer taskId = esCustomFieldDTO.getTaskId();
+        Integer optionType = esCustomFieldDTO.getOptionType();
+        String patentNo = esCustomFieldDTO.getPatentNo();
+        String fieldId = esCustomFieldDTO.getFieldId();
+        List<String> addValues = esCustomFieldDTO.getFieldValue();
+        Integer projectId = esCustomFieldDTO.getProjectId();
+        Date createDate = new Date();
+
+        if (optionType.equals(1) && (addValues == null || addValues.size() == 0)) {
+            throw new XiaoShiException("请填写值");
+        }
+
+
+        //根据专利号查询 是否专利关联过栏位
+        PatentWithIdVO patentWithIdVO = this.getEsCustomField(esCustomFieldDTO, patentNo);
+        if (patentWithIdVO != null) {
+            esCustomField = patentWithIdVO.getPatent().getESCustomField();
+            id = patentWithIdVO.getId();
+        } else {
+            //设置栏位
+            esCustomField.setField(esCustomFieldDTO.getFieldId());
+            //设置专题库或报告
+            esCustomField.setProjectId(esCustomFieldDTO.getProjectId());
+            //设置创建时间
+            esCustomField.setCreateTime(createDate);
+            //设置创建人
+            esCustomField.setPersonId("1");
+            //设置类型
+            esCustomField.setFieldType(fieldType);
+            //设置任务id
+            esCustomField.setTaskId(taskId);
+        }
+        List<String> values = esCustomField.getFieldValue();
+        //设置值
+        switch (fieldType) {
+            case 0:
+
+                ;
+            case 1:
+
+                ;
+            case 2:              //文本类型
+                if (optionType.equals(1) || optionType.equals(2)) {
+                    if (addValues != null && addValues.size() == 1 && !values.contains(addValues))
+                        esCustomField.setFieldValue(esCustomFieldDTO.getFieldValue());
+                } else if (optionType.equals(0)) {
+                    esCustomField.setFieldType(null);
+                }
+                break;
+            case 4:     //单选
+                if (optionType.equals(1) || optionType.equals(2)) {
+                    if (addValues != null && addValues.size() == 1 && !values.contains(addValues)) {
+                        esCustomField.setStatsValue(addValues);
+                    }
+                } else if (optionType.equals(0)) {
+                    esCustomField.setFieldValue(null);
+                    esCustomField.setStatsValue(null);
+                }
+                break;
+            case 5:
+                if (optionType.equals(1)) {
+                    if (addValues != null && addValues.size() == 1 && !values.contains(addValues)) {
+                        esCustomField.setStatsValue(addValues);
+                    }
+                }
+                break;
+            case 6:            //树类型
+
+            case 7:
+
+            case 8:
+
+            case 9:
+                if (optionType.equals(1)) {
+                    //根据值获得树节点
+                    List<String> reValues = FormatUtil.getDistinctList(addValues, values);
+                    //根据 reValues获得 reStateValues
+                    List<Integer> fieldIds = FormatUtil.StringTOIntegerList(reValues);
+                    //根据树节点id查询树节点
+                    LambdaQueryWrapper<TreeNode> queryWrapper = new LambdaQueryWrapper<>();
+                    queryWrapper.eq(TreeNode::getId, fieldIds);
+                    List<TreeNode> treeNodes = treeNodeService.list(queryWrapper);
+                    //遍历节点
+                    List<String> reStateValues = new ArrayList<>(reValues);
+                    treeNodes.forEach(item -> {
+                        String path = item.getPath();
+                        if (path != null && path.trim() != "") {
+                            List<String> a = Arrays.asList(path.split("/"));
+                            reStateValues.addAll(a);
+                        }
+                    });
+
+                    List<String> disReStateValues = new ArrayList<>(new HashSet<>(reStateValues));
+                    esCustomField.setStatsValue(disReStateValues);
+                } else if (optionType.equals(0)) {
+                    if (values != null && values.size() > 0 && addValues != null && addValues.size() > 0) {
+                        values.remove(addValues);
+                        esCustomField.setFieldValue(values);
+                        if (values.size() > 0) {
+                            //根据 reValues获得 reStateValues
+                            List<Integer> fieldIds = FormatUtil.StringTOIntegerList(values);
+                            //根据树节点id查询树节点
+                            LambdaQueryWrapper<TreeNode> queryWrapper = new LambdaQueryWrapper<>();
+                            queryWrapper.eq(TreeNode::getId, fieldIds);
+                            List<TreeNode> treeNodes = treeNodeService.list(queryWrapper);
+                            //遍历节点
+                            List<String> reStateValues = new ArrayList<>(values);
+                            treeNodes.forEach(item -> {
+                                String path = item.getPath();
+                                if (path != null && path.trim() != "") {
+                                    List<String> a = Arrays.asList(path.split("/"));
+                                    reStateValues.addAll(a);
+                                }
+                            });
+                            List<String> disReStateValues = new ArrayList<>(new HashSet<>(reStateValues));
+                            esCustomField.setStatsValue(disReStateValues);
+                        }
+                    }
+
+                } else if (optionType.equals(2)) {
+                    esCustomField.setFieldValue(addValues);
+                    if (addValues == null || addValues.size() == 0) {
+                        esCustomField.setStatsValue(new ArrayList<>());
+                    } else {
+                        //根据 reValues获得 reStateValues
+                        List<Integer> fieldIds = FormatUtil.StringTOIntegerList(addValues);
+                        //根据树节点id查询树节点
+                        LambdaQueryWrapper<TreeNode> queryWrapper = new LambdaQueryWrapper<>();
+                        queryWrapper.eq(TreeNode::getId, fieldIds);
+                        List<TreeNode> treeNodes = treeNodeService.list(queryWrapper);
+                        //遍历节点
+                        List<String> reStateValues = new ArrayList<>(addValues);
+                        treeNodes.forEach(item -> {
+                            String path = item.getPath();
+                            if (path != null && path.trim() != "") {
+                                List<String> a = Arrays.asList(path.split("/"));
+                                reStateValues.addAll(a);
+                            }
+                        });
+                        List<String> disReStateValues = new ArrayList<>(new HashSet<>(reStateValues));
+                        esCustomField.setStatsValue(disReStateValues);
+                    }
+                }
+                break;
+        }
+        if (!id.trim().equals("")) {
+            Patent patent = patentWithIdVO.getPatent();
+            patent.setESCustomField(esCustomField);
+            esService.updatePatent(patent, patentWithIdVO.getId());
+            ESCustomFieldHistory esCustomFieldHistory = new ESCustomFieldHistory();
+            esCustomFieldHistory.setField(fieldId);
+            esCustomFieldHistory.setFieldType(fieldType);
+            esCustomFieldHistory.setCreateTime(createDate);
+            esCustomFieldHistory.setFieldValue(addValues);
+            esCustomFieldHistory.setHistoryType(optionType);
+            esCustomFieldHistory.setTaskId(taskId);
+            esCustomFieldHistory.setPersonId("1");
+            esCustomFieldHistory.setProjectId(projectId);
+            esCustomFieldHistory.setCustomFieldId(id);
+            this.addCustomFieldHistory(esCustomFieldHistory);
+        } else {
+            this.addEsCustomFieldToEs(esCustomField, patentNo);
+        }
+    }
+
+
+    //添加操作历史
+    public String addCustomFieldHistory(ESCustomFieldHistory customFieldHistory) throws Exception {
+        IndexResponse indexResponse = client.index(i -> i
+                .index("custom_field_history")
+                .document(customFieldHistory)
+        );
+        return indexResponse.id();
+
+    }
+
+    //查询自定义字段
+    public PatentWithIdVO getEsCustomField(EsCustomFieldDTO esCustomFieldDTO, String patentNo) throws Exception {
+        PatentWithIdVO patentWithIdVO = new PatentWithIdVO();
+        Integer projectId = esCustomFieldDTO.getProjectId();
+        Integer taskId = esCustomFieldDTO.getTaskId();
+        SearchRequest.Builder builder = new SearchRequest.Builder();
+        //设置查询索引
+        builder.index("patent");
+
+        //专利号
+        Query q1 = QueryBuilders.term(t -> t.field("custom_field.project_id").value(projectId));
+        //栏位
+        Query q2 = QueryBuilders.term((t -> t.field("custom_field.field").value(esCustomFieldDTO.getFieldId())));
+
+        Query q4 = QueryBuilders.term(t -> t.field("custom_field.field_type").value(esCustomFieldDTO.getFieldType()));
+
+        Query parentQ1 = QueryBuilders.term(t -> t.field("app_no.keyword").value(patentNo));
+        //公开号
+        Query parentQ2 = QueryBuilders.term(t -> t.field("public_no.keyword").value(patentNo));
+        //授权号
+        Query parentQ3 = QueryBuilders.term(t -> t.field("grant_no.keyword").value(patentNo));
+
+        Query parentQ = QueryBuilders.bool(i -> i.should(parentQ1, parentQ2, parentQ3));
+
+        Query q3 = QueryBuilders.hasParent(t -> t.parentType("patent").query(parentQ));
+        Query bool = QueryBuilders.bool(i -> i.must(q1, q2, q3, q4));
+
+        builder.query(bool);
+        SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
+        long total = response.hits().total().value();
+        if (total > 0) {
+            List<Hit<Patent>> hits = response.hits().hits();
+            Hit<Patent> hit = hits.get(0);
+            Patent patent = hit.source();
+            patentWithIdVO.setPatent(patent);
+            patentWithIdVO.setId(hit.id());
+        } else {
+            patentWithIdVO = null;
+        }
+        return patentWithIdVO;
+    }
+
+    //将自定义字段添加到专利
+    public String addEsCustomFieldToEs(ESCustomField esCustomField, String patentNo) throws Exception {
+        //根据专利号查询专利
+        PatentWithIdVO patentWithIdVO = esService.getIdByPatentNo(patentNo);
+        String patentId = patentWithIdVO.getId();
+        Patent patentChild = new Patent();
+        PatentJoin patentJoin = new PatentJoin();
+        patentJoin.setParent(patentId);
+        patentJoin.setName("project_customfield");
+        patentChild.setPatentJoin(patentJoin);
+        patentChild.setESCustomField(esCustomField);
+        String id = esService.addChildPatent(patentChild, patentId);
+        return id;
+    }
+
+    /**
+     * 根据专利号 和 projectId ,以及栏位类型栏位值查询所有customField
+     */
+    public List<QueryESCustomFieldVO> getEsCustomField(QueryEsCustomFieldDTO queryEsCustomFieldDTO) throws Exception {
+        List<QueryESCustomFieldVO> vos = new ArrayList<>();
+
+        String fieldId = queryEsCustomFieldDTO.getFieldId();
+        Integer fieldType = queryEsCustomFieldDTO.getFieldType();
+        String patentNo = queryEsCustomFieldDTO.getPatentNo();
+        Query q1 = QueryBuilders.term(t -> t.field("app_no.keyword").value(patentNo));
+
+        Query parentQ1 = QueryBuilders.term(t -> t.field("app_no.keyword").value(patentNo));
+        //公开号
+        Query parentQ2 = QueryBuilders.term(t -> t.field("public_no.keyword").value(patentNo));
+        //授权号
+        Query parentQ3 = QueryBuilders.term(t -> t.field("grant_no.keyword").value(patentNo));
+
+        Query parentQ = QueryBuilders.bool(i -> i.should(parentQ1, parentQ2, parentQ3));
+        Query q3 = QueryBuilders.hasParent(t -> t.parentType("patent").query(parentQ));
+        Query bool = null;
+        if (fieldId != null && fieldType != null) {
+            Query q2 = QueryBuilders.term((t -> t.field("custom_field.field").value(fieldId)));
+            Query q4 = QueryBuilders.term(t -> t.field("custom_field.field_type").value(fieldType));
+            bool = QueryBuilders.bool(i -> i.must(q1, q2, q3, q4));
+        } else {
+            bool = QueryBuilders.bool(i -> i.must(q1, q3));
+        }
+        SearchRequest.Builder builder = new SearchRequest.Builder();
+        builder.query(bool);
+        SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
+        long total = response.hits().total().value();
+        if (total > 0) {
+            List<Hit<Patent>> hits = response.hits().hits();
+            hits.forEach(item -> {
+                ESCustomField esCustomField = item.source().getESCustomField();
+                QueryESCustomFieldVO queryESCustomFieldVO = new QueryESCustomFieldVO();
+                queryESCustomFieldVO.setField(esCustomField.getField());
+                queryESCustomFieldVO.setFieldType(esCustomField.getFieldType());
+                queryESCustomFieldVO.setFieldValue(esCustomField.getFieldValue());
+                vos.add(queryESCustomFieldVO);
+            });
+
+        }
+        return vos;
+    }
+
+    public String getEsCustomFieldId(FieldHistoryDTO fieldHistoryDTO) throws Exception {
+        String id = "";
+        List<QueryESCustomFieldVO> vos = new ArrayList<>();
+
+        String fieldId = fieldHistoryDTO.getFieldId();
+        Integer fieldType = fieldHistoryDTO.getFieldType();
+        String patentNo = fieldHistoryDTO.getPatentNo();
+        Query q1 = QueryBuilders.term(t -> t.field("app_no.keyword").value(patentNo));
+
+        Query parentQ1 = QueryBuilders.term(t -> t.field("app_no.keyword").value(patentNo));
+        //公开号
+        Query parentQ2 = QueryBuilders.term(t -> t.field("public_no.keyword").value(patentNo));
+        //授权号
+        Query parentQ3 = QueryBuilders.term(t -> t.field("grant_no.keyword").value(patentNo));
+
+        Query parentQ = QueryBuilders.bool(i -> i.should(parentQ1, parentQ2, parentQ3));
+        Query q3 = QueryBuilders.hasParent(t -> t.parentType("patent").query(parentQ));
+
+
+        Query q2 = QueryBuilders.term((t -> t.field("custom_field.field").value(fieldId)));
+        Query q4 = QueryBuilders.term(t -> t.field("custom_field.field_type").value(fieldType));
+        Query bool = QueryBuilders.bool(i -> i.must(q1, q2, q3, q4));
+
+        SearchRequest.Builder builder = new SearchRequest.Builder();
+        builder.query(bool);
+        SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
+        long total = response.hits().total().value();
+        if (total > 0) {
+            id = response.hits().hits().get(0).id();
+
+        }
+        return id;
+    }
+
+    /**
+     * 查询历史
+     */
+    public  List<FieldHistoryVO>  getCustomFieldHistory(FieldHistoryDTO fieldHistoryDTO) throws Exception {
+       List<FieldHistoryVO> fieldHistoryVOS =new ArrayList<>();
+        String customId = this.getEsCustomFieldId(fieldHistoryDTO);
+        Query q1 = QueryBuilders.term(t -> t.field("custom_field_id").value(customId));
+        SearchRequest.Builder builder = new SearchRequest.Builder();
+        builder.query(q1);
+        builder.sort(sortOptionsBuilder -> sortOptionsBuilder
+                .field(fieldSortBuilder -> fieldSortBuilder
+                        .field("create_time").order(SortOrder.Desc)));
+        SearchResponse<ESCustomFieldHistory> response = client.search(builder.build(), ESCustomFieldHistory.class);
+        long total = response.hits().total().value();
+        if (total > 0) {
+            List<Hit<ESCustomFieldHistory>> hits = response.hits().hits();
+            hits.forEach(item -> {
+               FieldHistoryVO fieldHistoryVO = new FieldHistoryVO();
+                BeanUtils.copyProperties(item.source(),fieldHistoryVO);
+                fieldHistoryVOS.add(fieldHistoryVO);
+            });
+
+        }
+        return fieldHistoryVOS;
+    }
+
+    /**
+     * 回退
+     */
+    public void BackTo(String historyId) throws Exception{
+        //根据历史id获得历史
+        SearchRequest.Builder builder = new SearchRequest.Builder();
+        builder.index("patent");
+        Query q =QueryBuilders.ids(i->i.values(Arrays.asList(historyId)));
+        builder.query(q);
+        SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
+        long total = response.hits().total().value();
+        System.out.println(total);
+        //根据历史的创建时间,查询出所有创建时间大于当前创建时间的历史
+        //遍历历史,根据操作类型,反推
+        //根据反推内容保存并保存历史为回退;
+    }
+}

+ 12 - 12
src/main/java/cn/cslg/pas/service/business/es/EsService.java

@@ -96,19 +96,19 @@ public class EsService {
      * @throws Exception
      */
     public PatentWithIdVO getIdByPatentNo(String patentNo) throws Exception {
+        SearchRequest.Builder builder = new SearchRequest.Builder();
+        //设置查询索引
+        builder.index("patent");
         PatentWithIdVO patentWithIdVO = null;
         String id = null;
-        SearchResponse<Patent> response = client.search(
-                s -> s.index("patent")
-                        .query(
-                                q -> q.match(
-                                        t -> t.field("patent_no")
-                                                .query(patentNo)
-                                )
-                        )
-                , Patent.class
-
-        );
+        Query q1 = QueryBuilders.term(t -> t.field("app_no.keyword").value(patentNo));
+        //公开号
+        Query q2 = QueryBuilders.term(t -> t.field("public_no.keyword").value(patentNo));
+        //授权号
+        Query q3 = QueryBuilders.term(t -> t.field("grant_no.keyword").value(patentNo));
+        Query query = QueryBuilders.bool(i -> i.should(q1, q2, q3));
+        builder.query(query);
+        SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
         List<Hit<Patent>> hits = response.hits().hits();
         if (hits != null && hits.size() > 0) {
             id = hits.get(0).id();
@@ -252,7 +252,7 @@ public class EsService {
     }
 
 
-    public Integer updateDocument(Patent patent, String id) {
+    public Integer updatePatent(Patent patent, String id) {
         UpdateRequest<Patent, Patent> req;
         req = UpdateRequest.of(
                 b -> b.index("patent").id(id)

+ 1 - 1
src/main/java/cn/cslg/pas/service/importPatent/SavePatentToEsThread.java

@@ -57,7 +57,7 @@ public class SavePatentToEsThread extends Thread {
                     patentId = patentWithIdVO.getId();
                     Patent orgPatent = patentWithIdVO.getPatent();
                     BeanUtils.copyProperties(patent, orgPatent, FormatUtil.getNullPropertyNames(patent));
-                    esService.updateDocument(orgPatent, patentWithIdVO.getId());
+                    esService.updatePatent(orgPatent, patentWithIdVO.getId());
                 } else {
                     PatentJoin patentJoin = new PatentJoin();
                     patentJoin.setName("patent");

+ 76 - 0
src/test/java/cn/cslg/pas/service/EsCustomFiedTests.java

@@ -0,0 +1,76 @@
+package cn.cslg.pas.service;
+
+import cn.cslg.pas.common.dto.es.EsCustomFieldDTO;
+import cn.cslg.pas.common.vo.PatentRightTree;
+import cn.cslg.pas.common.vo.PatentRightVo;
+import cn.cslg.pas.common.vo.PatentWithIdVO;
+import cn.cslg.pas.common.vo.business.SplitVO;
+import cn.cslg.pas.domain.business.Feature;
+import cn.cslg.pas.domain.es.ESCustomField;
+import cn.cslg.pas.domain.es.Patent;
+import cn.cslg.pas.service.business.FeatureService;
+import cn.cslg.pas.service.business.es.EsCustomFieldService;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @Author xiexiang
+ * @Date 2023/11/16
+ */
+@SpringBootTest
+@RunWith(SpringRunner.class)
+public class EsCustomFiedTests {
+    @Autowired
+    private EsCustomFieldService esCustomFieldService;
+
+    @Test
+    public void addEsCustomField() throws Exception {
+String patentNo="CN200920148721.1";
+        ESCustomField esCustomField =new ESCustomField();
+        esCustomField.setField("1");
+        esCustomField.setProjectId(0);
+        Date date =new Date();
+        esCustomField.setCreateTime(date);
+        esCustomField.setPersonId("1");
+        esCustomField.setStatsValue(Arrays.asList("高相关"));
+        esCustomField.setFieldValue(Arrays.asList("高相关"));
+        esCustomField.setFieldType(1);
+String a =esCustomFieldService.addEsCustomFieldToEs(esCustomField,patentNo);
+System.out.println(a);
+    }
+
+    @Test
+    public  void getEsCustomField() throws Exception{
+        EsCustomFieldDTO esCustomFieldDTO =new EsCustomFieldDTO();
+        esCustomFieldDTO.setProjectId(0);
+        esCustomFieldDTO.setFieldId("1");
+
+        String patentNo="CN200920148721.1";
+ PatentWithIdVO patent = esCustomFieldService.getEsCustomField(esCustomFieldDTO,patentNo);
+ System.out.println(patent);
+    }
+
+    @Test
+    public  void getTree(){
+     List<String> a=new ArrayList<>();
+     a.add("s");
+     a.removeAll(new ArrayList<>());
+     System.out.println(
+             a
+     );
+    }
+
+    @Test
+    public void getBackTo() throws Exception{
+        esCustomFieldService.BackTo("2y5NPowB68vilgBjR1zV");
+    }
+}

+ 2 - 5
src/test/java/cn/cslg/pas/service/EsServiceTests.java

@@ -47,13 +47,10 @@ public class EsServiceTests {
     @Test
     public void getPatentByPatentNo() throws Exception {
         //根据专利号获得id
-        PatentWithIdVO patentWithIdVO = esService.getIdByPatentNo("CN201114765Y");
+        PatentWithIdVO patentWithIdVO = esService.getIdByPatentNo("CN200920148721.1");
         Patent patent = new Patent();
         patent.setAgency("张三");
-        Patent orgPatent = patentWithIdVO.getPatent();
-        BeanUtils.copyProperties(patent, orgPatent, FormatUtil.getNullPropertyNames(patent));
-        esService.updateDocument(orgPatent, patentWithIdVO.getId());
-        System.out.println();
+        System.out.println(patentWithIdVO);
     }
 
     @Test

+ 1 - 1
src/test/java/cn/cslg/pas/service/PatentStarServiceTests.java

@@ -67,7 +67,7 @@ public class PatentStarServiceTests {
         patent.setAgency("张三");
         Patent orgPatent = patentWithIdVO.getPatent();
         BeanUtils.copyProperties(patent, orgPatent, FormatUtil.getNullPropertyNames(patent));
-        esService.updateDocument(orgPatent, patentWithIdVO.getId());
+        esService.updatePatent(orgPatent, patentWithIdVO.getId());
     }
 
     @Test