ソースを参照

Merge remote-tracking branch 'origin/master'

xiexiang 1 年間 前
コミット
ab121f7bd0

+ 17 - 0
src/main/java/cn/cslg/pas/common/dto/business/MarkTaskDTO.java

@@ -0,0 +1,17 @@
+package cn.cslg.pas.common.dto.business;
+
+import cn.cslg.pas.common.model.request.StringRequest;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+@Data
+public class MarkTaskDTO {
+private String name;
+private Date deadLine;
+private String description;
+private List<PersonAssignedDTO> personAssignedDTOList;
+private StringRequest stringRequest;
+private Integer taskType;
+}

+ 11 - 0
src/main/java/cn/cslg/pas/common/dto/business/PersonAssignedDTO.java

@@ -0,0 +1,11 @@
+package cn.cslg.pas.common.dto.business;
+
+import lombok.Data;
+
+import java.util.List;
+@Data
+public class PersonAssignedDTO {
+    private String personId;
+    private Integer patentNum;
+    private List<String> patentNos;
+}

+ 26 - 0
src/main/java/cn/cslg/pas/common/dto/es/EsCustomFieldValueDTO.java

@@ -0,0 +1,26 @@
+package cn.cslg.pas.common.dto.es;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Data
+@EqualsAndHashCode
+@AllArgsConstructor
+@NoArgsConstructor
+public class EsCustomFieldValueDTO {
+
+    /**
+     * 栏位
+     */
+    String fieldId;
+
+    /**
+     * 栏位值
+     */
+    List<String> fieldValue;
+
+}

+ 3 - 1
src/main/java/cn/cslg/pas/common/model/request/QueryRequest.java

@@ -1,6 +1,8 @@
 package cn.cslg.pas.common.model.request;
 
 
+import cn.cslg.pas.common.dto.es.EsCustomFieldValueDTO;
+import cn.cslg.pas.domain.business.CustomField;
 import lombok.Data;
 import lombok.experimental.Accessors;
 
@@ -15,5 +17,5 @@ public class QueryRequest {
     private String groupFieldValue;
     private List<OrderDTO> orderDTOList;
     private Integer projectId;
-
+    private List<EsCustomFieldValueDTO> customFields;
 }

+ 5 - 0
src/main/java/cn/cslg/pas/controller/ProjectTaskController.java

@@ -46,6 +46,7 @@ public class ProjectTaskController {
         return Response.success(id);
     }
 
+
     @Operation(summary = "添加任务")
     @PostMapping("/addTask")
     public Response addTask(@RequestBody ProjectTaskDTO projectTaskDTO) throws Exception {
@@ -53,6 +54,7 @@ public class ProjectTaskController {
         return Response.success(id);
     }
 
+
     @Operation(summary = "添加任务处理结果")
     @PostMapping("/addTaskAuditResult")
     public Response addTaskAuditResult(@RequestBody TaskHandleResultDTO taskHandleResultDTO) throws Exception {
@@ -60,6 +62,7 @@ public class ProjectTaskController {
         return Response.success(id);
     }
 
+
     @Operation(summary = "查询任务处理结果")
     @GetMapping("/getTaskHandleResult")
     public Response getTaskHandleResult(Integer taskId) throws IOException {
@@ -75,6 +78,7 @@ public class ProjectTaskController {
         return Response.success(records);
     }
 
+
     @Operation(summary = "查询审核历史")
     @GetMapping("/queryAuditHistory")
     public Response queryAuditHistory(Integer taskId) throws IOException {
@@ -91,6 +95,7 @@ public class ProjectTaskController {
         return Response.success();
     }
 
+
     @Operation(summary = "更改任务状态:0完成,1取消,2缺少资料")
     @GetMapping("/updateTaskStatus")
     public Response updateTaskStatus(Integer taskId, Integer type){

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

@@ -21,6 +21,8 @@ import org.joda.time.DateTime;
 public class CompareLiterature extends BaseEntity<CompareLiterature> {
     @TableField(value = "project_id")
     private Integer projectId;
+    @TableField(value = "project_task_id")
+    private Integer projectTaskId;
     @TableField(value = "literature_no")
     private String literatureNo;
     @TableField(value = "remark")

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

@@ -210,7 +210,7 @@ public class Patent {
      * pct进入日期
      */
     @JsonProperty("pctenterdate")
-    private Integer pctEnterDate;
+    private Date pctEnterDate;
 
     /**
      * pct公开日

+ 61 - 0
src/main/java/cn/cslg/pas/factorys/EsBuilderFactory/CustomChildQueryBuilder.java

@@ -0,0 +1,61 @@
+package cn.cslg.pas.factorys.EsBuilderFactory;
+
+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;
+
+@Component
+public class CustomChildQueryBuilder implements IQueryBuilder {
+    private String field = "";
+    private String value = "";
+    private String operator = "";
+    public String path = "";
+
+    @Override
+    public Query creteQuery() throws ParseException {
+        return QueryBuilders.hasChild(i -> i.type("project_customfield")
+                .query(j -> j.term(n -> n.field(field).value(value))));
+    }
+
+    @Override
+    public String getField() {
+        return field;
+    }
+
+    @Override
+    public void setField(String field) {
+        this.field = field;
+    }
+
+    @Override
+    public String getValue() {
+        return value;
+    }
+
+    @Override
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    @Override
+    public String getOperator() {
+        return operator;
+    }
+
+    @Override
+    public void setOperator(String operator) {
+        this.operator = operator;
+    }
+
+    @Override
+    public String getPath() {
+        return path;
+    }
+
+    @Override
+    public void setPath(String path) {
+        this.path = path;
+    }
+}

+ 58 - 0
src/main/java/cn/cslg/pas/factorys/EsCountBuilderFactory/RangeCountBuilder.java

@@ -0,0 +1,58 @@
+package cn.cslg.pas.factorys.EsCountBuilderFactory;
+
+import co.elastic.clients.elasticsearch._types.aggregations.Aggregation;
+import org.springframework.stereotype.Component;
+
+@Component
+public class RangeCountBuilder implements IEsCountBuilder{
+    public String field = "";
+    public String valueOne = "";
+    public String valueTwo = "";
+    public Integer topN = 10;
+    public String path = "";
+
+    @Override
+    public Aggregation createAggregation() {
+        return null;
+    }
+
+    public String getField() {
+        return field;
+    }
+
+    public void setField(String field) {
+        this.field = field;
+    }
+
+    public String getValueOne() {
+        return valueOne;
+    }
+
+    public void setValueOne(String valueOne) {
+        this.valueOne = valueOne;
+    }
+
+    public String getValueTwo() {
+        return valueTwo;
+    }
+
+    public void setValueTwo(String valueTwo) {
+        this.valueTwo = valueTwo;
+    }
+
+    public Integer getTopN() {
+        return topN;
+    }
+
+    public void setTopN(Integer topN) {
+        this.topN = topN;
+    }
+
+    public String getPath() {
+        return path;
+    }
+
+    public void setPath(String path) {
+        this.path = path;
+    }
+}

+ 71 - 1
src/main/java/cn/cslg/pas/service/business/ProjectTaskService.java

@@ -7,14 +7,17 @@ import cn.cslg.pas.common.model.cronModel.Records;
 import cn.cslg.pas.common.model.cronModel.SystemFile;
 import cn.cslg.pas.common.model.request.GroupRequest;
 import cn.cslg.pas.common.model.request.QueryRequest;
+import cn.cslg.pas.common.model.request.StringRequest;
 import cn.cslg.pas.common.utils.CacheUtils;
 import cn.cslg.pas.common.utils.LoginUtils;
 import cn.cslg.pas.common.vo.business.*;
 import cn.cslg.pas.domain.business.*;
+import cn.cslg.pas.domain.es.Patent;
 import cn.cslg.pas.exception.UnLoginException;
 import cn.cslg.pas.exception.XiaoShiException;
 import cn.cslg.pas.factorys.businessFactory.Business;
 import cn.cslg.pas.mapper.ProjectTaskMapper;
+import cn.cslg.pas.service.business.es.EsPatentService;
 import cn.cslg.pas.service.common.FileManagerService;
 import cn.cslg.pas.service.permissions.PermissionService;
 import cn.cslg.pas.service.query.FormatQueryService;
@@ -32,6 +35,7 @@ import java.util.stream.Collectors;
 
 /**
  * 专利挖掘任务模块
+ *
  * @Author xiexiang
  * @Date 2023/11/21
  */
@@ -83,6 +87,8 @@ public class ProjectTaskService extends ServiceImpl<ProjectTaskMapper, ProjectTa
     @Autowired
     private ReportProjectService reportProjectService;
 
+    @Autowired
+    private EsPatentService esPatentService;
 
     /**
      * 项目开卷审核任务
@@ -179,7 +185,7 @@ public class ProjectTaskService extends ServiceImpl<ProjectTaskMapper, ProjectTa
             assoTaskFileService.addTaskFile(assoTaskFileDTO);
         }
         //根据新增的审核任务的lastTaskId,将上一级任务状态改为审核中
-        if (projectTask.getLastTaskId() != null) {
+        if (projectTask.getLastTaskId() != null && projectTask.getType().equals(5)) {
             LambdaQueryWrapper<ProjectTask> queryWrapper = new LambdaQueryWrapper<>();
             queryWrapper.eq(ProjectTask::getId, projectTask.getLastTaskId());
             List<ProjectTask> projectTasks = this.list(queryWrapper);
@@ -850,4 +856,68 @@ public class ProjectTaskService extends ServiceImpl<ProjectTaskMapper, ProjectTa
             throw new XiaoShiException("侵权分析报告数据不能为空!");
         }
     }
+
+
+    private void addMarkTask(MarkTaskDTO markTaskDTO) throws Exception {
+        StringRequest stringRequest = markTaskDTO.getStringRequest();
+        //获取人员专利
+        List<PersonAssignedDTO> personAssignedDTOList = new ArrayList<>();
+        //过滤出已经添加的专利
+        List<String> patentNos = new ArrayList<>();
+        List<Integer> nums = new ArrayList<>();
+        personAssignedDTOList.forEach(item -> {
+            if (item.getPatentNos() == null || item.getPatentNos().size() == 0) {
+                patentNos.addAll(item.getPatentNos());
+            } else {
+                if (item.getPatentNum() != null) {
+                    nums.add(item.getPatentNum());
+                }
+            }
+        });
+        Integer current = 0;
+        for (PersonAssignedDTO item : personAssignedDTOList) {
+            List<String> addPatentNos =new ArrayList<>();
+            //创建任务
+            ProjectTaskDTO projectTaskDTO = new ProjectTaskDTO();
+           Integer taskId= this.addTask(projectTaskDTO);
+            //根据检索式和已经添加的专利以及位置获得专利
+            if (item.getPatentNos() == null || item.getPatentNos().size() == 0) {
+                Integer num = nums.remove(0);
+                stringRequest.setCurrent(Long.parseLong(current.toString()));
+                stringRequest.setSize(Long.parseLong(num.toString()));
+                current += num;
+                List<Patent> patentList = esPatentService.getPatentsWithNotNo(stringRequest, patentNos);
+                 addPatentNos =patentList.stream().map(Patent::getPatentNo).collect(Collectors.toList());
+
+            }
+            else {
+                addPatentNos=item.getPatentNos();
+            }
+            //添加专利
+            this.addCompareLiteratureByNos(addPatentNos,taskId);
+        }
+    }
+
+    private void addAssignTask(MarkTaskDTO markTaskDTO) {
+        //获取人员专利
+        //过滤出已经添加的专利
+        //根据检索式和已经添加的专利,以及自定义栏位过滤和位置获得专利
+        //创建任务
+        //添加专利
+    }
+
+
+    private void addCompareLiteratureByNos(List<String> patentNos, Integer taskId) {
+        List<CompareLiterature> compareLiteratures = new ArrayList<>();
+        if (patentNos == null || patentNos.size() == 0) {
+            return;
+        } else {
+            patentNos.forEach(item -> {
+                CompareLiterature compareLiterature = new CompareLiterature();
+                compareLiterature.setLiteratureNo(item);
+                compareLiterature.setName(item);
+                compareLiterature.setProjectTaskId(taskId);
+            });
+        }
+    }
 }

+ 132 - 33
src/main/java/cn/cslg/pas/service/business/es/EsPatentService.java

@@ -261,46 +261,75 @@ public class EsPatentService {
      * @return
      */
     public List<PatentPageMessageVO> getPatentPageMessage(QueryRequest queryRequest) throws Exception {
-        List<PatentPageMessageVO> patentPageMessageVOS= new ArrayList<>();
-        PatentDTO dto = new PatentDTO();
-        String searchCondition = "";
-        Integer projectId = queryRequest.getProjectId();
+        List<PatentPageMessageVO> patentPageMessageVOS = new ArrayList<>();
+
         Long current = queryRequest.getCurrent();
         Long size = queryRequest.getSize();
-
-        //判断表达式
-        if (queryRequest instanceof StringRequest) {
-            searchCondition = ((StringRequest) queryRequest).getSearchQuery();
-        } else if (queryRequest instanceof MapRequest) {
-            Map<String, Object> map = ((MapRequest) queryRequest).getSearchQuery();
-            StringBuilder stringBuilder = new StringBuilder();
-            for (String key : map.keySet()) {
-                Object value = map.get(key);
-                if (!"".contentEquals(stringBuilder)) {
-                    stringBuilder = stringBuilder.append(" AND ").append(key).append("=").append(value);
+        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)) {
+            for (OrderDTO orderDTO : dtoList) {
+                if (orderDTO.getOrderType().equals(IfConstant.NO)) {
+                    builder.sort(sortOptionsBuilder -> sortOptionsBuilder
+                            .field(fieldSortBuilder -> fieldSortBuilder
+                                    .field(orderDTO.getOrderBy()).order(SortOrder.Asc)));
                 } else {
-                    stringBuilder = stringBuilder.append(key).append("=").append(value);
+                    builder.sort(sortOptionsBuilder -> sortOptionsBuilder
+                            .field(fieldSortBuilder -> fieldSortBuilder
+                                    .field(orderDTO.getOrderBy()).order(SortOrder.Desc)));
                 }
             }
-            searchCondition = stringBuilder.toString();
+        } else {
+            builder.sort(sortOptionsBuilder -> sortOptionsBuilder
+                    .field(fieldSortBuilder -> fieldSortBuilder
+                            .field("patent_no.keyword").order(SortOrder.Desc)));
         }
-        if (projectId != null) {
-            if (searchCondition != null && !"".equals(searchCondition.trim())) {
-                searchCondition = "projectId = " + projectId + " AND " + searchCondition;
-            } else {
-                searchCondition = "projectId = " + projectId;
-            }
+        //分页
+        if (current > 0 && size > 0) {
+            builder.from(current.intValue()).size(size.intValue());
+        }
+        SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
+        List<Hit<Patent>> hits = response.hits().hits();
+        for (Hit<Patent> hit : hits) {
+            PatentPageMessageVO patentPageMessageVO = new PatentPageMessageVO();
+            patentPageMessageVO.setPatentNo(hit.source().getPatentNo());
+            patentPageMessageVOS.add(patentPageMessageVO);
         }
+        return patentPageMessageVOS;
+    }
+
+
+    /**
+     * 检索上一页下一页信息
+     *
+     * @param queryRequest 检索条件
+     * @return
+     */
+    public List<Patent> getPatentsWithNotNo(QueryRequest queryRequest, List<String> patentNos) throws Exception {
+        List<Patent> patentList = new ArrayList<>();
+        Long current = queryRequest.getCurrent();
+        Long size = queryRequest.getSize();
         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");
+        Query q = this.getQuery(queryRequest);
+
+        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(q);
+        builder.query(reQuery);
         //排序
         List<OrderDTO> dtoList = queryRequest.getOrderDTOList();
         if (!CollectionUtils.isEmpty(dtoList)) {
@@ -320,6 +349,12 @@ public class EsPatentService {
                     .field(fieldSortBuilder -> fieldSortBuilder
                             .field("patent_no.keyword").order(SortOrder.Desc)));
         }
+
+        List<String> reSources = this.rePatentSource();
+        builder.source(sourceOptionsBuilder -> sourceOptionsBuilder
+                .filter(fieldSourceBuilder -> fieldSourceBuilder
+                        .includes(reSources)));
+
         //分页
         if (current > 0 && size > 0) {
             builder.from(current.intValue()).size(size.intValue());
@@ -327,10 +362,74 @@ public class EsPatentService {
         SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
         List<Hit<Patent>> hits = response.hits().hits();
         for (Hit<Patent> hit : hits) {
-     PatentPageMessageVO patentPageMessageVO =new PatentPageMessageVO();
-     patentPageMessageVO.setPatentNo(hit.source().getPatentNo());
-   patentPageMessageVOS.add(patentPageMessageVO);
+            if (hits != null && hits.size() > 0) {
+                Patent patent = hits.get(0).source();
+                patentList.add(patent);
+            }
         }
-        return patentPageMessageVOS;
+        return patentList;
+    }
+
+    public Long getTotalNum(QueryRequest queryRequest) throws Exception {
+        SearchRequest.Builder builder = new SearchRequest.Builder();
+        //设置查询索引
+        builder.index("patent");
+        Query q = this.getQuery(queryRequest);
+        //4. 返回数据
+        Query reQuery = QueryBuilders.bool(i -> i.must(q));
+        builder.query(reQuery);
+
+        List<String> reSources = this.rePatentSource();
+        builder.source(sourceOptionsBuilder -> sourceOptionsBuilder
+                .filter(fieldSourceBuilder -> fieldSourceBuilder
+                        .includes(reSources)));
+        SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
+        return response.hits().total().value();
+    }
+
+
+    public Query getQuery(QueryRequest queryRequest) throws Exception {
+        String searchCondition = "";
+        Integer projectId = queryRequest.getProjectId();
+        //判断表达式
+        if (queryRequest instanceof StringRequest) {
+            searchCondition = ((StringRequest) queryRequest).getSearchQuery();
+        } else if (queryRequest instanceof MapRequest) {
+            Map<String, Object> map = ((MapRequest) queryRequest).getSearchQuery();
+            StringBuilder stringBuilder = new StringBuilder();
+            for (String key : map.keySet()) {
+                Object value = map.get(key);
+                if (!"".contentEquals(stringBuilder)) {
+                    stringBuilder = stringBuilder.append(" AND ").append(key).append("=").append(value);
+                } else {
+                    stringBuilder = stringBuilder.append(key).append("=").append(value);
+                }
+            }
+            searchCondition = stringBuilder.toString();
+        }
+        if (projectId != null) {
+            if (searchCondition != null && !"".equals(searchCondition.trim())) {
+                searchCondition = "projectId = " + projectId + " AND " + searchCondition;
+            } else {
+                searchCondition = "projectId = " + projectId;
+            }
+        }
+
+        //1. 解析检索条件
+        treeNode tree = expressManager.getInstance().Parse(searchCondition, false);
+        //格式化检索式
+        //3. 从es中检索数据
+        Query q = formatQueryService.EsQueryToQuery((operateNode) tree, "patent");
+
+        return q;
+    }
+
+    private 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));
+            queryList.add(q1);
+        }
+        return queryList;
     }
 }

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

@@ -8,6 +8,7 @@ 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.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;
@@ -119,7 +120,6 @@ public class EsService {
     }
 
 
-
     /**
      * Es检索
      *
@@ -130,6 +130,10 @@ public class EsService {
         PatentDTO dto = new PatentDTO();
 
         String searchCondition = "";
+        List<EsCustomFieldValueDTO> customFields = queryRequest.getCustomFields();
+        if (!CollectionUtils.isEmpty(customFields)) {
+            searchCondition = this.parseCustomField(customFields);
+        }
         Integer projectId = queryRequest.getProjectId();
         Long current = queryRequest.getCurrent();
         Long size = queryRequest.getSize();
@@ -221,6 +225,167 @@ public class EsService {
         return dto;
     }
 
+    public PatentDTO esSearch(QueryRequest queryRequest, List<EsCustomFieldValueDTO> customFields) throws Exception {
+        PatentDTO dto = new PatentDTO();
+
+        String searchCondition = "";
+//        List<EsCustomFieldValueDTO> customFields = queryRequest.getCustomFields();
+        if (!CollectionUtils.isEmpty(customFields)) {
+            searchCondition = this.parseCustomField(customFields);
+        }
+        Integer projectId = queryRequest.getProjectId();
+        Long current = queryRequest.getCurrent();
+        Long size = queryRequest.getSize();
+        //判断表达式
+        if (queryRequest instanceof StringRequest) {
+            searchCondition = ((StringRequest) queryRequest).getSearchQuery();
+        } else if (queryRequest instanceof MapRequest) {
+            Map<String, Object> map = ((MapRequest) queryRequest).getSearchQuery();
+            StringBuilder stringBuilder = new StringBuilder();
+            for (String key : map.keySet()) {
+                Object value = map.get(key);
+                if (!"".contentEquals(stringBuilder)) {
+                    stringBuilder = stringBuilder.append(" AND ").append(key).append("=").append(value);
+                } else {
+                    stringBuilder = stringBuilder.append(key).append("=").append(value);
+                }
+            }
+            searchCondition = stringBuilder.toString();
+        }
+        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");
+        //4. 返回数据
+        builder.query(q);
+        //排序
+        List<OrderDTO> dtoList = queryRequest.getOrderDTOList();
+        if (!CollectionUtils.isEmpty(dtoList)) {
+            for (OrderDTO orderDTO : dtoList) {
+                if (orderDTO.getOrderType().equals(IfConstant.NO)) {
+                    builder.sort(sortOptionsBuilder -> sortOptionsBuilder
+                            .field(fieldSortBuilder -> fieldSortBuilder
+                                    .field(orderDTO.getOrderBy()).order(SortOrder.Asc)));
+                } else {
+                    builder.sort(sortOptionsBuilder -> sortOptionsBuilder
+                            .field(fieldSortBuilder -> fieldSortBuilder
+                                    .field(orderDTO.getOrderBy()).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.intValue()).size(size.intValue());
+        }
+
+        SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
+        List<PatentColumnDTO> list = new ArrayList<>();
+        List<Hit<Patent>> hits = response.hits().hits();
+        long total = response.hits().total().value();
+        for (Hit<Patent> hit : hits) {
+            Patent esMess = hit.source();
+            PatentColumnDTO columnDTO = new PatentColumnDTO();
+//            columnDTO.setPatentNo(esMess.getPatentNo());
+            BeanUtils.copyProperties(esMess, columnDTO);
+            ContentVO titleVO = new ContentVO();
+            String title = StringUtils.strip(JSON.toJSONString(esMess.getTitle()), "[]");
+            ContentDetailDTO titleContent = JSONObject.parseObject(title, ContentDetailDTO.class);
+            titleVO.setContent(titleContent.getTextContent());
+            columnDTO.setTitle(titleVO);
+            ContentVO abstractVO = new ContentVO();
+            String abstractStr = StringUtils.strip(JSON.toJSONString(esMess.getAbstractStr()), "[]");
+            ContentDetailDTO abstractContent = JSONObject.parseObject(abstractStr, ContentDetailDTO.class);
+            abstractVO.setContent(abstractContent.getTextContent());
+            columnDTO.setAbstractStr(abstractVO);
+            list.add(columnDTO);
+
+        }
+        this.loadCoulumnDTO(list);
+        dto.setTotal(total);
+        dto.setPatents(list);
+        dto.setPageNum(current);
+        dto.setPageSize(size);
+        return dto;
+    }
+
+    /**
+     * 解析自定义栏位和值
+     *
+     * @param customFields
+     * @return
+     */
+    public String parseCustomField(List<EsCustomFieldValueDTO> customFields) {
+        int m = 1;
+        int n = 0;
+        StringBuilder builder = new StringBuilder();
+        long start = System.currentTimeMillis();
+        if (customFields.size() > m) {
+            builder.append("(");
+            for (int i = 0; i < customFields.size(); i++) {
+                EsCustomFieldValueDTO customField = customFields.get(i);
+                if (i != n) {
+                    builder.append(" ").append("and").append(" ").append("(");
+                    this.appendStr(customField, builder, m);
+                } else {
+                    this.appendStr(customField, builder, m);
+                }
+            }
+        } else {
+            for (int i = 0; i < customFields.size(); i++) {
+                EsCustomFieldValueDTO customField = customFields.get(i);
+                int num = customFields.size() - m;
+                if (i != n) {
+                    builder.append(" ").append("and").append(" ");
+                    this.appendStr(customField, builder, m);
+                } else {
+                    this.appendStr(customField, builder, m);
+                }
+            }
+        }
+
+        long end = System.currentTimeMillis();
+        System.out.println("耗时" + (end - start));
+        return builder.toString();
+    }
+
+    public void appendStr(EsCustomFieldValueDTO customField, StringBuilder builder, int m) {
+        List<String> values = customField.getFieldValue();
+        builder.append("field").append("=").append(customField.getFieldId());
+        builder.append(" ").append("and").append(" ");
+        builder.append("fieldValue").append("=");
+        if (values.size() > m) {
+            builder.append("(");
+            for (int j = 0; j < values.size(); j++) {
+                String s = values.get(j);
+                if (j != values.size() - m) {
+                    builder.append(s).append(" ").append("or").append(" ");
+                } else {
+                    builder.append(s).append(")").append(")");
+                }
+            }
+        } else {
+            for (String value : values) {
+                builder.append(value);
+            }
+        }
+    }
+
     /**
      * @param key
      * @param page
@@ -263,7 +428,6 @@ public class EsService {
         return list;
     }
 
-
     public Integer updatePatent(Patent patent, String id) {
         UpdateRequest<Patent, Patent> req;
         req = UpdateRequest.of(
@@ -750,6 +914,7 @@ public class EsService {
 
     /**
      * 查询权利要求
+     *
      * @param patentNo
      * @return
      */
@@ -767,7 +932,7 @@ public class EsService {
         //授权号
         Query q3 = QueryBuilders.term(t -> t.field("grant_no.keyword").value(patentNo));
         Query query = QueryBuilders.bool(i -> i.should(q1, q2, q3));
-        Query bool = QueryBuilders.bool(i -> i.must(q,query));
+        Query bool = QueryBuilders.bool(i -> i.must(q, query));
         builder.query(bool);
         SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
         SelectClaimDTO dto = new SelectClaimDTO();
@@ -785,17 +950,43 @@ public class EsService {
         return dto;
     }
 
-public List<PatentColumnDTO> loadCoulumnDTO(List<PatentColumnDTO> patentColumnDTOS){
-        patentColumnDTOS.forEach(item->{
+    public List<PatentColumnDTO> loadCoulumnDTO(List<PatentColumnDTO> patentColumnDTOS) {
+        patentColumnDTOS.forEach(item -> {
             item.setPictureGuid(FormatUtil.getPictureFormat(item.getAppNo()));
 
         });
 
-return patentColumnDTOS;
-}
-
+        return patentColumnDTOS;
+    }
 
+    /**
+     * 根据专利号查询出其他专利号
+     * @param patentNos
+     * @return
+     * @throws IOException
+     */
+    public SelectClaimDTO selectPatentNo(List<String> patentNos) throws IOException {
 
+        SearchRequest.Builder builder = new SearchRequest.Builder();
+        //设置查询索引
+        builder.index("patent");
+        List<Query> queryList = new ArrayList<>();
+        for (String patentNo : patentNos) {
+            Query q1 = QueryBuilders.term(t -> t.field("patent_no.keyword").value(patentNo));
+            queryList.add(q1);
+        }
+        //申请号
+        Query query = QueryBuilders.bool(i -> i.mustNot(queryList));
+        builder.query(query);
+        SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
+        SelectClaimDTO dto = new SelectClaimDTO();
+        List<Hit<Patent>> hits = response.hits().hits();
+        long value = response.hits().total().value();
+        if (value > 1) {
+            System.out.println("====================" + value);
+        }
+        return dto;
+    }
 }
 
 

+ 24 - 0
src/main/resources/jsons/patent.json

@@ -514,6 +514,30 @@
     "ifGroup": "false",
     "ifShow": "true",
     "ifAsCondition": "true"
+  },
+  {
+    "name": "自定义栏位id",
+    "type": "String",
+    "value": "field",
+    "field": "field",
+    "esField": "custom_field.field",
+    "esClass": "customChildQueryBuilder",
+    "ifSearch": "false",
+    "ifGroup": "false",
+    "ifShow": "true",
+    "ifAsCondition": "true"
+  },
+  {
+    "name": "自定义栏位值",
+    "type": "String",
+    "value": "fieldValue",
+    "field": "fieldValue",
+    "esField": "custom_field.field_value.raw",
+    "esClass": "customChildQueryBuilder",
+    "ifSearch": "false",
+    "ifGroup": "false",
+    "ifShow": "true",
+    "ifAsCondition": "true"
   }
 
 ]

+ 41 - 0
src/test/java/cn/cslg/pas/service/EsPatentServiceTests.java

@@ -0,0 +1,41 @@
+package cn.cslg.pas.service;
+
+import cn.cslg.pas.controller.AvoidDesignController;
+import cn.cslg.pas.service.business.AvoidDesignService;
+import cn.cslg.pas.service.business.es.EsPatentService;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @Author xiexiang
+ * @Date 2023/12/5
+ */
+@SpringBootTest
+public class EsPatentServiceTests {
+    @Autowired
+    private EsPatentService  esPatentService;
+
+
+    @Test
+    public void test() throws Exception {
+
+    }
+
+    @Test
+    public void testUpdate() {
+
+    }
+
+    @Test
+    public void getPatentsByNo() throws Exception {
+        List<String> patentNos =new ArrayList<>();
+        patentNos.add("CN201910069334.7");
+        patentNos.add("CN201110286649.0");
+        esPatentService.getPatentsByNo(patentNos);
+    }
+}

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

@@ -8,6 +8,7 @@ import cn.cslg.pas.common.dto.business.EsPatentFamilyDTO;
 import cn.cslg.pas.common.dto.business.ReportTempleDTO;
 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.cronModel.Records;
 import cn.cslg.pas.common.model.request.*;
 import cn.cslg.pas.common.utils.Response;
@@ -294,4 +295,32 @@ public class EventServiceTests {
         dto.setPatentNo("CN201910069334.7");
         esCustomFieldService.addCustomField(dto);
     }
+
+    @Test
+    void test16() {
+        List<EsCustomFieldValueDTO> customFields = new ArrayList<>();
+        EsCustomFieldValueDTO dto1 = new EsCustomFieldValueDTO();
+        dto1.setFieldId("1");
+        dto1.setFieldValue(Arrays.asList("a", "b"));
+        EsCustomFieldValueDTO dto2 = new EsCustomFieldValueDTO();
+        dto2.setFieldId("2");
+        dto2.setFieldValue(Arrays.asList("a", "b"));
+        customFields.add(dto1);
+        customFields.add(dto2);
+        String s = esService.parseCustomField(customFields);
+        System.out.println("结果为:" + s);
+        System.out.println("-----------------------------");
+        List<EsCustomFieldValueDTO> fields = new ArrayList<>();
+
+    }
+
+    @Test
+    void test17() throws IOException {
+        List<String> list = new ArrayList<>();
+        list.add("CN201910069334.7");
+        list.add("CN201110286649.0");
+        list.add("CN200820185104.4");
+        SelectClaimDTO dto = esService.selectPatentNo(list);
+        System.out.println(dto);
+    }
 }