Browse Source

Merge remote-tracking branch 'origin/master'

xiexiang 1 year ago
parent
commit
f494cc2046
31 changed files with 851 additions and 59 deletions
  1. 2 0
      src/main/java/cn/cslg/pas/common/dto/QueryFieldsDTO.java
  2. 0 1
      src/main/java/cn/cslg/pas/common/dto/business/ReportProjectDTO.java
  3. 1 0
      src/main/java/cn/cslg/pas/common/dto/business/UpdateScratchWordsDTO.java
  4. 19 0
      src/main/java/cn/cslg/pas/common/dto/es/EsQueryPatentFieldsDTO.java
  5. 17 0
      src/main/java/cn/cslg/pas/common/dto/es/InnerFields.java
  6. 2 0
      src/main/java/cn/cslg/pas/common/dto/patentCount/GetTabelColumDTO.java
  7. 2 1
      src/main/java/cn/cslg/pas/common/vo/PatentWithIdVO.java
  8. 1 0
      src/main/java/cn/cslg/pas/common/vo/PersonSelfFieldVO.java
  9. 1 0
      src/main/java/cn/cslg/pas/common/vo/ScratchWordsVO.java
  10. 2 0
      src/main/java/cn/cslg/pas/common/vo/business/AllCustomFieldVO.java
  11. 12 0
      src/main/java/cn/cslg/pas/common/vo/es/EsPatentFieldsVO.java
  12. 14 0
      src/main/java/cn/cslg/pas/common/vo/es/EsProductPatentVO.java
  13. 13 0
      src/main/java/cn/cslg/pas/common/vo/es/InnerPatentFieldsVO.java
  14. 24 4
      src/main/java/cn/cslg/pas/controller/CustomAnalyseController.java
  15. 17 0
      src/main/java/cn/cslg/pas/controller/CustomFieldController.java
  16. 32 2
      src/main/java/cn/cslg/pas/controller/PatentController.java
  17. 1 0
      src/main/java/cn/cslg/pas/domain/business/ScratchWords.java
  18. 2 0
      src/main/java/cn/cslg/pas/domain/es/Marking.java
  19. 1 1
      src/main/java/cn/cslg/pas/domain/es/Patent.java
  20. 60 0
      src/main/java/cn/cslg/pas/factorys/EsBuilderFactory/ProductQueryBuilder.java
  21. 1 0
      src/main/java/cn/cslg/pas/service/PatentLabelService.java
  22. 7 6
      src/main/java/cn/cslg/pas/service/business/CustomAnalyseService.java
  23. 198 6
      src/main/java/cn/cslg/pas/service/business/CustomFieldService.java
  24. 43 20
      src/main/java/cn/cslg/pas/service/business/InvalidStatutesService.java
  25. 5 4
      src/main/java/cn/cslg/pas/service/business/MergePersonService.java
  26. 43 1
      src/main/java/cn/cslg/pas/service/business/es/EsCountService.java
  27. 211 7
      src/main/java/cn/cslg/pas/service/business/es/EsCustomFieldService.java
  28. 78 0
      src/main/java/cn/cslg/pas/service/business/es/EsProductPatentService.java
  29. 22 6
      src/main/java/cn/cslg/pas/service/business/es/EsScratchWordsService.java
  30. 7 0
      src/main/java/cn/cslg/pas/service/common/PersonFieldService.java
  31. 13 0
      src/main/resources/jsons/patent.json

+ 2 - 0
src/main/java/cn/cslg/pas/common/dto/QueryFieldsDTO.java

@@ -15,4 +15,6 @@ import java.util.List;
 public class QueryFieldsDTO {
  private String tableName;
  private Integer projectId;
+ //商品化专利
+ private Integer productId;
 }

+ 0 - 1
src/main/java/cn/cslg/pas/common/dto/business/ReportProjectDTO.java

@@ -74,5 +74,4 @@ public class ReportProjectDTO {
     private Boolean ifSecondInvalid;
     @Schema(description = "主被动类型")
     private Integer actType;
-
 }

+ 1 - 0
src/main/java/cn/cslg/pas/common/dto/business/UpdateScratchWordsDTO.java

@@ -67,4 +67,5 @@ public class UpdateScratchWordsDTO {
      * 标注租户id
      */
     private Integer publicTenantId;
+    private Integer  createFrom;
 }

+ 19 - 0
src/main/java/cn/cslg/pas/common/dto/es/EsQueryPatentFieldsDTO.java

@@ -0,0 +1,19 @@
+package cn.cslg.pas.common.dto.es;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class EsQueryPatentFieldsDTO {
+
+    /**
+     * 专题库或报告id
+     */
+    Integer projectId;
+
+    List<String> patentNos;
+    List<InnerFields> innerFields;
+
+
+}

+ 17 - 0
src/main/java/cn/cslg/pas/common/dto/es/InnerFields.java

@@ -0,0 +1,17 @@
+package cn.cslg.pas.common.dto.es;
+
+import lombok.Data;
+
+@Data
+public class InnerFields {
+    /**
+     * 栏位类型
+     * 自定义栏位类型(0数字,1日期,2文本,4单选,5多选,6树,7产品8产品类别9技术分类 10标签)
+     */
+    private Integer fieldType;
+
+    /**
+     * 栏位
+     */
+    private String fieldId;
+}

+ 2 - 0
src/main/java/cn/cslg/pas/common/dto/patentCount/GetTabelColumDTO.java

@@ -12,4 +12,6 @@ public class GetTabelColumDTO {
     //任务id
     private Integer taskId;
     private String tableName;
+    //商品化专利
+    private Integer productId;
 }

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

@@ -14,7 +14,8 @@ import java.util.Map;
 @Accessors(chain = true)
 @Data
 public class PatentWithIdVO {
-private String id;
+
+    private String id;
     /**
      * 专利摘要附图
      */

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

@@ -28,5 +28,6 @@ public class PersonSelfFieldVO {
     private Boolean ifHidden;
     private Integer createType;
     private Boolean  defaultHidden;
+    private Boolean ifPersonal;
 
 }

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

@@ -48,4 +48,5 @@ public class ScratchWordsVO {
     private String patentId;
     private String patentNo;
     private String patentTitle;
+    private Integer createFrom;
 }

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

@@ -29,4 +29,6 @@ public class AllCustomFieldVO {
 
     private Integer sysOrder;
 
+    private Boolean ifPersonal;
+
 }

+ 12 - 0
src/main/java/cn/cslg/pas/common/vo/es/EsPatentFieldsVO.java

@@ -0,0 +1,12 @@
+package cn.cslg.pas.common.vo.es;
+
+import cn.cslg.pas.common.vo.FieldValueVO;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class EsPatentFieldsVO {
+    private String patentNo;
+    private List<InnerPatentFieldsVO> innerClassFields;
+}

+ 14 - 0
src/main/java/cn/cslg/pas/common/vo/es/EsProductPatentVO.java

@@ -0,0 +1,14 @@
+package cn.cslg.pas.common.vo.es;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class EsProductPatentVO {
+
+    private List<Integer> productIds;
+
+    private List<String> patentNos;
+
+}

+ 13 - 0
src/main/java/cn/cslg/pas/common/vo/es/InnerPatentFieldsVO.java

@@ -0,0 +1,13 @@
+package cn.cslg.pas.common.vo.es;
+
+import cn.cslg.pas.common.vo.FieldValueVO;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class InnerPatentFieldsVO {
+    private Integer fieldType;
+    private String field;
+    private List<FieldValueVO> fieldValueVOS;
+}

+ 24 - 4
src/main/java/cn/cslg/pas/controller/CustomAnalyseController.java

@@ -28,7 +28,12 @@ public class CustomAnalyseController {
     @Operation(summary = "查询组别/分析项")
     @PostMapping("/queryAnalyseGroup")
     public Response queryAnalyseGroup(@RequestBody SelectCustomAnalyseVO vo) {
-        List<SelectCustomAnalyseListDTO> list = customAnalyseService.queryAnalyseGroup(vo);
+        List<SelectCustomAnalyseListDTO> list = null;
+        try {
+            list = customAnalyseService.queryAnalyseGroup(vo);
+        } catch (Exception e) {
+            return Response.success(e.getMessage());
+        }
         return Response.success(list);
     }
 
@@ -49,21 +54,36 @@ public class CustomAnalyseController {
     @Operation(summary = "添加组别/分析项")
     @PostMapping("/addAnalyseGroup")
     public Response addAnalyseGroup(@RequestBody CustomAnalyseDTO vo) throws Exception {
-        Integer groupId = customAnalyseService.addAnalyseGroup(vo);
+        Integer groupId = null;
+        try {
+            groupId = customAnalyseService.addAnalyseGroup(vo);
+        } catch (Exception e) {
+            return Response.success(e.getMessage());
+        }
         return Response.success(groupId);
     }
 
     @Operation(summary = "编辑组别")
     @PostMapping("/editAnalyseGroup")
     public Response editAnalyseGroup(@RequestBody CustomAnalyseDTO vo) throws Exception {
-        Integer groupId = customAnalyseService.editAnalyseGroup(vo);
+        Integer groupId = null;
+        try {
+            groupId = customAnalyseService.editAnalyseGroup(vo);
+        } catch (Exception e) {
+            return Response.success(e.getMessage());
+        }
         return Response.success(groupId);
     }
 
     @Operation(summary = "删除组别/分析项")
     @PostMapping("/delAnalyseGroup")
     public Response delAnalyseGroup(@RequestBody CustomAnalyseIdVO vo) throws Exception {
-        Integer groupId = customAnalyseService.delAnalyseGroup(vo);
+        Integer groupId = null;
+        try {
+            groupId = customAnalyseService.delAnalyseGroup(vo);
+        } catch (Exception e) {
+            return Response.success(e.getMessage());
+        }
         return Response.success(groupId);
     }
 }

+ 17 - 0
src/main/java/cn/cslg/pas/controller/CustomFieldController.java

@@ -5,12 +5,14 @@ import cn.cslg.pas.common.dto.AllFieldOrderDTO;
 import cn.cslg.pas.common.dto.business.CustomFieldDTO;
 import cn.cslg.pas.common.dto.business.UpdateCustomFieldDTO;
 import cn.cslg.pas.common.dto.es.EsCustomFieldDTO;
+import cn.cslg.pas.common.dto.es.EsQueryPatentFieldsDTO;
 import cn.cslg.pas.common.dto.es.QueryEsCustomFieldDTO;
 import cn.cslg.pas.common.model.cronModel.Records;
 import cn.cslg.pas.common.model.request.StringRequest;
 import cn.cslg.pas.common.utils.Response;
 import cn.cslg.pas.common.vo.business.AllCustomFieldVO;
 import cn.cslg.pas.common.vo.es.EsCustomFieldBatchVO;
+import cn.cslg.pas.common.vo.es.EsPatentFieldsVO;
 import cn.cslg.pas.exception.ConditionException;
 import cn.cslg.pas.exception.UnLoginException;
 import cn.cslg.pas.exception.XiaoShiException;
@@ -145,4 +147,19 @@ public class CustomFieldController {
         records.setData(list);
         return Response.success(records);
     }
+
+    @PostMapping("/getPatentFields")
+    @Operation(summary = "批量获得专利的自定义栏位和值")
+    public Response getPatentFields(@RequestBody EsQueryPatentFieldsDTO esQueryPatentFieldsDTO) throws Exception {
+        Records records = new Records();
+        try {
+            List<EsPatentFieldsVO> list = esCustomFieldService.getPatentFields(esQueryPatentFieldsDTO);
+            records.setData(list);
+        }
+        catch (Exception e){
+            return Response.error(e.getMessage());
+        }
+
+        return Response.success(records);
+    }
 }

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

@@ -20,6 +20,7 @@ import cn.cslg.pas.common.vo.business.PatentKinVO;
 import cn.cslg.pas.common.vo.business.PatentNoVO;
 import cn.cslg.pas.common.vo.es.EsCustomFieldBatchVO;
 import cn.cslg.pas.common.vo.es.EsDateRangeVO;
+import cn.cslg.pas.common.vo.es.EsProductPatentVO;
 import cn.cslg.pas.domain.business.ImportTask;
 import cn.cslg.pas.exception.XiaoShiException;
 import cn.cslg.pas.factorys.businessFactory.Business;
@@ -31,6 +32,7 @@ import cn.cslg.pas.service.business.PatentExportService;
 import cn.cslg.pas.service.business.MergePersonService;
 import cn.cslg.pas.service.business.es.EsCountService;
 import cn.cslg.pas.service.business.es.EsPatentService;
+import cn.cslg.pas.service.business.es.EsProductPatentService;
 import cn.cslg.pas.service.business.es.EsService;
 import cn.cslg.pas.service.common.FileManagerService;
 import cn.cslg.pas.service.common.PatentStarApiService;
@@ -71,6 +73,9 @@ public class PatentController {
     private EsService esService;
 
     @Autowired
+    private EsProductPatentService esProductPatentService;
+
+    @Autowired
     private PatentStarApiService patentStarApiService;
 
     @Autowired
@@ -176,7 +181,12 @@ public class PatentController {
     @Operation(summary = "专利列表上新增发明人/权利人/申请人合并")
     @PostMapping("/mergePerson")
     public Response mergePerson(@RequestBody MergePersonVO personVO) throws Exception {
-        Integer personId = mergePersonService.mergePerson(personVO);
+        Integer personId = null;
+        try {
+            personId = mergePersonService.mergePerson(personVO);
+        } catch (Exception e) {
+            return Response.success(e.getMessage());
+        }
         return Response.success(personId);
     }
 
@@ -190,7 +200,12 @@ public class PatentController {
     @Operation(summary = "专利列表上编辑发明人/权利人/申请人合并")
     @PostMapping("/updateMergePerson")
     public Response updateMergePerson(@RequestBody MergePersonVO personVO) throws Exception{
-        Integer personId = mergePersonService.updateMergePerson(personVO);
+        Integer personId = null;
+        try {
+            personId = mergePersonService.updateMergePerson(personVO);
+        } catch (Exception e) {
+            return Response.success(e.getMessage());
+        }
         return Response.success(personId);
     }
 
@@ -284,4 +299,19 @@ public class PatentController {
         records.setData("导出专利");
         return Response.success(records);
     }
+
+    //---------------------------------商品化专利----------------
+    @Operation(summary = "添加商品化专利")
+    @PostMapping("/addProductPatent")
+    public Response addProductPatent(EsProductPatentVO vo) throws Exception {
+        List<Integer> ids = esProductPatentService.addProductPatent(vo);
+        return Response.success(ids);
+    }
+
+    @Operation(summary = "删除商品化专利")
+    @PostMapping("/delProductPatent")
+    public Response delProductPatent(EsProductPatentVO vo) throws Exception {
+        List<Integer> ids = esProductPatentService.delProductPatent(vo);
+        return Response.success(ids);
+    }
 }

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

@@ -81,6 +81,7 @@ public class ScratchWords {
     private Integer publicTenantId;
 
     private String patentTitle;
+    private Integer createFrom;
 
 
 }

+ 2 - 0
src/main/java/cn/cslg/pas/domain/es/Marking.java

@@ -89,4 +89,6 @@ public class Marking {
   private String patentNo;
   @JsonProperty("patent_title")
   private String patentTitle;
+  @JsonProperty("create_from")
+  private Integer createFrom;
 }

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

@@ -394,7 +394,7 @@ public class Patent {
      * 专题库或报告id
      */
     @JsonProperty("product_id")
-    private String productId;
+    private Integer productId;
 
     /**
      * 专题库或报告的任务

+ 60 - 0
src/main/java/cn/cslg/pas/factorys/EsBuilderFactory/ProductQueryBuilder.java

@@ -0,0 +1,60 @@
+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 ProductQueryBuilder implements IQueryBuilder {
+    private String field = "";
+    private String value = "";
+    private String operator = "";
+    public String path = "";
+
+    @Override
+    public Query creteQuery() throws ParseException {
+        return QueryBuilders.hasChild(child -> child.type("product").query(i -> i.match(j -> j.field(field).query(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;
+    }
+}

+ 1 - 0
src/main/java/cn/cslg/pas/service/PatentLabelService.java

@@ -46,6 +46,7 @@ public class PatentLabelService {
                 esCustomField.setFieldType(10);
                 esCustomField.setCreateTime(new Date());
                 esCustomField.setProjectId(projectId);
+                esCustomField.setField("0");
                 esCustomField.setFieldValue(labels);
                 esCustomField.setStatsValue(labels);
                 id = esCustomFieldService.addEsCustomFieldToEs(esCustomField, patentNo, null);

+ 7 - 6
src/main/java/cn/cslg/pas/service/business/CustomAnalyseService.java

@@ -13,6 +13,7 @@ import cn.cslg.pas.common.vo.customAnalyse.SelectAnalyseVO;
 import cn.cslg.pas.common.vo.customAnalyse.SelectCustomAnalyseVO;
 import cn.cslg.pas.domain.business.CustomAnalysisItem;
 import cn.cslg.pas.exception.UnLoginException;
+import cn.cslg.pas.exception.XiaoShiException;
 import cn.cslg.pas.mapper.CustomAnalysisItemMapper;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.ObjectUtil;
@@ -65,7 +66,7 @@ public class CustomAnalyseService extends ServiceImpl<CustomAnalysisItemMapper,
         try {
             personnelVO = cacheUtils.getLoginUser(loginUtils.getId());
         } catch (Exception e) {
-            throw new UnLoginException("未登录");
+            throw new XiaoShiException("未登录");
         }
 
         SelectAnalyseVO analyseVO = new SelectAnalyseVO();
@@ -116,7 +117,7 @@ public class CustomAnalyseService extends ServiceImpl<CustomAnalysisItemMapper,
                 .eq(CustomAnalysisItem::getName, vo.getName())
                 .eq(CustomAnalysisItem::getType, vo.getType()));
         if (items.size() > 1) {
-            throw new Exception("名称不可重复");
+            throw new XiaoShiException("名称不可重复");
         }
 
         String uid = IdUtil.simpleUUID();
@@ -125,7 +126,7 @@ public class CustomAnalyseService extends ServiceImpl<CustomAnalysisItemMapper,
         try {
             personnelVO = cacheUtils.getLoginUser(loginUtils.getId());
         } catch (Exception e) {
-            throw new UnLoginException("未登录");
+            throw new XiaoShiException("未登录");
         }
         CustomAnalysisItem item = new CustomAnalysisItem();
         BeanUtils.copyProperties(vo, item);
@@ -159,14 +160,14 @@ public class CustomAnalyseService extends ServiceImpl<CustomAnalysisItemMapper,
                 .eq(CustomAnalysisItem::getName, vo.getName())
                 .eq(CustomAnalysisItem::getType, vo.getType()));
         if (items.size() > 1) {
-            throw new Exception("名称不可重复");
+            throw new XiaoShiException("名称不可重复");
         }
         //获取登陆人信息 用于设置创建人
         PersonnelVO personnelVO = new PersonnelVO();
         try {
             personnelVO = cacheUtils.getLoginUser(loginUtils.getId());
         } catch (Exception e) {
-            throw new UnLoginException("未登录");
+            throw new XiaoShiException("未登录");
         }
 
         CustomAnalysisItem item = customAnalysisItemMapper.selectById(vo.getId());
@@ -191,7 +192,7 @@ public class CustomAnalyseService extends ServiceImpl<CustomAnalysisItemMapper,
         long count = this.count(new LambdaQueryWrapper<CustomAnalysisItem>()
                 .eq(CustomAnalysisItem::getParentId, vo.getId()));
         if (count > 0) {
-            throw new Exception("删除失败,请先删除子节点");
+            throw new XiaoShiException("删除失败,请先删除子节点");
         }
         this.removeById(vo.getId());
         itemSchemaService.deleteByUid(item.getUid());

+ 198 - 6
src/main/java/cn/cslg/pas/service/business/CustomFieldService.java

@@ -20,14 +20,17 @@ import cn.cslg.pas.common.vo.business.CustomFieldVO;
 import cn.cslg.pas.common.vo.business.ProductVO;
 import cn.cslg.pas.common.vo.es.QueryESCustomFieldVO;
 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.CustomFieldMapper;
 import cn.cslg.pas.service.AssoTaskFieldService;
 import cn.cslg.pas.service.business.es.EsCustomFieldService;
+import cn.cslg.pas.service.business.es.EsService;
 import cn.cslg.pas.service.permissions.PermissionService;
 import cn.cslg.pas.service.query.FormatQueryService;
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -39,10 +42,7 @@ import org.springframework.util.CollectionUtils;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -84,6 +84,8 @@ public class CustomFieldService extends ServiceImpl<CustomFieldMapper, CustomFie
     private TreeNodeService treeNodeService;
     @Autowired
     private AssoTaskFieldService assoTaskFieldService;
+    @Autowired
+    private EsService esService;
 
     @Override
     public Object queryMessage(QueryRequest queryRequest) throws Exception {
@@ -583,7 +585,7 @@ public class CustomFieldService extends ServiceImpl<CustomFieldMapper, CustomFie
                     case 6:
                         //TODO 根据名称和类型查询
                         fieldId = this.GetIdByName(name, projectId, type);
-                       value =treeNodeService.getIdByNames(value,fieldId,type);
+                        value = treeNodeService.getIdByNames(value, fieldId, type);
                         ;
                 }
 
@@ -628,8 +630,198 @@ public class CustomFieldService extends ServiceImpl<CustomFieldMapper, CustomFie
         return customField1.getId();
     }
 
-    public void copyCustomField(){
+    public void copyCustomField(Integer oldProject, Integer newProject) {
+        LambdaQueryWrapper<CustomField> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(CustomField::getProjectId, oldProject);
+        List<CustomField> fields = this.list(queryWrapper);
+        if (fields.size() != 0) {
+            for (CustomField customField : fields) {
+                CustomField newCustomField = new CustomField();
+                BeanUtils.copyProperties(fields, newCustomField);
+                newCustomField.setId(null);
+                newCustomField.setProjectId(newProject);
+                newCustomField.insert();
+                this.copyCustomFieldValues(customField, newCustomField);
+            }
+            this.saveBatch(fields);
+        }
+
+
+    }
+
+
+    public void copyCustomFieldValues(CustomField customField, CustomField newCustomField) {
+
+        Integer type = customField.getType();
+        switch (type) {
+            case 0:
+                ;
+            case 1:
+                ;
+            case 2:
+                ;
+            case 3:
+                this.copyTextValues(customField, newCustomField);
+                break;
+            case 4:
+
+
+            case 5:
+                this.copyOptionValues(customField, newCustomField);
+                break;
+            case 6:
+                this.copyTreeValues(customField, newCustomField);
+                break;
+
+        }
+
+
+    }
+
+    public void copyTextValues(CustomField customField, CustomField newCustomField) {
+
+        List<PatentWithIdVO> patents = esCustomFieldService.getEsCustomFields(customField.getId().toString(), customField.getType(), customField.getProjectId());
+        for (PatentWithIdVO patentWithIdVO : patents) {
+            Patent patent = patentWithIdVO.getPatent();
+            patent.getESCustomField().setField(newCustomField.getId().toString());
+            patent.getESCustomField().setCreateTime(new Date());
+            patent.getESCustomField().setTaskId(null);
+            patent.getESCustomField().setProjectId(newCustomField.getProjectId());
+            String parentId = patent.getPatentJoin().getParent();
+            try {
+                esService.addChildPatent(patent, parentId);
+            } catch (Exception e) {
+                throw new XiaoShiException("保存出错");
+            }
+
+        }
+
+
+    }
+
+    public void copyOptionValues(CustomField customField, CustomField newCustomField) {
+        Integer newId = newCustomField.getId();
+        //查询自定义栏位的选项值
+        Map<String, String> map = new HashMap<>();
+        LambdaQueryWrapper<CustomOption> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(CustomOption::getCustomFieldId, customField.getId());
+        List<CustomOption> customOptions = customOptionService.list(queryWrapper);
+        for (CustomOption customOption : customOptions) {
+            CustomOption customOption1 = new CustomOption();
+            BeanUtils.copyProperties(customOption, customOption1);
+            customOption1.setCustomFieldId(newId);
+            customOption1.insert();
+            map.put(customOption.getId().toString(), customOption1.getId().toString());
 
+        }
+        List<PatentWithIdVO> patents = esCustomFieldService.getEsCustomFields(customField.getId().toString(), customField.getType(), customField.getProjectId());
+        for (PatentWithIdVO patentWithIdVO : patents) {
+            Patent patent = patentWithIdVO.getPatent();
+            patent.getESCustomField().setField(customField.getId().toString());
+            patent.getESCustomField().setCreateTime(new Date());
+            patent.getESCustomField().setTaskId(null);
+            List<String> fieldValues = patent.getESCustomField().getFieldValue();
+            fieldValues.forEach(item -> item = map.get(item));
+            patent.getESCustomField().setFieldValue(fieldValues);
+            patent.getESCustomField().setStatsValue(fieldValues);
+            String parentId = patent.getPatentJoin().getParent();
+            try {
+                esService.addChildPatent(patent, parentId);
+            } catch (Exception e) {
+                throw new XiaoShiException("保存出错");
+            }
+
+        }
 
     }
+
+
+    public void copyTreeValues(CustomField customField, CustomField newCustomField) {
+        Integer newId = newCustomField.getId();
+        Map<String, String> map = new HashMap<>();
+        //查询自定义栏位的选项值
+        LambdaQueryWrapper<TreeNode> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(TreeNode::getTypeId, customField.getId())
+                .eq(TreeNode::getType, customField.getType())
+                .orderByAsc(TreeNode::getLevel);
+        List<TreeNode> treeNodes = treeNodeService.list(queryWrapper);
+        for (TreeNode treeNode : treeNodes) {
+            TreeNode treeNode1 = new TreeNode();
+            BeanUtils.copyProperties(treeNode, treeNode1);
+            treeNode1.setTypeId(newCustomField.getId());
+            treeNode1.setId(null);
+            String path = treeNode.getPath();
+            if (path != null && !path.trim().equals("")) {
+                List<String> paths = Arrays.asList(path.split("/"));
+                paths.forEach(item -> item = map.get(item));
+                path = StringUtils.join(paths, "/");
+                treeNode1.setPath(path);
+            }
+            treeNode1.insert();
+            map.put(treeNode.getId().toString(), treeNode1.getId().toString());
+
+        }
+        List<PatentWithIdVO> patents = esCustomFieldService.getEsCustomFields(customField.getId().toString(), customField.getType(), customField.getProjectId());
+        for (PatentWithIdVO patentWithIdVO : patents) {
+            Patent patent = patentWithIdVO.getPatent();
+            patent.getESCustomField().setField(customField.getId().toString());
+            patent.getESCustomField().setCreateTime(new Date());
+            patent.getESCustomField().setTaskId(null);
+            List<String> fieldValues = patent.getESCustomField().getFieldValue();
+            List<String> statusValues = patent.getESCustomField().getStatsValue();
+            fieldValues.forEach(item -> item = map.get(item));
+            statusValues.forEach(item -> item = map.get(item));
+            patent.getESCustomField().setFieldValue(fieldValues);
+            patent.getESCustomField().setStatsValue(statusValues);
+            String parentId = patent.getPatentJoin().getParent();
+            //TODO添加path
+            try {
+                esService.addChildPatent(patent, parentId);
+            } catch (Exception e) {
+                throw new XiaoShiException("保存出错");
+            }
+
+        }
+
+    }
+
+
+//    public void copyProductValues(CustomField customField,CustomField newCustomField) {
+//        Integer newId =newCustomField.getId();
+//        //查询自定义栏位的选项值
+//        List<Map<String,String>> maps =new ArrayList<>();
+//        LambdaQueryWrapper<TreeNode> queryWrapper =new LambdaQueryWrapper<>();
+//        queryWrapper.eq(TreeNode::getTypeId,customField.getId())
+//                .eq(TreeNode::getType,customField.getType())
+//                .orderByAsc(TreeNode::getLevel);
+//        List<TreeNode> treeNodes = treeNodeService.list(queryWrapper);
+//        for (TreeNode treeNode:treeNodes){
+//            TreeNode treeNode1 =new TreeNode();
+//            BeanUtils.copyProperties(treeNode,treeNode1);
+//            treeNode1.setTypeId(newCustomField.getId());
+//            treeNode1.setId(null);
+//            //TODO添加path
+//            Map<String,String> map =new HashMap<>();
+//            map.put(treeNode.getId().toString(),treeNode1.getId().toString());
+//
+//        }
+//        List<PatentWithIdVO> patents = esCustomFieldService.getEsCustomFields(customField.getId().toString(), customField.getType(), customField.getProjectId());
+//        for (PatentWithIdVO patentWithIdVO : patents) {
+//            Patent patent =patentWithIdVO.getPatent();
+//            patent.getESCustomField().setField(customField.getId().toString());
+//            patent.getESCustomField().setCreateTime(new Date());
+//            patent.getESCustomField().setTaskId(null);
+//            String parentId =patent.getPatentJoin().getParent();
+//            //TODO添加path
+//            try {
+//                esService.addChildPatent(patent,parentId);
+//            }
+//            catch (Exception e){
+//                throw new XiaoShiException("保存出错");
+//            }
+//
+//        }
+//
+//    }
+
 }

+ 43 - 20
src/main/java/cn/cslg/pas/service/business/InvalidStatutesService.java

@@ -3,7 +3,10 @@ package cn.cslg.pas.service.business;
 import cn.cslg.pas.common.dto.DomainFieldDTO;
 import cn.cslg.pas.common.dto.business.InvalidStatutesDTO;
 import cn.cslg.pas.common.dto.invalidDTO.UpdateMessageDTO;
+import cn.cslg.pas.common.model.cronModel.PersonnelVO;
+import cn.cslg.pas.common.utils.CacheUtils;
 import cn.cslg.pas.common.utils.GenerateObjectUtil;
+import cn.cslg.pas.common.utils.LoginUtils;
 import cn.cslg.pas.common.vo.invalidVO.InvalidStatutesVO;
 import cn.cslg.pas.domain.business.*;
 import cn.cslg.pas.exception.XiaoShiException;
@@ -25,6 +28,7 @@ import java.util.stream.Collectors;
 
 /**
  * 无效发条Service
+ *
  * @Author xiexiang
  * @Date 2023/12/22
  */
@@ -41,12 +45,19 @@ public class InvalidStatutesService extends ServiceImpl<InvalidStatutesMapper, I
     @Lazy
     private ProofGroupService proofGroupService;
 
+    @Autowired
+    private CacheUtils cacheUtils;
+    @Autowired
+    private LoginUtils loginUtils;
+
     /**
      * 添加无效法条
+     *
      * @param invalidStatutesDTO
      * @return
      */
     public List<Integer> addInvalidStatutes(InvalidStatutesDTO invalidStatutesDTO) {
+        Integer projectId =invalidStatutesDTO.getProjectId();
         List<Integer> ids = new ArrayList<>();
         if (invalidStatutesDTO != null) {
             if (invalidStatutesDTO.getProjectId() != null) {
@@ -71,11 +82,21 @@ public class InvalidStatutesService extends ServiceImpl<InvalidStatutesMapper, I
                     //涉及内容为说明书或者附图
                     InvalidStatutes invalidStatutes = new InvalidStatutes();
                     BeanUtils.copyProperties(invalidStatutesDTO, invalidStatutes);
+                    if (invalidStatutesDTO.getRelatedContent().equals(2)) {
+                        PersonnelVO personnelVO = cacheUtils.getLoginUser(loginUtils.getId());
+                        PatentClaim patentClaim = new PatentClaim();
+                        patentClaim.setCreateId(personnelVO.getId());
+                        patentClaim.setContentType(1);
+                        patentClaim.setProjectId(projectId);
+                        patentClaim.insert();
+                        invalidStatutes.setClaimId(patentClaim.getId());
+                    }
+
                     invalidStatutes.insert();
                     Integer id = invalidStatutes.getId();
                     ids.add(id);
-                }
-                else {
+
+                } else {
                     throw new XiaoShiException("涉及内容不能为空");
                 }
                 return ids;
@@ -88,10 +109,11 @@ public class InvalidStatutesService extends ServiceImpl<InvalidStatutesMapper, I
 
     /**
      * 查询无效法条
+     *
      * @param projectId
      * @return
      */
-    public List<InvalidStatutesVO> queryInvalidStatutes(Integer projectId){
+    public List<InvalidStatutesVO> queryInvalidStatutes(Integer projectId) {
         List<InvalidStatutesVO> invalidStatutesVOS = new ArrayList<>();
         if (projectId != null) {
             //根据报告id查询所有无效法条
@@ -116,9 +138,10 @@ public class InvalidStatutesService extends ServiceImpl<InvalidStatutesMapper, I
 
     /**
      * 装载法条
+     *
      * @param invalidStatutesVOS
      */
-    public void loadStatutes(List<InvalidStatutesVO> invalidStatutesVOS){
+    public void loadStatutes(List<InvalidStatutesVO> invalidStatutesVOS) {
         List<Integer> invalidStatutesIds = invalidStatutesVOS.stream().map(InvalidStatutesVO::getStatutesId).collect(Collectors.toList());
         if (!invalidStatutesIds.isEmpty()) {
             LambdaQueryWrapper<SystemDict> queryWrapper = new LambdaQueryWrapper<>();
@@ -147,9 +170,10 @@ public class InvalidStatutesService extends ServiceImpl<InvalidStatutesMapper, I
 
     /**
      * 装载权要
+     *
      * @param invalidStatutesVOS
      */
-    public void loadClaims(Integer projectId, List<InvalidStatutesVO> invalidStatutesVOS){
+    public void loadClaims(Integer projectId, List<InvalidStatutesVO> invalidStatutesVOS) {
         List<Integer> claimIds = invalidStatutesVOS.stream().filter(item -> item.getClaimId() != null).map(InvalidStatutesVO::getClaimId).collect(Collectors.toList());
         if (!claimIds.isEmpty()) {
             LambdaQueryWrapper<PatentClaim> queryWrapper = new LambdaQueryWrapper<>();
@@ -164,6 +188,7 @@ public class InvalidStatutesService extends ServiceImpl<InvalidStatutesMapper, I
                             .findFirst()
                             .orElse(null);
                     if (patentClaim != null) {
+                        invalidStatutesVO.setClaimId(patentClaim.getId());
                         invalidStatutesVO.setClaimSort(patentClaim.getSysOrder());
                         invalidStatutesVO.setClaimText(patentClaim.getContent());
                         invalidStatutesVO.setRbDecision(patentClaim.getRbDecision());
@@ -180,7 +205,6 @@ public class InvalidStatutesService extends ServiceImpl<InvalidStatutesMapper, I
     }
 
 
-
     /**
      * 更新信息
      *
@@ -214,27 +238,26 @@ public class InvalidStatutesService extends ServiceImpl<InvalidStatutesMapper, I
     }
 
     /**
-     *
      * @param id
      * @return
      */
     @Transactional(rollbackFor = Exception.class)
-    public Integer removeInvalidStatutes(Integer id){
-        if(id==null){
+    public Integer removeInvalidStatutes(Integer id) {
+        if (id == null) {
             throw new XiaoShiException("请输入无效法条");
         }
-        InvalidStatutes invalidStatutes =this.getById(id);
-        if(invalidStatutes==null){
+        InvalidStatutes invalidStatutes = this.getById(id);
+        if (invalidStatutes == null) {
             throw new XiaoShiException("无效法条不存在");
         }
-    //根据无效法条id 查询是否有证据组合
-        LambdaQueryWrapper<ProofGroup> queryWrapper =new LambdaQueryWrapper<>();
-        queryWrapper.eq(ProofGroup::getInvalidStatutesId,id);
-        List<ProofGroup> proofGroups =proofGroupService.list(queryWrapper);
-          if(proofGroups.size()>0){
-              throw new XiaoShiException("请先删除该法条的证据组合");
-          }
-          this.removeById(id);
-          return id;
+        //根据无效法条id 查询是否有证据组合
+        LambdaQueryWrapper<ProofGroup> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(ProofGroup::getInvalidStatutesId, id);
+        List<ProofGroup> proofGroups = proofGroupService.list(queryWrapper);
+        if (proofGroups.size() > 0) {
+            throw new XiaoShiException("请先删除该法条的证据组合");
+        }
+        this.removeById(id);
+        return id;
     }
 }

+ 5 - 4
src/main/java/cn/cslg/pas/service/business/MergePersonService.java

@@ -22,6 +22,7 @@ import cn.cslg.pas.domain.es.PatentMergePerson;
 import cn.cslg.pas.domain.es.PatentPerson;
 import cn.cslg.pas.domain.es.PersonAddress;
 import cn.cslg.pas.exception.UnLoginException;
+import cn.cslg.pas.exception.XiaoShiException;
 import cn.cslg.pas.mapper.MergePersonMapper;
 import cn.cslg.pas.mapper.SystemDictMapper;
 import cn.cslg.pas.service.business.es.EsPatentService;
@@ -92,7 +93,7 @@ public class MergePersonService extends ServiceImpl<MergePersonMapper, MergePers
         try {
             personnelVO = cacheUtils.getLoginUser(loginUtils.getId());
         } catch (Exception e) {
-            throw new UnLoginException("未登录");
+            throw new XiaoShiException("未登录");
         }
         //判断是否名称重复
         LambdaQueryWrapper<MergePerson> wrapper = new LambdaQueryWrapper<MergePerson>()
@@ -100,7 +101,7 @@ public class MergePersonService extends ServiceImpl<MergePersonMapper, MergePers
                 .eq(MergePerson::getName, vo.getName());
         List<MergePerson> list = mergePersonMapper.selectList(wrapper);
         if (list.size() > 1) {
-            throw new Exception("合并名称不可重复");
+            throw new XiaoShiException("合并名称不可重复");
         }
 
         MergePerson person = new MergePerson();
@@ -227,7 +228,7 @@ public class MergePersonService extends ServiceImpl<MergePersonMapper, MergePers
         try {
             personnelVO = cacheUtils.getLoginUser(loginUtils.getId());
         } catch (Exception e) {
-            throw new UnLoginException("未登录");
+            throw new XiaoShiException("未登录");
         }
         //判断是否名称重复
         LambdaQueryWrapper<MergePerson> wrapper = new LambdaQueryWrapper<MergePerson>()
@@ -235,7 +236,7 @@ public class MergePersonService extends ServiceImpl<MergePersonMapper, MergePers
                 .eq(MergePerson::getName, vo.getName());
         List<MergePerson> list = mergePersonMapper.selectList(wrapper);
         if (list.size() > 1) {
-            throw new Exception("合并名称不可重复");
+            throw new XiaoShiException("合并名称不可重复");
         }
         //获取老专利
         MergePerson person = this.getById(vo.getId());

+ 43 - 1
src/main/java/cn/cslg/pas/service/business/es/EsCountService.java

@@ -86,7 +86,12 @@ public class EsCountService {
                 }
             } else {
                 for (String value : values) {
-                    String condition = countVO.getField() + " = " + value;
+                    String condition = "";
+                    if (dateList.contains(countVO.getField())) {
+                        condition = this.getDateFormat(countVO.getField(), value);
+                    } else {
+                        condition = countVO.getField() + " = " + value;
+                    }
                     this.getReturnData(searchCondition, condition, customFields, taskId, projectId,
                             esCountVOS, detailDTOS, esCountDTO, value, map);
                 }
@@ -99,6 +104,43 @@ public class EsCountService {
         return esCountDTO;
     }
 
+    public String getDateFormat(String field,String value) {
+        String condition = "";
+        if (value.contains("Q") || value.contains("H") || value.length() == 9) {
+            String year = value.substring(0, value.indexOf("-"));
+            int nextYear = Integer.parseInt(year) + 1;
+            String start = "";
+            String end = "";
+            if (value.contains("Q1")) {
+                start = year + "-01";
+                end = year + "-04";
+            } else if (value.contains("Q2")) {
+                start = year + "-04";
+                end = year + "-07";
+            } else if (value.contains("Q3")) {
+                start = year + "-07";
+                end = year + "-10";
+            } else if (value.contains("Q4")) {
+                start = year + "-10";
+                end = nextYear + "-01";
+            } else if (value.contains("H1")) {
+                start = year + "-01";
+                end = year + "-07";
+            } else if (value.contains("H2")) {
+                start = year + "-07";
+                end = nextYear + "-01";
+            } else if (value.length() == 9) {
+                start = year;
+                end = value.substring(value.indexOf("-") + 1);
+            }
+            condition = field + ">=" + start + " " + "AND" + " " + field + "<" + end;
+        } else {
+            condition = field + " = " + value;
+        }
+
+        return condition;
+    }
+
     public void getReturnData(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 {

+ 211 - 7
src/main/java/cn/cslg/pas/service/business/es/EsCustomFieldService.java

@@ -8,15 +8,16 @@ 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.EsCustomFieldBatchVO;
-import cn.cslg.pas.common.vo.es.FieldHistoryVO;
-import cn.cslg.pas.common.vo.es.QueryESCustomFieldVO;
+import cn.cslg.pas.common.vo.es.*;
 import cn.cslg.pas.domain.business.CustomField;
+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;
@@ -54,7 +55,7 @@ public class EsCustomFieldService {
     private final ElasticsearchClient client;
     private final EsService esService;
     private final TreeNodeService treeNodeService;
-
+    private final CustomOptionService customOptionService;
     @Autowired
     private FormatQueryService formatQueryService;
 
@@ -271,6 +272,7 @@ public class EsCustomFieldService {
 
     /**
      * 批量添加自定义栏位值
+     *
      * @param vo
      * @return
      * @throws Exception
@@ -292,7 +294,7 @@ public class EsCustomFieldService {
                 }
 
             }
-        } else if (startNum >= 1 && endNum > 0){
+        } else if (startNum >= 1 && endNum > 0) {
             List<String> patentNos = this.getPatentNos(vo);
             for (String patentNo : patentNos) {
                 for (EsCustomFieldDTO fieldDTO : fieldDTOS) {
@@ -307,6 +309,7 @@ public class EsCustomFieldService {
 
     /**
      * 获取专利号列表
+     *
      * @param vo
      * @return
      * @throws Exception
@@ -383,7 +386,7 @@ public class EsCustomFieldService {
 
         int number = endNum - startNum;
         if (startNum > 0 && endNum > startNum) {
-            builder.from(startNum-1).size(number);
+            builder.from(startNum - 1).size(number);
         }
 
         SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
@@ -617,6 +620,7 @@ public class EsCustomFieldService {
         return esCustomFieldHistoryHit;
 
     }
+
     public PatentWithIdVO getPatentLabel(AddPatentLabelDTO addPatentLabelDTO) throws Exception {
         PatentWithIdVO patentWithIdVO = new PatentWithIdVO();
         Integer projectId = addPatentLabelDTO.getProjectId();
@@ -644,7 +648,7 @@ public class EsCustomFieldService {
         Query q3 = QueryBuilders.hasParent(t -> t.parentType("patent").query(parentQ));
 
         Query bool = null;
-            bool = QueryBuilders.bool(i -> i.must(q1, q3, q4));
+        bool = QueryBuilders.bool(i -> i.must(q1, q3, q4));
 
 
         builder.query(bool);
@@ -662,4 +666,204 @@ public class EsCustomFieldService {
         return patentWithIdVO;
     }
 
+
+    public List<ESCustomField> getPatentCustomFields(String projectId, String patentId) {
+        SearchRequest.Builder builder = new SearchRequest.Builder();
+        //设置查询索引
+        builder.index("patent");
+        Query q1 = QueryBuilders.term(t -> t.field("project_id").value(projectId));
+        Query q2 = QueryBuilders.parentId(parent -> parent.type("patent").id(patentId));
+        Query bool = QueryBuilders.bool(i -> i.must(q1, q2));
+        try {
+            SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
+            List<Hit<Patent>> hits = response.hits().hits();
+            hits.forEach(item -> {
+            });
+        } catch (Exception e) {
+
+        }
+        return null;
+    }
+
+
+    /**
+     * 查询自定义栏位和值
+     *
+     * @param esQueryPatentFieldsDTO
+     * @return
+     * @throws Exception
+     */
+    public List<EsPatentFieldsVO> getPatentFields(EsQueryPatentFieldsDTO esQueryPatentFieldsDTO) throws Exception {
+        List<EsPatentFieldsVO> esPatentFieldsVOS = new ArrayList<>();
+
+        Integer projectId = esQueryPatentFieldsDTO.getProjectId();
+        List<String> patentNos = esQueryPatentFieldsDTO.getPatentNos();
+        List<InnerFields> innerFields = esQueryPatentFieldsDTO.getInnerFields();
+
+        for (String patentNo : patentNos) {
+            EsPatentFieldsVO esPatentFieldsVO = new EsPatentFieldsVO();
+            esPatentFieldsVO.setPatentNo(patentNo);
+            SearchRequest.Builder builder = new SearchRequest.Builder();
+
+            //设置查询索引
+            builder.index("patent");
+            builder.sort(sortOptionsBuilder -> sortOptionsBuilder
+                    .field(fieldSortBuilder -> fieldSortBuilder
+                            .field("custom_field.create_time").order(SortOrder.Desc)));
+            Query queries = this.getQueries(patentNo, innerFields, projectId);
+            builder.size(999);
+            builder.query(queries);
+            SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
+            long total = response.hits().total().value();
+            List<ESCustomField> esCustomFields = new ArrayList<>();
+            List<InnerPatentFieldsVO> innerPatentFieldsVOS = new ArrayList<>();
+            if (total > 0) {
+                List<Hit<Patent>> hits = response.hits().hits();
+                for (Hit<Patent> hit : hits) {
+                    Patent patent = hit.source();
+                    ESCustomField esCustomField = patent.getESCustomField();
+                    ESCustomField esCustomField1 = esCustomFields.stream()
+                            .filter(item -> item.getField().equals(esCustomField.getField()) && item.getFieldType().equals(esCustomField.getFieldType()))
+                            .findFirst().orElse(null);
+
+                    if (esCustomField1 == null) {
+                        esCustomFields.add(esCustomField);
+                        InnerPatentFieldsVO innerPatentFieldsVO = new InnerPatentFieldsVO();
+                        innerPatentFieldsVO.setField(esCustomField.getField());
+                        innerPatentFieldsVO.setFieldType(esCustomField.getFieldType());
+                        List<FieldValueVO> fieldValueVOS = this.getCustomFieldValues(esCustomField.getFieldType(), esCustomField.getFieldValue());
+                        innerPatentFieldsVO.setFieldValueVOS(fieldValueVOS);
+                        innerPatentFieldsVOS.add(innerPatentFieldsVO);
+                    }
+                }
+            }
+            esPatentFieldsVO.setInnerClassFields(innerPatentFieldsVOS);
+            esPatentFieldsVOS.add(esPatentFieldsVO);
+        }
+
+        return esPatentFieldsVOS;
+    }
+
+    private Query getQueries(String patentNo, List<InnerFields> innerFields, Integer projectId) {
+
+        Query parentQ1 = QueryBuilders.term(t -> t.field("app_no.keyword").value(patentNo));
+
+        //公开号
+        Query parentQ2 = QueryBuilders.term(t -> t.field("public_no.keyword").value(patentNo));
+
+        //授权号
+        Query parentQ3 = QueryBuilders.term(t -> t.field("grant_no.keyword").value(patentNo));
+
+        Query parentQ = QueryBuilders.bool(i -> i.should(parentQ1, parentQ2, parentQ3));
+        Query patentQ1 = QueryBuilders.hasParent(t -> t.parentType("patent").query(parentQ));
+        List<Query> queries = new ArrayList<>();
+        for (InnerFields innerField : innerFields) {
+            String filedId = innerField.getFieldId();
+            Integer fieldType = innerField.getFieldType();
+            Query q1 = QueryBuilders.term(t -> t.field("custom_field.project_id").value(projectId));
+            Query q2 = QueryBuilders.term((t -> t.field("custom_field.field").value(filedId)));
+            Query q3 = QueryBuilders.term(t -> t.field("custom_field.field_type").value(fieldType));
+
+            Query fQ = QueryBuilders.bool(i -> i.must(q1, q2, q3));
+            queries.add(fQ);
+        }
+        Query query = QueryBuilders.bool(i -> i.should(queries));
+        Query query1 = QueryBuilders.bool(i -> i.must(query, patentQ1));
+        return query1;
+    }
+
+
+    /**
+     * 获得自定义字段的值
+     *
+     * @param type
+     * @param value
+     * @return
+     */
+    public List<FieldValueVO> getCustomFieldValues(Integer type, List<String> value) {
+        List<FieldValueVO> fieldValueVOS = new ArrayList<>();
+        switch (type) {
+            case 0:
+            case 1:
+            case 2:
+                value.forEach(item -> {
+                    FieldValueVO fieldValueVO = new FieldValueVO();
+                    fieldValueVO.setValue(item);
+                    fieldValueVOS.add(fieldValueVO);
+                });
+                break;
+            case 3:
+            case 4:
+            case 5:
+                if (value != null && value.size() > 0) {
+                    List<Integer> ids = FormatUtil.StringTOIntegerList(value);
+                    LambdaQueryWrapper<CustomOption> queryWrapper = new LambdaQueryWrapper<>();
+                    queryWrapper.in(CustomOption::getId, ids);
+                    List<CustomOption> customOptions = customOptionService.list(queryWrapper);
+                    customOptions.forEach(item -> {
+                        FieldValueVO fieldValueVO = new FieldValueVO();
+                        fieldValueVO.setValueId(item.getId());
+                        fieldValueVO.setValue(item.getName());
+                        fieldValueVOS.add(fieldValueVO);
+                    });
+                }
+                break;
+            case 6:
+            case 7:
+            case 8:
+
+            case 9:
+                if (value != null && value.size() > 0) {
+                    List<Integer> ids = FormatUtil.StringTOIntegerList(value);
+                    LambdaQueryWrapper<TreeNode> queryWrapper = new LambdaQueryWrapper<>();
+                    queryWrapper.in(TreeNode::getId, ids);
+                    List<TreeNode> treeNodes = treeNodeService.list(queryWrapper);
+                    treeNodes.forEach(item -> {
+                        FieldValueVO fieldValueVO = new FieldValueVO();
+                        fieldValueVO.setValueId(item.getId());
+                        fieldValueVO.setValue(item.getName());
+                        fieldValueVO.setPath(item.getPath());
+                        fieldValueVOS.add(fieldValueVO);
+                    });
+                }
+                break;
+        }
+        return fieldValueVOS;
+
+    }
+
+    public List<PatentWithIdVO> getEsCustomFields(String filedId, Integer type, Integer projectId) {
+        List<PatentWithIdVO> patentWithIdVOS = new ArrayList<>();
+        Query q1 = QueryBuilders.term(t -> t.field("custom_field.project_id").value(projectId));
+        Query q2 = QueryBuilders.term((t -> t.field("custom_field.field").value(filedId)));
+        Query q3 = QueryBuilders.term(t -> t.field("custom_field.field_type").value(type));
+
+        Query fQ = QueryBuilders.bool(i -> i.must(q1, q2, q3));
+        SearchRequest.Builder builder = new SearchRequest.Builder();
+        builder.size(999);
+        builder.query(fQ);
+        builder.sort(sortOptionsBuilder -> sortOptionsBuilder
+                .field(fieldSortBuilder -> fieldSortBuilder
+                        .field("custom_field.create_time").order(SortOrder.Desc)));
+        try {
+            SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
+            long total = response.hits().total().value();
+            if (total > 0) {
+                List<Hit<Patent>> hits = response.hits().hits();
+                for (Hit<Patent> hit : hits) {
+                    PatentWithIdVO patentWithIdVO = new PatentWithIdVO();
+                    patentWithIdVO.setPatent(hit.source());
+                    patentWithIdVO.setId(hit.id());
+                    PatentWithIdVO patentWithIdVO1 = patentWithIdVOS.stream().filter(item -> item.getPatent().getPatentJoin().getParent().equals(hit.source().getPatentJoin().getParent())).findFirst().orElse(null);
+                    if (patentWithIdVO1 == null) {
+                        patentWithIdVOS.add(patentWithIdVO);
+                    }
+                }
+
+            }
+        } catch (Exception e) {
+        }
+
+        return patentWithIdVOS;
+    }
 }

+ 78 - 0
src/main/java/cn/cslg/pas/service/business/es/EsProductPatentService.java

@@ -0,0 +1,78 @@
+package cn.cslg.pas.service.business.es;
+
+
+import cn.cslg.pas.common.dto.business.SelectClaimDTO;
+import cn.cslg.pas.common.vo.PatentWithIdVO;
+import cn.cslg.pas.common.vo.es.EsProductPatentVO;
+import cn.cslg.pas.domain.es.Patent;
+import cn.cslg.pas.domain.es.PatentJoin;
+import cn.cslg.pas.service.query.FormatQueryService;
+import co.elastic.clients.elasticsearch.ElasticsearchClient;
+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.Hit;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+@RequiredArgsConstructor(onConstructor_ = {@Lazy})
+public class EsProductPatentService {
+    private final ElasticsearchClient client;
+    private final FormatQueryService formatQueryService;
+
+    @Autowired
+    private EsService esService;
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class)
+    public List<Integer> addProductPatent(EsProductPatentVO vo) throws Exception {
+        List<Integer> ids = new ArrayList<>();
+        List<String> patentNos = vo.getPatentNos();
+        for (String patentNo : patentNos) {
+            PatentWithIdVO patentWithIdVO = esService.getIdByPatentNo(patentNo);
+            String id = patentWithIdVO.getId();
+            Patent patent = new Patent();
+            PatentJoin patentJoin = new PatentJoin();
+            patentJoin.setParent(id);
+            patentJoin.setName("product");
+            patent.setPatentJoin(patentJoin);
+            List<Integer> productIds = vo.getProductIds();
+            for (Integer productId : productIds) {
+                patent.setProductId(productId);
+                esService.addChildPatent(patent, id);
+                ids.add(productId);
+            }
+        }
+        return ids;
+    }
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class)
+    public List<Integer> delProductPatent(EsProductPatentVO vo) throws Exception {
+        List<Integer> ids = new ArrayList<>();
+        List<Integer> productIds = vo.getProductIds();
+        for (Integer productId : productIds) {
+            SearchRequest.Builder builder = new SearchRequest.Builder();
+            //设置查询索引
+            builder.index("patent");
+            Query q = QueryBuilders.term(n -> n.field("product_id").value(productId));
+            Query query = QueryBuilders.hasChild(i -> i.type("product").query(q));
+            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 patent = hit.source();
+
+            }
+        }
+
+        return ids;
+    }
+}

+ 22 - 6
src/main/java/cn/cslg/pas/service/business/es/EsScratchWordsService.java

@@ -29,6 +29,7 @@ import co.elastic.clients.elasticsearch._types.query_dsl.Query;
 import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders;
 import co.elastic.clients.elasticsearch.core.*;
 import co.elastic.clients.elasticsearch.core.search.Hit;
+import co.elastic.clients.elasticsearch.nodes.Stats;
 import co.elastic.clients.json.JsonData;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
@@ -256,12 +257,12 @@ public class EsScratchWordsService {
         Aggregation hits = AggregationBuilders.bucketSort(i -> i.size(size.intValue()).from((current.intValue() - 1) * size.intValue()));
         Aggregation aggregation = null;
         if (esGroupFiled.equals("mark_time")) {
-            aggregation =
-                    new Aggregation.Builder().dateHistogram(new DateHistogramAggregation.Builder().field(esGroupFiled).calendarInterval(CalendarInterval.Day).format("yyyy_MM_dd").build()).aggregations(new HashMap() {{
+            aggregation = new Aggregation.Builder().dateHistogram(new DateHistogramAggregation.Builder().field(esGroupFiled)
+                            .calendarInterval(CalendarInterval.Day).format("yyyy-MM-dd").build())
+                    .aggregations(new HashMap() {{
                         put("pageAgg", hits);
                     }}).build();
-        }
-        else {
+        } else {
            aggregation = new Aggregation.Builder().terms(new TermsAggregation.Builder()
                     .field(esGroupFiled).build()).aggregations(new HashMap() {{
                 put("pageAgg", hits);
@@ -271,7 +272,22 @@ public class EsScratchWordsService {
         builder.size(0);
 
         //查询总数聚合
-        Aggregation totalAggregation = AggregationBuilders.cardinality(i -> i.field(esGroupFiled));
+        /*Aggregation totalAggregation = null;
+        if (esGroupFiled.equals("mark_time")) {
+            Aggregation finalAggregation = aggregation;
+            Aggregation statsAgg = new Aggregation.Builder().statsBucket(new StatsBucketAggregation.Builder()
+                    .bucketsPath(m -> m.single("statsAgg._count")).build())
+                    .aggregations(new HashMap() {{
+                        put("statsAgg", finalAggregation);
+                    }}).build();
+            totalAggregation.aggregations().put("id", statsAgg);
+        } else {
+            totalAggregation = AggregationBuilders.cardinality(i -> i.field(esGroupFiled));
+        }*/
+//        Aggregation totalAggregation = AggregationBuilders.cardinality(i -> i.field(esGroupFiled));
+//        builder.aggregations("total", totalAggregation);
+        Aggregation totalAggregation = new Aggregation.Builder().statsBucket(new StatsBucketAggregation.Builder()
+                .bucketsPath(n -> n.single("agg._count")).build()).build();
         builder.aggregations("total", totalAggregation);
         try {
             SearchResponse<Marking> response = client.search(builder.build(), Marking.class);
@@ -304,7 +320,7 @@ public class EsScratchWordsService {
             records.setData(maps);
 
             Aggregate totalAgg = response.aggregations().get("total");
-            long total = totalAgg.cardinality().value();
+            long total = totalAgg.statsBucket().count();
             records.setTotal(total);
             records.setCurrent(current);
             records.setSize(size);

+ 7 - 0
src/main/java/cn/cslg/pas/service/common/PersonFieldService.java

@@ -300,6 +300,11 @@ public class PersonFieldService {
         if (PatentDictionary.NAME.equals(tableName)) {
             //获得所有自定义字段
             List<AllCustomFieldVO> allCustomFieldVOS = customFieldService.getAllProjectCustomField(projectId);
+            AllCustomFieldVO allCustomFieldVO =new AllCustomFieldVO();
+            allCustomFieldVO.setName("标签");
+            allCustomFieldVO.setId(0);
+            allCustomFieldVO.setType(10);
+            allCustomFieldVOS.add(allCustomFieldVO);
             if (allCustomFieldVOS.size() != 0) {
                 for (AllCustomFieldVO item : allCustomFieldVOS) {
                     PersonSelfFieldVO personSelfFieldVO = new PersonSelfFieldVO();
@@ -307,10 +312,12 @@ public class PersonFieldService {
                     personSelfFieldVO.setName(item.getName());
                     personSelfFieldVO.setType(item.getType().toString());
                     personSelfFieldVO.setValue(item.getId().toString());
+                    personSelfFieldVO.setIfPersonal(true);
                     personSelfFieldVO.setDefaultHidden(true);
                     fieldVOS.add(personSelfFieldVO);
                 }
             }
+
         }
         //装载顺序
         Integer order = 0;

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

@@ -118,6 +118,19 @@
     "ifStats": "false"
   },
   {
+    "name": "商品化专利id",
+    "type": "String",
+    "value": "productId",
+    "field": "productId",
+    "esField": "product_id",
+    "esClass": "productQueryBuilder",
+    "ifSearch": "false",
+    "ifGroup": "false",
+    "ifShow": "false",
+    "ifAsCondition": "true",
+    "ifStats": "false"
+  },
+  {
     "name": "摘要",
     "type": "Object",
     "value": "abstractStr",