Procházet zdrojové kódy

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	src/main/java/cn/cslg/pas/controller/FTOController.java
#	src/main/java/cn/cslg/pas/service/business/FTOCompareRecordService.java
lwhhszx před 1 rokem
rodič
revize
76ba25f608

+ 10 - 22
src/main/java/cn/cslg/pas/controller/FTOController.java

@@ -1,7 +1,6 @@
 package cn.cslg.pas.controller;
 
 import cn.cslg.pas.common.core.base.Constants;
-import cn.cslg.pas.common.dto.ComparedPatentVO;
 import cn.cslg.pas.common.dto.business.GetFeatureSplitDTO;
 import cn.cslg.pas.common.dto.business.ProductMessageDTO;
 import cn.cslg.pas.common.dto.business.TortCompareRecordDTO;
@@ -27,7 +26,6 @@ import java.util.List;
 
 /**
  * FTOTort
- *
  * @Author xiexiang
  * @Date 2023/12/8
  */
@@ -51,7 +49,7 @@ public class FTOController {
 
     @Operation(summary = "保存FTO对比结果")
     @PostMapping("/addFTOCompareRecord")
-    public Response addFTOCompareRecord(@RequestBody TortCompareRecordDTO tortCompareRecordDTO) {
+    public Response addFTOCompareRecord(@RequestBody TortCompareRecordDTO tortCompareRecordDTO){
         if (tortCompareRecordDTO != null) {
             List<Integer> ids = new ArrayList<>();
             try {
@@ -75,7 +73,7 @@ public class FTOController {
 
     @Operation(summary = "添加FTO协同任务")
     @PostMapping("/addFTOAssitTask")
-    public Response addFTOAssitTask(@RequestBody TortTaskDTO tortTaskDTO) {
+    public Response addFTOAssitTask(@RequestBody TortTaskDTO tortTaskDTO){
         Integer id = projectTaskService.addFTOAssitTask(tortTaskDTO);
         Records records = new Records();
         records.setData(id);
@@ -84,7 +82,7 @@ public class FTOController {
 
     @Operation(summary = "保存FTO协同任务对比结果")
     @PostMapping("/addFTOAssitTaskResult")
-    public Response addFTOAssitTaskResult(@RequestBody TortCompareRecordDTO tortCompareRecordDTO) {
+    public Response addFTOAssitTaskResult(@RequestBody TortCompareRecordDTO tortCompareRecordDTO){
         List<Integer> ids = ftoCompareRecordService.addFTOAssitTaskResult(tortCompareRecordDTO);
         Records records = new Records();
         records.setData(ids);
@@ -93,7 +91,7 @@ public class FTOController {
 
     @Operation(summary = "查询fto协同前后对比结果")
     @GetMapping("/getFTOAssitResult")
-    public Response getFTOAssitResult(String patentNo, Integer taskId) {
+    public Response getFTOAssitResult(String patentNo, Integer taskId){
         Integer type = 1;
         TortCompareRecordVO tortCompareRecordVO = ftoCompareRecordService.getFTOAssitResult(patentNo, taskId, type);
         return Response.success(tortCompareRecordVO);
@@ -101,7 +99,7 @@ public class FTOController {
 
     @Operation(summary = "保存最终对比结果")
     @PostMapping("/addFinalAssitResult")
-    public Response addFinalAssitResult(@RequestBody TortCompareRecordDTO tortCompareRecordDTO) {
+    public Response addFinalAssitResult(@RequestBody TortCompareRecordDTO tortCompareRecordDTO){
         List<Integer> ids = ftoCompareRecordService.addFinalAssitResult(tortCompareRecordDTO);
         Records records = new Records();
         records.setData(ids);
@@ -110,26 +108,16 @@ public class FTOController {
 
     @Operation(summary = "查询最终结果")
     @GetMapping("/getFTOFinalResult")
-    public Response getFTOFinalResult(String patentNo, Integer taskId) {
+    public Response getFTOFinalResult(String patentNo, Integer taskId){
         Integer type = 2;
-        TortCompareRecordVO tortCompareRecordVO = ftoCompareRecordService.getFTOAssitResult(patentNo, taskId, type);
+        TortCompareRecordVO tortCompareRecordVO = ftoCompareRecordService.getFTOAssitResult(patentNo,taskId, type);
         return Response.success(tortCompareRecordVO);
     }
 
     @Operation(summary = "查询报告专利最新对比结果")
     @GetMapping("/getLastRecord")
-    public Response getLastRecord(Integer projectId, String patentNo) {
-        ftoCompareRecordService.getLastRecord(projectId, patentNo);
-        return null;
-    }
-
-    @Operation(summary = "查询报告专利最新对比结果")
-    @GetMapping("/getComparedPatent")
-    public Response getComparedPatent(Integer projectId,Integer compareResult) {
-        List<ComparedPatentVO> comparedPatentVOS = ftoCompareRecordService.getComparedPatent(projectId,compareResult);
-        Records records = new Records();
-        records.setData(comparedPatentVOS);
-        return Response.success(records);
+    public Response getLastRecord(Integer projectId, String patentNo){
+        TortCompareRecordVO tortCompareRecordVO = ftoCompareRecordService.getLastRecord(projectId, patentNo);
+        return Response.success(tortCompareRecordVO);
     }
-
 }

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

@@ -53,13 +53,6 @@ public class PatentController {
         return Response.success(records);
     }
 
-    @Operation(summary = "统计专利库中专利")
-    @PostMapping("/esCountSearch")
-    public Response esCountSearch(@RequestBody List<EsCountVO> countVOS) throws Exception {
-        EsCountDTO dto = esCountService.esCountSearch(countVOS);
-        return Response.success(dto);
-    }
-
     @Operation(summary = "查询专利详情")
     @PostMapping("/selectPatentDetail")
     public Response selectPatentDetail(@RequestBody PatentNoVO vo) throws Exception {
@@ -81,18 +74,25 @@ public class PatentController {
         return Response.success(patentPageMessageVOS);
     }
 
-//    @Operation(summary = "esSearch")
-//    @PostMapping("/esSearch")
-//    public Response esSearch(@RequestBody List<EsCustomFieldValueDTO> customFields) throws Exception {
-//        PatentDTO patentDTO = esService.esSearch(customFields);
-//        return Response.success(patentDTO);
-//    }
-
-//    @Operation(summary = "esCount")
-//    @PostMapping("/esCount")
-//    public Response esCount(@RequestBody EsCountVO countVO) throws Exception {
-//        EsCountDTO patentDTO = esCountService.esCount(countVO);
-//        return Response.success(patentDTO);
-//    }
+    @Operation(summary = "专利的聚合统计")
+    @PostMapping("/esCountSearch")
+    public Response esCountSearch(@RequestBody List<EsCountVO> countVOS) throws Exception {
+        EsCountDTO dto = esCountService.esCountSearch(countVOS);
+        return Response.success(dto);
+    }
+
+    @Operation(summary = "专利的聚合分析")
+    @PostMapping("/esAnalysisSearch")
+    public Response esCount(@RequestBody List<EsCountVO> countVOS) throws Exception {
+        EsCountDTO patentDTO = esCountService.esAnalysisSearch(countVOS);
+        return Response.success(patentDTO);
+    }
+
+    @Operation(summary = "esAnalysis")
+    @PostMapping("/esAnalysis")
+    public Response esAnalysis(@RequestBody EsCountVO countVO) throws Exception {
+        EsCountDTO dto = esCountService.esAnalysis(countVO);
+        return Response.success(dto);
+    }
 
 }

+ 11 - 16
src/main/java/cn/cslg/pas/factorys/EsAnalysisBuilderFactory/ChildAnalysisBuilder.java

@@ -4,6 +4,7 @@ import co.elastic.clients.elasticsearch._types.aggregations.Aggregation;
 import co.elastic.clients.elasticsearch._types.aggregations.AggregationBuilders;
 import co.elastic.clients.elasticsearch._types.aggregations.ChildrenAggregation;
 import co.elastic.clients.elasticsearch._types.aggregations.TermsAggregation;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Component;
 
 import java.util.HashMap;
@@ -18,27 +19,21 @@ public class ChildAnalysisBuilder implements IEsAnalysisBuilder {
 
     @Override
     public Aggregation createAnalyseAgg() {
-        Aggregation terms;
-        if (ifHaveChild) {
-            Aggregation agg = AggregationBuilders.terms(i -> i.field("custom_field.stats_value.raw").size(topN));
-            terms = new Aggregation.Builder().terms(new TermsAggregation.Builder()
+        Aggregation aggregation = null;
+        if (StringUtils.isNotEmpty(fieldValue)){
+            Aggregation filter = AggregationBuilders.filter(n -> n.term(m -> m.field("custom_field.field_value.raw")
+                    .value(fieldValue)));
+            Aggregation filterAgg = new Aggregation.Builder().terms(new TermsAggregation.Builder()
                     .field(field).size(topN).build())
                     .aggregations(new HashMap() {{
-                        put("filter_agg", agg);
-                    }}).build();
-        } else {
-            Aggregation agg = AggregationBuilders.terms(i -> i.field("custom_field.field_value.raw").size(topN));
-            terms = new Aggregation.Builder().terms(new TermsAggregation.Builder()
-                    .field(field).size(topN).build())
-                    .aggregations(new HashMap() {{
-                        put("filter_agg", agg);
+                        put("filter_agg", filter);
                     }}).build();
+            aggregation = new Aggregation.Builder().children(new ChildrenAggregation.Builder()
+                    .type("project_customfield").build()).aggregations(new HashMap() {{
+                put("child_agg", filterAgg);
+            }}).build();
         }
 
-        Aggregation aggregation = new Aggregation.Builder().children(new ChildrenAggregation.Builder()
-                .type("project_customfield").build()).aggregations(new HashMap() {{
-            put("child_agg", terms);
-        }}).build();
         return aggregation;
     }
 

+ 137 - 19
src/main/java/cn/cslg/pas/factorys/EsAnalysisBuilderFactory/DateAnalysisBuilder.java

@@ -9,6 +9,10 @@ import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Component;
 
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
 import java.util.HashMap;
 
 @Component
@@ -18,14 +22,25 @@ public class DateAnalysisBuilder implements IEsAnalysisBuilder {
     public Integer topN = 10;
     public String path = "";
     public Boolean ifHaveChild = false;
+    public static final int YEAR = 4;
+    public static final int YEARRANGE = 9;
+    public static final int MONTH = 7;
+    public static final int DAYONE = 8;
+    public static final int DAY = 10;
 
     @Override
-    public Aggregation createAnalyseAgg() {
-//        Aggregation aggregation = AggregationBuilders.dateHistogram(i -> i.field(field).format("yyyy").calendarInterval(CalendarInterval.Year));
+    public Aggregation createAnalyseAgg() throws ParseException {
         Aggregation aggregation = null;
         if (StringUtils.isNotEmpty(fieldValue)) {
-            if (fieldValue.length() == 4) {
-                Query query = QueryBuilders.term(i -> i.field(field).value(fieldValue));
+            Calendar calendar = Calendar.getInstance();
+            if (fieldValue.length() == YEAR) {
+                SimpleDateFormat format = new SimpleDateFormat("yyyy");
+                Date year = format.parse(fieldValue);
+                calendar.setTime(year);
+                calendar.add(Calendar.YEAR, 1);
+                Date yearDate = calendar.getTime();
+                String nextYear = format.format(yearDate);
+                Query query = QueryBuilders.range(j -> j.field(field).from(fieldValue).to(nextYear).format("yyyy"));
                 Aggregation filter = AggregationBuilders.filter(n -> n.bool(k -> k.must(query)));
                 aggregation = new Aggregation.Builder().dateHistogram(new DateHistogramAggregation.Builder()
                         .field(field).format("yyyy")
@@ -33,8 +48,15 @@ public class DateAnalysisBuilder implements IEsAnalysisBuilder {
                         .aggregations(new HashMap() {{
                             put("filter_agg", filter);
                         }}).build();
-            } else if (fieldValue.length() == 6) {
-                Query query = QueryBuilders.term(i -> i.field(field).value(fieldValue));
+            } else if (fieldValue.length() == MONTH && !fieldValue.contains("Q")
+                    && !fieldValue.contains("H")) {
+                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");
+                Date month = format.parse(fieldValue);
+                calendar.setTime(month);
+                calendar.add(Calendar.MONTH, 1);
+                Date monthDate = calendar.getTime();
+                String nextMonth = format.format(monthDate);
+                Query query = QueryBuilders.range(j -> j.field(field).from(fieldValue).to(nextMonth).format("yyyy-MM"));
                 Aggregation filter = AggregationBuilders.filter(n -> n.bool(k -> k.must(query)));
                 aggregation = new Aggregation.Builder().dateHistogram(new DateHistogramAggregation.Builder()
                         .field(field).format("yyyy-MM")
@@ -42,21 +64,118 @@ public class DateAnalysisBuilder implements IEsAnalysisBuilder {
                         .aggregations(new HashMap() {{
                             put("filter_agg", filter);
                         }}).build();
-            } else if (fieldValue.contains("Q")) {
-                Query query = QueryBuilders.term(i -> i.field(field).value(fieldValue));
-                Aggregation filter = AggregationBuilders.filter(n -> n.bool(k -> k.must(query)));
-                aggregation = new Aggregation.Builder().dateHistogram(new DateHistogramAggregation.Builder()
-                        .field(field).format("yyyy-MM")
-                        .calendarInterval(CalendarInterval.Quarter).build())
-                        .aggregations(new HashMap() {{
-                            put("filter_agg", filter);
-                        }}).build();
-            } else if (fieldValue.contains("H")) {
 
+            } else if (fieldValue.length() == MONTH && fieldValue.contains("Q")) {
+                if (fieldValue.contains("Q1")) {
+                    String firstQuarter = fieldValue.substring(0, fieldValue.indexOf("-"));
+                    String firstQuarterDate = firstQuarter + "-01";
+                    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");
+                    Date quarter = format.parse(firstQuarterDate);
+                    calendar.setTime(quarter);
+                    calendar.add(Calendar.MONTH, 3);
+                    Date quarterDate = calendar.getTime();
+                    String nextQuarterDate = format.format(quarterDate);
+                    Query query = QueryBuilders.range(j -> j.field(field).from(firstQuarterDate).to(nextQuarterDate).format("yyyy-MM"));
+                    Aggregation filter = AggregationBuilders.filter(n -> n.bool(k -> k.must(query)));
+                    aggregation = new Aggregation.Builder().dateHistogram(new DateHistogramAggregation.Builder()
+                            .field(field).format("yyyy-MM")
+                            .calendarInterval(CalendarInterval.Quarter).build())
+                            .aggregations(new HashMap() {{
+                                put("filter_agg", filter);
+                            }}).build();
+                } else if (fieldValue.contains("Q2")) {
+                    String secondQuarter = fieldValue.substring(0, fieldValue.indexOf("-"));
+                    String secondQuarterDate = secondQuarter + "-04";
+                    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");
+                    Date quarter = format.parse(secondQuarterDate);
+                    calendar.setTime(quarter);
+                    calendar.add(Calendar.MONTH, 3);
+                    Date quarterDate = calendar.getTime();
+                    String nextQuarterDate = format.format(quarterDate);
+                    Query query = QueryBuilders.range(j -> j.field(field).from(secondQuarterDate).to(nextQuarterDate).format("yyyy-MM"));
+                    Aggregation filter = AggregationBuilders.filter(n -> n.bool(k -> k.must(query)));
+                    aggregation = new Aggregation.Builder().dateHistogram(new DateHistogramAggregation.Builder()
+                            .field(field).format("yyyy-MM")
+                            .calendarInterval(CalendarInterval.Quarter).build())
+                            .aggregations(new HashMap() {{
+                                put("filter_agg", filter);
+                            }}).build();
+                } else if (fieldValue.contains("Q3")) {
+                    String thirdQuarter = fieldValue.substring(0, fieldValue.indexOf("-"));
+                    String thirdQuarterDate = thirdQuarter + "-07";
+                    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");
+                    Date quarter = format.parse(thirdQuarterDate);
+                    calendar.setTime(quarter);
+                    calendar.add(Calendar.MONTH, 3);
+                    Date quarterDate = calendar.getTime();
+                    String nextQuarterDate = format.format(quarterDate);
+                    Query query = QueryBuilders.range(j -> j.field(field).from(thirdQuarterDate).to(nextQuarterDate).format("yyyy-MM"));
+                    Aggregation filter = AggregationBuilders.filter(n -> n.bool(k -> k.must(query)));
+                    aggregation = new Aggregation.Builder().dateHistogram(new DateHistogramAggregation.Builder()
+                            .field(field).format("yyyy-MM")
+                            .calendarInterval(CalendarInterval.Quarter).build())
+                            .aggregations(new HashMap() {{
+                                put("filter_agg", filter);
+                            }}).build();
+                } else if (fieldValue.contains("Q4")) {
+                    String fourthQuarter = fieldValue.substring(0, fieldValue.indexOf("-"));
+                    String fourthQuarterDate = fourthQuarter + "-10";
+                    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");
+                    Date quarter = format.parse(fourthQuarterDate);
+                    calendar.setTime(quarter);
+                    calendar.add(Calendar.MONTH, 3);
+                    Date quarterDate = calendar.getTime();
+                    String nextQuarterDate = format.format(quarterDate);
+                    Query query = QueryBuilders.range(j -> j.field(field).from(fourthQuarterDate).to(nextQuarterDate).format("yyyy-MM"));
+                    Aggregation filter = AggregationBuilders.filter(n -> n.bool(k -> k.must(query)));
+                    aggregation = new Aggregation.Builder().dateHistogram(new DateHistogramAggregation.Builder()
+                            .field(field).format("yyyy-MM")
+                            .calendarInterval(CalendarInterval.Quarter).build())
+                            .aggregations(new HashMap() {{
+                                put("filter_agg", filter);
+                            }}).build();
+                }
+            } else if (fieldValue.length() == MONTH && fieldValue.contains("H")) {
+                if (fieldValue.contains("H1")) {
+                    String firstHalfYear = fieldValue.substring(0, fieldValue.indexOf("-"));
+                    String firstHalfYearDate = firstHalfYear + "-01";
+                    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");
+                    Date halfYear = format.parse(firstHalfYearDate);
+                    calendar.setTime(halfYear);
+                    calendar.add(Calendar.MONTH, 6);
+                    Date halfYearDate = calendar.getTime();
+                    String nextHalfYearDate = format.format(halfYearDate);
+                    Query query = QueryBuilders.range(j -> j.field(field).from(firstHalfYearDate).to(nextHalfYearDate).format("yyyy-MM"));
+                    Aggregation filter = AggregationBuilders.filter(n -> n.bool(k -> k.must(query)));
+                    aggregation = new Aggregation.Builder().dateHistogram(new DateHistogramAggregation.Builder()
+                            .field(field).format("yyyy-MM")
+                            .calendarInterval(CalendarInterval.Month).build())
+                            .aggregations(new HashMap() {{
+                                put("filter_agg", filter);
+                            }}).build();
+                } else if (fieldValue.contains("H2")) {
+                    String secondHalfYear = fieldValue.substring(0, fieldValue.indexOf("-"));
+                    String secondHalfYearDate = secondHalfYear + "-07";
+                    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");
+                    Date halfYear = format.parse(secondHalfYearDate);
+                    calendar.setTime(halfYear);
+                    calendar.add(Calendar.MONTH, 6);
+                    Date halfYearDate = calendar.getTime();
+                    String nextHalfYearDate = format.format(halfYearDate);
+                    Query query = QueryBuilders.range(j -> j.field(field).from(secondHalfYearDate).to(nextHalfYearDate).format("yyyy-MM"));
+                    Aggregation filter = AggregationBuilders.filter(n -> n.bool(k -> k.must(query)));
+                    aggregation = new Aggregation.Builder().dateHistogram(new DateHistogramAggregation.Builder()
+                            .field(field).format("yyyy-MM")
+                            .calendarInterval(CalendarInterval.Month).build())
+                            .aggregations(new HashMap() {{
+                                put("filter_agg", filter);
+                            }}).build();
+                }
             } else {
                 String start = fieldValue.substring(0, fieldValue.indexOf("-"));
-                String end = fieldValue.substring(fieldValue.indexOf("-"));
-                Query query = QueryBuilders.range(j -> j.field(field).from(start).to(end));
+                String end = fieldValue.substring(fieldValue.indexOf("-") + 1);
+                String nextYear = String.valueOf(Integer.parseInt(end) + 1);
+                Query query = QueryBuilders.range(j -> j.field(field).from(start).to(nextYear).format("yyyy"));
                 Aggregation filter = AggregationBuilders.filter(n -> n.bool(k -> k.must(query)));
                 aggregation = new Aggregation.Builder().dateHistogram(new DateHistogramAggregation.Builder()
                         .field(field).format("yyyy")
@@ -65,7 +184,6 @@ public class DateAnalysisBuilder implements IEsAnalysisBuilder {
                             put("filter_agg", filter);
                         }}).build();
             }
-
         }
         return aggregation;
     }

+ 1 - 1
src/main/java/cn/cslg/pas/factorys/EsAnalysisBuilderFactory/RangeAnalysisBuilder.java

@@ -22,7 +22,7 @@ public class RangeAnalysisBuilder implements IEsAnalysisBuilder {
         if (StringUtils.isNotEmpty(fieldValue)) {
             if (fieldValue.contains("-")) {
                 String start = fieldValue.substring(0, fieldValue.indexOf("-"));
-                String end = fieldValue.substring(fieldValue.indexOf("-"));
+                String end = fieldValue.substring(fieldValue.indexOf("-") + 1);
                 end = String.valueOf(Integer.parseInt(end) + 1);
                 String finalEnd = end;
                 aggregation = AggregationBuilders.range(i -> i.field(field)

+ 1 - 1
src/main/java/cn/cslg/pas/factorys/EsCountBuilderFactory/DateHistogramBuilder.java

@@ -24,7 +24,7 @@ public class DateHistogramBuilder implements IEsCountBuilder{
     public Aggregation createAggregation() {
         Aggregation aggregation = AggregationBuilders.dateHistogram(i -> i.field(field).format("yyyy").calendarInterval(CalendarInterval.Year));
         if (StringUtils.isNotEmpty(valueOne) && StringUtils.isNotEmpty(valueTwo)) {
-            Query query = QueryBuilders.range(j -> j.field(field).from(valueOne).to(valueTwo));
+            Query query = QueryBuilders.range(j -> j.field(field).from(valueOne).to(valueTwo).format("yyyy"));
             Aggregation filter = AggregationBuilders.filter(n -> n.bool(k -> k.must(query)));
             aggregation = new Aggregation.Builder().dateHistogram(new DateHistogramAggregation.Builder()
                     .field(field).format("yyyy")

+ 105 - 69
src/main/java/cn/cslg/pas/service/business/FTOCompareRecordService.java

@@ -1,6 +1,5 @@
 package cn.cslg.pas.service.business;
 
-import cn.cslg.pas.common.dto.ComparedPatentVO;
 import cn.cslg.pas.common.dto.business.GetFeatureSplitDTO;
 import cn.cslg.pas.common.dto.business.TortCompareRecordDTO;
 import cn.cslg.pas.common.dto.business.TortDTO;
@@ -15,16 +14,14 @@ import cn.cslg.pas.domain.business.CompareLiterature;
 import cn.cslg.pas.domain.business.FTOCompareRecord;
 import cn.cslg.pas.domain.business.Feature;
 import cn.cslg.pas.domain.business.ProjectTask;
-import cn.cslg.pas.domain.es.Patent;
 import cn.cslg.pas.exception.UnLoginException;
 import cn.cslg.pas.exception.XiaoShiException;
 import cn.cslg.pas.mapper.FTOCompareRecordMapper;
-import cn.cslg.pas.service.business.es.EsFamilyService;
-import cn.cslg.pas.service.business.es.EsPatentService;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.spire.pdf.packages.sprcxq;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.ss.formula.functions.T;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
@@ -32,13 +29,11 @@ import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
 /**
  * FTO
- *
  * @Author xiexiang
  * @Date 2023/12/13
  */
@@ -67,19 +62,12 @@ public class FTOCompareRecordService extends ServiceImpl<FTOCompareRecordMapper,
     @Autowired
     private TortCompareRecordService tortCompareRecordService;
 
-    @Autowired
-    private EsPatentService esPatentService;
-
-    @Autowired
-    private EsFamilyService esFamilyService;
-
     /**
      * 查询FTO对比结果VO
-     *
      * @param getFeatureSplitDTO
      * @return
      */
-    public TortCompareRecordVO getTortCompareRecord(GetFeatureSplitDTO getFeatureSplitDTO) {
+    public TortCompareRecordVO getTortCompareRecord(GetFeatureSplitDTO getFeatureSplitDTO){
         // 判断参数不能为空
         // 分配任务id
         Integer taskId = getFeatureSplitDTO.getTaskId();
@@ -138,11 +126,10 @@ public class FTOCompareRecordService extends ServiceImpl<FTOCompareRecordMapper,
 
     /**
      * 装载权要层
-     *
      * @param patentRightVos
      * @return
      */
-    public List<TortRightVO> loadTortRightVO(String patentNo, Integer taskId, List<PatentRightVo> patentRightVos) {
+    public List<TortRightVO> loadTortRightVO(String patentNo, Integer taskId, List<PatentRightVo> patentRightVos){
         //新建权要层信息
         List<TortRightVO> tortRightVOS = new ArrayList<>();
         //遍历装载权要层信息
@@ -166,13 +153,12 @@ public class FTOCompareRecordService extends ServiceImpl<FTOCompareRecordMapper,
     /**
      * 发起人查询
      * 装载特征与对比结果
-     *
      * @param taskId
      * @param features
      * @param ftoCompareRecords
      * @return
      */
-    public List<TortVO> loadAllTortVO(Integer taskId, List<Feature> features, List<FTOCompareRecord> ftoCompareRecords) {
+    public List<TortVO> loadAllTortVO(Integer taskId, List<Feature> features, List<FTOCompareRecord> ftoCompareRecords){
         List<TortVO> tortVOS = new ArrayList<>();
         for (Feature feature : features) {
             //新建特征与侵权分析对比结果VO
@@ -253,8 +239,8 @@ public class FTOCompareRecordService extends ServiceImpl<FTOCompareRecordMapper,
         LambdaQueryWrapper<Feature> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.select(Feature::getId)
                 .eq(Feature::getProjectTaskId, taskId);
-        Function<Object, Integer> f = (o -> Integer.parseInt(o.toString()));
-        List<Integer> featureIds = featureService.listObjs(queryWrapper, f);
+        Function<Object,Integer> f = (o -> Integer.parseInt(o.toString()));
+        List<Integer> featureIds = featureService.listObjs(queryWrapper,f);
         // 删除特征
         List<Integer> ids = new ArrayList<>();
         if (!featureIds.isEmpty()) {
@@ -273,13 +259,12 @@ public class FTOCompareRecordService extends ServiceImpl<FTOCompareRecordMapper,
 
     /**
      * 更新剩余特征和对比结果
-     *
      * @param patentNo
      * @param taskId
      * @param featureIds
      * @param tortDTOS
      */
-    public List<Integer> updateFeatures(String patentNo, Integer taskId, List<Integer> featureIds, List<TortDTO> tortDTOS) {
+    public List<Integer> updateFeatures(String patentNo, Integer taskId, List<Integer> featureIds, List<TortDTO> tortDTOS){
         // 获取登录人信息
         PersonnelVO personnelVO = new PersonnelVO();
         try {
@@ -328,20 +313,19 @@ public class FTOCompareRecordService extends ServiceImpl<FTOCompareRecordMapper,
                     ftoIds.add(id);
                 }
             }
-            order++;
+            order++ ;
         }
         return ftoIds;
     }
 
     /**
      * 对比结果入库
-     *
      * @param patentNo
      * @param projectId
      * @param taskId
      * @param tortDTO
      */
-    public Integer addCompareRecords(String patentNo, Integer projectId, Integer taskId, TortDTO tortDTO) {
+    public Integer addCompareRecords(String patentNo, Integer projectId, Integer taskId, TortDTO tortDTO){
         Integer featureId = tortDTO.getFeatureId();
         //获取登录人信息
         PersonnelVO personnelVO = new PersonnelVO();
@@ -370,10 +354,9 @@ public class FTOCompareRecordService extends ServiceImpl<FTOCompareRecordMapper,
 
     /**
      * 保存协同任务对比结果
-     *
      * @param tortCompareRecordDTO
      */
-    public List<Integer> addFTOAssitTaskResult(TortCompareRecordDTO tortCompareRecordDTO) {
+    public List<Integer> addFTOAssitTaskResult(TortCompareRecordDTO tortCompareRecordDTO){
         if (tortCompareRecordDTO == null) {
             throw new XiaoShiException("入参不能为空");
         }
@@ -439,7 +422,6 @@ public class FTOCompareRecordService extends ServiceImpl<FTOCompareRecordMapper,
     /**
      * 查询侵权分析协同前后对比结果
      * 三份结果:原始、协同处理、最终
-     *
      * @param taskId
      * @return
      */
@@ -463,7 +445,7 @@ public class FTOCompareRecordService extends ServiceImpl<FTOCompareRecordMapper,
             if (type == 1) {//查询协同前后对比结果
                 tortRightVOS = this.loadBeforeAndAfter(taskId, patentNo, patentRightVos);
             } else if (type == 2) {//发起人的查询
-                tortRightVOS = this.loadTortRightVOS2(taskId, projectId, patentRightVos);
+                tortRightVOS = this.loadTortRightVOS2(taskId, patentRightVos);
             }
             tortCompareRecordVO.setTortRightVOS(tortRightVOS);
         } catch (Exception e) {
@@ -474,13 +456,12 @@ public class FTOCompareRecordService extends ServiceImpl<FTOCompareRecordMapper,
 
     /**
      * 协同前后对比结果
-     *
      * @param patentNo
      * @param taskId
      * @param patentRightVos
      * @return
      */
-    public List<TortRightVO> loadBeforeAndAfter(Integer taskId, String patentNo, List<PatentRightVo> patentRightVos) {
+    public List<TortRightVO> loadBeforeAndAfter(Integer taskId, String patentNo, List<PatentRightVo> patentRightVos){
         if (patentRightVos != null && !patentRightVos.isEmpty()) {
             //新建权要层信息
             List<TortRightVO> tortRightVOS = new ArrayList<>();
@@ -507,12 +488,11 @@ public class FTOCompareRecordService extends ServiceImpl<FTOCompareRecordMapper,
     /**
      * 协同前后对比结果
      * 装载特征与对比结果
-     *
      * @param features
      * @param ftoCompareRecords
      * @return
      */
-    public List<TortVO> loadBeforeAndAfterTortVO(List<Feature> features, List<FTOCompareRecord> ftoCompareRecords) {
+    public List<TortVO> loadBeforeAndAfterTortVO(List<Feature> features, List<FTOCompareRecord> ftoCompareRecords){
         List<TortVO> tortVOS = new ArrayList<>();
         for (Feature feature : features) {
             //新建特征与侵权分析对比结果VO
@@ -552,13 +532,11 @@ public class FTOCompareRecordService extends ServiceImpl<FTOCompareRecordMapper,
 
     /**
      * 根据projectId和权要集合装载返回侵权分析对比结果页面VO
-     *
      * @param taskId
-     * @param projectId
      * @param patentRightVos
      * @return
      */
-    public List<TortRightVO> loadTortRightVOS2(Integer taskId, Integer projectId, List<PatentRightVo> patentRightVos) {
+    public List<TortRightVO> loadTortRightVOS2(Integer taskId, List<PatentRightVo> patentRightVos){
         if (patentRightVos != null && !patentRightVos.isEmpty()) {
             //新建权要层信息
             List<TortRightVO> tortRightVOS = new ArrayList<>();
@@ -571,7 +549,7 @@ public class FTOCompareRecordService extends ServiceImpl<FTOCompareRecordMapper,
                 LambdaQueryWrapper<FTOCompareRecord> queryWrapper = new LambdaQueryWrapper<>();
                 queryWrapper.eq(FTOCompareRecord::getProjectTaskId, taskId);
                 List<FTOCompareRecord> ftoCompareRecords = this.list(queryWrapper);
-                List<TortVO> tortVOS = this.loadTortVO2(taskId, features, ftoCompareRecords);
+                List<TortVO> tortVOS = this.loadTortVO2(features, ftoCompareRecords);
                 tortRightVO.setTortVOS(tortVOS);
                 tortRightVOS.add(tortRightVO);
             });
@@ -584,13 +562,11 @@ public class FTOCompareRecordService extends ServiceImpl<FTOCompareRecordMapper,
     /**
      * 发起人查询
      * 装载特征与对比结果
-     *
-     * @param taskId
      * @param features
      * @param ftoCompareRecords
      * @return
      */
-    public List<TortVO> loadTortVO2(Integer taskId, List<Feature> features, List<FTOCompareRecord> ftoCompareRecords) {
+    public List<TortVO> loadTortVO2(List<Feature> features, List<FTOCompareRecord> ftoCompareRecords){
         List<TortVO> tortVOS = new ArrayList<>();
         for (Feature feature : features) {
             //新建特征与侵权分析对比结果VO
@@ -649,11 +625,10 @@ public class FTOCompareRecordService extends ServiceImpl<FTOCompareRecordMapper,
 
     /**
      * 保存最终对比结果接口
-     *
      * @param tortCompareRecordDTO
      * @return
      */
-    public List<Integer> addFinalAssitResult(TortCompareRecordDTO tortCompareRecordDTO) {
+    public List<Integer> addFinalAssitResult(TortCompareRecordDTO tortCompareRecordDTO){
         List<Integer> ids = new ArrayList<>();
         Integer taskId = tortCompareRecordDTO.getTaskId();
         if (taskId == null) {
@@ -713,13 +688,12 @@ public class FTOCompareRecordService extends ServiceImpl<FTOCompareRecordMapper,
 
     /**
      * 从侵权分析中获得对比结果,并复制保存
-     *
      * @param projectId
      * @param taskId
      * @param createId
      * @param patentNo
      */
-    public void copyTortCompareRecords(Integer projectId, Integer taskId, String createId, String patentNo) {
+    public void copyTortCompareRecords(Integer projectId, Integer taskId, String createId, String patentNo){
         if (projectId != null && taskId != null) {
             LambdaQueryWrapper<FTOCompareRecord> queryWrapper = new LambdaQueryWrapper<>();
             queryWrapper.eq(FTOCompareRecord::getProjectTaskId, taskId)
@@ -748,41 +722,103 @@ public class FTOCompareRecordService extends ServiceImpl<FTOCompareRecordMapper,
         }
     }
 
-    public void getLastRecord(Integer projectId, String patentNo) {
+    /**
+     * 根据报告id和专利号查询最新的对比结果
+     * @param projectId
+     * @param patentNo
+     * @return
+     */
+    public TortCompareRecordVO getLastRecord(Integer projectId, String patentNo){
+        TortCompareRecordVO tortCompareRecordVO = new TortCompareRecordVO();
+        tortCompareRecordVO.setProjectId(projectId);
+        //根据报告id,专利号,ifFinal为true,createTime为最新的查询一条最新的结果
         LambdaQueryWrapper<FTOCompareRecord> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(FTOCompareRecord::getCompareFileNumber, patentNo)
+        queryWrapper
+                .eq(FTOCompareRecord::getCompareFileNumber, patentNo)
                 .eq(FTOCompareRecord::getProjectId, projectId)
                 .eq(FTOCompareRecord::getIfFinal, true)
                 .eq(FTOCompareRecord::getIfOriginal, false)
                 .orderByDesc(FTOCompareRecord::getCreateTime);
-        List<FTOCompareRecord> ftoCompareRecords = this.list(queryWrapper);
-
+        List<FTOCompareRecord> lastFTORecords = this.list(queryWrapper);
+        List<Integer> taskIds = lastFTORecords.stream()
+                .map(FTOCompareRecord::getProjectTaskId)
+                .distinct()  // 去除重复的任务ID
+                .collect(Collectors.toList());
+        Integer taskId = null;
+        if (taskIds.size() == 1) {
+            taskId = taskIds.get(0);  // 获取唯一的任务ID
+        } else {
+            throw new XiaoShiException("查询任务id错误,多个或者没有");
+        }
+        //根据专利号查询权要
+        try {
+            List<PatentRightVo> patentRightVos = new ArrayList<>();
+            List<RePatentClaim> patentRights = featureService.getRightListByNo(patentNo);
+            LambdaQueryWrapper<Feature> wrapper = new LambdaQueryWrapper<>();
+            wrapper.eq(Feature::getProjectTaskId, taskId)
+                    .eq(Feature::getPatentNo, patentNo);
+            List<Feature> allFeatures = featureService.list(wrapper);
+            patentRightVos = featureService.loadPatentRightVO(patentRights, allFeatures, projectId, patentNo);
+            //装载权要层下的特征与对比结果
+            List<TortRightVO> tortRightVOS = new ArrayList<>();
+            tortRightVOS = this.loadLastRecord(lastFTORecords, patentRightVos);
+            tortCompareRecordVO.setTortRightVOS(tortRightVOS);
+            return tortCompareRecordVO;
+        } catch (Exception e) {
+            throw new XiaoShiException("根据专利号查询权要失败");
+        }
     }
 
+    /**
+     * 查询最新的对比结果
+     * @param lastFTORecords
+     * @param patentRightVos
+     * @return
+     */
+    public List<TortRightVO> loadLastRecord(List<FTOCompareRecord> lastFTORecords, List<PatentRightVo> patentRightVos){
+        if (patentRightVos != null && !patentRightVos.isEmpty()) {
+            //新建权要层信息
+            List<TortRightVO> tortRightVOS = new ArrayList<>();
+            //遍历装载权要层信息
+            patentRightVos.forEach(item -> {
+                TortRightVO tortRightVO = new TortRightVO();
+                BeanUtils.copyProperties(item, tortRightVO);
+                //新建特征与侵权分析对比结果VOS
+                List<Feature> features = item.getFeatures();
+                List<TortVO> tortVOS = this.loadLastVO(features, lastFTORecords);
+                tortRightVO.setTortVOS(tortVOS);
+                tortRightVOS.add(tortRightVO);
+            });
+            return tortRightVOS;
+        } else {
+            throw new XiaoShiException("传入权要为空");
+        }
+    }
 
-    public List<ComparedPatentVO> getComparedPatent(Integer projectId,Integer compareResult) {
-        //根据projectId 查询出对比过的专利号
-        List<String> patentNos = this.getBaseMapper().getComparedPatents(projectId,compareResult);
-        List<ComparedPatentVO> comparedPatentVOS = new ArrayList<>();
-        //根据专利号查询专利信息
-        List<Patent> patents = new ArrayList<>();
-        try {
-            if (patentNos != null && patentNos.size() != 0) {
-                patents = esPatentService.getPatentsByNo(patentNos, true);
-                List<Map<String, Object>> maps = esFamilyService.getPatentFamilyByNos(patentNos, "inpadoc");
-                patents.forEach(item -> {
-                    ComparedPatentVO comparedPatentVO = new ComparedPatentVO();
-                    BeanUtils.copyProperties(item, comparedPatentVO);
-                    Map<String, Object> map = maps.stream().filter(i -> i.get("id").toString().equals(item.getInpadocFamilyId())).findFirst().orElse(null);
-                    if(map!=null){
-                        comparedPatentVO.setInpadocFamilyNos((List<String>)map.get("nos"));
-                    }
-                    comparedPatentVOS.add(comparedPatentVO);
-                });
+    public List<TortVO> loadLastVO(List<Feature> features, List<FTOCompareRecord> ftoCompareRecords){
+        List<TortVO> tortVOS = new ArrayList<>();
+        for (Feature feature : features) {
+            //新建特征与侵权分析对比结果VO
+            //装载特征部分的信息
+            TortVO tortVO = tortCompareRecordService.loadFeature(feature);
+            //装载侵权分析对比结果的部分
+            FTOCompareRecordVO originalRecordVO = new FTOCompareRecordVO();
+            if (!ftoCompareRecords.isEmpty()) {
+                // 原始数据的装载
+                // 原始数据应该是ifOriginal为true的数据
+                FTOCompareRecord originalRecord = ftoCompareRecords
+                        .stream()
+                        .filter(item -> item.getFeatureId() != null && item.getFeatureId().equals(feature.getId()))
+                        .findFirst()
+                        .orElse(null);
+                if (originalRecord != null) {
+                    originalRecordVO = tortCompareRecordService.loadVO(originalRecord);
+                }
             }
-        } catch (Exception e) {
+            tortVO.setOriginalRecordVO(originalRecordVO);
+            tortVOS.add(tortVO);
         }
-        return comparedPatentVOS;
+        return tortVOS;
     }
 
 }

+ 156 - 10
src/main/java/cn/cslg/pas/service/business/es/EsCountService.java

@@ -28,8 +28,6 @@ import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
-import java.io.IOException;
-import java.text.ParseException;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -137,6 +135,13 @@ public class EsCountService {
         return esCountDTO;
     }
 
+    /**
+     * 专利的聚合分析
+     *
+     * @param countVOS
+     * @return
+     * @throws Exception
+     */
     public EsCountDTO esAnalysisSearch(List<EsCountVO> countVOS) throws Exception {
         EsCountDTO esCountDTO = new EsCountDTO();
         List<EsCountDetailDTO> detailDTOS = new ArrayList<>();
@@ -158,11 +163,11 @@ public class EsCountService {
                 iEsAnalysisBuilder.setField(esConfigVO.getEsField());
                 iEsAnalysisBuilder.setTopN(topN);
                 iEsAnalysisBuilder.setIfHaveChild(ifHaveChild);
-                if (iEsAnalysisBuilder.getField().contains(".")) {
-                    String path = iEsAnalysisBuilder.getField().substring(0, iEsAnalysisBuilder.getField().indexOf("."));
-                    iEsAnalysisBuilder.setPath(path);
-                }
                 for (String value : values) {
+                    if (iEsAnalysisBuilder.getField().contains(".")) {
+                        String path = iEsAnalysisBuilder.getField().substring(0, iEsAnalysisBuilder.getField().indexOf("."));
+                        iEsAnalysisBuilder.setPath(path);
+                    }
                     iEsAnalysisBuilder.setFieldValue(value);
                     Aggregation aggregation = iEsAnalysisBuilder.createAnalyseAgg();
                     builder.aggregations("Agg", aggregation);
@@ -170,17 +175,65 @@ public class EsCountService {
 
                     Aggregate agg = response.aggregations().get("Agg");
                     if (dateList.contains(field)) {
-                        this.getDateCountDTOS(agg, field, topN, detailDTOS);
+                        this.getDateAnalysisDTOS(agg, field, value, topN, detailDTOS);
                     } else if (nestedList.contains(field)) {
                         this.getNestedCountDTOS(agg, field, detailDTOS);
                     } else if (childList.contains(field)) {
-                        this.getChildCountDTOS(agg, field, detailDTOS);
-                    } else if (childList.contains(field)) {
-                        this.getChildCountDTOS(agg, field, detailDTOS);
+                        this.getChildAnalysisDTOS(agg, field, value, detailDTOS);
+                    } else if (numberList.contains(field)) {
+                        this.getNumberAnalysisDTOS(agg, field, value, detailDTOS);
                     } else {
                         this.getTermCountDTOS(agg, field, detailDTOS);
                     }
+                }
+            }
+        }
+        esCountDTO.setDetailDTOS(detailDTOS);
+        return esCountDTO;
+    }
+
+    public EsCountDTO esAnalysisSearch(EsCountVO vo) throws Exception {
+        EsCountDTO esCountDTO = new EsCountDTO();
+        List<EsCountDetailDTO> detailDTOS = new ArrayList<>();
+        String field = vo.getField();
+        Integer topN = vo.getTopN();
+        Boolean ifHaveChild = vo.getIfHaveChild();
+        List<String> values = vo.getValues();
+
+        //查询es返回数据
+        SearchRequest.Builder builder = new SearchRequest.Builder();
+        builder.index("patent");
+        IEsAnalysisBuilder iEsAnalysisBuilder = null;
+        String json = CommonService.readJsonFile("esAnalysis.json");
+        List<EsConfigVO> esConfigVOS = JSON.parseArray(json, EsConfigVO.class);
+        EsConfigVO esConfigVO = esConfigVOS.stream().filter(item -> item.getField().equals(field))
+                .findFirst().orElse(null);
+        if (esConfigVO != null) {
+            iEsAnalysisBuilder = esAnalysisBuilderFactory.getClass(esConfigVO.getEsClass());
+            iEsAnalysisBuilder.setField(esConfigVO.getEsField());
+            iEsAnalysisBuilder.setTopN(topN);
+            iEsAnalysisBuilder.setIfHaveChild(ifHaveChild);
+            for (String value : values) {
+                if (iEsAnalysisBuilder.getField().contains(".")) {
+                    String path = iEsAnalysisBuilder.getField().substring(0, iEsAnalysisBuilder.getField().indexOf("."));
+                    iEsAnalysisBuilder.setPath(path);
+                }
+                iEsAnalysisBuilder.setFieldValue(value);
+                Aggregation aggregation = iEsAnalysisBuilder.createAnalyseAgg();
+                builder.aggregations("Agg", aggregation);
+                SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
 
+                Aggregate agg = response.aggregations().get("Agg");
+                if (dateList.contains(field)) {
+                    this.getDateAnalysisDTOS(agg, field, value, topN, detailDTOS);
+                } else if (nestedList.contains(field)) {
+                    this.getNestedCountDTOS(agg, field, detailDTOS);
+                } else if (childList.contains(field)) {
+                    this.getChildAnalysisDTOS(agg, field, value, detailDTOS);
+                } else if (numberList.contains(field)) {
+                    this.getNumberAnalysisDTOS(agg, field, value, detailDTOS);
+                } else {
+                    this.getTermCountDTOS(agg, field, detailDTOS);
                 }
             }
         }
@@ -309,6 +362,50 @@ public class EsCountService {
     }
 
     /**
+     * 获取children分析后数据
+     *
+     * @param agg
+     * @param field
+     * @param value
+     * @param detailDTOS
+     */
+    public void getChildAnalysisDTOS(Aggregate agg, String field, String value, List<EsCountDetailDTO> detailDTOS) {
+        Aggregate childAgg = agg.children().aggregations().get("child_agg");
+        List<StringTermsBucket> list = childAgg.sterms().buckets().array();
+        list.forEach(bucket -> {
+            EsCountDetailDTO dto = new EsCountDetailDTO();
+            dto.setField(field);
+            Aggregate aggregate = bucket.aggregations().get("filter_agg");
+            dto.setName(value);
+            dto.setNumber(aggregate.filter().docCount());
+            if (dto.getNumber() > 0) {
+                detailDTOS.add(dto);
+            }
+        });
+    }
+
+    /**
+     * 获取range分析后数据
+     *
+     * @param agg
+     * @param field
+     * @param value
+     * @param detailDTOS
+     */
+    public void getNumberAnalysisDTOS(Aggregate agg, String field,String value, List<EsCountDetailDTO> detailDTOS) {
+        List<RangeBucket> list = agg.range().buckets().array();
+        list.forEach(bucket -> {
+            EsCountDetailDTO dto = new EsCountDetailDTO();
+            dto.setField(field);
+            dto.setName(value);
+            dto.setNumber(bucket.docCount());
+            if (dto.getNumber() > 0) {
+                detailDTOS.add(dto);
+            }
+        });
+    }
+
+    /**
      * 获取dateHistogram聚合后数据
      *
      * @param agg
@@ -339,6 +436,55 @@ public class EsCountService {
     }
 
     /**
+     * 获取dateHistogram分析后数据
+     *
+     * @param agg
+     * @param field
+     * @param value
+     * @param topN
+     * @param detailDTOS
+     */
+    public void getDateAnalysisDTOS(Aggregate agg, String field, String value, Integer topN, List<EsCountDetailDTO> detailDTOS) {
+        List<DateHistogramBucket> list = agg.dateHistogram().buckets().array();
+        List<EsCountDetailDTO> esCountDetailDTOS = new ArrayList<>();
+        if (value.contains("H")) {
+            long sum = 0L;
+            for (DateHistogramBucket bucket : list) {
+                Aggregate aggregate = bucket.aggregations().get("filter_agg");
+                long docCount = aggregate.filter().docCount();
+                sum += docCount;
+            }
+            EsCountDetailDTO dto = new EsCountDetailDTO();
+            dto.setField(field);
+            dto.setName(value);
+            dto.setNumber(sum);
+            if (dto.getNumber() > 0) {
+                esCountDetailDTOS.add(dto);
+            }
+        } else {
+            list.forEach(bucket -> {
+                EsCountDetailDTO dto = new EsCountDetailDTO();
+                dto.setField(field);
+                Aggregate aggregate = bucket.aggregations().get("filter_agg");
+                dto.setName(value);
+                dto.setNumber(bucket.docCount());
+                if (aggregate != null) {
+                    dto.setNumber(aggregate.filter().docCount());
+                }
+                if (dto.getNumber() > 0) {
+                    esCountDetailDTOS.add(dto);
+                }
+            });
+        }
+
+        if (!CollectionUtils.isEmpty(esCountDetailDTOS)) {
+            List<EsCountDetailDTO> collect = esCountDetailDTOS.stream()
+                    .sorted(Comparator.comparing(EsCountDetailDTO::getName).reversed()).limit(topN).collect(Collectors.toList());
+            detailDTOS.addAll(collect);
+        }
+    }
+
+    /**
      * 获取nested聚合后数据
      *
      * @param agg

+ 27 - 27
src/main/resources/jsons/esCount.json

@@ -2,7 +2,7 @@
   {
     "name": "申请人",
     "type": "String",
-    "value": "PA",
+    "value": "applicant",
     "field": "PA",
     "esField": "applicant.name.key",
     "esClass": "nestedCountBuilder",
@@ -14,7 +14,7 @@
   {
     "name": "发明人",
     "type": "String",
-    "value": "IN",
+    "value": "inventor",
     "field": "IN",
     "esField": "inventor.name.key",
     "esClass": "nestedCountBuilder",
@@ -26,7 +26,7 @@
   {
     "name": "权利人",
     "type": "String",
-    "value": "PE",
+    "value": "rightHolder",
     "field": "PE",
     "esField": "right_holder.name.key",
     "esClass": "nestedCountBuilder",
@@ -39,7 +39,7 @@
     "name": "IPC分类号一级",
     "type": "String",
     "value": "ipcLevel1",
-    "field": "ipcLevel1",
+    "field": "IC",
     "esField": "mipc.level1",
     "esClass": "termsCountBuilder",
     "ifSearch": "false",
@@ -51,7 +51,7 @@
     "name": "IPC分类号二级",
     "type": "String",
     "value": "ipcLevel2",
-    "field": "ipcLevel2",
+    "field": "IC2",
     "esField": "mipc.level2",
     "esClass": "termsCountBuilder",
     "ifSearch": "false",
@@ -63,7 +63,7 @@
     "name": "IPC分类号三级",
     "type": "String",
     "value": "ipcLevel3",
-    "field": "ipcLevel3",
+    "field": "IC3",
     "esField": "mipc.level3",
     "esClass": "termsCountBuilder",
     "ifSearch": "false",
@@ -75,7 +75,7 @@
     "name": "IPC分类号四级",
     "type": "String",
     "value": "ipcLevel4",
-    "field": "ipcLevel4",
+    "field": "IC4",
     "esField": "mipc.level4",
     "esClass": "termsCountBuilder",
     "ifSearch": "false",
@@ -87,7 +87,7 @@
     "name": "IPC分类号五级",
     "type": "String",
     "value": "ipcLevel5",
-    "field": "ipcLevel5",
+    "field": "IC5",
     "esField": "mipc.level5",
     "esClass": "termsCountBuilder",
     "ifSearch": "false",
@@ -99,7 +99,7 @@
     "name": "CPC分类号一级",
     "type": "String",
     "value": "cpcLevel1",
-    "field": "cpcLevel1",
+    "field": "CPC",
     "esField": "mcpc.level1",
     "esClass": "termsCountBuilder",
     "ifSearch": "false",
@@ -111,7 +111,7 @@
     "name": "CPC分类号二级",
     "type": "String",
     "value": "cpcLevel2",
-    "field": "cpcLevel2",
+    "field": "CPC2",
     "esField": "mcpc.level2",
     "esClass": "termsCountBuilder",
     "ifSearch": "false",
@@ -123,7 +123,7 @@
     "name": "CPC分类号三级",
     "type": "String",
     "value": "cpcLevel3",
-    "field": "cpcLevel3",
+    "field": "CPC3",
     "esField": "mcpc.level3",
     "esClass": "termsCountBuilder",
     "ifSearch": "false",
@@ -135,7 +135,7 @@
     "name": "CPC分类号四级",
     "type": "String",
     "value": "cpcLevel4",
-    "field": "cpcLevel4",
+    "field": "CPC4",
     "esField": "mcpc.level4",
     "esClass": "termsCountBuilder",
     "ifSearch": "false",
@@ -147,7 +147,7 @@
     "name": "CPC分类号五级",
     "type": "String",
     "value": "cpcLevel5",
-    "field": "cpcLevel5",
+    "field": "CPC5",
     "esField": "mcpc.level5",
     "esClass": "termsCountBuilder",
     "ifSearch": "false",
@@ -159,7 +159,7 @@
     "name": "UPC分类号一级",
     "type": "String",
     "value": "upcLevel1",
-    "field": "upcLevel1",
+    "field": "UPC",
     "esField": "mupc.level1",
     "esClass": "termsCountBuilder",
     "ifSearch": "false",
@@ -171,7 +171,7 @@
     "name": "UPC分类号二级",
     "type": "String",
     "value": "upcLevel2",
-    "field": "upcLevel2",
+    "field": "UPC2",
     "esField": "mupc.level2",
     "esClass": "termsCountBuilder",
     "ifSearch": "false",
@@ -183,7 +183,7 @@
     "name": "UPC分类号三级",
     "type": "String",
     "value": "upcLevel3",
-    "field": "upcLevel3",
+    "field": "UPC3",
     "esField": "mupc.level3",
     "esClass": "termsCountBuilder",
     "ifSearch": "false",
@@ -195,7 +195,7 @@
     "name": "LOC分类号一级",
     "type": "String",
     "value": "locLevel1",
-    "field": "locLevel1",
+    "field": "LOC",
     "esField": "mloc.level1",
     "esClass": "termsCountBuilder",
     "ifSearch": "false",
@@ -207,7 +207,7 @@
     "name": "LOC分类号二级",
     "type": "String",
     "value": "locLevel2",
-    "field": "locLevel2",
+    "field": "LOC2",
     "esField": "mloc.level2",
     "esClass": "termsCountBuilder",
     "ifSearch": "false",
@@ -219,7 +219,7 @@
     "name": "LOC分类号三级",
     "type": "String",
     "value": "locLevel3",
-    "field": "locLevel3",
+    "field": "LOC3",
     "esField": "mloc.level3",
     "esClass": "termsCountBuilder",
     "ifSearch": "false",
@@ -230,7 +230,7 @@
   {
     "name": "专利状态",
     "type": "String",
-    "value": "SS",
+    "value": "simpleStatus",
     "field": "SS",
     "esField": "simple_status",
     "esClass": "termsCountBuilder",
@@ -242,7 +242,7 @@
   {
     "name": "专利类型",
     "type": "String",
-    "value": "PT",
+    "value": "patentType",
     "field": "PT",
     "esField": "patent_type",
     "esClass": "termsCountBuilder",
@@ -254,8 +254,8 @@
   {
     "name": "申请人国家",
     "type": "String",
-    "value": "CO",
-    "field": "CO",
+    "value": "appCountry",
+    "field": "AAC",
     "esField": "applicant_addr.country",
     "esClass": "termsCountBuilder",
     "ifSearch": "false",
@@ -267,7 +267,7 @@
     "name": "申请人省份",
     "type": "String",
     "value": "appProvince",
-    "field": "appProvince",
+    "field": "ADP",
     "esField": "applicant_addr.province",
     "esClass": "termsCountBuilder",
     "ifSearch": "false",
@@ -278,7 +278,7 @@
   {
     "name": "公开年",
     "type": "String",
-    "value": "PD",
+    "value": "publicDate",
     "field": "PD",
     "esField": "public_date",
     "esClass": "dateHistogramBuilder",
@@ -290,7 +290,7 @@
   {
     "name": "申请年",
     "type": "String",
-    "value": "AD",
+    "value": "appDate",
     "field": "AD",
     "esField": "app_date",
     "esClass": "dateHistogramBuilder",
@@ -303,7 +303,7 @@
     "name": "受理局",
     "type": "String",
     "value": "appCountry",
-    "field": "appCountry",
+    "field": "CO",
     "esField": "app_country",
     "esClass": "termsCountBuilder",
     "ifSearch": "false",