|
@@ -1,10 +1,15 @@
|
|
|
package cn.cslg.pas.service.business.es;
|
|
|
|
|
|
import cn.cslg.pas.common.dto.es.EsCustomFieldDTO;
|
|
|
+import cn.cslg.pas.common.dto.es.EsCustomFieldValueDTO;
|
|
|
import cn.cslg.pas.common.dto.es.FieldHistoryDTO;
|
|
|
import cn.cslg.pas.common.dto.es.QueryEsCustomFieldDTO;
|
|
|
import cn.cslg.pas.common.utils.FormatUtil;
|
|
|
+import cn.cslg.pas.common.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.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.domain.business.CustomField;
|
|
@@ -12,6 +17,7 @@ import cn.cslg.pas.domain.business.TreeNode;
|
|
|
import cn.cslg.pas.domain.es.*;
|
|
|
import cn.cslg.pas.exception.XiaoShiException;
|
|
|
import cn.cslg.pas.service.business.TreeNodeService;
|
|
|
+import cn.cslg.pas.service.query.FormatQueryService;
|
|
|
import co.elastic.clients.elasticsearch.ElasticsearchClient;
|
|
|
import co.elastic.clients.elasticsearch._types.SortOrder;
|
|
|
import co.elastic.clients.elasticsearch._types.aggregations.Aggregation;
|
|
@@ -27,13 +33,18 @@ import co.elastic.clients.json.JsonData;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
import lombok.Value;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
import org.springframework.beans.BeanUtils;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.context.annotation.Lazy;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.util.CollectionUtils;
|
|
|
|
|
|
import java.io.IOException;
|
|
|
import java.lang.reflect.Array;
|
|
|
+import java.text.ParseException;
|
|
|
import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
@Service
|
|
|
@RequiredArgsConstructor(onConstructor_ = {@Lazy})
|
|
@@ -42,6 +53,9 @@ public class EsCustomFieldService {
|
|
|
private final EsService esService;
|
|
|
private final TreeNodeService treeNodeService;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private FormatQueryService formatQueryService;
|
|
|
+
|
|
|
//添加自定义栏位值
|
|
|
public String addCustomField(EsCustomFieldDTO esCustomFieldDTO) throws Exception {
|
|
|
ESCustomField esCustomField = new ESCustomField();
|
|
@@ -253,219 +267,108 @@ public class EsCustomFieldService {
|
|
|
return id;
|
|
|
}
|
|
|
|
|
|
- //批量添加自定义栏位值
|
|
|
- public List<String> batchAddCustomField(List<EsCustomFieldDTO> fieldDTOS) throws Exception {
|
|
|
+ /**
|
|
|
+ * 批量添加自定义栏位值
|
|
|
+ * @param vo
|
|
|
+ * @return
|
|
|
+ * @throws Exception
|
|
|
+ */
|
|
|
+ public List<String> batchAddCustomField(EsCustomFieldBatchVO vo) throws Exception {
|
|
|
+ Integer startNum = vo.getStartNum();
|
|
|
+ Integer endNum = vo.getEndNum();
|
|
|
+ List<String> isAdd = vo.getIsAdd();
|
|
|
+ List<String> isDel = vo.getIsDel();
|
|
|
List<String> ids = new ArrayList<>();
|
|
|
- for (EsCustomFieldDTO esCustomFieldDTO : fieldDTOS) {
|
|
|
- ESCustomField esCustomField = new ESCustomField();
|
|
|
- String id = "";
|
|
|
- //判断类型
|
|
|
- Integer fieldType = esCustomFieldDTO.getFieldType();
|
|
|
- Integer taskId = esCustomFieldDTO.getTaskId();
|
|
|
- Integer optionType = esCustomFieldDTO.getOptionType();
|
|
|
- String patentNo = esCustomFieldDTO.getPatentNo();
|
|
|
- String fieldId = esCustomFieldDTO.getFieldId();
|
|
|
- String patentId = esCustomFieldDTO.getPatentId();
|
|
|
- List<String> addValues = esCustomFieldDTO.getFieldValue();
|
|
|
- Integer projectId = esCustomFieldDTO.getProjectId();
|
|
|
- Date createDate = new Date();
|
|
|
-
|
|
|
- if (optionType.equals(1) && (addValues == null || addValues.size() == 0)) {
|
|
|
- throw new XiaoShiException("请填写值");
|
|
|
+ if (!CollectionUtils.isEmpty(isAdd) && startNum < 1 && endNum < 1) {
|
|
|
+ isAdd.removeAll(isDel);
|
|
|
+ for (String patentNo : isAdd) {
|
|
|
+ EsCustomFieldDTO fieldDTO = new EsCustomFieldDTO();
|
|
|
+ fieldDTO.setFieldId(vo.getFieldId());
|
|
|
+ fieldDTO.setFieldType(vo.getFieldType());
|
|
|
+ fieldDTO.setFieldValue(vo.getFieldValue());
|
|
|
+ fieldDTO.setPatentNo(patentNo);
|
|
|
+ fieldDTO.setOptionType(vo.getOptionType());
|
|
|
+ fieldDTO.setProjectId(vo.getProjectId());
|
|
|
+ fieldDTO.setTaskId(vo.getTaskId());
|
|
|
+ String field = this.addCustomField(fieldDTO);
|
|
|
+ ids.add(field);
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
- //根据专利号查询 是否专利关联过栏位
|
|
|
- PatentWithIdVO patentWithIdVO = this.getEsCustomField(esCustomFieldDTO);
|
|
|
- if (patentWithIdVO != null) {
|
|
|
- esCustomField = patentWithIdVO.getPatent().getESCustomField();
|
|
|
- id = patentWithIdVO.getId();
|
|
|
- } else {
|
|
|
- //设置栏位
|
|
|
- esCustomField.setField(esCustomFieldDTO.getFieldId());
|
|
|
- //设置专题库或报告
|
|
|
- esCustomField.setProjectId(esCustomFieldDTO.getProjectId());
|
|
|
- //设置创建时间
|
|
|
- esCustomField.setCreateTime(createDate);
|
|
|
- //设置创建人
|
|
|
- esCustomField.setPersonId("1");
|
|
|
- //设置类型
|
|
|
- esCustomField.setFieldType(fieldType);
|
|
|
- //设置任务id
|
|
|
- esCustomField.setTaskId(taskId);
|
|
|
+ } else if (startNum > 0 && endNum > 0){
|
|
|
+ List<String> patentNos = this.getPatentNos(vo);
|
|
|
+ for (String patentNo : patentNos) {
|
|
|
+ EsCustomFieldDTO fieldDTO = new EsCustomFieldDTO();
|
|
|
+ fieldDTO.setFieldId(vo.getFieldId());
|
|
|
+ fieldDTO.setFieldType(vo.getFieldType());
|
|
|
+ fieldDTO.setFieldValue(vo.getFieldValue());
|
|
|
+ fieldDTO.setPatentNo(patentNo);
|
|
|
+ fieldDTO.setOptionType(vo.getOptionType());
|
|
|
+ fieldDTO.setProjectId(vo.getProjectId());
|
|
|
+ fieldDTO.setTaskId(vo.getTaskId());
|
|
|
+ String field = this.addCustomField(fieldDTO);
|
|
|
+ ids.add(field);
|
|
|
}
|
|
|
- List<String> values = esCustomField.getFieldValue();
|
|
|
-
|
|
|
- //设置值
|
|
|
- switch (fieldType) {
|
|
|
- case 0:
|
|
|
-
|
|
|
- ;
|
|
|
- case 1:
|
|
|
-
|
|
|
- ;
|
|
|
- case 2: //文本类型
|
|
|
- if (optionType.equals(1) || optionType.equals(2)) {
|
|
|
- if (addValues != null && addValues.size() == 1)
|
|
|
- esCustomField.setFieldValue(addValues);
|
|
|
- esCustomField.setStatsValue(addValues);
|
|
|
- } else if (optionType.equals(0)) {
|
|
|
- esCustomField.setFieldValue(new ArrayList<>());
|
|
|
- esCustomField.setStatsValue(new ArrayList<>());
|
|
|
- }
|
|
|
- break;
|
|
|
- case 4: //单选
|
|
|
- if (optionType.equals(1) || optionType.equals(2)) {
|
|
|
- if (addValues != null && addValues.size() == 1) {
|
|
|
- esCustomField.setFieldValue(addValues);
|
|
|
- esCustomField.setStatsValue(addValues);
|
|
|
- }
|
|
|
- } else if (optionType.equals(0)) {
|
|
|
- esCustomField.setFieldValue(new ArrayList<>());
|
|
|
- esCustomField.setStatsValue(new ArrayList<>());
|
|
|
- }
|
|
|
- break;
|
|
|
- case 5:
|
|
|
- if (optionType.equals(1)) {
|
|
|
- List<String> orgValue = esCustomField.getFieldValue();
|
|
|
-
|
|
|
- if (orgValue == null) {
|
|
|
- orgValue = new ArrayList<>();
|
|
|
- }
|
|
|
-
|
|
|
- for (String item : addValues) {
|
|
|
- if (!orgValue.contains(item)) {
|
|
|
- orgValue.add(item);
|
|
|
- }
|
|
|
- }
|
|
|
- esCustomField.setFieldValue(orgValue);
|
|
|
- esCustomField.setStatsValue(orgValue);
|
|
|
- } else if (optionType.equals(2)) {
|
|
|
- if (addValues != null && addValues.size() > 0) {
|
|
|
- esCustomField.setFieldValue(addValues);
|
|
|
- esCustomField.setStatsValue(addValues);
|
|
|
- } else {
|
|
|
- esCustomField.setFieldValue(new ArrayList<>());
|
|
|
- esCustomField.setStatsValue(new ArrayList<>());
|
|
|
- }
|
|
|
- } else if (optionType.equals(0)) {
|
|
|
- List<String> orgValue = esCustomField.getFieldValue();
|
|
|
-
|
|
|
- if (orgValue == null) {
|
|
|
- orgValue = new ArrayList<>();
|
|
|
- }
|
|
|
-
|
|
|
- for (String item : addValues) {
|
|
|
- if (orgValue.contains(item)) {
|
|
|
- orgValue.remove(item);
|
|
|
- }
|
|
|
- }
|
|
|
- esCustomField.setFieldValue(orgValue);
|
|
|
- esCustomField.setStatsValue(orgValue);
|
|
|
- }
|
|
|
- break;
|
|
|
- case 6: //树类型
|
|
|
-
|
|
|
- case 7:
|
|
|
-
|
|
|
- case 8:
|
|
|
-
|
|
|
- case 9:
|
|
|
- if (optionType.equals(1)) {
|
|
|
- //根据值获得树节点
|
|
|
- List<String> reValues = FormatUtil.getDistinctList(addValues, values);
|
|
|
- esCustomField.setFieldValue(reValues);
|
|
|
- //根据 reValues获得 reStateValues
|
|
|
- List<Integer> fieldIds = FormatUtil.StringTOIntegerList(reValues);
|
|
|
- //根据树节点id查询树节点
|
|
|
- LambdaQueryWrapper<TreeNode> queryWrapper = new LambdaQueryWrapper<>();
|
|
|
- queryWrapper.in(TreeNode::getId, fieldIds);
|
|
|
- List<TreeNode> treeNodes = treeNodeService.list(queryWrapper);
|
|
|
- //遍历节点
|
|
|
- List<String> reStateValues = new ArrayList<>(reValues);
|
|
|
- treeNodes.forEach(item -> {
|
|
|
- String path = item.getPath();
|
|
|
- if (path != null && path.trim() != "") {
|
|
|
- List<String> a = Arrays.asList(path.split("/"));
|
|
|
- reStateValues.addAll(a);
|
|
|
- }
|
|
|
- });
|
|
|
-
|
|
|
- List<String> disReStateValues = new ArrayList<>(new HashSet<>(reStateValues));
|
|
|
- esCustomField.setStatsValue(disReStateValues);
|
|
|
- } else if (optionType.equals(0)) {
|
|
|
- if (values != null && values.size() > 0 && addValues != null && addValues.size() > 0) {
|
|
|
- values.removeAll(addValues);
|
|
|
- esCustomField.setFieldValue(values);
|
|
|
- if (values.size() > 0) {
|
|
|
- //根据 reValues获得 reStateValues
|
|
|
- List<Integer> fieldIds = FormatUtil.StringTOIntegerList(values);
|
|
|
- //根据树节点id查询树节点
|
|
|
- LambdaQueryWrapper<TreeNode> queryWrapper = new LambdaQueryWrapper<>();
|
|
|
- queryWrapper.eq(TreeNode::getId, fieldIds);
|
|
|
- List<TreeNode> treeNodes = treeNodeService.list(queryWrapper);
|
|
|
- //遍历节点
|
|
|
- List<String> reStateValues = new ArrayList<>(values);
|
|
|
- treeNodes.forEach(item -> {
|
|
|
- String path = item.getPath();
|
|
|
- if (path != null && path.trim() != "") {
|
|
|
- List<String> a = Arrays.asList(path.split("/"));
|
|
|
- reStateValues.addAll(a);
|
|
|
- }
|
|
|
- });
|
|
|
- List<String> disReStateValues = new ArrayList<>(new HashSet<>(reStateValues));
|
|
|
- esCustomField.setStatsValue(disReStateValues);
|
|
|
- }
|
|
|
- }
|
|
|
+ }
|
|
|
+ return ids;
|
|
|
+ }
|
|
|
|
|
|
- } else if (optionType.equals(2)) {
|
|
|
- esCustomField.setFieldValue(addValues);
|
|
|
- if (addValues == null || addValues.size() == 0) {
|
|
|
- esCustomField.setStatsValue(new ArrayList<>());
|
|
|
- } else {
|
|
|
- //根据 reValues获得 reStateValues
|
|
|
- List<Integer> fieldIds = FormatUtil.StringTOIntegerList(addValues);
|
|
|
- //根据树节点id查询树节点
|
|
|
- LambdaQueryWrapper<TreeNode> queryWrapper = new LambdaQueryWrapper<>();
|
|
|
- queryWrapper.eq(TreeNode::getId, fieldIds);
|
|
|
- List<TreeNode> treeNodes = treeNodeService.list(queryWrapper);
|
|
|
- //遍历节点
|
|
|
- List<String> reStateValues = new ArrayList<>(addValues);
|
|
|
- treeNodes.forEach(item -> {
|
|
|
- String path = item.getPath();
|
|
|
- if (path != null && path.trim() != "") {
|
|
|
- List<String> a = Arrays.asList(path.split("/"));
|
|
|
- reStateValues.addAll(a);
|
|
|
- }
|
|
|
- });
|
|
|
- List<String> disReStateValues = new ArrayList<>(new HashSet<>(reStateValues));
|
|
|
- esCustomField.setStatsValue(disReStateValues);
|
|
|
- }
|
|
|
- }
|
|
|
- break;
|
|
|
- }
|
|
|
- if (!id.trim().equals("")) {
|
|
|
- Patent patent = patentWithIdVO.getPatent();
|
|
|
- patent.setESCustomField(esCustomField);
|
|
|
- esService.updatePatent(patent, patentWithIdVO.getId());
|
|
|
- ESCustomFieldHistory esCustomFieldHistory = new ESCustomFieldHistory();
|
|
|
- esCustomFieldHistory.setField(fieldId);
|
|
|
- esCustomFieldHistory.setFieldType(fieldType);
|
|
|
- esCustomFieldHistory.setCreateTime(createDate);
|
|
|
- esCustomFieldHistory.setFieldValue(addValues);
|
|
|
- esCustomFieldHistory.setSavedValue(esCustomField.getFieldValue());
|
|
|
- esCustomFieldHistory.setHistoryType(optionType);
|
|
|
- esCustomFieldHistory.setTaskId(taskId);
|
|
|
- esCustomFieldHistory.setPersonId("1");
|
|
|
- esCustomFieldHistory.setProjectId(projectId);
|
|
|
- esCustomFieldHistory.setCustomFieldId(id);
|
|
|
- this.addCustomFieldHistory(esCustomFieldHistory);
|
|
|
+ /**
|
|
|
+ * 获取专利号列表
|
|
|
+ * @param vo
|
|
|
+ * @return
|
|
|
+ * @throws Exception
|
|
|
+ */
|
|
|
+ public List<String> getPatentNos(EsCustomFieldBatchVO vo) throws Exception {
|
|
|
+ Integer taskId = vo.getTaskId();
|
|
|
+ Integer projectId = vo.getProjectId();
|
|
|
+ Integer startNum = vo.getStartNum();
|
|
|
+ Integer endNum = vo.getEndNum();
|
|
|
+ List<String> isAdd = vo.getIsAdd();
|
|
|
+ List<String> isDel = vo.getIsDel();
|
|
|
+ String searchCondition = "";
|
|
|
+ if (StringUtils.isNotEmpty(vo.getSearchQuery())) {
|
|
|
+ searchCondition = vo.getSearchQuery();
|
|
|
+ }
|
|
|
+ List<EsCustomFieldValueDTO> customFields = vo.getCustomFields();
|
|
|
+ if (!CollectionUtils.isEmpty(customFields)) {
|
|
|
+ searchCondition = esService.parseCustomField(customFields);
|
|
|
+ }
|
|
|
+ if (taskId != null) {
|
|
|
+ if (searchCondition != null && !"".equals(searchCondition.trim())) {
|
|
|
+ searchCondition = "taskId = " + taskId + " AND " + searchCondition;
|
|
|
} else {
|
|
|
- this.addEsCustomFieldToEs(esCustomField, patentNo, patentId);
|
|
|
+ searchCondition = "taskId = " + taskId;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if (projectId != null) {
|
|
|
+ if (searchCondition != null && !"".equals(searchCondition.trim())) {
|
|
|
+ searchCondition = "projectId = " + projectId + " AND " + searchCondition;
|
|
|
+ } else {
|
|
|
+ searchCondition = "projectId = " + projectId;
|
|
|
+ }
|
|
|
}
|
|
|
- ids.add(id);
|
|
|
}
|
|
|
- return ids;
|
|
|
+ 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");
|
|
|
+ builder.query(q);
|
|
|
+ if (startNum > 0 && endNum > 0) {
|
|
|
+ builder.from(startNum-1).size(endNum);
|
|
|
+ }
|
|
|
+ SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
|
|
|
+ List<Hit<Patent>> hits = response.hits().hits();
|
|
|
+ List<String> patentNos = new ArrayList<>();
|
|
|
+ for (Hit<Patent> hit : hits) {
|
|
|
+ Patent patent = hit.source();
|
|
|
+ patentNos.add(patent.getPatentNo());
|
|
|
+ }
|
|
|
+ patentNos.addAll(isAdd);
|
|
|
+ patentNos.removeAll(isDel);
|
|
|
+ return patentNos.stream().distinct().collect(Collectors.toList());
|
|
|
}
|
|
|
|
|
|
|