Procházet zdrojové kódy

Merge remote-tracking branch 'origin/master' into prod_test

# Conflicts:
#	src/main/java/cn/cslg/pas/common/utils/FileUtils.java
#	src/main/java/cn/cslg/pas/service/exportProject/ExportProjectService.java
lwhhszx před 1 rokem
rodič
revize
a5e8ee1c79
51 změnil soubory, kde provedl 1619 přidání a 728 odebrání
  1. binární
      a8c0ca9fa41341cc9a46440025b63b63.xls
  2. 4 4
      src/main/java/cn/cslg/pas/common/config/WebSocketConfig.java
  3. 6 0
      src/main/java/cn/cslg/pas/common/dto/PatentColumnDTO.java
  4. 4 5
      src/main/java/cn/cslg/pas/common/model/addPatentToReport/AddProjectPatentToReportDTO.java
  5. 22 0
      src/main/java/cn/cslg/pas/common/model/importPDF/AddImportPDFTaskDTO.java
  6. 26 21
      src/main/java/cn/cslg/pas/common/utils/ClaimUtils/ClaimSplitUtils.java
  7. 18 49
      src/main/java/cn/cslg/pas/common/utils/FileUtils.java
  8. 34 20
      src/main/java/cn/cslg/pas/common/utils/parseQueryToTree/expressManager.java
  9. 1 0
      src/main/java/cn/cslg/pas/common/vo/ImportTaskAMVO.java
  10. 2 1
      src/main/java/cn/cslg/pas/common/vo/business/EsAllCountVO.java
  11. 2 0
      src/main/java/cn/cslg/pas/common/vo/business/PatentNoVO.java
  12. 2 0
      src/main/java/cn/cslg/pas/common/vo/business/ReportProjectVO.java
  13. 2 0
      src/main/java/cn/cslg/pas/common/vo/es/EsCustomFieldBatchVO.java
  14. 36 0
      src/main/java/cn/cslg/pas/common/vo/es/EsPatentCommonVO.java
  15. 2 0
      src/main/java/cn/cslg/pas/common/vo/es/EsValueCurveVO.java
  16. 9 14
      src/main/java/cn/cslg/pas/controller/ImportTaskController.java
  17. 12 2
      src/main/java/cn/cslg/pas/controller/PatentController.java
  18. 14 5
      src/main/java/cn/cslg/pas/controller/PatentProjectController.java
  19. 1 0
      src/main/java/cn/cslg/pas/controller/ProductController.java
  20. 112 0
      src/main/java/cn/cslg/pas/controller/TemController.java
  21. 1 0
      src/main/java/cn/cslg/pas/domain/business/ImportTask.java
  22. 2 0
      src/main/java/cn/cslg/pas/domain/business/ImportTaskCondition.java
  23. 19 2
      src/main/java/cn/cslg/pas/factorys/EsBuilderFactory/NestedPersonQueryBuilder.java
  24. 51 0
      src/main/java/cn/cslg/pas/factorys/PatentExportFactory/GetClassifyValue.java
  25. 9 1
      src/main/java/cn/cslg/pas/factorys/PatentExportFactory/GetDateValue.java
  26. 41 0
      src/main/java/cn/cslg/pas/factorys/PatentExportFactory/GetPatentTypeValue.java
  27. 39 0
      src/main/java/cn/cslg/pas/factorys/PatentExportFactory/GetSimpleStatusValue.java
  28. 4 0
      src/main/java/cn/cslg/pas/factorys/PatentImportFactory/PatentImportFactory.java
  29. 21 1
      src/main/java/cn/cslg/pas/service/business/CommonService.java
  30. 23 0
      src/main/java/cn/cslg/pas/service/business/ImportTaskService.java
  31. 40 1
      src/main/java/cn/cslg/pas/service/business/PDFExportFirstPageService.java
  32. 80 19
      src/main/java/cn/cslg/pas/service/business/PatentExportService.java
  33. 1 2
      src/main/java/cn/cslg/pas/service/business/PatentService.java
  34. 7 4
      src/main/java/cn/cslg/pas/service/business/ProjectService.java
  35. 2 4
      src/main/java/cn/cslg/pas/service/business/ProjectTaskService.java
  36. 22 14
      src/main/java/cn/cslg/pas/service/business/ReportProjectService.java
  37. 97 70
      src/main/java/cn/cslg/pas/service/business/es/EsCountService.java
  38. 21 76
      src/main/java/cn/cslg/pas/service/business/es/EsCustomFieldService.java
  39. 79 101
      src/main/java/cn/cslg/pas/service/business/es/EsPatentService.java
  40. 256 116
      src/main/java/cn/cslg/pas/service/business/es/EsService.java
  41. 7 95
      src/main/java/cn/cslg/pas/service/business/es/EsValueCurveService.java
  42. 46 21
      src/main/java/cn/cslg/pas/service/exportProject/ExportProjectService.java
  43. 4 18
      src/main/java/cn/cslg/pas/service/importPatent/GetCataloguingFromWebThread.java
  44. 84 0
      src/main/java/cn/cslg/pas/service/importPatent/ImportPDFBatchService.java
  45. 101 0
      src/main/java/cn/cslg/pas/service/importPatent/ImportPDFBatchThread.java
  46. 6 1
      src/main/java/cn/cslg/pas/service/importPatent/SchedulingTaskService.java
  47. 10 3
      src/main/java/cn/cslg/pas/service/importPatent/TaskThread.java
  48. 5 0
      src/main/resources/jsons/importTaskConfig.json
  49. 122 58
      src/main/resources/jsons/patent.json
  50. 87 0
      src/test/java/cn/cslg/pas/service/ClaimTextTests.java
  51. 23 0
      src/test/java/cn/cslg/pas/service/EventServiceTests.java

binární
a8c0ca9fa41341cc9a46440025b63b63.xls


+ 4 - 4
src/main/java/cn/cslg/pas/common/config/WebSocketConfig.java

@@ -6,8 +6,8 @@ import org.springframework.web.socket.server.standard.ServerEndpointExporter;
 
 @Configuration
 public class WebSocketConfig {
-    @Bean
-    public ServerEndpointExporter serverEndpointExporter() {
-        return new ServerEndpointExporter();
-    }
+//    @Bean
+//    public ServerEndpointExporter serverEndpointExporter() {
+//        return new ServerEndpointExporter();
+//    }
 }

+ 6 - 0
src/main/java/cn/cslg/pas/common/dto/PatentColumnDTO.java

@@ -3,6 +3,7 @@ package cn.cslg.pas.common.dto;
 import cn.cslg.pas.common.vo.ContentVO;
 import cn.cslg.pas.domain.es.*;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
@@ -15,6 +16,11 @@ import java.util.List;
 @AllArgsConstructor
 public class PatentColumnDTO {
     /**
+     * 专利id
+     */
+    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
+    private String patentId;
+    /**
      * 专利号
      */
     private String patentNo;

+ 4 - 5
src/main/java/cn/cslg/pas/common/model/addPatentToReport/AddProjectPatentToReportDTO.java

@@ -9,11 +9,10 @@ import java.util.List;
 @Data
 public class AddProjectPatentToReportDTO {
     private StringRequest stringRequest;
-    private Integer taskType;
     private Integer fromProjectId;
-    private Long start;
-    private Long end;
+    private Long startNumber;
+    private Long endNumber;
     private Integer toProjectId;
-    private List<String> notInPatentNos;
-    private List<String> InPatentNos;
+    private List<String> isDelete;
+    private List<String> isAdd;
 }

+ 22 - 0
src/main/java/cn/cslg/pas/common/model/importPDF/AddImportPDFTaskDTO.java

@@ -0,0 +1,22 @@
+package cn.cslg.pas.common.model.importPDF;
+
+import cn.cslg.pas.common.dto.es.EsCustomFieldDTO;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class AddImportPDFTaskDTO {
+
+    /**
+     * 文件guid
+     */
+    private String fileGuid;
+    /**
+     * 0公开
+     * 1授权
+     */
+    private Integer pdfType;
+    private String remark;
+}

+ 26 - 21
src/main/java/cn/cslg/pas/common/utils/ClaimUtils/ClaimSplitUtils.java

@@ -23,7 +23,7 @@ import java.util.stream.Collectors;
 public class ClaimSplitUtils {
     private static final List<String> CNRegix = Arrays.asList("[0-9]+\\.[^0-9]+?", "\\[[0-9]+]");
     private static final List<String> JPRegix = Arrays.asList("【請求項[0-9]+】");
-    private static final List<String> KORRegix = Arrays.asList("청구항 [0-9]+");
+    private static final List<String> KORRegix = Arrays.asList("청구항 [0-9]+","\\[[0-9]+]");
     private static final List<String> ENReginx = Arrays.asList("[0-9]+\\.[^0-9]+?", "\\[[0-9]+]");
 
 
@@ -31,9 +31,9 @@ public class ClaimSplitUtils {
         try {
             //国家
             String country = params.getCountry();
-            String  patentNo =params.getPatentNo();
+            String patentNo = params.getPatentNo();
             if (country == null) {
-                country = params.getPatentNo().substring(0, 2);
+                country = params.getPatentNo().substring(0,2);
             }
             //原文
             String content = params.getContent();
@@ -47,22 +47,23 @@ public class ClaimSplitUtils {
             }
             String regex = ClaimSplitUtils.getRegex(country, content);
             if (regex == null) {
-                reDefaultPatentClaim(patentRights, content);
+               reDefaultPatentClaim(patentRights,content);
                 return patentRights;
             }
             patentRights = splitPatentRight(regex, content);
 
-   switch (country) {
-       case "CN":
-           loadCNPatentClaim(patentNo,patentRights);
-           break;
-       case "FR":
-           loadFRPatentClaim(patentNo,patentRights);
-           break;
-       default:
-           loadENPatentClaim(patentNo,patentRights);
-   }
-            return patentRights;
+            switch (country) {
+                case "CN":
+                    loadCNPatentClaim(patentNo, patentRights);
+                    break;
+                case "FR":
+                    loadFRPatentClaim(patentNo, patentRights);
+                    break;
+                default:
+                    loadENPatentClaim(patentNo, patentRights);
+                    break;
+            }
+             return patentRights;
         } catch (Exception e) {
             e.printStackTrace();
             ArrayList<RePatentClaim> patentRights = new ArrayList<>();
@@ -81,11 +82,13 @@ public class ClaimSplitUtils {
         Integer num = 1;
         ArrayList<RePatentClaim> patentRights = new ArrayList<>();
         Boolean flag = true;
+
         for (int i = 0; i < claimSplitVOS.size(); i++) {
             Integer start = claimSplitVOS.get(i).getPosition();
             Integer end = content.length();
             String cont = claimSplitVOS.get(i).getContent();
             Matcher matcherNum = Pattern.compile(regexNum).matcher(cont);
+
             //查询当前序号
             if (matcherNum.find()) {
                 String a = matcherNum.group();
@@ -117,7 +120,7 @@ public class ClaimSplitUtils {
                 break;
             }
         }
-        if (flag.equals(false)) {
+        if (flag.equals(false) || patentRights.size() == 1) {
             reDefaultPatentClaim(patentRights, content);
         }
         return patentRights;
@@ -148,12 +151,16 @@ public class ClaimSplitUtils {
         switch (country) {
             case "CN":
                 regixs = ClaimSplitUtils.CNRegix;
+                break;
             case "JP":
                 regixs = ClaimSplitUtils.JPRegix;
-            case "KOR":
+                break;
+            case "KR":
                 regixs = ClaimSplitUtils.KORRegix;
+                break;
             default:
                 regixs = ClaimSplitUtils.ENReginx;
+                break;
         }
         for (String re : regixs) {
             Matcher matcher = Pattern.compile(re).matcher(content);
@@ -166,8 +173,7 @@ public class ClaimSplitUtils {
     }
 
     private static void reDefaultPatentClaim(ArrayList<RePatentClaim> patentRights, String content) {
-        patentRights = new ArrayList<>();
-
+        patentRights.clear();
         RePatentClaim rePatentClaim = new RePatentClaim();
         rePatentClaim.setSort(1);
         rePatentClaim.setContent(content);
@@ -176,7 +182,7 @@ public class ClaimSplitUtils {
     }
 
 
-    private static void loadCNPatentClaim(String patentNo,ArrayList<RePatentClaim> rePatentClaims) {
+    private static void loadCNPatentClaim(String patentNo, ArrayList<RePatentClaim> rePatentClaims) {
         String regex1 = "权利要求[0-9]+";
         String regex2 = "权利要求[0-9]+[至或~-]+[0-9]+";
 
@@ -378,7 +384,6 @@ public class ClaimSplitUtils {
                         .setPatentNo(patentNo)
                         .setType(1)
                         .setParentSort("-1");
-                patentRights.add(patentRight);
             }
         }
 

+ 18 - 49
src/main/java/cn/cslg/pas/common/utils/FileUtils.java

@@ -2,7 +2,6 @@ package cn.cslg.pas.common.utils;
 
 
 import cn.cslg.pas.Application;
-import cn.cslg.pas.common.vo.business.PatentProjectVO;
 import cn.hutool.core.util.IdUtil;
 import org.apache.commons.fileupload.FileItem;
 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
@@ -212,61 +211,31 @@ public class FileUtils {
     public String getSystemPath(String url) {
         return getStaticPath(COMMON_FILE) + FILE_SEPARATOR + url;
     }
-
-    public static void  writeObjectToFile(Object object, String url) {
-        //根据projectId查询对象
-        try {
-            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(url));
-            oos.writeObject(object);
-
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-
+    public static String getSystemPath2(String url) {
+        return getStaticPath(COMMON_FILE) + FILE_SEPARATOR + url;
     }
+    public  static void  writeFile(String json, String FilePath) {
 
-
-
-
-    public String readJson(String jsonPath) {
-        File jsonFile = new File(jsonPath);
         try {
-            FileReader fileReader = new FileReader(jsonFile);
-            BufferedReader reader = new BufferedReader(fileReader);
-            StringBuilder sb = new StringBuilder();
-            while (true) {
-                int ch = reader.read();
-                if (ch != -1) {
-                    sb.append((char) ch);
-                } else {
-                    break;
-                }
+            File file = new File(FilePath);
+
+            // if file doesnt exists, then create it
+            if (!file.exists()) {
+                file.createNewFile();
+            } else {
+                file.delete();
+                file.createNewFile();
             }
-            fileReader.close();
-            reader.close();
-            return sb.toString();
-        } catch (IOException e) {
-            return "";
-        }
-    }
 
+            // true = append file
+            FileWriter fileWritter = new FileWriter(file, false);
+            BufferedWriter bufferWritter = new BufferedWriter(fileWritter);
+            bufferWritter.write(json);
+            bufferWritter.close();
 
-    public static String writeJson(String jsonPath, Object object) {
-        // Map数据转化为Json,再转换为String
-        String data =JsonUtils.objectToJson(object);
-        File jsonFile = new File(jsonPath);
-        try {
-            // 文件不存在就创建文件
-            if (!jsonFile.exists()) {
-                jsonFile.createNewFile();
-            }
-            FileWriter fileWriter = new FileWriter(jsonFile.getAbsoluteFile(),false);
-            BufferedWriter bw = new BufferedWriter(fileWriter);
-            bw.write(data);
-            bw.close();
-            return "success";
         } catch (IOException e) {
-            return "error";
+            e.printStackTrace();
         }
     }
+
 }

+ 34 - 20
src/main/java/cn/cslg/pas/common/utils/parseQueryToTree/expressManager.java

@@ -1,9 +1,8 @@
 package cn.cslg.pas.common.utils.parseQueryToTree;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Stack;
+import org.springframework.util.CollectionUtils;
+
+import java.util.*;
 
 public class expressManager {
     HashMap<String, Symbol> hSymbols = new HashMap<String, Symbol>();
@@ -359,28 +358,42 @@ public class expressManager {
                         break;
                     case '(':
                     case '[':
-                        if (i == 0 || strTem.charAt(i - 1) == ' ' || (Tokens.size() > 0 && Tokens.get(Tokens.size() - 1) == String.valueOf(c)) || strTem.charAt(i - 1) == '=') {
-                            Tokens.add(String.valueOf(c));
-                            step = i;
+                        if (!isFindingEndYinHao) {
+                            if (step == (i - 1)) {
+                                Tokens.add(String.valueOf(c));
+                                step = i;
+                            } else {
+                                if (i == 0 || strTem.charAt(i - 1) == ' ' || (Tokens.size() > 0 && Tokens.get(Tokens.size() - 1) == String.valueOf(c)) || strTem.charAt(i - 1) == '=') {
+                                    Tokens.add(String.valueOf(c));
+                                    step = i;
+                                }
+                            }
                         }
                         break;
                     case ')':
                     case ']':
-                        if ((i < strTem.length() - 1 && (strTem.charAt(i + 1) == ' ' || strTem.charAt(i + 1) == c)) || i == strTem.length() - 1) {
-                            Boolean isAdd = false;
-                            for (int index = Tokens.size() - 1; index >= 0; index--) {
-                                if ((c == ')' && Tokens.get(index).equals("(")) || (c == ']' && Tokens.get(index).equals("["))) {
-                                    isAdd = true;
-                                    break;
-                                }
-                            }
-                            if (isAdd) {
-                                strTemToken = strTem.substring(step + 1, i);
-                                if (strTemToken != null && !strTemToken.equals("")) {
-                                    Tokens.add(strTemToken);
-                                }
+                        if (!isFindingEndYinHao) {
+                            if (step == (i - 1)) {
                                 Tokens.add(String.valueOf(c));
                                 step = i;
+                            } else {
+                                if ((i < strTem.length() - 1 && (strTem.charAt(i + 1) == ' ' || strTem.charAt(i + 1) == c)) || i == strTem.length() - 1) {
+                                    Boolean isAdd = false;
+                                    for (int index = Tokens.size() - 1; index >= 0; index--) {
+                                        if ((c == ')' && Tokens.get(index).equals("(")) || (c == ']' && Tokens.get(index).equals("["))) {
+                                            isAdd = true;
+                                            break;
+                                        }
+                                    }
+                                    if (isAdd) {
+                                        strTemToken = strTem.substring(step + 1, i);
+                                        if (strTemToken != null && !strTemToken.equals("")) {
+                                            Tokens.add(strTemToken);
+                                        }
+                                        Tokens.add(String.valueOf(c));
+                                        step = i;
+                                    }
+                                }
                             }
                         }
                         break;
@@ -417,4 +430,5 @@ public class expressManager {
             return null;
         }
     }
+
 }

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

@@ -95,4 +95,5 @@ public class ImportTaskAMVO {
     private Integer messageThreadCounter;
     private String patentNoStr;
     private List<EsCustomFieldDTO> fieldDTOS;
+    private Integer pdfType;
 }

+ 2 - 1
src/main/java/cn/cslg/pas/common/vo/business/EsAllCountVO.java

@@ -8,8 +8,9 @@ import java.util.List;
 @Data
 public class EsAllCountVO {
     private String condition;
+    private String groupField;
     private Integer projectId;
-    private List<EsCustomFieldValueDTO> customFields;
     private Integer taskId;
+    private List<EsCustomFieldValueDTO> customFields;
     private List<EsCountVO> countVOS;
 }

+ 2 - 0
src/main/java/cn/cslg/pas/common/vo/business/PatentNoVO.java

@@ -7,4 +7,6 @@ public class PatentNoVO {
 
     //专利号
     private String patentNo;
+
+    private Integer projectId;
 }

+ 2 - 0
src/main/java/cn/cslg/pas/common/vo/business/ReportProjectVO.java

@@ -224,5 +224,7 @@ public class ReportProjectVO {
     private Integer patentType;
     @Schema(description = "梳理意见")
     private String cardingOpinion;
+    @Schema(description = "关联id")
+    private Integer assoReportId;
 
 }

+ 2 - 0
src/main/java/cn/cslg/pas/common/vo/es/EsCustomFieldBatchVO.java

@@ -25,6 +25,8 @@ public class EsCustomFieldBatchVO {
 
     private String searchQuery;
 
+    private String groupField;
+
     private List<OrderDTO> orderDTOList;
 
     private List<EsCustomFieldValueDTO> customFields;

+ 36 - 0
src/main/java/cn/cslg/pas/common/vo/es/EsPatentCommonVO.java

@@ -0,0 +1,36 @@
+package cn.cslg.pas.common.vo.es;
+
+import cn.cslg.pas.common.dto.es.EsCustomFieldValueDTO;
+import cn.cslg.pas.common.model.request.OrderDTO;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class EsPatentCommonVO {
+
+    private Integer taskId;
+
+    private Integer projectId;
+
+    private Integer productId;
+
+    private String productFrom;
+
+    private String searchCondition;
+
+    private String esField;
+
+    private Long current;
+
+    private Long size;
+
+    private List<OrderDTO> orderDTOList;
+
+    private List<EsCustomFieldValueDTO> customFields;
+
+    private List<String> isDelete;
+    private List<String> isAdd;
+    private Long startNum;
+    private Long endNum;
+}

+ 2 - 0
src/main/java/cn/cslg/pas/common/vo/es/EsValueCurveVO.java

@@ -23,6 +23,8 @@ public class EsValueCurveVO {
 
     private String searchQuery;
 
+    private String groupField;
+
     private List<OrderDTO> orderDTOList;
 
     private List<EsCustomFieldValueDTO> customFields;

+ 9 - 14
src/main/java/cn/cslg/pas/controller/ImportTaskController.java

@@ -4,6 +4,7 @@ package cn.cslg.pas.controller;
 import cn.cslg.pas.common.core.base.Constants;
 import cn.cslg.pas.common.dto.ImportTaskDTO;
 import cn.cslg.pas.common.model.cronModel.Records;
+import cn.cslg.pas.common.model.importPDF.AddImportPDFTaskDTO;
 import cn.cslg.pas.common.model.request.StringRequest;
 import cn.cslg.pas.common.utils.Response;
 import cn.cslg.pas.factorys.businessFactory.Business;
@@ -21,19 +22,7 @@ import org.springframework.web.bind.annotation.*;
 public class ImportTaskController {
 
     @Autowired
-    private SystemDictService systemDictService;
-
-    @Autowired
-    private CommonService commonService;
-
-    @Autowired
-    private ScenarioService scenarioService;
-
-    @Autowired
-    private AssoScenarioMatterService assoScenarioMatterService;
-
-    @Autowired
-    private PersonFieldService personFieldService;
+    private ImportTaskService importTaskService;
 
     @Autowired
     private BusinessFactory businessFactory;
@@ -68,5 +57,11 @@ public class ImportTaskController {
         return Response.success("id");
     }
 
-//
+
+@Operation(summary = "添加pdf导入任务")
+@PostMapping("/addPdfTask")
+public Response addPdfTask(@RequestBody AddImportPDFTaskDTO addImportPDFTaskDTO) throws Exception {
+  Integer id=  importTaskService.addPdfTask(addImportPDFTaskDTO);
+    return Response.success(id);
+}
 }

+ 12 - 2
src/main/java/cn/cslg/pas/controller/PatentController.java

@@ -100,7 +100,12 @@ public class PatentController {
     @PostMapping("/queryPatent")
     public Response queryPatent(@RequestBody StringRequest stringRequest) throws Exception {
         Business business = businessFactory.getClass("patentService");
-        Records records = (Records) business.queryMessage(stringRequest);
+        Records records = null;
+        try {
+            records = (Records) business.queryMessage(stringRequest);
+        } catch (Exception e) {
+            return Response.error(e.getMessage());
+        }
         return Response.success(records);
     }
 
@@ -172,7 +177,12 @@ public class PatentController {
     @Operation(summary = "专利的聚合统计")
     @PostMapping("/esCountAnalysis")
     public Response esCountAnalysis(@RequestBody EsAllCountVO countVO) throws Exception {
-        EsCountDTO dto = esCountService.esCountAnalysis(countVO);
+        EsCountDTO dto = null;
+        try {
+            dto = esCountService.esCountAnalysis(countVO);
+        } catch (Exception e) {
+            return Response.error(e.getMessage());
+        }
         return Response.success(dto);
     }
 

+ 14 - 5
src/main/java/cn/cslg/pas/controller/PatentProjectController.java

@@ -4,6 +4,7 @@ import cn.cslg.pas.common.core.base.Constants;
 import cn.cslg.pas.common.dto.business.PatentProjectDTO;
 import cn.cslg.pas.common.dto.business.UpdateEventDTO;
 import cn.cslg.pas.common.dto.business.UpdatePatentProjectDTO;
+import cn.cslg.pas.common.model.addPatentToReport.AddProjectPatentToReportDTO;
 import cn.cslg.pas.common.model.cronModel.Records;
 import cn.cslg.pas.common.model.request.StringGroupRequest;
 import cn.cslg.pas.common.model.request.StringRequest;
@@ -13,6 +14,7 @@ import cn.cslg.pas.exception.UnLoginException;
 import cn.cslg.pas.exception.XiaoShiException;
 import cn.cslg.pas.factorys.businessFactory.Business;
 import cn.cslg.pas.factorys.businessFactory.BusinessFactory;
+import cn.cslg.pas.service.business.ProjectService;
 import com.alibaba.fastjson.JSONObject;
 import io.swagger.v3.oas.annotations.Operation;
 import lombok.extern.slf4j.Slf4j;
@@ -36,6 +38,8 @@ import java.util.List;
 public class PatentProjectController {
     @Autowired
     private BusinessFactory businessFactory;
+    @Autowired
+    private ProjectService projectService;
 
     @Operation(summary = "查询专利数据库")
     @PostMapping("/queryPatentProject")
@@ -61,8 +65,7 @@ public class PatentProjectController {
                     return Response.unLogin(e.getMessage());
                 } else if (e instanceof ConditionException) {
                     return Response.conditionError(e.getMessage());
-                }
-                else{
+                } else {
                     return Response.error(e.getMessage());
                 }
             }
@@ -91,8 +94,7 @@ public class PatentProjectController {
                 }
             }
             return Response.success(id);
-        }
-        else {
+        } else {
             return Response.error("网络异常");
         }
     }
@@ -113,8 +115,15 @@ public class PatentProjectController {
     @PostMapping("/groupPatentProject")
     public Response groupPatentProject(@RequestBody StringGroupRequest stringGroupRequest) throws Exception {
         Business business = businessFactory.getClass("patentProjectService");
-        Records records = (Records)business.getGroup(stringGroupRequest,"patentProject");
+        Records records = (Records) business.getGroup(stringGroupRequest, "patentProject");
         return Response.success(records);
     }
 
+
+    @Operation(summary = "将专题库专利添加报告")
+    @PostMapping("/addProjectPatentToReport")
+    public String addProjectPatentToReport(@RequestBody AddProjectPatentToReportDTO addProjectPatentToReportDTO) throws Exception {
+        projectService.addProjectPatentToReport(addProjectPatentToReportDTO);
+        return Response.success();
+    }
 }

+ 1 - 0
src/main/java/cn/cslg/pas/controller/ProductController.java

@@ -95,4 +95,5 @@ public class ProductController {
     }
 
 
+
 }

+ 112 - 0
src/main/java/cn/cslg/pas/controller/TemController.java

@@ -0,0 +1,112 @@
+package cn.cslg.pas.controller;
+
+import cn.cslg.pas.common.core.base.Constants;
+import cn.cslg.pas.common.dto.PatentColumnDTO;
+import cn.cslg.pas.common.dto.PatentDTO;
+import cn.cslg.pas.common.dto.business.AsInvalidReasonHistoryDTO;
+import cn.cslg.pas.common.dto.business.OtherPatentInfoDTO;
+import cn.cslg.pas.common.model.cronModel.Records;
+import cn.cslg.pas.common.model.request.StringRequest;
+import cn.cslg.pas.common.utils.ClaimUtils.ClaimSplitUtils;
+import cn.cslg.pas.common.utils.FileUtils;
+import cn.cslg.pas.common.utils.Response;
+import cn.cslg.pas.common.vo.PatentRightParams;
+import cn.cslg.pas.common.vo.RePatentClaim;
+import cn.cslg.pas.domain.es.Text;
+import cn.cslg.pas.service.business.AsInvalidReasonHistoryService;
+import cn.cslg.pas.service.business.es.EsService;
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONObject;
+import com.google.gson.JsonObject;
+import io.swagger.v3.oas.annotations.Operation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 作为无效证据使用历史
+ *
+ * @Author xiexiang
+ * @Date 2024/1/19
+ */
+@Slf4j
+@RequestMapping(Constants.API_XiaoSHI + "/tem")
+@RestController
+public class TemController {
+    @Autowired
+    private AsInvalidReasonHistoryService asInvalidReasonHistoryService;
+
+    @Autowired
+    private EsService esService;
+
+    @Operation(summary = "添加or更新作为无效证据使用历史")
+    @GetMapping("/saveOrUpdate")
+    public Response saveOrUpdate() throws Exception {
+        String rootPath1 = "C:\\Users\\admin\\Desktop\\patentClaim\\";
+        String rootPath2 = "C:\\Users\\admin\\Desktop\\patentClaimOnlyOne\\";
+
+        Long total = 0L;
+        Long current = 37L;
+        Boolean flag = true;
+        while (flag) {
+            System.out.println(current);
+            StringRequest stringRequest = new StringRequest();
+            stringRequest.setProjectId(323);
+            stringRequest.setCurrent(current);
+            stringRequest.setSize(10L);
+            PatentDTO patentDTO = esService.esSearch(stringRequest);
+            List<PatentColumnDTO> patentColumnDTOS = patentDTO.getPatents();
+            total = patentDTO.getTotal();
+            if (current * 10L > total) {
+                flag = false;
+            } else {
+                current++;
+            }
+            for (PatentColumnDTO patentColumnDTO : patentColumnDTOS) {
+                String pn = patentColumnDTO.getPatentNo();
+                List<Text> claims = patentColumnDTO.getClaim();
+                if (claims == null || claims.size() == 0) {
+                    continue;
+                }
+                Text text = claims.stream().filter(item -> item.getIfOrigin().equals(true)).findFirst().orElse(null);
+                if (text == null) {
+                    continue;
+                }
+                PatentRightParams rightParams = new PatentRightParams();
+                String content = text.getTextContent();
+                rightParams.setPatentNo(pn);
+                rightParams.setContent(content);
+                List<RePatentClaim> rePatentClaims = ClaimSplitUtils.formatPatentRight(rightParams);
+                StringBuilder stringBuilder = new StringBuilder();
+                rePatentClaims.forEach(item -> stringBuilder.append(item.getContent()));
+
+                if (rePatentClaims.size() == 1) {
+                    Map<String, Object> map = new HashMap<>();
+                    map.put("content", content);
+                    map.put("PN", patentColumnDTO.getPatentNo());
+                    String path = rootPath2 + patentColumnDTO.getPatentNo() + ".json";
+                    String json = JSONObject.toJSONString(map);
+                    FileUtils.writeFile(json, path);
+                }
+                if (!stringBuilder.toString().equals(content)) {
+                    Map<String, Object> map = new HashMap<>();
+                    map.put("content", content);
+                    map.put("PN", patentColumnDTO.getPatentNo());
+                    String path = rootPath1 + patentColumnDTO.getPatentNo() + ".json";
+                    String json = JSONObject.toJSONString(map);
+                    FileUtils.writeFile(json, path);
+                }
+                System.out.println(pn);
+            }
+        }
+        System.out.println("done");
+        return Response.success("");
+    }
+
+
+}

+ 1 - 0
src/main/java/cn/cslg/pas/domain/business/ImportTask.java

@@ -93,4 +93,5 @@ public class ImportTask extends BaseEntity<ImportTask> {
     private Integer pdfDoneNum;
     @TableField(value = "picture_done_num")
     private Integer pictureDoneNum;
+    private String remark;
 }

+ 2 - 0
src/main/java/cn/cslg/pas/domain/business/ImportTaskCondition.java

@@ -102,5 +102,7 @@ public class ImportTaskCondition extends BaseEntity<ImportTaskCondition> {
     @TableField(value = "custom_fields")
     private String customFields;
 
+    @TableField(value = "pdf_type")
+    private Integer pdfType;
 
 }

+ 19 - 2
src/main/java/cn/cslg/pas/factorys/EsBuilderFactory/NestedPersonQueryBuilder.java

@@ -1,10 +1,12 @@
 package cn.cslg.pas.factorys.EsBuilderFactory;
 
+import cn.cslg.pas.common.utils.StringUtils;
 import co.elastic.clients.elasticsearch._types.query_dsl.Query;
 import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders;
 import org.springframework.stereotype.Component;
 
 import java.text.ParseException;
+import java.util.Locale;
 
 @Component
 public class NestedPersonQueryBuilder implements IQueryBuilder{
@@ -20,8 +22,23 @@ public class NestedPersonQueryBuilder implements IQueryBuilder{
         Query query = null;
         if (operator.equals("=")) {
             String str = "*";
-            String s = str.concat(value).concat("*");
-            query = QueryBuilders.wildcard(i -> i.field(field).value(s));
+            if (field.equals("priorities.priorityno")) {
+                String s = "";
+                String sub = value.substring(0, 2);
+                if ((StringUtils.isPositiveInteger(sub) || sub.equalsIgnoreCase("CN")) && (value.length() == 13|| value.length() == 15)) {
+                    String frontPart = value.substring(0, value.length() - 1);
+                    String afterPart = value.substring(value.length() - 1);
+                    String s1 = frontPart + "." + afterPart;
+                    s = str.concat(s1.toUpperCase(Locale.ROOT)).concat("*");
+                } else {
+                    s = str.concat(value.toUpperCase(Locale.ROOT)).concat("*");
+                }
+                String finalS = s;
+                query = QueryBuilders.wildcard(i -> i.field(field).value(finalS));
+            } else {
+                String s = str.concat(value).concat("*");
+                query = QueryBuilders.wildcard(i -> i.field(field).value(s));
+            }
         } else {
             query = QueryBuilders.term(i -> i.field(field).value(value));
         }

+ 51 - 0
src/main/java/cn/cslg/pas/factorys/PatentExportFactory/GetClassifyValue.java

@@ -0,0 +1,51 @@
+package cn.cslg.pas.factorys.PatentExportFactory;
+
+import cn.cslg.pas.domain.es.PatentClassify;
+import com.alibaba.fastjson.JSONObject;
+import org.springframework.stereotype.Component;
+
+import java.lang.reflect.Field;
+import java.util.List;
+
+/**
+ * @Author xiexiang
+ * @Date 2024/6/6
+ */
+@Component
+public class GetClassifyValue implements GetValueImp {
+
+    @Override
+    public String getValue(Object value) {
+        try {
+            String classifyStr = JSONObject.toJSONString(value);
+            PatentClassify patentClassify = JSONObject.parseObject(classifyStr, PatentClassify.class);
+            if (patentClassify != null) {
+                String objectString = getObjectAsString(patentClassify);
+                return objectString;
+            } else {
+                return "";
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return "";
+        }
+    }
+
+
+    public static String getObjectAsString(Object obj) {
+        Class<?> clazz = obj.getClass();
+        StringBuilder result = new StringBuilder();
+        for (Field field : clazz.getDeclaredFields()) {
+            field.setAccessible(true); // 设置为可访问,即便是私有字段也可以访问到
+            try {
+                result.append(field.getName())
+                        .append("=")
+                        .append(field.get(obj))
+                        .append(", ");
+            } catch (IllegalAccessException e) {
+                e.printStackTrace();
+            }
+        }
+        return result.toString();
+    }
+}

+ 9 - 1
src/main/java/cn/cslg/pas/factorys/PatentExportFactory/GetDateValue.java

@@ -11,9 +11,17 @@ import java.util.Date;
  * @Date 2024/1/11
  */
 @Component
-public class GetDateValue implements GetValueImp{
+public class GetDateValue implements GetValueImp {
     @Override
     public String getValue(Object value) {
+        if (value == null) {
+            return "null";
+        }
+        if (!(value instanceof Date)) {
+            // 处理不合适的输入类型,比如字符串等
+            // 例如,如果输入是字符串,可以尝试将其解析为日期,或者直接返回错误提示
+            return "null"; // 这里根据实际情况返回相应的值
+        }
         Date inputDate = (Date)value;
         String reValue;
         // 创建SimpleDateFormat对象,指定输出日期的格式

+ 41 - 0
src/main/java/cn/cslg/pas/factorys/PatentExportFactory/GetPatentTypeValue.java

@@ -0,0 +1,41 @@
+package cn.cslg.pas.factorys.PatentExportFactory;
+
+import org.springframework.stereotype.Component;
+
+/**
+ * @Author xiexiang
+ * @Date 2024/6/6
+ */
+@Component
+public class GetPatentTypeValue implements GetValueImp {
+    @Override
+    public String getValue(Object value) {
+        String patentTypeStr = "";
+        if (value != null) {
+            try {
+                int patentType = Integer.parseInt(value.toString());
+
+                switch (patentType) {
+                    case 1:
+                    case 8:
+                        patentTypeStr = "发明";
+                        break;
+                    case 2:
+                    case 9:
+                        patentTypeStr = "实用新型";
+                        break;
+                    case 3:
+                        patentTypeStr = "外观";
+                        break;
+                    default:
+                        patentTypeStr = "";
+                        break;
+                }
+            } catch (NumberFormatException e) {
+                // 处理无法解析为整数的情况
+                patentTypeStr = "";
+            }
+        }
+        return patentTypeStr;
+    }
+}

+ 39 - 0
src/main/java/cn/cslg/pas/factorys/PatentExportFactory/GetSimpleStatusValue.java

@@ -0,0 +1,39 @@
+package cn.cslg.pas.factorys.PatentExportFactory;
+
+import org.springframework.stereotype.Component;
+
+/**
+ * @Author xiexiang
+ * @Date 2024/6/6
+ */
+@Component
+public class GetSimpleStatusValue implements GetValueImp {
+    @Override
+    public String getValue(Object value) {
+        String statusStr = "";
+        if (value != null) {
+            try {
+                int simpleStatus = Integer.parseInt(value.toString());
+
+                switch (simpleStatus) {
+                    case 1:
+                        statusStr = "有效";
+                        break;
+                    case 2:
+                        statusStr = "无效";
+                        break;
+                    case 3:
+                        statusStr = "审中";
+                        break;
+                    default:
+                        statusStr = "";
+                        break;
+                }
+            } catch (NumberFormatException e) {
+                // 处理无法解析为整数的情况
+                statusStr = "";
+            }
+        }
+        return statusStr;
+    }
+}

+ 4 - 0
src/main/java/cn/cslg/pas/factorys/PatentImportFactory/PatentImportFactory.java

@@ -2,6 +2,7 @@ package cn.cslg.pas.factorys.PatentImportFactory;
 
 import cn.cslg.pas.service.importPatent.ImportFromExcelToEsService;
 import cn.cslg.pas.service.importPatent.ImportFromWebToEsService;
+import cn.cslg.pas.service.importPatent.ImportPDFBatchService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ApplicationContext;
 import org.springframework.stereotype.Component;
@@ -21,6 +22,9 @@ public class PatentImportFactory {
         else if(shapeType.equals("importFromExcelToEsService")){
             return applicationContext.getBean(ImportFromExcelToEsService.class);
         }
+        else if(shapeType.equals("importPDFBatchService")){
+            return applicationContext.getBean(ImportPDFBatchService.class);
+        }
         return null;
     }
 }

+ 21 - 1
src/main/java/cn/cslg/pas/service/business/CommonService.java

@@ -109,5 +109,25 @@ public class CommonService {
         return maps;
 }
 
-
+    public static String readFile(String fileName) {
+        String json = "";
+        try {
+            //获取 applicationHome 内的路径 ...\target\classes 到这一层级下
+            //获取 file的parentFile 即最后一级之前的所有层级路径(包括盘符) 这里能获得到的最终层级为  ...\target 后续用FILE_SEPARATOR(系统路径分割通配符 即 "\") 以及fileName拼接生成存放文件的目录层级 即为根目录 root
+//            String filePath = fileUtils.getPath("/11.docx");
+            File file = new File(fileName);
+            Reader reader = new InputStreamReader(new FileInputStream(file), "utf-8");
+            int ch = 0;
+            StringBuffer buffer = new StringBuffer();
+            while ((ch = reader.read()) != -1) {
+                buffer.append((char) ch);
+            }
+            reader.close();
+            json = buffer.toString();
+            return json;
+        } catch (IOException e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
 }

+ 23 - 0
src/main/java/cn/cslg/pas/service/business/ImportTaskService.java

@@ -7,6 +7,7 @@ import cn.cslg.pas.common.model.cronModel.Personnel;
 import cn.cslg.pas.common.model.cronModel.PersonnelVO;
 import cn.cslg.pas.common.model.cronModel.Records;
 import cn.cslg.pas.common.model.cronModel.SystemFile;
+import cn.cslg.pas.common.model.importPDF.AddImportPDFTaskDTO;
 import cn.cslg.pas.common.model.request.GroupRequest;
 import cn.cslg.pas.common.model.request.QueryRequest;
 import cn.cslg.pas.common.utils.*;
@@ -528,4 +529,26 @@ public class ImportTaskService extends ServiceImpl<ImportTaskMapper, ImportTask>
         return sqls;
 
     }
+
+
+
+    public  Integer addPdfTask(AddImportPDFTaskDTO addImportPDFTaskDTO){
+        String fileGuid =addImportPDFTaskDTO.getFileGuid();
+        Integer pdfType =addImportPDFTaskDTO.getPdfType();
+        String remark =addImportPDFTaskDTO.getRemark();
+        ImportTaskCondition importTaskCondition =new ImportTaskCondition();
+        importTaskCondition.setFileGuid(fileGuid);
+        importTaskCondition.setType(5);
+        importTaskCondition.setPdfType(pdfType);
+        importTaskCondition.setCreateId("1");
+        importTaskCondition.insert();
+        ImportTask importTask =new ImportTask();
+        importTask.setImportTaskConditionId(importTaskCondition.getId());
+         importTask.setRemark(remark);
+         importTask.setCreateId("1");
+         importTask.setType(5);
+         importTask.insert();
+        schedulingTaskService.startTask();
+        return  importTask.getId();
+    }
 }

+ 40 - 1
src/main/java/cn/cslg/pas/service/business/PDFExportFirstPageService.java

@@ -22,6 +22,10 @@ import org.apache.pdfbox.multipdf.PDFMergerUtility;
 import org.apache.pdfbox.io.MemoryUsageSetting;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.PDPage;
+import org.apache.pdfbox.pdmodel.PDPageContentStream;
+import org.apache.pdfbox.pdmodel.common.PDRectangle;
+import org.apache.pdfbox.pdmodel.font.PDFont;
+import org.apache.pdfbox.pdmodel.font.PDType1Font;
 import org.apache.pdfbox.rendering.PDFRenderer;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
@@ -65,12 +69,12 @@ public class PDFExportFirstPageService {
         List<String> patentNos = this.getPatentNo(EsVO);
         Integer total = patentNos.size();
         Integer defaultNum = 0;
-
         PDFMergerUtility merger = new PDFMergerUtility();
         PDDocument resultDocument = new PDDocument();
         for (int i = 0; i < patentNos.size(); i++) {
             PatentNoVO patentNoVO = new PatentNoVO();
             patentNoVO.setPatentNo(patentNos.get(i));
+            patentNoVO.setProjectId(exportTask.getProjectId());
             PatentColumnDTO patentColumnDTO = new PatentColumnDTO();
             try {
                 patentColumnDTO = patentService.selectPatentDetail(patentNoVO);
@@ -94,6 +98,11 @@ public class PDFExportFirstPageService {
                             String pdfGuid2 = FormatUtil.getPDFFormat(appNo, type2);
                             pdfData = fileManagerService.downloadSystemFileFromFMS(pdfGuid2);
                             if (pdfData == null || pdfData.length == 0) {
+                                // 创建一个空白页文档 内容为暂无文档
+                                PDDocument blankPageDocument = createBlankPageDocument();
+                                merger.appendDocument(resultDocument, blankPageDocument);
+                                // 不需要关闭 blankPageDocument,因为在保存 resultDocument 时会处理它
+                                // 同样,根据这个修改更新任何相关的 WebSocketMessageVO 或代码其他部分。
                                 defaultNum++;
                                 continue;
                             } else {
@@ -183,6 +192,36 @@ public class PDFExportFirstPageService {
     }
 
     /**
+     * 创建一个空白pdf文档 内容为”暂无文档“
+     * @return
+     * @throws IOException
+     */
+    private PDDocument createBlankPageDocument() throws IOException {
+        PDDocument document = new PDDocument();
+        PDPage blankPage = new PDPage();
+        document.addPage(blankPage);
+
+        try (PDPageContentStream contentStream = new PDPageContentStream(document, blankPage)) {
+            // 加载适当的字体
+            PDFont font = PDType1Font.HELVETICA_BOLD;
+            contentStream.setFont(font, 30);
+
+            String text = "NO DOCUMENTS";
+            float textWidth = font.getStringWidth(text) / 1000 * 30;
+            PDRectangle pageSize = blankPage.getMediaBox();
+            float startX = (pageSize.getWidth() - textWidth) / 2;
+            float startY = pageSize.getHeight() / 2;
+
+            //居中
+            contentStream.beginText();
+//            contentStream.setLeading(14.5f);
+            contentStream.newLineAtOffset(startX, startY);
+            contentStream.showText(text);
+            contentStream.endText();
+        }
+        return document;
+    }
+    /**
      * 获取专利号
      * @param EsVO
      * @return

+ 80 - 19
src/main/java/cn/cslg/pas/service/business/PatentExportService.java

@@ -3,15 +3,21 @@ package cn.cslg.pas.service.business;
 import cn.cslg.pas.common.dto.ExportTaskDTO;
 import cn.cslg.pas.common.dto.PatentColumnDTO;
 import cn.cslg.pas.common.dto.PatentExport.PatentExportVO;
+import cn.cslg.pas.common.dto.es.EsQueryPatentFieldsDTO;
+import cn.cslg.pas.common.dto.es.InnerFields;
 import cn.cslg.pas.common.utils.*;
 import cn.cslg.pas.common.vo.ConfigVOS.PatentConfigVO;
+import cn.cslg.pas.common.vo.FieldValueVO;
 import cn.cslg.pas.common.vo.WebSocketMessageVO;
 import cn.cslg.pas.common.vo.business.PatentNoVO;
 import cn.cslg.pas.common.vo.es.EsCustomFieldBatchVO;
+import cn.cslg.pas.common.vo.es.EsPatentFieldsVO;
+import cn.cslg.pas.common.vo.es.InnerPatentFieldsVO;
 import cn.cslg.pas.domain.business.ImportTask;
 import cn.cslg.pas.exception.XiaoShiException;
 import cn.cslg.pas.factorys.PatentExportFactory.GetValueImp;
 import cn.cslg.pas.factorys.PatentExportFactory.PatentExportFactory;
+import cn.cslg.pas.service.business.es.EsCustomFieldService;
 import cn.cslg.pas.service.business.es.EsPatentService;
 import cn.cslg.pas.service.common.MessageService;
 import com.alibaba.fastjson.JSON;
@@ -58,6 +64,9 @@ public class PatentExportService {
     @Autowired
     private ImportTaskService importTaskService;
 
+    @Autowired
+    private EsCustomFieldService esCustomFieldService;
+
     /**
      * 导出专利
      *
@@ -79,12 +88,21 @@ public class PatentExportService {
             }
 
             //key的集合(标头:例如patentNo)
-            List<String> columns = selected.stream().filter(PatentExportVO::getSelected).map(PatentExportVO::getValue).distinct().collect(Collectors.toList());
+            List<PatentExportVO> patentExportVOS = selected.stream()
+                    .filter(PatentExportVO::getSelected)
+                    .collect(Collectors.toList());
+            List<String> types = Arrays.asList("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10");
+            List<InnerFields> innerFieldsList = new ArrayList<>();
+            for (PatentExportVO patentExportVO : patentExportVOS) {
+                if (types.contains(patentExportVO.getType())) {
+                    InnerFields innerFields = new InnerFields();
+                    innerFields.setFieldId(patentExportVO.getValue());
+                    innerFields.setFieldType(Integer.parseInt(patentExportVO.getType()));
+                    innerFieldsList.add(innerFields);
+                }
+            }
             //name的集合
             List<String> headers = selected.stream().filter(PatentExportVO::getSelected).map(PatentExportVO::getName).distinct().collect(Collectors.toList());
-            if (columns.size() != headers.size()) {
-                throw new XiaoShiException("数量不匹配");
-            }
             //新建工作簿
             HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
             //新建sheet页
@@ -117,28 +135,68 @@ public class PatentExportService {
             Integer total = patentNos.size();
             Integer defaultNum = 0;
             for (int i = 0; i < patentNos.size(); i++) {
+                String patentNo = patentNos.get(i);
                 Map<String, Object> map = new LinkedHashMap<>();
                 PatentNoVO patentNoVO = new PatentNoVO();
-                patentNoVO.setPatentNo(patentNos.get(i));
+                patentNoVO.setPatentNo(patentNo);
+                patentNoVO.setProjectId(exportTask.getProjectId());
                 PatentColumnDTO patent = patentService.selectPatentDetail(patentNoVO);
                 if (patent == null) {
                     defaultNum++;
                     continue;
                 }
-                for (int j = 0; j < columns.size(); j++) {
-                    String column = columns.get(j);
-                    PatentExportVO patentExportVO = selected.stream().filter(item -> item.getValue().equals(column)).findFirst().orElse(new PatentExportVO());
-                    // 使用反射获取属性值
-                    Object value = GenerateObjectUtil.getPropertyValue(patent, patentExportVO.getValue());
-                    if (value != null) {
-                        String json = CommonService.readJsonFile("patent.json");
-                        List<PatentConfigVO> patentConfigVOS = JSON.parseArray(json, PatentConfigVO.class);
-                        PatentConfigVO patentConfigVO = patentConfigVOS.stream().filter(item -> item.getValue().equals(column)).findFirst().orElse(null);
-                        String exportClass = patentConfigVO.getExportClass();
-                        GetValueImp getValueImp = patentExportFactory.getClass(exportClass);
-                        if (getValueImp != null) {
-                            String reValue = getValueImp.getValue(value);
-                            map.put(patentExportVO.getName(), reValue);
+
+                EsQueryPatentFieldsDTO esQueryPatentFieldsDTO = new EsQueryPatentFieldsDTO();
+                esQueryPatentFieldsDTO.setProjectId(exportTask.getProjectId());
+                esQueryPatentFieldsDTO.setTaskId(EsVO.getTaskId());
+                esQueryPatentFieldsDTO.setPatentNos(patentNos);
+                esQueryPatentFieldsDTO.setInnerFields(innerFieldsList);
+                List<EsPatentFieldsVO> list = esCustomFieldService.getPatentFields(esQueryPatentFieldsDTO);
+
+
+                for (int j = 0; j < patentExportVOS.size(); j++) {
+                    String column = patentExportVOS.get(j).getValue();
+                    String name = patentExportVOS.get(j).getName();
+                    String type = patentExportVOS.get(j).getType();
+
+                    if (types.contains(type)) {
+                        EsPatentFieldsVO esPatentFieldsVO = list.stream()
+                                .filter(item -> item.getPatentNo().equals(patentNo))
+                                .findFirst()
+                                .orElse(null);
+                        if (esPatentFieldsVO != null) {
+                            List<InnerPatentFieldsVO> innerClassFields = esPatentFieldsVO.getInnerClassFields();
+                            if (!innerClassFields.isEmpty()) {
+                                InnerPatentFieldsVO innerPatentFieldsVO = innerClassFields.stream()
+                                        .filter(item -> item.getField().equals(column) && item.getFieldType().equals(Integer.parseInt(type)))
+                                        .findFirst()
+                                        .orElse(null);
+                                if (innerPatentFieldsVO != null) {
+                                    List<FieldValueVO> fieldValueVOS = innerPatentFieldsVO.getFieldValueVOS();
+                                    if (!fieldValueVOS.isEmpty()) {
+                                        StringBuffer sb = new StringBuffer();
+                                        for (FieldValueVO fieldValueVO : fieldValueVOS) {
+                                            String valueStr = fieldValueVO.getValue();
+                                            sb.append(valueStr);
+                                        }
+                                        map.put(name, sb.toString());
+                                    }
+                                }
+                            }
+                        }
+                    } else {
+                        // 使用反射获取属性值
+                        Object value = GenerateObjectUtil.getPropertyValue(patent, column);
+                        if (value != null) {
+                            String json = CommonService.readJsonFile("patent.json");
+                            List<PatentConfigVO> patentConfigVOS = JSON.parseArray(json, PatentConfigVO.class);
+                            PatentConfigVO patentConfigVO = patentConfigVOS.stream().filter(item -> item.getValue().equals(column)).findFirst().orElse(null);
+                            String exportClass = patentConfigVO.getExportClass();
+                            GetValueImp getValueImp = patentExportFactory.getClass(exportClass);
+                            if (getValueImp != null) {
+                                String reValue = getValueImp.getValue(value);
+                                map.put(name, reValue);
+                            }
                         }
                     }
                 }
@@ -191,8 +249,11 @@ public class PatentExportService {
             if (taskId == null) {
                 throw new XiaoShiException("导出记录失败");
             }
+
         } catch (FileNotFoundException e) {
             throw new FileNotFoundException();
+        } catch (Exception e) {
+
         }
     }
 

+ 1 - 2
src/main/java/cn/cslg/pas/service/business/PatentService.java

@@ -39,8 +39,7 @@ public class PatentService extends ServiceImpl<PatentMapper, Patent> implements
             records.setSize(queryRequest.getSize());
             records.setData(patentDTO.getPatents());
             records.setTotal(patentDTO.getTotal());
-        }
-       catch (Exception e){
+        } catch (Exception e){
             e.printStackTrace();
        }
         return records;

+ 7 - 4
src/main/java/cn/cslg/pas/service/business/ProjectService.java

@@ -97,14 +97,17 @@ public class ProjectService extends ServiceImpl<ProjectMapper, Project> {
      * @param addProjectPatentToReportDTO
      */
     public void addProjectPatentToReport(AddProjectPatentToReportDTO addProjectPatentToReportDTO) {
+
         //查询专利号
         StringRequest stringRequest = addProjectPatentToReportDTO.getStringRequest();
         Integer toProjectId = addProjectPatentToReportDTO.getToProjectId();
-        List<String> notInNos = addProjectPatentToReportDTO.getNotInPatentNos();
+        List<String> notInNos = addProjectPatentToReportDTO.getIsDelete();
+     Long startNum =addProjectPatentToReportDTO.getStartNumber();
+     Long endNum =addProjectPatentToReportDTO.getEndNumber();
         List<PatentNoWithIdVO> patentWithIdVOS = new ArrayList<>();
-        List<String> InPatentNos = addProjectPatentToReportDTO.getInPatentNos();
+        List<String> InPatentNos = addProjectPatentToReportDTO.getIsAdd();
         try {
-            patentWithIdVOS = esPatentService.getPatentIdsWithNotNo(stringRequest, notInNos);
+            patentWithIdVOS = esPatentService.getPatentIdsWithNotNo(stringRequest, notInNos,startNum,endNum);
             if (patentWithIdVOS != null && patentWithIdVOS.size() > 0) {
                 this.addAssoToEs(patentWithIdVOS, toProjectId);
             }
@@ -120,7 +123,7 @@ public class ProjectService extends ServiceImpl<ProjectMapper, Project> {
             }
 
         } catch (Exception e) {
-
+e.printStackTrace();
         }
 
     }

+ 2 - 4
src/main/java/cn/cslg/pas/service/business/ProjectTaskService.java

@@ -29,16 +29,14 @@ import cn.cslg.pas.service.common.FileManagerService;
 import cn.cslg.pas.service.permissions.PermissionService;
 import cn.cslg.pas.service.query.FormatQueryService;
 import com.alibaba.fastjson.JSONObject;
-import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.joda.time.format.FormatUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.web.bind.annotation.RequestBody;
+
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
@@ -52,7 +50,7 @@ import java.util.stream.Collectors;
  * @Date 2023/11/21
  */
 @Service
-public class ProjectTaskService extends ServiceImpl<ProjectTaskMapper, ProjectTask> implements Business {
+ public class ProjectTaskService extends ServiceImpl<ProjectTaskMapper, ProjectTask> implements Business {
 
     @Autowired
     private CacheUtils cacheUtils;

+ 22 - 14
src/main/java/cn/cslg/pas/service/business/ReportProjectService.java

@@ -205,7 +205,7 @@ public class ReportProjectService extends ServiceImpl<ReportProjectMapper, Repor
         StringRequest stringRequest = new StringRequest();
         BeanUtils.copyProperties(groupRequest, stringRequest);
         List<String> sqls = formatQueryService.reSqls(stringRequest, tableName);
-        sqls=this.loadSearchSql(sqls);
+        sqls = this.loadSearchSql(sqls);
         //格式化 分组
         GroupConfig groupConfig = null;
         if (groupRequest.getGroupBy() != null) {
@@ -217,13 +217,13 @@ public class ReportProjectService extends ServiceImpl<ReportProjectMapper, Repor
             }
         }
         tableName = "report as rp left join project as p on rp.project_id =p.id ";
-        tableName+=  "left join (select * from asso_project_event where scenario_id is not null ) as asps on p.id = asps.project_id " +
+        tableName += "left join (select * from asso_project_event where scenario_id is not null ) as asps on p.id = asps.project_id " +
                 "left join (select * from asso_project_event where event_id is not null ) as aspe on p.id = aspe.project_id " +
                 "left join (select * from asso_project_event where matter_id is not null ) as aspm on p.id = aspm.project_id";
         //返回分组数据
         QueryGroupImp queryGroupImp = queryGroupFactory.getClass(groupConfig.getGroupClass());
-        String countFiled="distinct p.id";
-        ReGroupDataVO reGroupDataVO = queryGroupImp.getGroup(sqls, tableName, groupConfig.getSqlField(),countFiled);
+        String countFiled = "distinct p.id";
+        ReGroupDataVO reGroupDataVO = queryGroupImp.getGroup(sqls, tableName, groupConfig.getSqlField(), countFiled);
 
         //装载数据
         GroupVO groupVO = new GroupVO();
@@ -333,10 +333,10 @@ public class ReportProjectService extends ServiceImpl<ReportProjectMapper, Repor
             try {
                 PatentWithIdVO patentWithIdVO = esService.getIdByPatentNo(reportProject.getSignPatentNo());
                 if (patentWithIdVO != null && patentWithIdVO.getPatent() != null) {
-                    if(patentWithIdVO.getPatent().getPatentType()!=null) {
+                    if (patentWithIdVO.getPatent().getPatentType() != null) {
                         reportProject.setPatentType(Integer.parseInt(patentWithIdVO.getPatent().getPatentType()));
                     }
-                    }
+                }
             } catch (Exception e) {
                 throw new XiaoShiException("未查询到标的专利");
             }
@@ -371,7 +371,7 @@ public class ReportProjectService extends ServiceImpl<ReportProjectMapper, Repor
         List<AssoProjectEvent> assoProjectEvents = new ArrayList<>();
         List<ProjectEventDTO> events = reportProjectDTO.getEvents();
         if (events != null && events.size() != 0) {
-            assoProjectEventService.addAssoEventProject(events,project.getId(),1);
+            assoProjectEventService.addAssoEventProject(events, project.getId(), 1);
         }
         /**
          * 装载和附件关联
@@ -548,7 +548,7 @@ public class ReportProjectService extends ServiceImpl<ReportProjectMapper, Repor
         List<ProjectEventDTO> events = updateReportProjectDTO.getEvents();
         if (events != null && events.size() != 0) {
             if (events != null && events.size() != 0) {
-                assoProjectEventService.addAssoEventProject(events,project.getId(),1);
+                assoProjectEventService.addAssoEventProject(events, project.getId(), 1);
             }
         }
         /**
@@ -612,6 +612,7 @@ public class ReportProjectService extends ServiceImpl<ReportProjectMapper, Repor
         List<SystemDict> reportTypeList = new ArrayList<>();
         List<Scenario> scenarios = new ArrayList<>();
         List<Matter> matters = new ArrayList<>();
+        List<AssoProject> assoProjects = new ArrayList<>();
         reportProjectVOs.forEach(
                 item -> {
 
@@ -682,6 +683,11 @@ public class ReportProjectService extends ServiceImpl<ReportProjectMapper, Repor
             systemDictLambdaQueryWrapper.eq(SystemDict::getType, "REPORT_TYPE").or().eq(SystemDict::getType, "REPORT_STATE");
             reportTypeList = systemDictService.list(systemDictLambdaQueryWrapper);
 
+
+            //
+            LambdaQueryWrapper<AssoProject> queryWrapper1 = new LambdaQueryWrapper<>();
+            queryWrapper1.in(AssoProject::getAssoProjectId, ids);
+            assoProjects = assoProjectService.list(queryWrapper1);
         }
 
 
@@ -853,7 +859,11 @@ public class ReportProjectService extends ServiceImpl<ReportProjectMapper, Repor
                     reportProjectVO.setStatusName(systemDictStatus.getLabel());
                 }
             }
-
+            //装载关联报告id
+            AssoProject assoProject = assoProjects.stream().filter(item -> item.getAssoProjectId().equals(reportProjectVO.getId())).findFirst().orElse(null);
+            if (assoProject != null) {
+                reportProjectVO.setAssoReportId(assoProject.getProjectId());
+            }
         }
     }
 
@@ -882,16 +892,14 @@ public class ReportProjectService extends ServiceImpl<ReportProjectMapper, Repor
     private List<String> loadSearchSql(List<String> sqls) {
         PersonnelVO personnelVO = cacheUtils.getLoginUser(loginUtils.getId());
         String id = personnelVO.getId();
-        Integer tenantId= personnelVO.getTenantId();
+        Integer tenantId = personnelVO.getTenantId();
         Integer roleType = personnelVO.getRoleType();
         String rootSql = "";
         if (roleType == null || roleType.equals(0)) {
             rootSql = "(p.create_id =" + id + " or p.head_id=" + id + " or p.id in (select project_id from asso_project_person where person_id =" + id + "))";
 
-        }
-        else if(roleType.equals(2))
-        {
-            rootSql="p.tenant_id="+tenantId;
+        } else if (roleType.equals(2)) {
+            rootSql = "p.tenant_id=" + tenantId;
         }
         if (sqls.get(0) != null && !sqls.get(0).equals("") && !rootSql.equals("")) {
             sqls.set(0, rootSql + " and " + "(" + sqls.get(0) + ")");

+ 97 - 70
src/main/java/cn/cslg/pas/service/business/es/EsCountService.java

@@ -1,6 +1,7 @@
 package cn.cslg.pas.service.business.es;
 
 import cn.cslg.pas.common.dto.GetUnselectedDTO;
+import cn.cslg.pas.common.dto.PatentColumnDTO;
 import cn.cslg.pas.common.dto.business.EsCountDTO;
 import cn.cslg.pas.common.dto.business.EsCountDetailDTO;
 import cn.cslg.pas.common.dto.es.EsCustomFieldValueDTO;
@@ -18,11 +19,14 @@ import cn.cslg.pas.factorys.EsCountAnalyseBuilderFactory.IEsCountAnalysisBuilder
 import cn.cslg.pas.service.business.CommonService;
 import cn.cslg.pas.service.query.FormatQueryService;
 import co.elastic.clients.elasticsearch.ElasticsearchClient;
+import co.elastic.clients.elasticsearch._types.SortOptions;
+import co.elastic.clients.elasticsearch._types.SortOrder;
 import co.elastic.clients.elasticsearch._types.aggregations.*;
 import co.elastic.clients.elasticsearch._types.query_dsl.Query;
 import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders;
 import co.elastic.clients.elasticsearch.core.SearchRequest;
 import co.elastic.clients.elasticsearch.core.SearchResponse;
+import co.elastic.clients.elasticsearch.core.search.FieldCollapse;
 import co.elastic.clients.elasticsearch.core.search.Hit;
 import com.alibaba.fastjson.JSON;
 import lombok.RequiredArgsConstructor;
@@ -71,6 +75,7 @@ public class EsCountService {
         List<EsCustomFieldValueDTO> customFields = vo.getCustomFields();
         Integer taskId = vo.getTaskId();
         Integer projectId = vo.getProjectId();
+        String groupField = vo.getGroupField();
         EsCountDTO esCountDTO = new EsCountDTO();
         HashMap<String, List<EsCountDetailDTO>> map = new HashMap<>();
         List<EsCountDetailDTO> detailDTOS = new ArrayList<>();
@@ -88,7 +93,7 @@ public class EsCountService {
                         valueDTO.setFieldValue(Arrays.asList("\""+value+"\""));
                         customFields.add(valueDTO);
                         this.getDatas(searchCondition, "",customFields, taskId, projectId,
-                                esCountVOS, detailDTOS, esCountDTO, value, map);
+                                esCountVOS, detailDTOS, esCountDTO, value, map,groupField);
                     }
                 }
             } else {
@@ -100,12 +105,12 @@ public class EsCountService {
                         condition = countVO.getField() + " = " + "\""+value+"\"";
                     }
                     this.getDatas(searchCondition, condition, customFields, taskId, projectId,
-                            esCountVOS, detailDTOS, esCountDTO, value, map);
+                            esCountVOS, detailDTOS, esCountDTO, value, map,groupField);
                 }
             }
         } else {
             this.getDatas(searchCondition, "", customFields, taskId, projectId, countVOS,
-                    detailDTOS, esCountDTO, "", map);
+                    detailDTOS, esCountDTO, "", map,groupField);
         }
         esCountDTO.setDetailDTOS(detailDTOS);
         return esCountDTO;
@@ -113,7 +118,7 @@ public class EsCountService {
 
     public void getDatas(String searchCondition,String condition, List<EsCustomFieldValueDTO> customFields, Integer taskId,
                               Integer projectId, List<EsCountVO> countVOS, List<EsCountDetailDTO> detailDTOS,
-                              EsCountDTO esCountDTO, String firstName, Map<String, List<EsCountDetailDTO>> map) throws Exception {
+                              EsCountDTO esCountDTO, String firstName, Map<String, List<EsCountDetailDTO>> map,String groupField) throws Exception {
 
         if (StringUtils.isNotEmpty(condition)) {
             if (searchCondition != null && !"".equals(searchCondition.trim())) {
@@ -132,11 +137,11 @@ public class EsCountService {
             }
         }
         searchCondition = this.getCondition(searchCondition, taskId, projectId);
-
         SearchRequest.Builder builder = new SearchRequest.Builder();
         //设置查询索引
         builder.index("patent");
         Query query = null;
+//        String esGroupField = "";
         if (StringUtils.isNotEmpty(searchCondition)) {
             //1. 解析检索条件
             treeNode tree = expressManager.getInstance().Parse(searchCondition, false);
@@ -144,75 +149,88 @@ public class EsCountService {
             //3. 从es中检索数据
             query = formatQueryService.EsQueryToQuery((operateNode) tree, "patent",projectId);
             builder.query(query);
+//            if (StringUtils.isNotEmpty(groupField) && !groupField.equals("0")) {
+//                String esField = esService.getGroupField(groupField);
+//                esGroupField = esField;
+//                Query existQ = QueryBuilders.exists(i -> i.field(esField));
+//                Query finalQuery = query;
+//                Query bool = QueryBuilders.bool(i -> i.must(finalQuery, existQ));
+//                builder.query(bool);
+//                FieldCollapse collapse = FieldCollapse.of(i -> i.field(esField));
+//                builder.collapse(collapse);
+//            } else {
+//                builder.query(query);
+//            }
         }
+        if (query != null) {
+            for (EsCountVO countVO : countVOS) {
+                String field = countVO.getField();
+                String fieldId = countVO.getFieldId();
+                Integer topN = countVO.getTopN();
+                String valueOne = countVO.getValueOne();
+                String valueTwo = countVO.getValueTwo();
+                Integer fieldType = null;
+                String type = countVO.getFieldType();
+                if (StringUtils.isNotEmpty(type) && type.equals("tree")) {
+                    fieldType = 6;
+                }
+                String format = countVO.getFormat();
+                List<String> values = countVO.getValues();
+                Aggregation aggregation = this.getAggregation(countVO, projectId, taskId);
+                builder.aggregations("Agg", aggregation);
+                //解除最大条数限制
+                builder.trackTotalHits(i -> i.enabled(true));
+                SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
+                Aggregate agg = response.aggregations().get("Agg");
 
-        for (EsCountVO countVO : countVOS) {
-            String field = countVO.getField();
-            String fieldId = countVO.getFieldId();
-            Integer topN = countVO.getTopN();
-            String valueOne = countVO.getValueOne();
-            String valueTwo = countVO.getValueTwo();
-            Integer fieldType = null;
-            String type = countVO.getFieldType();
-            if (StringUtils.isNotEmpty(type) && type.equals("tree")) {
-                fieldType = 6;
-            }
-            String format = countVO.getFormat();
-            List<String> values = countVO.getValues();
-            Aggregation aggregation = this.getAggregation(countVO, projectId, taskId);
-            builder.aggregations("Agg", aggregation);
-            //解除最大条数限制
-            builder.trackTotalHits(i -> i.enabled(true));
-            SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
-            Aggregate agg = response.aggregations().get("Agg");
+                if (StringUtils.isNotEmpty(field)) {
+                    if (dateList.contains(field)) {
+                        if (CollectionUtils.isEmpty(values)) {
+                            this.getDateCountDTOS(agg, field, topN, format, detailDTOS, esCountDTO,valueOne,valueTwo);
+                        } else {
+                            this.getDateAnalysisDTOS(agg, field, topN, detailDTOS, esCountDTO, firstName, map, values);
+                        }
+                    } else if (nestedList.contains(field)) {
+                        this.getNestedCountDTOS(agg, field, topN, detailDTOS, esCountDTO, firstName, map, values,valueOne);
+                        if (!CollectionUtils.isEmpty(values)) {
+                            esCountDTO.setAllNumber(agg.nested().docCount());
+                        }
+                    } else if (nestDateList.contains(field)) {
+                        if (CollectionUtils.isEmpty(values)) {
+                            Aggregate termsAgg = agg.nested().aggregations().get("terms_agg");
+                            this.getDateCountDTOS(termsAgg, field, topN, format, detailDTOS, esCountDTO,valueOne,valueTwo);
+                        } else {
+                            Aggregate termsAgg = agg.nested().aggregations().get("terms_agg");
+                            this.getDateAnalysisDTOS(termsAgg, field, topN, detailDTOS, esCountDTO, firstName, map, values);
+                        }
+                    } else if (nestChildList.contains(field)) {
+                        Aggregate childAgg = agg.children().aggregations().get("childAgg");
+                        this.getNestedCountDTOS(childAgg, field, topN, detailDTOS, esCountDTO, firstName, map, values,valueOne);
+                        if (!CollectionUtils.isEmpty(values)) {
+                            esCountDTO.setAllNumber(childAgg.nested().docCount());
+                        }
+                    } else if (childList.contains(field)) {
+                        if (CollectionUtils.isEmpty(values)) {
+                            this.getChildCountDTOS(agg, field, fieldType, topN, detailDTOS, esCountDTO,projectId,fieldId,query,null);
+                        } else {
+                            this.getChildAnalysisDTOS(agg, field, fieldType, topN,
+                                    detailDTOS, esCountDTO, firstName, map, values);
+                        }
+                    } else if (numberList.contains(field)) {
+                        if (CollectionUtils.isEmpty(values)) {
 
-            if (StringUtils.isNotEmpty(field)) {
-                if (dateList.contains(field)) {
-                    if (CollectionUtils.isEmpty(values)) {
-                        this.getDateCountDTOS(agg, field, topN, format, detailDTOS, esCountDTO,valueOne,valueTwo);
+                        } else {
+                            this.getNumberAnalysisDTOS(agg, field, topN, detailDTOS, esCountDTO, firstName, map, values);
+                        }
                     } else {
-                        this.getDateAnalysisDTOS(agg, field, topN, detailDTOS, esCountDTO, firstName, map, values);
-                    }
-                } else if (nestedList.contains(field)) {
-                    this.getNestedCountDTOS(agg, field, topN, detailDTOS, esCountDTO, firstName, map, values,valueOne);
-                    if (!CollectionUtils.isEmpty(values)) {
-                        esCountDTO.setAllNumber(agg.nested().docCount());
-                    }
-                } else if (nestDateList.contains(field)) {
-                    if (CollectionUtils.isEmpty(values)) {
-                        Aggregate termsAgg = agg.nested().aggregations().get("terms_agg");
-                        this.getDateCountDTOS(termsAgg, field, topN, format, detailDTOS, esCountDTO,valueOne,valueTwo);
-                    } else {
-                        Aggregate termsAgg = agg.nested().aggregations().get("terms_agg");
-                        this.getDateAnalysisDTOS(termsAgg, field, topN, detailDTOS, esCountDTO, firstName, map, values);
-                    }
-                } else if (nestChildList.contains(field)) {
-                    Aggregate childAgg = agg.children().aggregations().get("childAgg");
-                    this.getNestedCountDTOS(childAgg, field, topN, detailDTOS, esCountDTO, firstName, map, values,valueOne);
-                    if (!CollectionUtils.isEmpty(values)) {
-                        esCountDTO.setAllNumber(childAgg.nested().docCount());
-                    }
-                } else if (childList.contains(field)) {
-                    if (CollectionUtils.isEmpty(values)) {
-                        this.getChildCountDTOS(agg, field, fieldType, topN, detailDTOS, esCountDTO,projectId,fieldId,query);
-                    } else {
-                        this.getChildAnalysisDTOS(agg, field, fieldType, topN,
-                                detailDTOS, esCountDTO, firstName, map, values);
-                    }
-                } else if (numberList.contains(field)) {
-                    if (CollectionUtils.isEmpty(values)) {
-
-                    } else {
-                        this.getNumberAnalysisDTOS(agg, field, topN, detailDTOS, esCountDTO, firstName, map, values);
+                        this.getTermCountDTOS(agg, field, topN, detailDTOS, esCountDTO, firstName, map, values,valueOne);
                     }
                 } else {
-                    this.getTermCountDTOS(agg, field, topN, detailDTOS, esCountDTO, firstName, map, values,valueOne);
+                    this.getFilterCountDTO(agg, searchCondition, detailDTOS);
                 }
-            } else {
-                this.getFilterCountDTO(agg, searchCondition, detailDTOS);
+                esCountDTO.setCondition(searchCondition);
+                esCountDTO.setAnalyseMap(map);
             }
-            esCountDTO.setCondition(searchCondition);
-            esCountDTO.setAnalyseMap(map);
         }
     }
 
@@ -522,7 +540,8 @@ public class EsCountService {
      * @param detailDTOS
      */
     public void getChildCountDTOS(Aggregate agg, String field, Integer fieldType, Integer topN,
-                                  List<EsCountDetailDTO> detailDTOS, EsCountDTO esCountDTO,Integer projectId, String fieldId,Query query) throws Exception {
+                                  List<EsCountDetailDTO> detailDTOS, EsCountDTO esCountDTO,Integer projectId,
+                                  String fieldId,Query query,String esField) throws Exception {
         esCountDTO.setAllNumber(agg.children().docCount());
         Aggregate childAgg = agg.children().aggregations().get("childAgg");
         List<StringTermsBucket> list = childAgg.sterms().buckets().array();
@@ -544,7 +563,7 @@ public class EsCountService {
             });
         });
         if (fieldType == null || fieldType != 6) {
-            GetUnselectedDTO unselectedDTO = this.getUnselectedCustomNum1(projectId, fieldId, query);
+            GetUnselectedDTO unselectedDTO = this.getUnselectedCustomNum1(projectId, fieldId, query,esField);
             EsCountDetailDTO detail = new EsCountDetailDTO();
             detail.setField(field);
             detail.setName("未选择");
@@ -561,13 +580,21 @@ public class EsCountService {
     }
 
     //统计未选择数量
-    public GetUnselectedDTO getUnselectedCustomNum1(Integer projectId, String fieldId, Query query) throws Exception {
+    public GetUnselectedDTO getUnselectedCustomNum1(Integer projectId, String fieldId, Query query,String esField) throws Exception {
         GetUnselectedDTO dto = new GetUnselectedDTO();
         SearchRequest.Builder builder = new SearchRequest.Builder();
         //设置查询索引
         builder.index("patent");
         builder.size(9999);
-        builder.query(query);
+        if (StringUtils.isNotEmpty(esField)) {
+            Query existQ = QueryBuilders.exists(i -> i.field(esField));
+            Query bool = QueryBuilders.bool(i -> i.must(query, existQ));
+            builder.query(bool);
+            FieldCollapse collapse = FieldCollapse.of(i -> i.field(esField));
+            builder.collapse(collapse);
+        } else {
+            builder.query(query);
+        }
         SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
         List<Hit<Patent>> hits = response.hits().hits();
         List<String> list = new ArrayList<>();

+ 21 - 76
src/main/java/cn/cslg/pas/service/business/es/EsCustomFieldService.java

@@ -1,13 +1,8 @@
 package cn.cslg.pas.service.business.es;
 
-import cn.cslg.pas.common.core.base.IfConstant;
+import cn.cslg.pas.common.dto.PatentColumnDTO;
 import cn.cslg.pas.common.dto.es.*;
-import cn.cslg.pas.common.model.request.OrderDTO;
 import cn.cslg.pas.common.utils.FormatUtil;
-import cn.cslg.pas.common.utils.parseQueryToTree.expressManager;
-import cn.cslg.pas.common.utils.parseQueryToTree.operateNode;
-import cn.cslg.pas.common.utils.parseQueryToTree.treeNode;
-import cn.cslg.pas.common.vo.EsConfigVO;
 import cn.cslg.pas.common.vo.FieldValueVO;
 import cn.cslg.pas.common.vo.PatentWithIdVO;
 import cn.cslg.pas.common.vo.es.*;
@@ -17,27 +12,21 @@ import cn.cslg.pas.domain.business.CustomOption;
 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.CommonService;
 import cn.cslg.pas.service.business.CustomOptionService;
 import cn.cslg.pas.service.business.TreeNodeService;
 import cn.cslg.pas.service.query.FormatQueryService;
 import co.elastic.clients.elasticsearch.ElasticsearchClient;
-import co.elastic.clients.elasticsearch._types.SortOptions;
 import co.elastic.clients.elasticsearch._types.SortOrder;
-import co.elastic.clients.elasticsearch._types.aggregations.Aggregation;
-import co.elastic.clients.elasticsearch._types.aggregations.AggregationBuilders;
-import co.elastic.clients.elasticsearch._types.aggregations.NestedAggregation;
+import co.elastic.clients.elasticsearch._types.aggregations.*;
 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.FieldCollapse;
 import co.elastic.clients.elasticsearch.core.search.Hit;
-import co.elastic.clients.json.JsonData;
-import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import lombok.RequiredArgsConstructor;
-import lombok.Value;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -45,9 +34,6 @@ import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
-import java.io.IOException;
-import java.lang.reflect.Array;
-import java.text.ParseException;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -321,6 +307,8 @@ public class EsCustomFieldService {
         Integer projectId = vo.getProjectId();
         Integer startNum = vo.getStartNumber();
         Integer endNum = vo.getEndNumber();
+        int number = endNum - startNum + 1;
+        String groupField = vo.getGroupField();
         List<String> isAdd = new ArrayList<>();
         if (!CollectionUtils.isEmpty(vo.getIsAdd())) {
             isAdd = vo.getIsAdd();
@@ -329,71 +317,28 @@ public class EsCustomFieldService {
         if (!CollectionUtils.isEmpty(vo.getIsDelete())) {
             isDel = vo.getIsDelete();
         }
-        String searchCondition = "";
-        if (StringUtils.isNotEmpty(vo.getSearchQuery())) {
-            searchCondition = vo.getSearchQuery();
-        }
-        List<EsCustomFieldValueDTO> customFields = vo.getCustomFields();
-        if (!CollectionUtils.isEmpty(customFields)) {
-            searchCondition = esService.parseCustomField(customFields,projectId,taskId);
-        }
-        if (taskId != null) {
-            if (searchCondition != null && !"".equals(searchCondition.trim())) {
-                searchCondition = "taskId = " + taskId + " AND " + searchCondition;
-            } else {
-                searchCondition = "taskId = " + taskId;
-            }
-        } else {
-            if (projectId != null) {
-                if (searchCondition != null && !"".equals(searchCondition.trim())) {
-                    searchCondition = "projectId = " + projectId + " AND " + searchCondition;
-                } else {
-                    searchCondition = "projectId = " + projectId;
-                }
-            }
-        }
-        SearchRequest.Builder builder = new SearchRequest.Builder();
-        //设置查询索引
-        builder.index("patent");
-        //1. 解析检索条件
-        treeNode tree = expressManager.getInstance().Parse(searchCondition, false);
-        //格式化检索式
-        //3. 从es中检索数据
-        Query q = formatQueryService.EsQueryToQuery((operateNode) tree, "patent",null);
-        builder.query(q);
 
-        //排序
-        List<SortOptions> optionsList = new ArrayList<>();
-        List<OrderDTO> dtoList = vo.getOrderDTOList();
-        if (!CollectionUtils.isEmpty(dtoList)) {
-            String json = CommonService.readJsonFile("patent.json");
-            List<EsConfigVO> esConfigVOS = JSON.parseArray(json, EsConfigVO.class);
-            for (OrderDTO orderDTO : dtoList) {
-                EsConfigVO configVO = esConfigVOS.stream().filter(item -> item.getField().equals(orderDTO.getOrderBy())).findFirst().orElse(null);
-                if (configVO != null) {
-                    if (orderDTO.getOrderType().equals(IfConstant.NO)) {
-                        SortOptions sortOptions = SortOptions.of(i -> i.field(j -> j.field(configVO.getEsField()).order(SortOrder.Asc).missing(-1)));
-                        optionsList.add(sortOptions);
-                    } else {
-                        SortOptions sortOptions = SortOptions.of(i -> i.field(j -> j.field(configVO.getEsField()).order(SortOrder.Desc).missing(-1)));
-                        optionsList.add(sortOptions);
-                    }
-                }
-            }
-        } else {
-            SortOptions sortOptions = SortOptions.of(i -> i.field(j -> j.field("patent_no.keyword").order(SortOrder.Desc).missing(-1)));
-            optionsList.add(sortOptions);
+        //判断同族分组
+        String esField = "";
+        if (StringUtils.isNotEmpty(groupField) && !groupField.equals("0")) {
+            esField = esService.getGroupField(groupField);
         }
-        builder.sort(optionsList);
-
-        int number = endNum - startNum + 1;
-        if (startNum > 0 && endNum > startNum) {
+        EsPatentCommonVO commonVO = new EsPatentCommonVO();
+        commonVO.setTaskId(taskId);
+        commonVO.setProjectId(projectId);
+        commonVO.setSearchCondition(vo.getSearchQuery());
+        commonVO.setCurrent(startNum.longValue());
+        commonVO.setSize(Integer.valueOf(number).longValue());
+        commonVO.setEsField(esField);
+        commonVO.setCustomFields(vo.getCustomFields());
+        commonVO.setOrderDTOList(vo.getOrderDTOList());
+        SearchRequest.Builder builder = esService.getCommonPatentByGroup(commonVO);
+        if (startNum > 0 && number > 0) {
             builder.from(startNum - 1).size(number);
         }
-
         SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
-        List<Hit<Patent>> hits = response.hits().hits();
         List<String> patentNos = new ArrayList<>();
+        List<Hit<Patent>> hits = response.hits().hits();
         for (Hit<Patent> hit : hits) {
             Patent patent = hit.source();
             patentNos.add(patent.getPatentNo());

+ 79 - 101
src/main/java/cn/cslg/pas/service/business/es/EsPatentService.java

@@ -19,10 +19,12 @@ import cn.cslg.pas.common.utils.parseQueryToTree.treeNode;
 import cn.cslg.pas.common.vo.ContentVO;
 import cn.cslg.pas.common.vo.EsConfigVO;
 import cn.cslg.pas.common.vo.PatentPageMessageVO;
+import cn.cslg.pas.common.vo.PatentWithIdVO;
 import cn.cslg.pas.common.vo.business.PatentKinDetailVO;
 import cn.cslg.pas.common.vo.business.PatentKinVO;
 import cn.cslg.pas.common.vo.business.PatentNoVO;
 import cn.cslg.pas.common.vo.business.SelectProductVO;
+import cn.cslg.pas.common.vo.es.EsPatentCommonVO;
 import cn.cslg.pas.domain.es.*;
 import cn.cslg.pas.mapper.ProductCategoryMapper;
 import cn.cslg.pas.mapper.ProductMapper;
@@ -32,7 +34,10 @@ import cn.cslg.pas.service.common.FileManagerService;
 import cn.cslg.pas.service.permissions.PermissionService;
 import cn.cslg.pas.service.query.FormatQueryService;
 import co.elastic.clients.elasticsearch.ElasticsearchClient;
+import co.elastic.clients.elasticsearch._types.SortOptions;
 import co.elastic.clients.elasticsearch._types.SortOrder;
+import co.elastic.clients.elasticsearch._types.aggregations.Aggregate;
+import co.elastic.clients.elasticsearch._types.aggregations.StringTermsBucket;
 import co.elastic.clients.elasticsearch._types.query_dsl.Query;
 import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders;
 import co.elastic.clients.elasticsearch.core.DeleteResponse;
@@ -80,6 +85,7 @@ public class EsPatentService {
     @Autowired
     @Lazy
     private EsService esService;
+
     /**
      * 根据专利号查询专利详情
      *
@@ -97,13 +103,13 @@ public class EsPatentService {
         Query q2 = QueryBuilders.term(t -> t.field("public_no.keyword").value(vo.getPatentNo()));
         //授权号
         Query q3 = QueryBuilders.term(t -> t.field("grant_no.keyword").value(vo.getPatentNo()));
-        Query query = QueryBuilders.bool(i -> i.should(q1,q2,q3));
+        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();
         for (Hit<Patent> hit : hits) {
             Patent esMess = hit.source();
-            BeanUtils.copyProperties(esMess, dto);
+            dto = esService.getPatentColumnDTO(esMess, vo.getProjectId(), hit.id());
             //格式化权利要求
             List<Text> claims = dto.getClaim();
             if (claims != null && claims.size() > 0) {
@@ -111,17 +117,6 @@ public class EsPatentService {
                     item.setTextContent(PatentRightUtils.getFormatClaim(item.getTextContent(), item.getLanguage()));
                 });
             }
-            dto.setRightHolderAddr(esMess.getRightHolderAddr());
-            dto.setApplicantAddr(esMess.getApplicantAddr());
-            if (!CollectionUtils.isEmpty(esMess.getApplicant())) {
-                dto.setApplicant(this.loadName(esMess.getApplicant()));
-            }
-            if (!CollectionUtils.isEmpty(esMess.getRightHolder())) {
-                dto.setRightHolder(this.loadName(esMess.getRightHolder()));
-            }
-            if (!CollectionUtils.isEmpty(esMess.getInventor())) {
-                dto.setInventor(this.loadName(esMess.getInventor()));
-            }
             if (esMess.getPatentNo().equals(vo.getPatentNo())) {
                 break;
             }
@@ -139,14 +134,14 @@ public class EsPatentService {
         builder.index("legal_event");
         List<Query> queries = new ArrayList<>();
 
-            Query q1 = QueryBuilders.term(i -> i.field("app_no").value(patentNo));
-            queries.add(q1);
+        Query q1 = QueryBuilders.term(i -> i.field("app_no").value(patentNo));
+        queries.add(q1);
 
-            Query q2 = QueryBuilders.term(i -> i.field("public_no").value(patentNo));
-            queries.add(q2);
+        Query q2 = QueryBuilders.term(i -> i.field("public_no").value(patentNo));
+        queries.add(q2);
 
-            Query q3 = QueryBuilders.term(i -> i.field("grant_no").value(patentNo));
-            queries.add(q3);
+        Query q3 = QueryBuilders.term(i -> i.field("grant_no").value(patentNo));
+        queries.add(q3);
 
         if (!CollectionUtils.isEmpty(queries)) {
             Query query = QueryBuilders.bool(i -> i.should(queries));
@@ -300,14 +295,14 @@ public class EsPatentService {
         }
         if (!CollectionUtils.isEmpty(systemFiles)) {
             SystemFile systemFile1 = systemFiles.stream().filter(item -> item.getGuid().equals(pdfFormat1)).findFirst().orElse(null);
-            SystemFile systemFile2 =  systemFiles.stream().filter(item->item.getGuid().equals(pdfFormat2)).findFirst().orElse(null);
-            if(systemFile1!=null) {
+            SystemFile systemFile2 = systemFiles.stream().filter(item -> item.getGuid().equals(pdfFormat2)).findFirst().orElse(null);
+            if (systemFile1 != null) {
                 InnerPatentPdfDTO dto = new InnerPatentPdfDTO();
                 dto.setPdfGuid(pdfFormat1);
                 dto.setType(0);
                 list.add(dto);
             }
-            if(systemFile2!=null) {
+            if (systemFile2 != null) {
                 InnerPatentPdfDTO dto = new InnerPatentPdfDTO();
                 dto.setPdfGuid(pdfFormat2);
                 dto.setType(1);
@@ -361,8 +356,8 @@ public class EsPatentService {
         Query q3 = QueryBuilders.term(t -> t.field("patent.grant_no").value(no));
         //同族类型
         Query q4 = QueryBuilders.term(t -> t.field("family_type").value(type));
-        Query q =QueryBuilders.bool(i->i.should(q1,q2,q3));
-        Query bool = QueryBuilders.bool(i -> i.must(q4,q));
+        Query q = QueryBuilders.bool(i -> i.should(q1, q2, q3));
+        Query bool = QueryBuilders.bool(i -> i.must(q4, q));
         builder.query(bool);
         //分页
         if (pageNum > 0 && pageSize > 0) {
@@ -591,40 +586,13 @@ public class EsPatentService {
 
         Long current = queryRequest.getCurrent();
         Long size = queryRequest.getSize();
-        SearchRequest.Builder builder = new SearchRequest.Builder();
-        //设置查询索引
-        builder.index("patent");
-        Query q = this.getQuery(queryRequest);
-        //4. 返回数据
-        builder.query(q);
-        //排序
-        List<OrderDTO> dtoList = queryRequest.getOrderDTOList();
-        if (!CollectionUtils.isEmpty(dtoList)) {
-            String json = CommonService.readJsonFile("patent.json");
-            List<EsConfigVO> esConfigVOS = JSON.parseArray(json, EsConfigVO.class);
-            for (OrderDTO orderDTO : dtoList) {
-                EsConfigVO configVO = esConfigVOS.stream().filter(item -> item.getField().equals(orderDTO.getOrderBy())).findFirst().orElse(null);
-                if (configVO != null) {
-                    if (orderDTO.getOrderType().equals(IfConstant.NO)) {
-                        builder.sort(sortOptionsBuilder -> sortOptionsBuilder
-                                .field(fieldSortBuilder -> fieldSortBuilder
-                                        .field(configVO.getEsField()).order(SortOrder.Asc)));
-                    } else {
-                        builder.sort(sortOptionsBuilder -> sortOptionsBuilder
-                                .field(fieldSortBuilder -> fieldSortBuilder
-                                        .field(configVO.getEsField()).order(SortOrder.Desc)));
-                    }
-                }
-            }
-        } else {
-            builder.sort(sortOptionsBuilder -> sortOptionsBuilder
-                    .field(fieldSortBuilder -> fieldSortBuilder
-                            .field("patent_no.keyword").order(SortOrder.Desc)));
-        }
-        //分页
-        if (current > 0 && size > 0) {
-            builder.from(current.intValue() - 1).size(size.intValue());
-        }
+        EsPatentCommonVO esPatentCommonVO = esService.tranPatentRequestToComVO(queryRequest);
+        esPatentCommonVO.setStartNum(current);
+        esPatentCommonVO.setEndNum(current + size);
+        esPatentCommonVO.setCurrent(null);
+        esPatentCommonVO.setSize(null);
+        SearchRequest.Builder builder = esService.getCommonPatent(esPatentCommonVO);
+        Records records = new Records();
         SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
         List<Hit<Patent>> hits = response.hits().hits();
         for (Hit<Patent> hit : hits) {
@@ -632,15 +600,21 @@ public class EsPatentService {
             patentPageMessageVO.setPatentNo(hit.source().getPatentNo());
             patentPageMessageVOS.add(patentPageMessageVO);
         }
-        Records records = new Records();
-        records.setTotal(response.hits().total().value());
+        long total = 0L;
+        if (StringUtils.isNotEmpty(esPatentCommonVO.getEsField())) {
+            Aggregate aggregate = response.aggregations().get("count");
+            total = aggregate.cardinality().value();
+        } else {
+            total = response.hits().total().value();
+        }
+        records.setTotal(total);
+
         records.setSize(size);
         records.setCurrent(current);
         records.setData(patentPageMessageVOS);
         return records;
     }
 
-
     /**
      * 检索上一页下一页信息
      *
@@ -650,8 +624,8 @@ public class EsPatentService {
     public List<Patent> getPatentsWithNotNo(QueryRequest queryRequest, List<String> patentNos) throws Exception {
         List<Patent> patentList = new ArrayList<>();
         SearchRequest.Builder builder = new SearchRequest.Builder();
-        Long current =queryRequest.getCurrent();
-        Long size =queryRequest.getSize();
+        Long current = queryRequest.getCurrent();
+        Long size = queryRequest.getSize();
         //设置查询索引
         builder.index("patent");
         Query q = this.getQuery(queryRequest);
@@ -705,7 +679,7 @@ public class EsPatentService {
     public Query getQuery(QueryRequest queryRequest) throws Exception {
         String searchCondition = "";
         Integer projectId = queryRequest.getProjectId();
-        Integer taskId =queryRequest.getTaskId();
+        Integer taskId = queryRequest.getTaskId();
         //判断表达式
         if (queryRequest instanceof StringRequest) {
             searchCondition = ((StringRequest) queryRequest).getSearchQuery();
@@ -728,8 +702,7 @@ public class EsPatentService {
             } else {
                 searchCondition = "taskId = " + taskId;
             }
-        }
-       else if (projectId != null) {
+        } else if (projectId != null) {
             if (searchCondition != null && !"".equals(searchCondition.trim())) {
                 searchCondition = "projectId = " + projectId + " AND " + searchCondition;
             } else {
@@ -749,12 +722,12 @@ public class EsPatentService {
         treeNode tree = expressManager.getInstance().Parse(searchCondition, false);
         //格式化检索式
         //3. 从es中检索数据
-        Query q = formatQueryService.EsQueryToQuery((operateNode) tree, "patent",null);
+        Query q = formatQueryService.EsQueryToQuery((operateNode) tree, "patent", null);
 
         return q;
     }
 
-    private List<Query> getNoNotInQuery(List<String> patentNos) {
+    public List<Query> getNoNotInQuery(List<String> patentNos) {
         List<Query> queryList = new ArrayList<>();
         for (String patentNo : patentNos) {
             Query q1 = QueryBuilders.term(t -> t.field("patent_no.keyword").value(patentNo));
@@ -763,6 +736,28 @@ public class EsPatentService {
         return queryList;
     }
 
+    public Query getEntireNotInQuery(EsPatentCommonVO commonVO) throws Exception {
+        Integer projectId = commonVO.getProjectId();
+        Integer productId = commonVO.getProductId();
+        Integer taskId = commonVO.getTaskId();
+        String searchCondition = commonVO.getSearchCondition();
+        String productFrom = commonVO.getProductFrom();
+        List<EsCustomFieldValueDTO> customFields = commonVO.getCustomFields();
+        if (!CollectionUtils.isEmpty(customFields)) {
+            String customFieldCondition = esService.parseCustomField(customFields, projectId, taskId);
+            if (StringUtils.isNotEmpty(searchCondition)) {
+                searchCondition = searchCondition + " AND " + customFieldCondition;
+            } else {
+                searchCondition = customFieldCondition;
+            }
+        }
+        String condition = esService.appendIdsCondition(searchCondition, taskId, productFrom, projectId, productId);
+        //1. 解析检索条件
+        treeNode tree = expressManager.getInstance().Parse(condition, false);
+        //3. 从es中检索数据
+        Query q = formatQueryService.EsQueryToQuery((operateNode) tree, "patent", projectId);
+        return q;
+    }
 
     /**
      * 根据id查询
@@ -792,42 +787,25 @@ public class EsPatentService {
     }
 
 
-    public List<PatentNoWithIdVO> getPatentIdsWithNotNo(QueryRequest queryRequest, List<String> patentNos) throws Exception {
-        List<PatentNoWithIdVO> patentWithIdVOS=new ArrayList<>();
-        SearchRequest.Builder builder = new SearchRequest.Builder();
-        Long current =queryRequest.getCurrent();
-        Long size =queryRequest.getSize();
-        //设置查询索引
-        builder.index("patent");
-        Query q = this.getQuery(queryRequest);
+    public List<PatentNoWithIdVO> getPatentIdsWithNotNo(QueryRequest queryRequest, List<String> patentNos, Long startNum, Long endNum) throws Exception {
+        List<PatentNoWithIdVO> patentWithIdVOS = new ArrayList<>();
 
-        Query reQuery = null;
-        if (patentNos != null && patentNos.size() > 0) {
-            List<Query> notInQuery = this.getNoNotInQuery(patentNos);
-            reQuery = QueryBuilders.bool(i -> i.must(q).mustNot(notInQuery));
-        } else {
-            reQuery = QueryBuilders.bool(i -> i.must(q));
-        }
-        //4. 返回数据
-        builder.query(reQuery);
-        if (current > 0 && size > 0) {
-            builder.from(current.intValue() - 1).size(size.intValue());
-        }
-        List<String> reSources = this.rePatentSource();
-        builder.source(sourceOptionsBuilder -> sourceOptionsBuilder
-                .filter(fieldSourceBuilder -> fieldSourceBuilder
-                        .includes(reSources)));
+        EsPatentCommonVO esPatentCommonVO = esService.tranPatentRequestToComVO(queryRequest);
+        esPatentCommonVO.setIsDelete(patentNos);
+        esPatentCommonVO.setStartNum(startNum);
+        esPatentCommonVO.setEndNum(endNum);
+        SearchRequest.Builder builder = esService.getCommonPatent(esPatentCommonVO);
+            SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
+            List<Hit<Patent>> hits = response.hits().hits();
+            for (Hit<Patent> hit : hits) {
+                if ((patentNos == null || patentNos.size() == 0) || (!patentNos.contains(hit.source().getPatentNo()))) {
 
-        SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
-        List<Hit<Patent>> hits = response.hits().hits();
-        for (Hit<Patent> hit : hits) {
-            if (hits != null && hits.size() > 0) {
-                PatentNoWithIdVO patentWithIdVO =new PatentNoWithIdVO();
-                patentWithIdVO.setId(hit.id());
-                patentWithIdVO.setPatentNo(hit.source().getPatentNo());
-                patentWithIdVOS.add(patentWithIdVO);
+                    PatentNoWithIdVO patentWithIdVO = new PatentNoWithIdVO();
+                    patentWithIdVO.setId(hit.id());
+                    patentWithIdVO.setPatentNo(hit.source().getPatentNo());
+                    patentWithIdVOS.add(patentWithIdVO);
+                }
             }
-        }
         return patentWithIdVOS;
     }
 }

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

@@ -4,23 +4,17 @@ import cn.cslg.pas.common.core.base.IfConstant;
 import cn.cslg.pas.common.dto.GetUnselectedDTO;
 import cn.cslg.pas.common.dto.PatentColumnDTO;
 import cn.cslg.pas.common.dto.PatentDTO;
-//import cn.cslg.pas.common.dto.business.EsPatentFamilyDTO;
-import cn.cslg.pas.common.dto.PatentStarListDTO;
-import cn.cslg.pas.common.dto.business.ContentDetailDTO;
 import cn.cslg.pas.common.dto.business.EsPatentFamilyDTO;
 import cn.cslg.pas.common.dto.business.SelectClaimDTO;
-import cn.cslg.pas.common.dto.es.EsCustomFieldDTO;
 import cn.cslg.pas.common.dto.es.EsCustomFieldValueDTO;
 import cn.cslg.pas.common.model.request.MapRequest;
 import cn.cslg.pas.common.model.request.OrderDTO;
 import cn.cslg.pas.common.model.request.QueryRequest;
 import cn.cslg.pas.common.model.request.StringRequest;
 import cn.cslg.pas.common.utils.FormatUtil;
-import cn.cslg.pas.common.utils.parseQueryToTree.expressManager;
-import cn.cslg.pas.common.utils.parseQueryToTree.operateNode;
-import cn.cslg.pas.common.utils.parseQueryToTree.treeNode;
 import cn.cslg.pas.common.vo.*;
 import cn.cslg.pas.common.vo.es.EsCustomFieldBatchVO;
+import cn.cslg.pas.common.vo.es.EsPatentCommonVO;
 import cn.cslg.pas.common.vo.es.PatentFamilyMessageWithId;
 import cn.cslg.pas.domain.es.*;
 import cn.cslg.pas.exception.XiaoShiException;
@@ -32,6 +26,7 @@ import co.elastic.clients.elasticsearch._types.*;
 import co.elastic.clients.elasticsearch._types.aggregations.*;
 import co.elastic.clients.elasticsearch._types.query_dsl.*;
 import co.elastic.clients.elasticsearch.core.*;
+import co.elastic.clients.elasticsearch.core.search.FieldCollapse;
 import co.elastic.clients.elasticsearch.core.search.Hit;
 import co.elastic.clients.json.JsonData;
 import com.alibaba.fastjson.JSON;
@@ -164,63 +159,172 @@ public class EsService {
             }
             searchCondition = stringBuilder.toString();
         }
-        List<EsCustomFieldValueDTO> customFields = queryRequest.getCustomFields();
-        if (!CollectionUtils.isEmpty(customFields)) {
-            String customFieldCondition = this.parseCustomField(customFields, projectId, taskId);
-            if (StringUtils.isNotEmpty(searchCondition)) {
-                searchCondition = searchCondition + " AND " + customFieldCondition;
-            } else {
-                searchCondition = customFieldCondition;
-            }
+        //判断同族分组
+        String esField = "";
+        if (StringUtils.isNotEmpty(groupField) && !groupField.equals("0")) {
+            esField = this.getGroupField(groupField);
+        }
+        EsPatentCommonVO commonVO = new EsPatentCommonVO();
+        commonVO.setTaskId(taskId);
+        commonVO.setProjectId(projectId);
+        commonVO.setProductId(productId);
+        commonVO.setSearchCondition(searchCondition);
+        commonVO.setProductFrom(productFrom);
+        commonVO.setCurrent(current);
+        commonVO.setSize(size);
+        commonVO.setEsField(esField);
+        commonVO.setCustomFields(queryRequest.getCustomFields());
+        commonVO.setOrderDTOList(queryRequest.getOrderDTOList());
+        SearchRequest.Builder builder = this.getCommonPatent(commonVO);
+        //解除最大条数限制
+        builder.trackTotalHits(i -> i.enabled(true));
+        SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
+        List<PatentColumnDTO> list = new ArrayList<>();
+        List<Hit<Patent>> hits = response.hits().hits();
+        long total = 0L;
+        if (StringUtils.isNotEmpty(esField)) {
+            Aggregate aggregate = response.aggregations().get("count");
+            total = aggregate.cardinality().value();
+        } else {
+            total = response.hits().total().value();
         }
-        String condition = this.appendIdsCondition(searchCondition, taskId, productFrom, projectId, productId);
+        for (Hit<Patent> hit : hits) {
+            String id = hit.id();
+            Patent esMess = hit.source();
+            PatentColumnDTO columnDTO = this.getPatentColumnDTO(esMess, projectId, id);
+            list.add(columnDTO);
+        }
+        this.loadCoulumnDTO(list);
+        dto.setTotal(total);
+        dto.setPatents(list);
+        dto.setPageNum(current);
+        dto.setPageSize(size);
+        return dto;
+    }
+
+    //获取分组字段栏位
+    public String getGroupField(String groupField) {
+        String esField = "";
+        switch (groupField) {
+            case "simpleFamilyId":
+                esField = "simple_family_id";
+                break;
+            case "inpadocFamilyId":
+                esField = "inpadoc_family_id";
+                break;
+            case "patsnapFamilyId":
+                esField = "patsnap_family_id";
+                break;
+            default:
+                esField = "0";
+                break;
+        }
+        return esField;
+    }
+
+    //获取通用检索专利方法--服务检索专利清单
+    public SearchRequest.Builder getCommonPatent(EsPatentCommonVO commonVO) throws Exception {
+        String esField = commonVO.getEsField();
+
+        //计算分页信息
+        Long current = commonVO.getCurrent();
+        Long size = commonVO.getSize();
+        Long startNum = commonVO.getStartNum();
+        Long endNum = commonVO.getEndNum();
+        Integer temPageFrom = 0;
+        Integer temPageSize = 100000;
+        if (current != null && size != null) {
+            temPageFrom = (current.intValue() - 1) * size.intValue();
+            temPageSize = size.intValue();
+        } else if (startNum != null && endNum != null) {
+            temPageFrom = startNum.intValue() - 1;
+            temPageSize = (endNum.intValue() - startNum.intValue()) + 1;
+        }
+        Integer pageFrom = temPageFrom;
+        Integer pageSize = temPageSize;
 
         SearchRequest.Builder builder = new SearchRequest.Builder();
         //设置查询索引
         builder.index("patent");
-        //1. 解析检索条件
-        treeNode tree = expressManager.getInstance().Parse(condition, false);
-        //3. 从es中检索数据
-        Query q = formatQueryService.EsQueryToQuery((operateNode) tree, "patent", projectId);
-        builder.query(q);
+
+        Query reQuery = esPatentService.getEntireNotInQuery(commonVO);
+
         //判断同族分组
-        String str = "";
-        if (StringUtils.isNotEmpty(groupField)) {
-            switch (groupField) {
-                case "simpleFamilyId":
-                    str = "simple_family_id";
-                    break;
-                case "inpadocFamilyId":
-                    str = "inpadoc_family_id";
-                    break;
-                case "patsnapFamilyId":
-                    str = "patsnap_family_id";
-                    break;
-            }
-        }
-        String esField = str;
         if (StringUtils.isNotEmpty(esField)) {
-            List<SortOptions> options = new ArrayList<>();
-            SortOptions appDate = SortOptions.of(i -> i.field(j -> j.field("app_date").order(SortOrder.Asc)));
-            options.add(appDate);
-            Aggregation bucketSort = AggregationBuilders.bucketSort(i -> i.from((current.intValue() - 1) * size.intValue()).size(size.intValue()));
-            Aggregation aggregation = new Aggregation.Builder().terms(new TermsAggregation.Builder()
-                    .field(esField).size(100000).build())
-                    .aggregations(new HashMap() {{
-                        put("hitAgg", bucketSort);
-                    }}).build();
-            builder.aggregations("Agg", aggregation);
-            //对聚合结果统计出总数
-            Aggregation terms = AggregationBuilders.terms(i -> i.field(esField).size(100000));
-            builder.aggregations("termAgg", terms);
-            BucketsPath bucketsPath = BucketsPath.of(i -> i.single("termAgg>_count"));
-            Aggregation statsBucket = AggregationBuilders.statsBucket(i -> i.bucketsPath(bucketsPath));
-            builder.aggregations("statsBucket", statsBucket);
+            Query existQ = QueryBuilders.exists(i -> i.field(esField));
+            Query bool = QueryBuilders.bool(i -> i.must(reQuery, existQ));
+            builder.query(bool);
+            FieldCollapse collapse = FieldCollapse.of(i -> i.field(esField));
+            builder.collapse(collapse);
+            //统计总数
+            Aggregation aggregation = AggregationBuilders.cardinality(i -> i.field(esField));
+            builder.aggregations("count", aggregation);
+        } else {
+            builder.query(reQuery);
         }
+        builder.from(pageFrom).size(pageSize);
 
         //排序
+        List<OrderDTO> dtoList = commonVO.getOrderDTOList();
+        List<SortOptions> optionsList = this.getCommonSortMethod(dtoList);
+        builder.sort(optionsList);
+        return builder;
+    }
+
+    //获取通用检索专利方法--服务于批量删除、标引、查询价值曲线、导出excel、pdf首页
+    public SearchRequest.Builder getCommonPatentByGroup(EsPatentCommonVO commonVO) throws Exception {
+        String esField = commonVO.getEsField();
+        Query reQuery = esPatentService.getEntireNotInQuery(commonVO);
+
+        SearchRequest.Builder builder = new SearchRequest.Builder();
+        //设置查询索引
+        builder.index("patent");
+        //判断同族分组
+        if (StringUtils.isNotEmpty(esField)) {
+            Query existQ = QueryBuilders.exists(i -> i.field(esField));
+            Query bool = QueryBuilders.bool(i -> i.must(reQuery, existQ));
+            builder.query(bool);
+            FieldCollapse collapse = FieldCollapse.of(i -> i.field(esField));
+            builder.collapse(collapse);
+        } else {
+            builder.query(reQuery);
+        }
+        //排序
+        List<OrderDTO> dtoList = commonVO.getOrderDTOList();
+        List<SortOptions> optionsList = this.getCommonSortMethod(dtoList);
+        builder.sort(optionsList);
+        return builder;
+    }
+
+    public PatentWithIdVO getPatentColumnDTOByGroup2(String key, Integer projectId, String field) throws Exception {
+        PatentWithIdVO dto = new PatentWithIdVO();
+        SearchRequest.Builder builder = new SearchRequest.Builder();
+        //设置查询索引
+        builder.index("patent");
+        Query query = QueryBuilders.term(i -> i.field("project_id").value(projectId));
+        Query q1 = QueryBuilders.hasChild(i -> i.type("project").query(query));
+        Query q2 = QueryBuilders.term(i -> i.field(field).value(key));
+        Query bool = QueryBuilders.bool(i -> i.must(q1, q2));
+        builder.query(bool);
+        SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
+        List<Hit<Patent>> hits = response.hits().hits();
+        if (!CollectionUtils.isEmpty(hits)) {
+            String id = hits.get(0).id();
+            Patent patent = hits.get(0).source();
+            dto.setPatent(patent);
+            dto.setId(id);
+        }
+        return dto;
+    }
+
+    /**
+     * 获取公共排序方法
+     *
+     * @param dtoList
+     * @return
+     */
+    public List<SortOptions> getCommonSortMethod(List<OrderDTO> dtoList) {
         List<SortOptions> optionsList = new ArrayList<>();
-        List<OrderDTO> dtoList = queryRequest.getOrderDTOList();
         if (!CollectionUtils.isEmpty(dtoList)) {
             String json = CommonService.readJsonFile("patent.json");
             List<EsConfigVO> esConfigVOS = JSON.parseArray(json, EsConfigVO.class);
@@ -240,64 +344,7 @@ public class EsService {
             SortOptions sortOptions = SortOptions.of(i -> i.field(j -> j.field("patent_no.keyword").order(SortOrder.Desc).missing(-1)));
             optionsList.add(sortOptions);
         }
-        builder.sort(optionsList);
-
-        //分页
-        if (current != null && size != null && current > 0 && size > 0) {
-            builder.from((current.intValue() - 1) * size.intValue()).size(size.intValue());
-        } else {
-            builder.from(0).size(99999);
-        }
-
-        //解除最大条数限制
-        builder.trackTotalHits(i -> i.enabled(true));
-        SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
-        List<PatentColumnDTO> list = new ArrayList<>();
-        long total = 0L;
-        if (StringUtils.isNotEmpty(esField)) {
-            Aggregate statsAgg = response.aggregations().get("statsBucket");
-            total = statsAgg.statsBucket().count();
-            Aggregate agg = response.aggregations().get("Agg");
-            List<StringTermsBucket> termsBuckets = agg.sterms().buckets().array();
-            for (StringTermsBucket termsBucket : termsBuckets) {
-                String key = termsBucket.key().stringValue();
-                PatentColumnDTO columnDTO = this.getPatentColumnDTO(key, projectId, esField);
-                list.add(columnDTO);
-            }
-        } else {
-            List<Hit<Patent>> hits = response.hits().hits();
-            total = response.hits().total().value();
-            for (Hit<Patent> hit : hits) {
-                String id = hit.id();
-                Patent esMess = hit.source();
-                PatentColumnDTO columnDTO = this.getPatentColumnDTO(esMess, projectId, id);
-                list.add(columnDTO);
-            }
-        }
-        this.loadCoulumnDTO(list);
-        dto.setTotal(total);
-        dto.setPatents(list);
-        dto.setPageNum(current);
-        dto.setPageSize(size);
-        return dto;
-    }
-
-    //封装专利清单的同族分组
-    public PatentColumnDTO getPatentColumnDTO(String key, Integer projectId, String field) throws Exception {
-        PatentColumnDTO dto = new PatentColumnDTO();
-        SearchRequest.Builder builder = new SearchRequest.Builder();
-        //设置查询索引
-        builder.index("patent");
-        Query query = QueryBuilders.term(i -> i.field(field).value(key));
-        builder.query(query);
-        SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
-        List<Hit<Patent>> hits = response.hits().hits();
-        if (!CollectionUtils.isEmpty(hits)) {
-            String id = hits.get(0).id();
-            Patent patent = hits.get(0).source();
-            dto = this.getPatentColumnDTO(patent, projectId, id);
-        }
-        return dto;
+        return optionsList;
     }
 
     //装载专利清单列表的数据
@@ -427,6 +474,7 @@ public class EsService {
         return builder.toString();
     }
 
+    //拼接自定义栏位
     public void appendStr(EsCustomFieldValueDTO customField, StringBuilder builder, int m, boolean ifHaveChild,
                           Integer projectId, Integer taskId) throws Exception {
         builder.append("field").append("=").append(customField.getFieldId());
@@ -478,7 +526,7 @@ public class EsService {
         }
     }
 
-    //拼接ids
+    //拼接专利ids
     public String appendIds(List<String> nos) {
         String str = "ids = ";
         if (nos.size() > 1) {
@@ -486,7 +534,7 @@ public class EsService {
             for (int i = 0; i < nos.size(); i++) {
                 String s = nos.get(i);
                 if (i != nos.size() - 1) {
-                    str = str + s  + ",";
+                    str = str + s + ",";
                 } else {
                     str = str + s + "\"";
                 }
@@ -499,6 +547,28 @@ public class EsService {
         return str;
     }
 
+    //拼接专利号NOS
+    public String appendNOS(List<String> nos) {
+        String str = "NO = ";
+        if (nos.size() > 1) {
+            str = str + "(";
+            for (int i = 0; i < nos.size(); i++) {
+                String s = nos.get(i);
+                if (i != nos.size() - 1) {
+                    str = str + s + " " + "OR" + " ";
+                } else {
+                    str = str + s + ")";
+                }
+            }
+        } else {
+            for (String no : nos) {
+                str = str + no;
+            }
+        }
+        return str;
+    }
+
+
     //更新patent
     public Integer updatePatent(Patent patent, String id) {
         UpdateRequest<Patent, Patent> req;
@@ -524,7 +594,6 @@ public class EsService {
                 b -> b.index("patent").id(id)
                         .doc(patent).refresh(Refresh.True)
         );
-
         try {
             client.update(req, Patent.class);
             return 1;
@@ -766,9 +835,8 @@ public class EsService {
      * @throws IOException
      */
     public EsPatentFamilyDTO addEsPatentFamily(Patent patent, List<String> nos, String type) throws Exception {
-        EsPatentFamilyDTO esDTO = new EsPatentFamilyDTO();
 
-        List<String> absentList = new ArrayList<>();
+        EsPatentFamilyDTO esDTO = new EsPatentFamilyDTO();
 
         PatentFamilyMessage patentFamilyMessage = null;
         String id = "";
@@ -878,6 +946,11 @@ public class EsService {
             patentFamilyMessage.getPatent().addAll(patents);
 
         }
+        List<FamilyPatent> familyPatents1 =patentFamilyMessage.getPatent();
+        if(familyPatents1.size()!=0){
+            List<FamilyPatent> familyPatentsNew =this.getDistFamilyPatents(familyPatents1);
+            patentFamilyMessage.setPatent(familyPatentsNew);
+        }
         //当id不为null时
         if (!id.equals("")) {
 
@@ -893,9 +966,28 @@ public class EsService {
         }
         esDTO.setPatentFamilyId(id);
         esDTO.setFamilyNum(patentFamilyMessage.getPatent().size());
+
         return esDTO;
     }
 
+    private List<FamilyPatent> getDistFamilyPatents(List<FamilyPatent> familyPatents) {
+        List<FamilyPatent> familyPatentsNew = new ArrayList<>();
+        for (int i = 0; i < familyPatents.size(); i++) {
+            FamilyPatent familyPatent = familyPatents.get(i);
+            FamilyPatent familyPatentNew = familyPatentsNew.stream().filter(item ->(item.getPublicNo()!=null&& item.getPublicNo().equals(familyPatent.getPublicNo()))
+                    || (item.getGrantNo()!=null&&item.getGrantNo().equals(familyPatent.getGrantNo()))).findFirst().orElse(null);
+            if (familyPatentNew == null) {
+                familyPatentsNew.add(familyPatent);
+            } else {
+                if (familyPatentNew.getGrantNo() == null && familyPatent.getAppNo() == null) {
+                    familyPatentsNew.remove(familyPatentNew);
+                    familyPatentsNew.add(familyPatent);
+                }
+            }
+        }
+        return familyPatentsNew;
+    }
+
     /**
      * 添加同族
      *
@@ -1473,6 +1565,54 @@ public class EsService {
         }
     }
 
+    /**
+     * 装载条件
+     *
+     * @param queryRequest
+     * @return
+     */
+    public EsPatentCommonVO tranPatentRequestToComVO(QueryRequest queryRequest) {
+        StringRequest stringRequest = (StringRequest) queryRequest;
+        EsPatentCommonVO commonVO = new EsPatentCommonVO();
+        try {
+            Integer taskId = stringRequest.getTaskId();
+            Integer projectId = stringRequest.getProjectId();
+            Integer productId = stringRequest.getProductId();
+            Long current = stringRequest.getCurrent();
+            Long size = stringRequest.getSize();
+            String productFrom = stringRequest.getFrom();
+            String searchCondition = stringRequest.getSearchQuery();
+            String groupField = stringRequest.getGroupField();
+            //判断同族分组
+            String str = "";
+            if (StringUtils.isNotEmpty(groupField)) {
+                switch (groupField) {
+                    case "simpleFamilyId":
+                        str = "simple_family_id";
+                        break;
+                    case "inpadocFamilyId":
+                        str = "inpadoc_family_id";
+                        break;
+                    case "patsnapFamilyId":
+                        str = "patsnap_family_id";
+                        break;
+                }
+            }
+            String esField = str;
+            commonVO.setTaskId(taskId);
+            commonVO.setProjectId(projectId);
+            commonVO.setProductId(productId);
+            commonVO.setSearchCondition(searchCondition);
+            commonVO.setProductFrom(productFrom);
+            commonVO.setCurrent(current);
+            commonVO.setSize(size);
+            commonVO.setEsField(esField);
+            commonVO.setCustomFields(stringRequest.getCustomFields());
+            commonVO.setOrderDTOList(stringRequest.getOrderDTOList());
+        } catch (Exception e) {
+        }
+        return commonVO;
+    }
 }
 
 

+ 7 - 95
src/main/java/cn/cslg/pas/service/business/es/EsValueCurveService.java

@@ -37,6 +37,7 @@ import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import lombok.RequiredArgsConstructor;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
@@ -78,6 +79,9 @@ public class EsValueCurveService {
     @Autowired
     private ProductMapper productMapper;
 
+    @Autowired
+    private EsCustomFieldService esCustomFieldService;
+
     /**
      * 查询价值曲线
      * @param vo
@@ -103,7 +107,9 @@ public class EsValueCurveService {
             isAdd.removeAll(isDel);
             map = this.getProductIdByPatentNo(isAdd,tenantId);
         } else if (startNum >= 1 && endNum > 0) {
-            List<String> patentNos = this.getPatentNos(vo);
+            EsCustomFieldBatchVO batchVO = new EsCustomFieldBatchVO();
+            BeanUtils.copyProperties(vo, batchVO);
+            List<String> patentNos = esCustomFieldService.getPatentNos(batchVO);
             map = this.getProductIdByPatentNo(patentNos,tenantId);
         }
         return this.getValueCurveList(map, timeType,tenantId);
@@ -317,100 +323,6 @@ public class EsValueCurveService {
     }
 
     /**
-     * 获取专利号列表
-     *
-     * @param vo
-     * @return
-     * @throws Exception
-     */
-    public List<String> getPatentNos(EsValueCurveVO vo) throws Exception {
-        Integer taskId = vo.getTaskId();
-        Integer projectId = vo.getProjectId();
-        Integer startNum = vo.getStartNumber();
-        Integer endNum = vo.getEndNumber();
-        List<String> isAdd = new ArrayList<>();
-        if (!CollectionUtils.isEmpty(vo.getIsAdd())) {
-            isAdd = vo.getIsAdd();
-        }
-        List<String> isDel = new ArrayList<>();
-        if (!CollectionUtils.isEmpty(vo.getIsDelete())) {
-            isDel = vo.getIsDelete();
-        }
-        String searchCondition = "";
-        if (StringUtils.isNotEmpty(vo.getSearchQuery())) {
-            searchCondition = vo.getSearchQuery();
-        }
-        List<EsCustomFieldValueDTO> customFields = vo.getCustomFields();
-        if (!CollectionUtils.isEmpty(customFields)) {
-            searchCondition = esService.parseCustomField(customFields, projectId, taskId);
-        }
-        if (taskId != null) {
-            if (searchCondition != null && !"".equals(searchCondition.trim())) {
-                searchCondition = "taskId = " + taskId + " AND " + searchCondition;
-            } else {
-                searchCondition = "taskId = " + taskId;
-            }
-        } else {
-            if (projectId != null) {
-                if (searchCondition != null && !"".equals(searchCondition.trim())) {
-                    searchCondition = "projectId = " + projectId + " AND " + searchCondition;
-                } else {
-                    searchCondition = "projectId = " + projectId;
-                }
-            }
-        }
-        SearchRequest.Builder builder = new SearchRequest.Builder();
-        //设置查询索引
-        builder.index("patent");
-        //1. 解析检索条件
-        treeNode tree = expressManager.getInstance().Parse(searchCondition, false);
-        //格式化检索式
-        //3. 从es中检索数据
-        Query q = formatQueryService.EsQueryToQuery((operateNode) tree, "patent",null);
-        builder.query(q);
-
-        List<OrderDTO> dtoList = vo.getOrderDTOList();
-        if (!CollectionUtils.isEmpty(dtoList)) {
-            String json = CommonService.readJsonFile("patent.json");
-            List<EsConfigVO> esConfigVOS = JSON.parseArray(json, EsConfigVO.class);
-            for (OrderDTO orderDTO : dtoList) {
-                EsConfigVO configVO = esConfigVOS.stream().filter(item -> item.getField().equals(orderDTO.getOrderBy())).findFirst().orElse(null);
-                if (configVO != null) {
-                    if (orderDTO.getOrderType().equals(IfConstant.NO)) {
-                        builder.sort(sortOptionsBuilder -> sortOptionsBuilder
-                                .field(fieldSortBuilder -> fieldSortBuilder
-                                        .field(configVO.getEsField()).order(SortOrder.Asc)));
-                    } else {
-                        builder.sort(sortOptionsBuilder -> sortOptionsBuilder
-                                .field(fieldSortBuilder -> fieldSortBuilder
-                                        .field(configVO.getEsField()).order(SortOrder.Desc)));
-                    }
-                }
-            }
-        } else {
-            builder.sort(sortOptionsBuilder -> sortOptionsBuilder
-                    .field(fieldSortBuilder -> fieldSortBuilder
-                            .field("patent_no.keyword").order(SortOrder.Desc)));
-        }
-
-        int number = endNum - startNum;
-        if (startNum > 0 && endNum > startNum) {
-            builder.from(startNum - 1).size(number);
-        }
-
-        SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
-        List<Hit<Patent>> hits = response.hits().hits();
-        List<String> patentNos = new ArrayList<>();
-        for (Hit<Patent> hit : hits) {
-            Patent patent = hit.source();
-            patentNos.add(patent.getPatentNo());
-        }
-        patentNos.addAll(isAdd);
-        patentNos.removeAll(isDel);
-        return patentNos.stream().distinct().collect(Collectors.toList());
-    }
-
-    /**
      * 根据专利号获取productId
      * @param list
      * @return

+ 46 - 21
src/main/java/cn/cslg/pas/service/exportProject/ExportProjectService.java

@@ -3,6 +3,7 @@ package cn.cslg.pas.service.exportProject;
 
 import cn.cslg.pas.common.dto.PatentColumnDTO;
 import cn.cslg.pas.common.dto.PatentDTO;
+import cn.cslg.pas.common.dto.business.PatentProjectDTO;
 import cn.cslg.pas.common.model.request.QueryRequest;
 import cn.cslg.pas.common.utils.FileUtils;
 import cn.cslg.pas.common.utils.JsonUtils;
@@ -28,7 +29,10 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.io.*;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -57,14 +61,17 @@ public class ExportProjectService {
     private TreeNodeService treeNodeService;
     @Autowired
     private EsCustomFieldService esCustomFieldService;
-     @Autowired
-     private PatentProjectService patentProjectService;
+    @Autowired
+    private PatentProjectService patentProjectService;
+
     public void exportProject(Integer projectId) {
         String directoryName = IdUtil.simpleUUID();
         String url = FileUtils.getStaticPath(directoryName);
 
         this.writeProjectToFile(projectId, url);
-        this.getPatentsFromEs(projectId,url);
+        this.getPatentsFromEs(projectId, url);
+        List<CustomField> customFields = this.getCustomFiled(projectId, url);
+        this.getCustomFiledLabel(customFields, url);
         String outUrl = FileUtils.getStaticPath("");
         String trueOutUrl = outUrl + "\\" + directoryName + ".zip";
         ZipUtil.zip(url, trueOutUrl);
@@ -75,9 +82,10 @@ public class ExportProjectService {
     public void writeProjectToFile(Integer projectId, String url) {
         //根据projectId查询对象
         try {
-            PatentProjectVO patentProjectVO=patentProjectService.getPatentProjectVOById(projectId);
+            PatentProjectVO patentProjectVO = patentProjectService.getPatentProjectVOById(projectId);
             String projectUrl = url + "\\project.json";
-           FileUtils.writeJson(projectUrl,patentProjectVO);
+            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(projectUrl));
+            oos.writeObject(patentProjectVO);
 
         } catch (Exception e) {
             e.printStackTrace();
@@ -106,7 +114,7 @@ public class ExportProjectService {
     /**
      * 获取专利对象
      */
-    private void getPatentsFromEs(Integer projectId,String url) {
+    private void getPatentsFromEs(Integer projectId, String url) {
         QueryRequest queryRequest = new QueryRequest();
         queryRequest.setProjectId(projectId);
         queryRequest.setCurrent(1L);
@@ -121,7 +129,7 @@ public class ExportProjectService {
                 Long total = patentDTO.getTotal();
                 Long size = patentDTO.getPageSize();
                 Long current = patentDTO.getPageNum();
-                List<PatentColumnDTO> patents =patentDTO.getPatents();
+                List<PatentColumnDTO> patents = patentDTO.getPatents();
                 if (size * current < total) {
                     QueryRequest queryRequest1 = new QueryRequest();
                     queryRequest1.setCurrent(current + 1);
@@ -130,20 +138,12 @@ public class ExportProjectService {
                     queryRequests.add(queryRequest1);
 
                 }
-                for(PatentColumnDTO patent:patents){
-                    String appNo =patent.getAppNo();
-                    String patentDirectoryName =url+"\\"+appNo;
-                    File patentDirectory =new File(patentDirectoryName);
-                    if(!patentDirectory.exists())
-                    {
-                        patentDirectory.mkdir();
-                    }
-                    String patentName ="patentCategory.json";
-                    String patentCategoryUrl =patentDirectoryName+"\\"+patentName;
-
-                    FileUtils.writeJson(patentCategoryUrl,patent);
+                String customFiledUrl = url + "\\patent" + index + ".json";
+                try {
+                    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(customFiledUrl));
+                    oos.writeObject(patents);
+                } catch (Exception e) {
                 }
-
             }
         } catch (Exception e) {
             e.printStackTrace();
@@ -268,4 +268,29 @@ public class ExportProjectService {
         }
 
     }
+
+
+    //将项目对象写进文件
+    public void writeObjectToFile(Object object, String url) {
+        //根据projectId查询对象
+        try {
+            String projectUrl = url;
+            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(projectUrl));
+            oos.writeObject(object);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+    }
+
+    //装载专利数据库DTO
+    private PatentProjectDTO getProjectDTO(Integer projectId) {
+        PatentProjectDTO patentProjectDTO =new PatentProjectDTO();
+        PatentProjectVO patentProjectVO=  patentProjectService.getPatentProjectVOById(projectId);
+         BeanUtils.copyProperties(patentProjectVO,patentProjectDTO);
+        return patentProjectDTO;
+    }
+
+
 }

+ 4 - 18
src/main/java/cn/cslg/pas/service/importPatent/GetCataloguingFromWebThread.java

@@ -331,23 +331,6 @@ public class GetCataloguingFromWebThread extends Thread {
             }
         }
 
-        //装载优先权
-        if (starPatentVO.getPriorityNo() != null && !starPatentVO.getPriorityNo().equals("")) {
-            String pr = starPatentVO.getPriorityNo();
-            String prStrs[] = pr.split(" ");
-            String priorityNo = prStrs[0];
-            String prDate = "";
-            if (prStrs.length > 1) {
-                prDate = prStrs[1];
-            }
-            Priorities priorities = new Priorities();
-            priorities.setPriorityNo(priorityNo);
-            String pCountry = priorityNo.substring(0, 2);
-            priorities.setPriorityCountry(pCountry);
-            //装载优先权日
-            priorities.setPriorityDate(prDate);
-            patent.setPriorities(Arrays.asList(priorities));
-        }
 
         //装载受理局
         if (starPatentVO.getBureau() != null && !starPatentVO.getBureau().equals("")) {
@@ -526,7 +509,10 @@ public class GetCataloguingFromWebThread extends Thread {
             String pCountry = priorityNo.substring(0, 2);
             priorities.setPriorityCountry(pCountry);
             //装载优先权日
-            priorities.setPriorityDate(prDate);
+            if (prDate != null) {
+                String a = DateUtils.strToStr(prDate, "yyyy-MM-dd");
+                priorities.setPriorityDate(a);
+            }
             patent.setPriorities(Arrays.asList(priorities));
         }
 

+ 84 - 0
src/main/java/cn/cslg/pas/service/importPatent/ImportPDFBatchService.java

@@ -0,0 +1,84 @@
+package cn.cslg.pas.service.importPatent;
+
+import cn.cslg.pas.common.model.importPDF.AddImportPDFTaskDTO;
+import cn.cslg.pas.common.utils.FileUtils;
+import cn.cslg.pas.common.utils.Response;
+import cn.cslg.pas.common.utils.ResponseEnum;
+import cn.cslg.pas.common.utils.WebSocketServer;
+import cn.cslg.pas.factorys.PatentImportFactory.PatentImportImp;
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.ZipUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
+import java.io.File;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Service
+public class ImportPDFBatchService implements PatentImportImp {
+    @Autowired
+    private FileUtils fileUtils;
+
+    private TaskThread taskThread;
+    @Async("singleThreadAsyncTaskExecutor")
+    @Transactional(rollbackFor = Exception.class)
+    public void batchUpload(String url, Integer type, String remark, Integer userId) {
+        String tempPath = null;
+        try {
+            String tempDirectoryName = IdUtil.simpleUUID();
+            tempPath = fileUtils.getSystemPath(tempDirectoryName);
+            File tempDirectory = new File(tempPath);
+            if (!tempDirectory.exists()) {
+                tempDirectory.mkdir();
+            }
+            ZipUtil.unzip(fileUtils.getSystemPath(url), tempPath);
+            List<File> fileList = FileUtil.loopFiles(tempPath).stream().filter(item -> FileUtil.getType(item).equals("pdf")).collect(Collectors.toList());
+            for (int i = 0; i < fileList.size(); i++) {
+                File file = fileList.get(i);
+                String fileName = file.getName();
+                String patentNo = FileUtil.getPrefix(file);
+                String saveName = IdUtil.simpleUUID() + ".pdf";
+                String saveUrl = fileUtils.getDirectory(saveName);
+                String savePath = fileUtils.getSystemPath(saveUrl);
+                FileUtil.copy(file.getPath(), savePath, true);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+        } finally {
+            FileUtil.del(tempPath);
+        }
+    }
+
+
+    public  void startPatent(AddImportPDFTaskDTO addImportPDFTaskDTO){
+        String fileGuid =addImportPDFTaskDTO.getFileGuid();
+
+
+
+    }
+
+
+
+    @Override
+    public Boolean startPatentThread() {
+
+        taskThread.getImportTaskAMVO().setThreadCounter(1);
+        taskThread.getImportTaskAMVO().setThreadDoneCounter(0);
+
+        ImportPDFBatchThread importPDFBatchThread = new ImportPDFBatchThread(taskThread);
+        importPDFBatchThread.start();
+        return true;
+    }
+
+    @Override
+    public void setTaskThread(TaskThread taskThread) {
+        this.taskThread = taskThread;
+    }
+}

+ 101 - 0
src/main/java/cn/cslg/pas/service/importPatent/ImportPDFBatchThread.java

@@ -0,0 +1,101 @@
+package cn.cslg.pas.service.importPatent;
+
+import cn.cslg.pas.common.model.cronModel.SystemFile;
+import cn.cslg.pas.common.utils.FileUtils;
+import cn.cslg.pas.common.utils.FormatUtil;
+import cn.cslg.pas.common.vo.ImportTaskAMVO;
+import cn.cslg.pas.domain.business.ImportTask;
+import cn.cslg.pas.domain.es.Patent;
+import cn.cslg.pas.service.business.ImportTaskService;
+import cn.cslg.pas.service.business.es.EsPatentService;
+import cn.cslg.pas.service.common.FileManagerService;
+import cn.cslg.pas.service.common.PatentStarApiService;
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.ZipUtil;
+import com.alibaba.fastjson.JSONArray;
+import org.apache.commons.compress.utils.IOUtils;
+import org.springframework.context.ApplicationContext;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class ImportPDFBatchThread extends Thread {
+    private TaskThread taskThread;
+    private ApplicationContext applicationContext;
+    private ImportTaskAMVO importTaskAMVO;
+
+    @Override
+    public void run() {
+        String tempPath = null;
+
+         ImportTaskService importTaskService =applicationContext.getBean(ImportTaskService.class);
+        ImportTask task = importTaskService.getById(importTaskAMVO.getId());
+        task.setState(1);
+        task.updateById();
+        try {
+
+            importTaskAMVO.getFileGuid();
+            Integer pdfType = importTaskAMVO.getPdfType();
+            FileManagerService fileManagerService = applicationContext.getBean(FileManagerService.class);
+            String res = fileManagerService.getSystemFileFromFMS(Arrays.asList(importTaskAMVO.getFileGuid()));
+            List<SystemFile> systemFiles = JSONArray.parseArray(res, SystemFile.class);
+            SystemFile systemFile = systemFiles.get(0);
+            String suffix = systemFile.getFileName().substring(systemFile.getFileName().lastIndexOf("."));
+            //调用文件系统取出文件接口,获得文件流
+            byte[] bytes = fileManagerService.downloadSystemFileFromFMS(importTaskAMVO.getFileGuid());
+            //创建临时文件tempFile,并将文件读取到tempFile
+            File tempFile = File.createTempFile(systemFile.getFileName() + "temp", suffix);
+            try (
+                    InputStream inputStream = new ByteArrayInputStream(bytes);
+                    FileOutputStream outputStream = new FileOutputStream(tempFile)
+            ) {
+                IOUtils.copy(inputStream, outputStream); // 将输入流复制到临时文件
+            }
+            String tempDirectoryName = IdUtil.simpleUUID();
+            tempPath = FileUtils.getSystemPath2(tempDirectoryName);
+            File tempDirectory = new File(tempPath);
+            if (!tempDirectory.exists()) {
+                tempDirectory.mkdir();
+            }
+            ZipUtil.unzip(tempFile, tempDirectory);
+            tempFile.delete();
+            List<File> fileList = FileUtil.loopFiles(tempPath).stream().filter(item -> FileUtil.getType(item).equals("pdf")).collect(Collectors.toList());
+
+            for (int i = 0; i < fileList.size(); i++) {
+                File file = fileList.get(i);
+                String patentNo = FileUtil.getPrefix(file);
+                System.out.println(patentNo);
+                EsPatentService esPatentService = applicationContext.getBean(EsPatentService.class);
+                List<Patent> patentList = esPatentService.getPatentsByNo(Arrays.asList(patentNo), true, null, null);
+
+                if (patentList != null && patentList.size() > 0) {
+                    Patent patent = patentList.get(0);
+                    String guid1 = FormatUtil.getPDFFormat(patent.getPatentNo(), pdfType);
+                    fileManagerService.uploadFileWithGuid(file, guid1);
+                }
+                taskThread.updateProcess(false, 4, patentNo);
+            }
+
+        } catch (Exception e) {
+
+           importTaskAMVO.setState(7);
+            e.printStackTrace();
+        } finally {
+            FileUtil.del(tempPath);
+            taskThread.awakeTaskThread();
+        }
+    }
+
+    public ImportPDFBatchThread(TaskThread taskThread) {
+        this.importTaskAMVO = taskThread.getImportTaskAMVO();
+        this.applicationContext = taskThread.getApplicationContext();
+        this.taskThread = taskThread;
+    }
+}

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

@@ -112,10 +112,11 @@ public class SchedulingTaskService {
                 importTaskAMVO.setOrderByType(importTaskCondition.getOrderByType());
                 importTaskAMVO.setProjectType(importTaskCondition.getProjectType());
                 importTaskAMVO.setPatentNoStr(importTaskCondition.getPatentNos());
+                importTaskAMVO.setPdfType(importTaskCondition.getPdfType());
                 if (importTaskCondition.getCustomFields() != null) {
 
                     JSONArray jsonArray = JSONArray.parseArray(importTaskCondition.getCustomFields());
-                    List<EsCustomFieldDTO> dtos=  jsonArray.toJavaList(EsCustomFieldDTO.class);
+                    List<EsCustomFieldDTO> dtos = jsonArray.toJavaList(EsCustomFieldDTO.class);
                     importTaskAMVO.setFieldDTOS(dtos);
                 }
                 LambdaQueryWrapper<ReportProject> rQueryWrapper = new LambdaQueryWrapper<>();
@@ -157,4 +158,8 @@ public class SchedulingTaskService {
 
 
     }
+
+    public void startPdfTask() {
+
+    }
 }

+ 10 - 3
src/main/java/cn/cslg/pas/service/importPatent/TaskThread.java

@@ -50,10 +50,16 @@ public class TaskThread extends Thread {
         this.importTaskAMVO = importTaskAMVO;
         //十进制转二进制
         String imContents = "0000";
-        //当任务为
+        //当任务为excel导入
         if (importTaskAMVO.getType().equals(1)) {
             imContents = "1100";
-        } else if (!importTaskAMVO.getImportContent().equals(0)) {
+        }
+        //当任务为pdf导入
+        else if(importTaskAMVO.getType().equals(5))
+        {
+            imContents = "0001";
+        }
+            else if (!importTaskAMVO.getImportContent().equals(0)) {
             imContents = MathUtils.fun(2, importTaskAMVO.getImportContent());
         }
         //下载字段
@@ -79,6 +85,7 @@ public class TaskThread extends Thread {
             this.patentProcess.setPictureDoneNum(importTaskAMVO.getDoneNum());
             this.patentProcess.setPictureDefaultNum(0);
         }
+
         if (ifCataloguing == '1' || ifFullText == '1') {
             threadCount += 1;
             this.patentProcess.setPatentMessageDefaultNum(0);
@@ -130,7 +137,7 @@ public class TaskThread extends Thread {
             importTaskAMVO.setState(2);
             MailSendService mailSendService = applicationContext.getBean(MailSendService.class);
 
-            mailSendService.sendImportTaskDoneEmail("导入任务",task.getName(),task.getCreateId());
+//            mailSendService.sendImportTaskDoneEmail("导入任务",task.getName(),task.getCreateId());
 
         } else {
             task.setState(importTaskAMVO.getState());

+ 5 - 0
src/main/resources/jsons/importTaskConfig.json

@@ -18,5 +18,10 @@
     "taskType": 4,
     "importClass": "importFromWebToEsService",
     "importTo": 1
+  },
+  {
+    "taskType": 5,
+    "importClass": "importPDFBatchService",
+    "importTo": 1
   }
 ]

+ 122 - 58
src/main/resources/jsons/patent.json

@@ -200,7 +200,8 @@
     "ifStats": "true",
     "ifAsCondition": "true",
     "groupBy": "company",
-    "ifSort": "false"
+    "ifSort": "false",
+    "exportClass": "getCommonValue"
   },
   {
     "name": "合并申请人",
@@ -215,7 +216,8 @@
     "ifStats": "true",
     "ifAsCondition": "true",
     "groupBy": "company",
-    "ifSort": "false"
+    "ifSort": "false",
+    "exportClass": "getNameValue"
   },
   {
     "name": "合并申请人1",
@@ -245,7 +247,8 @@
     "ifStats": "true",
     "ifAsCondition": "true",
     "groupBy": "company",
-    "ifSort": "false"
+    "ifSort": "false",
+    "exportClass": "getNameValue"
   },
   {
     "name": "合并发明人",
@@ -260,7 +263,8 @@
     "ifStats": "true",
     "ifAsCondition": "true",
     "groupBy": "company",
-    "ifSort": "false"
+    "ifSort": "false",
+    "exportClass": "getNameValue"
   },
   {
     "name": "合并发明人1",
@@ -275,7 +279,8 @@
     "ifStats": "false",
     "ifAsCondition": "false",
     "groupBy": "company",
-    "ifSort": "false"
+    "ifSort": "false",
+    "exportClass": "getNameValue"
   },
   {
     "name": "权利人",
@@ -290,7 +295,8 @@
     "ifStats": "true",
     "ifAsCondition": "true",
     "groupBy": "company",
-    "ifSort": "false"
+    "ifSort": "false",
+    "exportClass": "getNameValue"
   },
   {
     "name": "标准权利人",
@@ -305,7 +311,8 @@
     "ifStats": "true",
     "ifAsCondition": "true",
     "groupBy": "company",
-    "ifSort": "false"
+    "ifSort": "false",
+    "exportClass": "getCommonValue"
   },
   {
     "name": "合并权利人",
@@ -320,7 +327,8 @@
     "ifStats": "true",
     "ifAsCondition": "true",
     "groupBy": "company",
-    "ifSort": "false"
+    "ifSort": "false",
+    "exportClass": "getNameValue"
   },
   {
     "name": "合并权利人1",
@@ -349,7 +357,8 @@
     "ifShow": "false",
     "ifStats": "false",
     "ifAsCondition": "true",
-    "groupBy": "text"
+    "groupBy": "text",
+    "exportClass": "getCommonValue"
   },
   {
     "name": "授权说明书文本",
@@ -363,7 +372,8 @@
     "ifShow": "false",
     "ifStats": "false",
     "ifAsCondition": "true",
-    "groupBy": "text"
+    "groupBy": "text",
+    "exportClass": "getCommonValue"
   },
   {
     "name": "代理机构",
@@ -378,7 +388,8 @@
     "ifStats": "true",
     "ifAsCondition": "true",
     "groupBy": "company",
-    "ifSort": "true"
+    "ifSort": "true",
+    "exportClass": "getCommonValue"
   },
   {
     "name": "代理人名称",
@@ -393,7 +404,8 @@
     "ifStats": "true",
     "ifAsCondition": "true",
     "groupBy": "company",
-    "ifSort": "true"
+    "ifSort": "true",
+    "exportClass": "getNameValue"
   },
   {
     "name": "简单同族数量",
@@ -407,7 +419,8 @@
     "ifShow": "true",
     "ifAsCondition": "true",
     "groupBy": "amount",
-    "ifSort": "true"
+    "ifSort": "true",
+    "exportClass": "getCommonValue"
   },
   {
     "name": "inpadoc同族数量",
@@ -421,7 +434,8 @@
     "ifShow": "true",
     "ifAsCondition": "true",
     "groupBy": "amount",
-    "ifSort": "true"
+    "ifSort": "true",
+    "exportClass": "getCommonValue"
   },
   {
     "name": "扩展同族数量",
@@ -435,7 +449,8 @@
     "ifShow": "true",
     "ifAsCondition": "true",
     "groupBy": "amount",
-    "ifSort": "true"
+    "ifSort": "true",
+    "exportClass": "getCommonValue"
   },
   {
     "name": "引用专利数量",
@@ -449,7 +464,8 @@
     "ifShow": "true",
     "ifAsCondition": "true",
     "groupBy": "amount",
-    "ifSort": "true"
+    "ifSort": "true",
+    "exportClass": "getCommonValue"
   },
   {
     "name": "被引用专利数量",
@@ -463,7 +479,8 @@
     "ifShow": "true",
     "ifAsCondition": "true",
     "groupBy": "amount",
-    "ifSort": "true"
+    "ifSort": "true",
+    "exportClass": "getCommonValue"
   },
   {
     "name": "申请人地址",
@@ -478,7 +495,8 @@
     "ifStats": "false",
     "ifAsCondition": "true",
     "groupBy": "address",
-    "ifSort": "false"
+    "ifSort": "false",
+    "exportClass": "getCommonValue"
   },
   {
     "name": "申请国家",
@@ -493,7 +511,8 @@
     "ifStats": "true",
     "ifAsCondition": "true",
     "groupBy": "nation",
-    "ifSort": "true"
+    "ifSort": "true",
+    "exportClass": "getCommonValue"
   },
   {
     "name": "申请人国家",
@@ -508,7 +527,8 @@
     "ifStats": "true",
     "ifAsCondition": "true",
     "groupBy": "nation",
-    "ifSort": "false"
+    "ifSort": "false",
+    "exportClass": "getCommonValue"
   },
   {
     "name": "申请人省份",
@@ -523,7 +543,8 @@
     "ifStats": "true",
     "ifAsCondition": "true",
     "groupBy": "nation",
-    "ifSort": "false"
+    "ifSort": "false",
+    "exportClass": "getCommonValue"
   },
   {
     "name": "申请人市区",
@@ -538,7 +559,8 @@
     "ifStats": "true",
     "ifAsCondition": "true",
     "groupBy": "nation",
-    "ifSort": "false"
+    "ifSort": "false",
+    "exportClass": "getCommonValue"
   },
   {
     "name": "申请人区县",
@@ -553,7 +575,8 @@
     "ifStats": "false",
     "ifAsCondition": "true",
     "groupBy": "nation",
-    "ifSort": "false"
+    "ifSort": "false",
+    "exportClass": "getCommonValue"
   },
   {
     "name": "权利人地址",
@@ -568,7 +591,8 @@
     "ifStats": "false",
     "ifAsCondition": "true",
     "groupBy": "address",
-    "ifSort": "false"
+    "ifSort": "false",
+    "exportClass": "getCommonValue"
   },
   {
     "name": "权利人国家",
@@ -583,7 +607,8 @@
     "ifStats": "true",
     "ifAsCondition": "true",
     "groupBy": "nation",
-    "ifSort": "false"
+    "ifSort": "false",
+    "exportClass": "getCommonValue"
   },
   {
     "name": "权利人省份",
@@ -598,7 +623,8 @@
     "ifStats": "true",
     "ifAsCondition": "true",
     "groupBy": "nation",
-    "ifSort": "false"
+    "ifSort": "false",
+    "exportClass": "getCommonValue"
   },
   {
     "name": "权利人市区",
@@ -613,7 +639,8 @@
     "ifStats": "true",
     "ifAsCondition": "true",
     "groupBy": "nation",
-    "ifSort": "false"
+    "ifSort": "false",
+    "exportClass": "getCommonValue"
   },
   {
     "name": "权利人区县",
@@ -627,7 +654,8 @@
     "ifShow": "true",
     "ifAsCondition": "true",
     "groupBy": "nation",
-    "ifSort": "false"
+    "ifSort": "false",
+    "exportClass": "getCommonValue"
   },
   {
     "name": "IPC分类号",
@@ -643,6 +671,7 @@
     "ifAsCondition": "true",
     "groupBy": "classify",
     "ifSort": "false",
+    "exportClass": "getClassifyValue",
     "children": [
       {
         "label": "IPC部",
@@ -687,7 +716,8 @@
     "ifGroup": "false",
     "ifShow": "false",
     "ifStats": "false",
-    "ifAsCondition": "true"
+    "ifAsCondition": "true",
+    "exportClass": "getCommonValue"
   },
   {
     "name": "IPC大类",
@@ -700,7 +730,8 @@
     "ifGroup": "false",
     "ifShow": "false",
     "ifStats": "false",
-    "ifAsCondition": "true"
+    "ifAsCondition": "true",
+    "exportClass": "getCommonValue"
   },
   {
     "name": "IPC小类",
@@ -713,7 +744,8 @@
     "ifGroup": "false",
     "ifShow": "false",
     "ifStats": "false",
-    "ifAsCondition": "true"
+    "ifAsCondition": "true",
+    "exportClass": "getCommonValue"
   },
   {
     "name": "IPC大组",
@@ -726,7 +758,8 @@
     "ifGroup": "false",
     "ifShow": "false",
     "ifStats": "false",
-    "ifAsCondition": "true"
+    "ifAsCondition": "true",
+    "exportClass": "getCommonValue"
   },
   {
     "name": "IPC",
@@ -739,7 +772,8 @@
     "ifGroup": "false",
     "ifShow": "false",
     "ifStats": "false",
-    "ifAsCondition": "true"
+    "ifAsCondition": "true",
+    "exportClass": "getCommonValue"
   },
   {
     "name": "CPC分类号",
@@ -755,6 +789,7 @@
     "ifAsCondition": "true",
     "groupBy": "classify",
     "ifSort": "false",
+    "exportClass": "getClassifyValue",
     "children": [
       {
         "label": "CPC部",
@@ -799,7 +834,8 @@
     "ifGroup": "false",
     "ifShow": "false",
     "ifStats": "false",
-    "ifAsCondition": "true"
+    "ifAsCondition": "true",
+    "exportClass": "getCommonValue"
   },
   {
     "name": "CPC大类",
@@ -812,7 +848,8 @@
     "ifGroup": "false",
     "ifShow": "false",
     "ifStats": "false",
-    "ifAsCondition": "true"
+    "ifAsCondition": "true",
+    "exportClass": "getCommonValue"
   },
   {
     "name": "CPC小类",
@@ -825,7 +862,8 @@
     "ifGroup": "false",
     "ifShow": "false",
     "ifStats": "false",
-    "ifAsCondition": "true"
+    "ifAsCondition": "true",
+    "exportClass": "getCommonValue"
   },
   {
     "name": "CPC大组",
@@ -838,7 +876,8 @@
     "ifGroup": "false",
     "ifShow": "false",
     "ifStats": "false",
-    "ifAsCondition": "true"
+    "ifAsCondition": "true",
+    "exportClass": "getCommonValue"
   },
   {
     "name": "CPC",
@@ -851,7 +890,8 @@
     "ifGroup": "false",
     "ifShow": "false",
     "ifStats": "false",
-    "ifAsCondition": "true"
+    "ifAsCondition": "true",
+    "exportClass": "getCommonValue"
   },
   {
     "name": "UPC分类号",
@@ -867,6 +907,7 @@
     "ifAsCondition": "true",
     "groupBy": "classify",
     "ifSort": "false",
+    "exportClass": "getClassifyValue",
     "children": [
       {
         "label": "UPC大类",
@@ -893,7 +934,8 @@
     "ifGroup": "false",
     "ifShow": "false",
     "ifStats": "false",
-    "ifAsCondition": "true"
+    "ifAsCondition": "true",
+    "exportClass": "getCommonValue"
   },
   {
     "name": "UPC",
@@ -906,7 +948,8 @@
     "ifGroup": "false",
     "ifShow": "false",
     "ifStats": "false",
-    "ifAsCondition": "true"
+    "ifAsCondition": "true",
+    "exportClass": "getCommonValue"
   },
   {
     "name": "LOC分类号",
@@ -922,6 +965,7 @@
     "ifAsCondition": "true",
     "groupBy": "classify",
     "ifSort": "false",
+    "exportClass": "getClassifyValue",
     "children": [
       {
         "label": "LOC大类",
@@ -948,7 +992,8 @@
     "ifGroup": "false",
     "ifShow": "false",
     "ifStats": "false",
-    "ifAsCondition": "true"
+    "ifAsCondition": "true",
+    "exportClass": "getCommonValue"
   },
   {
     "name": "LOC",
@@ -961,7 +1006,8 @@
     "ifGroup": "false",
     "ifShow": "false",
     "ifStats": "false",
-    "ifAsCondition": "true"
+    "ifAsCondition": "true",
+    "exportClass": "getCommonValue"
   },
   {
     "name": "权利要求",
@@ -975,7 +1021,8 @@
     "ifShow": "false",
     "ifAsCondition": "true",
     "groupBy": "text",
-    "ifSort": "false"
+    "ifSort": "false",
+    "exportClass": "getCommonValue"
   },
   {
     "name": "法律状态",
@@ -992,6 +1039,7 @@
     "fieldOptionQueryParam": "PATENT_SIMPLE_STATUS",
     "groupBy": "typeStatus",
     "ifSort": "true",
+    "exportClass": "getSimpleStatusValue",
     "optionValue": [
       {
         "label": "有效",
@@ -1022,6 +1070,7 @@
     "fieldOptionQueryParam": "PATENT_TYPE",
     "groupBy": "typeStatus",
     "ifSort": "true",
+    "exportClass": "getPatentTypeValue",
     "optionValue": [
       {
         "label": "发明",
@@ -1050,7 +1099,8 @@
     "ifStats": "false",
     "ifAsCondition": "true",
     "groupBy": "company",
-    "ifSort": "true"
+    "ifSort": "true",
+    "exportClass": "getCommonValue"
   },
   {
     "name": "助理审查员",
@@ -1065,7 +1115,8 @@
     "ifStats": "false",
     "ifAsCondition": "true",
     "groupBy": "company",
-    "ifSort": "true"
+    "ifSort": "true",
+    "exportClass": "getCommonValue"
   },
   {
     "name": "优先权国家",
@@ -1080,7 +1131,8 @@
     "ifStats": "true",
     "ifAsCondition": "true",
     "groupBy": "nation",
-    "ifSort": "false"
+    "ifSort": "false",
+    "exportClass": "getCommonValue"
   },
   {
     "name": "优先权日",
@@ -1095,7 +1147,8 @@
     "ifStats": "true",
     "ifAsCondition": "true",
     "groupBy": "dateType",
-    "ifSort": "false"
+    "ifSort": "false",
+    "exportClass": "getDateValue"
   },
   {
     "name": "优先权号",
@@ -1110,7 +1163,8 @@
     "ifStats": "false",
     "ifAsCondition": "true",
     "groupBy": "number",
-    "ifSort": "false"
+    "ifSort": "false",
+    "exportClass": "getCommonValue"
   },
   {
     "name": "pct申请号",
@@ -1125,7 +1179,8 @@
     "ifStats": "false",
     "ifAsCondition": "true",
     "groupBy": "number",
-    "ifSort": "true"
+    "ifSort": "true",
+    "exportClass": "getCommonValue"
   },
   {
     "name": "pct申请日",
@@ -1140,7 +1195,8 @@
     "ifStats": "false",
     "ifAsCondition": "true",
     "groupBy": "dateType",
-    "ifSort": "true"
+    "ifSort": "true",
+    "exportClass": "getDateValue"
   },
   {
     "name": "pct进入日期",
@@ -1155,7 +1211,8 @@
     "ifStats": "false",
     "ifAsCondition": "true",
     "groupBy": "dateType",
-    "ifSort": "true"
+    "ifSort": "true",
+    "exportClass": "getDateValue"
   },
   {
     "name": "pct公开号",
@@ -1170,7 +1227,8 @@
     "ifStats": "false",
     "ifAsCondition": "true",
     "groupBy": "number",
-    "ifSort": "true"
+    "ifSort": "true",
+    "exportClass": "getCommonValue"
   },
   {
     "name": "pct公开日",
@@ -1185,7 +1243,8 @@
     "ifStats": "false",
     "ifAsCondition": "true",
     "groupBy": "dateType",
-    "ifSort": "true"
+    "ifSort": "true",
+    "exportClass": "getDateValue"
   },
   {
     "name": "实审日",
@@ -1200,7 +1259,8 @@
     "ifStats": "false",
     "ifAsCondition": "true",
     "groupBy": "dateType",
-    "ifSort": "true"
+    "ifSort": "true",
+    "exportClass": "getDateValue"
   },
   {
     "name": "wo指定国",
@@ -1215,7 +1275,8 @@
     "ifStats": "false",
     "ifAsCondition": "true",
     "groupBy": "nation",
-    "ifSort": "true"
+    "ifSort": "true",
+    "exportClass": "getCommonValue"
   },
   {
     "name": "ep申请号",
@@ -1230,7 +1291,8 @@
     "ifStats": "false",
     "ifAsCondition": "true",
     "groupBy": "number",
-    "ifSort": "true"
+    "ifSort": "true",
+    "exportClass": "getCommonValue"
   },
   {
     "name": "EP指定国",
@@ -1245,7 +1307,8 @@
     "ifStats": "false",
     "ifAsCondition": "true",
     "groupBy": "nation",
-    "ifSort": "true"
+    "ifSort": "true",
+    "exportClass": "getCommonValue"
   },
   {
     "name": "ep申请日",
@@ -1260,7 +1323,8 @@
     "ifStats": "false",
     "ifAsCondition": "true",
     "groupBy": "dateType",
-    "ifSort": "true"
+    "ifSort": "true",
+    "exportClass": "getDateValue"
   },
   {
     "name": "自定义栏位id",

+ 87 - 0
src/test/java/cn/cslg/pas/service/ClaimTextTests.java

@@ -0,0 +1,87 @@
+package cn.cslg.pas.service;
+
+
+import cn.cslg.pas.common.dto.PatentColumnDTO;
+import cn.cslg.pas.common.dto.PatentDTO;
+import cn.cslg.pas.common.model.request.StringRequest;
+import cn.cslg.pas.common.utils.ClaimUtils.ClaimSplitUtils;
+import cn.cslg.pas.common.vo.PatentRightParams;
+import cn.cslg.pas.common.vo.RePatentClaim;
+import cn.cslg.pas.domain.es.Text;
+import cn.cslg.pas.service.business.CommonService;
+import cn.cslg.pas.service.business.es.EsService;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.thymeleaf.templateparser.text.TextTemplateParser;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@SpringBootTest
+public class ClaimTextTests {
+    @Autowired
+    private EsService esService;
+
+    @Test
+    public void test() throws Exception {
+        String json = CommonService.readFile("C:\\Users\\dick\\Desktop\\claim\\KR200488684Y1.json");
+        JSONObject sqlObjects = JSON.parseObject(json, JSONObject.class);
+
+        String pn = sqlObjects.get("PN").toString();
+        String content = sqlObjects.get("content").toString();
+
+        PatentRightParams rightParams = new PatentRightParams();
+        rightParams.setPatentNo(pn);
+        rightParams.setContent(content);
+        List<RePatentClaim> rePatentClaims = ClaimSplitUtils.formatPatentRight(rightParams);
+        StringBuilder stringBuilder = new StringBuilder();
+        rePatentClaims.forEach(item -> stringBuilder.append(item.getContent()));
+
+        if (stringBuilder.toString().equals(content)) {
+            System.out.println(true);
+        }
+
+        System.out.println(pn);
+    }
+
+
+    @Test
+    public void testTotal() throws Exception {
+        StringRequest stringRequest = new StringRequest();
+        stringRequest.setProjectId(323);
+        stringRequest.setCurrent(1L);
+        stringRequest.setSize(10L);
+        PatentDTO patentDTO = esService.esSearch(stringRequest);
+        List<PatentColumnDTO> patentColumnDTOS = patentDTO.getPatents();
+
+        for (PatentColumnDTO patentColumnDTO : patentColumnDTOS) {
+            String pn = patentColumnDTO.getPatentNo();
+            List<Text> claims = patentColumnDTO.getClaim();
+            if (claims == null || claims.size() == 0) {
+                continue;
+            }
+            Text text =claims.stream().filter(item->item.getIfOrigin().equals(true)).findFirst().orElse(null);
+            if(text==null){
+                continue;
+            }
+            PatentRightParams rightParams = new PatentRightParams();
+            String content =text.getTextContent();
+            rightParams.setPatentNo(pn);
+            rightParams.setContent(content);
+            List<RePatentClaim> rePatentClaims = ClaimSplitUtils.formatPatentRight(rightParams);
+            StringBuilder stringBuilder = new StringBuilder();
+            rePatentClaims.forEach(item -> stringBuilder.append(item.getContent()));
+
+            if (stringBuilder.toString().equals(content)) {
+                System.out.println(true);
+            }
+
+            System.out.println(pn);
+        }
+
+
+    }
+}

+ 23 - 0
src/test/java/cn/cslg/pas/service/EventServiceTests.java

@@ -10,6 +10,9 @@ import cn.cslg.pas.common.model.cronModel.Records;
 import cn.cslg.pas.common.model.request.*;
 import cn.cslg.pas.common.utils.Response;
 import cn.cslg.pas.common.utils.StringUtils;
+import cn.cslg.pas.common.utils.parseQueryToTree.expressManager;
+import cn.cslg.pas.common.utils.parseQueryToTree.operateNode;
+import cn.cslg.pas.common.utils.parseQueryToTree.treeNode;
 import cn.cslg.pas.common.vo.business.*;
 import cn.cslg.pas.controller.EventController;
 import cn.cslg.pas.controller.PatentController;
@@ -25,6 +28,7 @@ import cn.cslg.pas.service.business.es.EsCustomFieldService;
 import cn.cslg.pas.service.business.es.EsService;
 import cn.cslg.pas.service.business.es.EsPatentService;
 import cn.cslg.pas.service.common.FileManagerService;
+import co.elastic.clients.elasticsearch._types.query_dsl.Query;
 import com.alibaba.fastjson.JSONObject;
 import org.apache.http.entity.ContentType;
 import org.junit.jupiter.api.Test;
@@ -553,4 +557,23 @@ public class EventServiceTests {
             System.out.println("B");
         }
     }
+
+    @Test
+    public void test106() throws Exception {
+//        String condition = "AGN = (\"深圳市瑞方达知识产权事务所(普通合伙) 44314\")";
+//        ArrayList<String> list = expressManager.getInstance().get(condition);
+//        System.out.println(list);
+        //3. 从es中检索数据
+//        Query q = formatQueryService.EsQueryToQuery((operateNode) tree, "patent", projectId);
+        List<String> list = Arrays.asList("87K5hY8BdwlBaY8vibM3","DLK3hY8BdwlBaY8vfLLP","FLK3hY8BdwlBaY8vibLp","G7K5hY8BdwlBaY8vkrR7","I7K5hY8BdwlBaY8vnbTN",
+                "K7K5hY8BdwlBaY8vqLSM","K7LEhY8BdwlBaY8vP72K","M7K5hY8BdwlBaY8vsbRD","ObK3hY8BdwlBaY8vk7Ko","TbIWhY8BdwlBaY8vhS1O",
+                "XrK2hY8BdwlBaY8v37E8","Bt6xvo8BdwlBaY8vQe2a","Y7K3hY8BdwlBaY8vwLL8","ZrK2hY8BdwlBaY8v7LEH","i7K2hY8BdwlBaY8v9bHY",
+                "k7LJhY8BdwlBaY8vq8Fi","lLK3hY8BdwlBaY8vAbFG","m7LJhY8BdwlBaY8vtcGx","nLK3hY8BdwlBaY8vGLFD","q7K5hY8BdwlBaY8vUrOz","s7K5hY8BdwlBaY8vX7MV",
+                "u7LBhY8BdwlBaY8vn7qI","wbLJhY8BdwlBaY8vvcEH","xLK3hY8BdwlBaY8vIrH6","y7LEhY8BdwlBaY8vE7wT","y7LJhY8BdwlBaY8vxsG6");
+        list.forEach(System.out::println);
+        List<String> collect = list.stream().distinct().collect(Collectors.toList());
+        System.out.println(collect.size());
+    }
+
+
 }