EsCustomFieldService.java 44 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004
  1. package cn.cslg.pas.service.business.es;
  2. import cn.cslg.pas.common.dto.PatentColumnDTO;
  3. import cn.cslg.pas.common.dto.es.*;
  4. import cn.cslg.pas.common.utils.FormatUtil;
  5. import cn.cslg.pas.common.vo.FieldValueVO;
  6. import cn.cslg.pas.common.vo.PatentWithIdVO;
  7. import cn.cslg.pas.common.vo.es.*;
  8. import cn.cslg.pas.common.vo.exportProject.CustomFiledRecord;
  9. import cn.cslg.pas.domain.business.CustomField;
  10. import cn.cslg.pas.domain.business.CustomOption;
  11. import cn.cslg.pas.domain.business.TreeNode;
  12. import cn.cslg.pas.domain.es.*;
  13. import cn.cslg.pas.exception.ExceptionEnum;
  14. import cn.cslg.pas.exception.XiaoShiException;
  15. import cn.cslg.pas.service.business.CustomOptionService;
  16. import cn.cslg.pas.service.business.TreeNodeService;
  17. import cn.cslg.pas.service.query.FormatQueryService;
  18. import co.elastic.clients.elasticsearch.ElasticsearchClient;
  19. import co.elastic.clients.elasticsearch._types.ElasticsearchException;
  20. import co.elastic.clients.elasticsearch._types.SortOrder;
  21. import co.elastic.clients.elasticsearch._types.aggregations.*;
  22. import co.elastic.clients.elasticsearch._types.query_dsl.Query;
  23. import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders;
  24. import co.elastic.clients.elasticsearch.core.IndexResponse;
  25. import co.elastic.clients.elasticsearch.core.SearchRequest;
  26. import co.elastic.clients.elasticsearch.core.SearchResponse;
  27. import co.elastic.clients.elasticsearch.core.search.FieldCollapse;
  28. import co.elastic.clients.elasticsearch.core.search.Hit;
  29. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  30. import lombok.RequiredArgsConstructor;
  31. import org.apache.commons.lang3.StringUtils;
  32. import org.springframework.beans.BeanUtils;
  33. import org.springframework.beans.factory.annotation.Autowired;
  34. import org.springframework.context.annotation.Lazy;
  35. import org.springframework.stereotype.Service;
  36. import org.springframework.util.CollectionUtils;
  37. import java.io.IOException;
  38. import java.util.*;
  39. import java.util.stream.Collectors;
  40. @Service
  41. @RequiredArgsConstructor(onConstructor_ = {@Lazy})
  42. public class EsCustomFieldService {
  43. private final ElasticsearchClient client;
  44. private final EsService esService;
  45. private final TreeNodeService treeNodeService;
  46. private final CustomOptionService customOptionService;
  47. @Autowired
  48. private FormatQueryService formatQueryService;
  49. //添加自定义栏位值
  50. public String addCustomField(EsCustomFieldDTO esCustomFieldDTO) throws Exception {
  51. ESCustomField esCustomField = new ESCustomField();
  52. String id = "";
  53. //判断类型
  54. Integer fieldType = esCustomFieldDTO.getFieldType();
  55. Integer taskId = esCustomFieldDTO.getTaskId();
  56. Integer optionType = esCustomFieldDTO.getOptionType();
  57. String patentNo = esCustomFieldDTO.getPatentNo();
  58. String fieldId = esCustomFieldDTO.getFieldId();
  59. String patentId = esCustomFieldDTO.getPatentId();
  60. List<String> addValues = esCustomFieldDTO.getFieldValue();
  61. Integer projectId = esCustomFieldDTO.getProjectId();
  62. Date createDate = new Date();
  63. if (optionType.equals(1) && (addValues == null || addValues.size() == 0)) {
  64. throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "请填写值");
  65. }
  66. //根据专利号查询 是否专利关联过栏位
  67. PatentWithIdVO patentWithIdVO = this.getEsCustomField(esCustomFieldDTO);
  68. if (patentWithIdVO != null) {
  69. esCustomField = patentWithIdVO.getPatent().getESCustomField();
  70. id = patentWithIdVO.getId();
  71. } else {
  72. //设置栏位
  73. esCustomField.setField(esCustomFieldDTO.getFieldId());
  74. //设置专题库或报告
  75. esCustomField.setProjectId(esCustomFieldDTO.getProjectId());
  76. //设置创建时间
  77. esCustomField.setCreateTime(createDate);
  78. //设置创建人
  79. esCustomField.setPersonId("1");
  80. //设置类型
  81. esCustomField.setFieldType(fieldType);
  82. //设置任务id
  83. esCustomField.setTaskId(taskId);
  84. }
  85. List<String> values = esCustomField.getFieldValue();
  86. //设置值
  87. switch (fieldType) {
  88. case 0:
  89. ;
  90. case 1:
  91. ;
  92. case 10:
  93. ;
  94. case 2://文本类型
  95. if (optionType.equals(1) || optionType.equals(2)) {
  96. if (addValues != null)
  97. esCustomField.setFieldValue(addValues);
  98. esCustomField.setStatsValue(addValues);
  99. } else if (optionType.equals(0)) {
  100. esCustomField.setFieldValue(new ArrayList<>());
  101. esCustomField.setStatsValue(new ArrayList<>());
  102. }
  103. break;
  104. case 4: //单选
  105. if (optionType.equals(1) || optionType.equals(2)) {
  106. if (addValues != null) {
  107. esCustomField.setFieldValue(addValues);
  108. esCustomField.setStatsValue(addValues);
  109. }
  110. } else if (optionType.equals(0)) {
  111. esCustomField.setFieldValue(new ArrayList<>());
  112. esCustomField.setStatsValue(new ArrayList<>());
  113. }
  114. break;
  115. case 5:
  116. if (optionType.equals(1)) {
  117. List<String> orgValue = esCustomField.getFieldValue();
  118. if (orgValue == null) {
  119. orgValue = new ArrayList<>();
  120. }
  121. for (String item : addValues) {
  122. if (!orgValue.contains(item)) {
  123. orgValue.add(item);
  124. }
  125. }
  126. esCustomField.setFieldValue(orgValue);
  127. esCustomField.setStatsValue(orgValue);
  128. } else if (optionType.equals(2)) {
  129. if (addValues != null) {
  130. esCustomField.setFieldValue(addValues);
  131. esCustomField.setStatsValue(addValues);
  132. } else {
  133. esCustomField.setFieldValue(new ArrayList<>());
  134. esCustomField.setStatsValue(new ArrayList<>());
  135. }
  136. } else if (optionType.equals(0)) {
  137. List<String> orgValue = esCustomField.getFieldValue();
  138. if (orgValue == null) {
  139. orgValue = new ArrayList<>();
  140. }
  141. for (String item : addValues) {
  142. if (orgValue.contains(item)) {
  143. orgValue.remove(item);
  144. }
  145. }
  146. esCustomField.setFieldValue(orgValue);
  147. esCustomField.setStatsValue(orgValue);
  148. }
  149. break;
  150. case 6: //树类型
  151. case 7:
  152. case 8:
  153. case 9:
  154. if (optionType.equals(1)) {
  155. //根据值获得树节点
  156. List<String> reValues = FormatUtil.getDistinctList(addValues, values);
  157. esCustomField.setFieldValue(reValues);
  158. //根据 reValues获得 reStateValues
  159. List<Integer> fieldIds = FormatUtil.StringTOIntegerList(reValues);
  160. //根据树节点id查询树节点
  161. LambdaQueryWrapper<TreeNode> queryWrapper = new LambdaQueryWrapper<>();
  162. queryWrapper.in(TreeNode::getId, fieldIds);
  163. List<TreeNode> treeNodes = treeNodeService.list(queryWrapper);
  164. //遍历节点
  165. List<String> reStateValues = new ArrayList<>(reValues);
  166. treeNodes.forEach(item -> {
  167. String path = item.getPath();
  168. if (path != null && path.trim() != "") {
  169. List<String> a = Arrays.asList(path.split("/"));
  170. reStateValues.addAll(a);
  171. }
  172. });
  173. List<String> disReStateValues = new ArrayList<>(new HashSet<>(reStateValues));
  174. esCustomField.setStatsValue(disReStateValues);
  175. } else if (optionType.equals(0)) {
  176. if (values != null && values.size() > 0 && addValues != null && addValues.size() > 0) {
  177. values.removeAll(addValues);
  178. esCustomField.setFieldValue(values);
  179. if (values.size() > 0) {
  180. //根据 reValues获得 reStateValues
  181. List<Integer> fieldIds = FormatUtil.StringTOIntegerList(values);
  182. //根据树节点id查询树节点
  183. LambdaQueryWrapper<TreeNode> queryWrapper = new LambdaQueryWrapper<>();
  184. queryWrapper.eq(TreeNode::getId, fieldIds);
  185. List<TreeNode> treeNodes = treeNodeService.list(queryWrapper);
  186. //遍历节点
  187. List<String> reStateValues = new ArrayList<>(values);
  188. treeNodes.forEach(item -> {
  189. String path = item.getPath();
  190. if (path != null && path.trim() != "") {
  191. List<String> a = Arrays.asList(path.split("/"));
  192. reStateValues.addAll(a);
  193. }
  194. });
  195. List<String> disReStateValues = new ArrayList<>(new HashSet<>(reStateValues));
  196. esCustomField.setStatsValue(disReStateValues);
  197. }
  198. }
  199. } else if (optionType.equals(2)) {
  200. esCustomField.setFieldValue(addValues);
  201. if (addValues == null || addValues.size() == 0) {
  202. esCustomField.setStatsValue(new ArrayList<>());
  203. } else {
  204. //根据 reValues获得 reStateValues
  205. List<Integer> fieldIds = FormatUtil.StringTOIntegerList(addValues);
  206. //根据树节点id查询树节点
  207. LambdaQueryWrapper<TreeNode> queryWrapper = new LambdaQueryWrapper<>();
  208. queryWrapper.in(TreeNode::getId, fieldIds);
  209. List<TreeNode> treeNodes = treeNodeService.list(queryWrapper);
  210. //遍历节点
  211. List<String> reStateValues = new ArrayList<>(addValues);
  212. treeNodes.forEach(item -> {
  213. String path = item.getPath();
  214. if (path != null && path.trim() != "") {
  215. List<String> a = Arrays.asList(path.split("/"));
  216. reStateValues.addAll(a);
  217. }
  218. });
  219. List<String> disReStateValues = new ArrayList<>(new HashSet<>(reStateValues));
  220. esCustomField.setStatsValue(disReStateValues);
  221. }
  222. }
  223. break;
  224. }
  225. if (!id.trim().equals("")&&fieldType!=10) {
  226. Patent patent = patentWithIdVO.getPatent();
  227. patent.setESCustomField(esCustomField);
  228. esService.updateByQuery(patent, patentWithIdVO.getId());
  229. ESCustomFieldHistory esCustomFieldHistory = new ESCustomFieldHistory();
  230. esCustomFieldHistory.setField(fieldId);
  231. esCustomFieldHistory.setFieldType(fieldType);
  232. esCustomFieldHistory.setCreateTime(createDate);
  233. esCustomFieldHistory.setFieldValue(addValues);
  234. esCustomFieldHistory.setSavedValue(esCustomField.getFieldValue());
  235. esCustomFieldHistory.setHistoryType(optionType);
  236. esCustomFieldHistory.setTaskId(taskId);
  237. esCustomFieldHistory.setPersonId("1");
  238. esCustomFieldHistory.setProjectId(projectId);
  239. esCustomFieldHistory.setCustomFieldId(id);
  240. this.addCustomFieldHistory(esCustomFieldHistory);
  241. } else {
  242. esCustomField.setIfNew(1);
  243. this.addEsCustomFieldToEs(esCustomField, patentNo, patentId);
  244. }
  245. return id;
  246. }
  247. /**
  248. * 批量添加自定义栏位值
  249. *
  250. * @param vo
  251. * @return
  252. * @throws Exception
  253. */
  254. public List<String> batchAddCustomField(EsCustomFieldBatchVO vo) throws Exception {
  255. Integer startNum = vo.getStartNumber();
  256. Integer endNum = vo.getEndNumber();
  257. List<String> isAdd = vo.getIsAdd();
  258. List<String> isDel = vo.getIsDelete();
  259. List<String> ids = new ArrayList<>();
  260. List<EsCustomFieldDTO> fieldDTOS = vo.getEsCustomFieldDTOS();
  261. if (!CollectionUtils.isEmpty(isAdd) && startNum <= 1 && endNum < 1) {
  262. isAdd.removeAll(isDel);
  263. for (String patentNo : isAdd) {
  264. for (EsCustomFieldDTO fieldDTO : fieldDTOS) {
  265. fieldDTO.setPatentNo(patentNo);
  266. String field = this.addCustomField(fieldDTO);
  267. ids.add(field);
  268. }
  269. }
  270. } else if (startNum >= 1 && endNum > 0) {
  271. List<String> patentNos = this.getPatentNos(vo);
  272. for (String patentNo : patentNos) {
  273. for (EsCustomFieldDTO fieldDTO : fieldDTOS) {
  274. fieldDTO.setPatentNo(patentNo);
  275. String field = this.addCustomField(fieldDTO);
  276. ids.add(field);
  277. }
  278. }
  279. }
  280. return ids;
  281. }
  282. /**
  283. * 获取专利号列表
  284. *
  285. * @param vo
  286. * @return
  287. * @throws Exception
  288. */
  289. public List<String> getPatentNos(EsCustomFieldBatchVO vo) throws Exception {
  290. Integer taskId = vo.getTaskId();
  291. Integer projectId = vo.getProjectId();
  292. Integer startNum = vo.getStartNumber();
  293. Integer endNum = vo.getEndNumber();
  294. int number = endNum - startNum + 1;
  295. String groupField = vo.getGroupField();
  296. List<String> isAdd = new ArrayList<>();
  297. if (!CollectionUtils.isEmpty(vo.getIsAdd())) {
  298. isAdd = vo.getIsAdd();
  299. }
  300. List<String> isDel = new ArrayList<>();
  301. if (!CollectionUtils.isEmpty(vo.getIsDelete())) {
  302. isDel = vo.getIsDelete();
  303. }
  304. //判断同族分组
  305. String esField = "";
  306. if (StringUtils.isNotEmpty(groupField) && !groupField.equals("0")) {
  307. esField = esService.getGroupField(groupField);
  308. }
  309. EsPatentCommonVO commonVO = new EsPatentCommonVO();
  310. commonVO.setTaskId(taskId);
  311. commonVO.setProjectId(projectId);
  312. commonVO.setSearchCondition(vo.getSearchQuery());
  313. commonVO.setCurrent(startNum.longValue());
  314. commonVO.setSize(Integer.valueOf(number).longValue());
  315. commonVO.setEsField(esField);
  316. commonVO.setCustomFields(vo.getCustomFields());
  317. commonVO.setOrderDTOList(vo.getOrderDTOList());
  318. SearchRequest.Builder builder = esService.getCommonPatentByGroup(commonVO);
  319. if (startNum > 0 && number > 0) {
  320. builder.from(startNum - 1).size(number);
  321. }
  322. SearchResponse<Patent> response = null;
  323. try {
  324. response = client.search(builder.build(), Patent.class);
  325. } catch (Exception e) {
  326. throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "ES检索失败");
  327. }
  328. List<String> patentNos = new ArrayList<>();
  329. List<Hit<Patent>> hits = response.hits().hits();
  330. for (Hit<Patent> hit : hits) {
  331. Patent patent = hit.source();
  332. patentNos.add(patent.getPatentNo());
  333. }
  334. patentNos.addAll(isAdd);
  335. patentNos.removeAll(isDel);
  336. return patentNos.stream().collect(Collectors.toList());
  337. }
  338. //添加操作历史
  339. public String addCustomFieldHistory(ESCustomFieldHistory customFieldHistory) throws Exception {
  340. IndexResponse indexResponse = client.index(i -> i
  341. .index("custom_field_history")
  342. .document(customFieldHistory)
  343. );
  344. return indexResponse.id();
  345. }
  346. //查询自定义字段
  347. public PatentWithIdVO getEsCustomField(EsCustomFieldDTO esCustomFieldDTO) throws Exception {
  348. PatentWithIdVO patentWithIdVO = new PatentWithIdVO();
  349. Integer projectId = esCustomFieldDTO.getProjectId();
  350. Integer taskId = esCustomFieldDTO.getTaskId();
  351. SearchRequest.Builder builder = new SearchRequest.Builder();
  352. String patentNo = esCustomFieldDTO.getPatentNo();
  353. //设置查询索引
  354. builder.index("patent");
  355. //栏位
  356. Query q1 = QueryBuilders.term(t -> t.field("custom_field.project_id").value(projectId));
  357. Query q2 = QueryBuilders.term((t -> t.field("custom_field.field").value(esCustomFieldDTO.getFieldId())));
  358. Query q4 = QueryBuilders.term(t -> t.field("custom_field.field_type").value(esCustomFieldDTO.getFieldType()));
  359. Query parentQ1 = QueryBuilders.term(t -> t.field("patent_no.keyword").value(patentNo));
  360. // Query parentQ1 = QueryBuilders.term(t -> t.field("app_no.keyword").value(patentNo));
  361. //公开号
  362. // Query parentQ2 = QueryBuilders.term(t -> t.field("public_no.keyword").value(patentNo));
  363. //授权号
  364. // Query parentQ3 = QueryBuilders.term(t -> t.field("grant_no.keyword").value(patentNo));
  365. // Query parentQ = QueryBuilders.bool(i -> i.should(parentQ1, parentQ2, parentQ3));
  366. Query parentQ = QueryBuilders.bool(i -> i.should(parentQ1));
  367. Query q3 = QueryBuilders.hasParent(t -> t.parentType("patent").query(parentQ));
  368. Query bool = null;
  369. if (taskId == null) {
  370. bool = QueryBuilders.bool(i -> i.must(q1, q2, q3, q4));
  371. } else {
  372. Query q5 = QueryBuilders.term((t -> t.field("custom_field.task_id").value(taskId)));
  373. bool = QueryBuilders.bool(i -> i.must(q1, q2, q3, q4, q5));
  374. }
  375. builder.query(bool);
  376. builder.sort(sortOptionsBuilder -> sortOptionsBuilder
  377. .field(fieldSortBuilder -> fieldSortBuilder
  378. .field("custom_field.create_time").order(SortOrder.Desc)));
  379. SearchResponse<Patent> response = null;
  380. try {
  381. response = client.search(builder.build(), Patent.class);
  382. } catch (Exception e) {
  383. throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "ES检索失败");
  384. }
  385. long total = response.hits().total().value();
  386. if (total > 0) {
  387. List<Hit<Patent>> hits = response.hits().hits();
  388. Hit<Patent> hit = hits.get(0);
  389. Patent patent = hit.source();
  390. patentWithIdVO.setPatent(patent);
  391. patentWithIdVO.setId(hit.id());
  392. } else {
  393. patentWithIdVO = null;
  394. }
  395. return patentWithIdVO;
  396. }
  397. //将自定义字段添加到专利
  398. public String addEsCustomFieldToEs(ESCustomField esCustomField, String patentNo, String patentId) throws Exception {
  399. //根据专利号查询专利
  400. if (patentId == null) {
  401. PatentWithIdVO patentWithIdVO = esService.getIdByPatentNo(patentNo);
  402. patentId = patentWithIdVO.getId();
  403. }
  404. esService.getIds(patentId, esCustomField.getProjectId(), esCustomField.getTaskId(), esCustomField.getField());
  405. Patent patentChild = new Patent();
  406. PatentJoin patentJoin = new PatentJoin();
  407. patentJoin.setParent(patentId);
  408. patentJoin.setName("project_customfield");
  409. patentChild.setPatentJoin(patentJoin);
  410. patentChild.setESCustomField(esCustomField);
  411. String id = esService.addChildPatent(patentChild, patentId);
  412. return id;
  413. }
  414. public String getEsCustomFieldId(FieldHistoryDTO fieldHistoryDTO) throws Exception {
  415. String id = "";
  416. List<QueryESCustomFieldVO> vos = new ArrayList<>();
  417. String fieldId = fieldHistoryDTO.getFieldId();
  418. Integer fieldType = fieldHistoryDTO.getFieldType();
  419. String patentNo = fieldHistoryDTO.getPatentNo();
  420. Query q1 = QueryBuilders.term(t -> t.field("app_no.keyword").value(patentNo));
  421. Query parentQ1 = QueryBuilders.term(t -> t.field("app_no.keyword").value(patentNo));
  422. //公开号
  423. Query parentQ2 = QueryBuilders.term(t -> t.field("public_no.keyword").value(patentNo));
  424. //授权号
  425. Query parentQ3 = QueryBuilders.term(t -> t.field("grant_no.keyword").value(patentNo));
  426. Query parentQ = QueryBuilders.bool(i -> i.should(parentQ1, parentQ2, parentQ3));
  427. Query q3 = QueryBuilders.hasParent(t -> t.parentType("patent").query(parentQ));
  428. Query q2 = QueryBuilders.term((t -> t.field("custom_field.field").value(fieldId)));
  429. Query q4 = QueryBuilders.term(t -> t.field("custom_field.field_type").value(fieldType));
  430. Query bool = QueryBuilders.bool(i -> i.must(q1, q2, q3, q4));
  431. SearchRequest.Builder builder = new SearchRequest.Builder();
  432. builder.query(bool);
  433. SearchResponse<Patent> response = null;
  434. try {
  435. response = client.search(builder.build(), Patent.class);
  436. } catch (Exception e) {
  437. throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "ES检索失败");
  438. }
  439. long total = response.hits().total().value();
  440. if (total > 0) {
  441. id = response.hits().hits().get(0).id();
  442. }
  443. return id;
  444. }
  445. /**
  446. * 查询历史
  447. */
  448. public List<FieldHistoryVO> getCustomFieldHistory(FieldHistoryDTO fieldHistoryDTO) throws Exception {
  449. List<FieldHistoryVO> fieldHistoryVOS = new ArrayList<>();
  450. String customId = this.getEsCustomFieldId(fieldHistoryDTO);
  451. Query q1 = QueryBuilders.term(t -> t.field("custom_field_id").value(customId));
  452. SearchRequest.Builder builder = new SearchRequest.Builder();
  453. builder.query(q1);
  454. builder.sort(sortOptionsBuilder -> sortOptionsBuilder
  455. .field(fieldSortBuilder -> fieldSortBuilder
  456. .field("create_time").order(SortOrder.Desc)));
  457. SearchResponse<ESCustomFieldHistory> response = client.search(builder.build(), ESCustomFieldHistory.class);
  458. long total = response.hits().total().value();
  459. if (total > 0) {
  460. List<Hit<ESCustomFieldHistory>> hits = response.hits().hits();
  461. hits.forEach(item -> {
  462. FieldHistoryVO fieldHistoryVO = new FieldHistoryVO();
  463. BeanUtils.copyProperties(item.source(), fieldHistoryVO);
  464. fieldHistoryVOS.add(fieldHistoryVO);
  465. });
  466. }
  467. return fieldHistoryVOS;
  468. }
  469. /**
  470. * 回退
  471. */
  472. public void backTo(String historyId) throws Exception {
  473. Hit<ESCustomFieldHistory> hit = this.getEsCustomFieldHistoryById(historyId);
  474. ESCustomFieldHistory esCustomFieldHistory = hit.source();
  475. List<String> values = esCustomFieldHistory.getSavedValue();
  476. String customFieldId = esCustomFieldHistory.getCustomFieldId();
  477. //根据id查询customField
  478. Patent patent = new Patent();
  479. String id = "";
  480. SearchRequest.Builder builder = new SearchRequest.Builder();
  481. builder.index("patent");
  482. Query q = QueryBuilders.ids(i -> i.values(Arrays.asList(customFieldId)));
  483. builder.query(q);
  484. SearchResponse<Patent> response = null;
  485. try {
  486. response = client.search(builder.build(), Patent.class);
  487. } catch (Exception e) {
  488. throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "ES检索失败");
  489. }
  490. long total = response.hits().total().value();
  491. if (total > 0) {
  492. patent = response.hits().hits().get(0).source();
  493. id = response.hits().hits().get(0).id();
  494. }
  495. if (values == null || values.size() <= 0) {
  496. patent.getESCustomField().setFieldValue(null);
  497. patent.getESCustomField().setStatsValue(null);
  498. } else {
  499. List<Integer> fieldIds = FormatUtil.StringTOIntegerList(values);
  500. //根据树节点id查询树节点
  501. LambdaQueryWrapper<TreeNode> queryWrapper = new LambdaQueryWrapper<>();
  502. queryWrapper.eq(TreeNode::getId, fieldIds);
  503. List<TreeNode> treeNodes = treeNodeService.list(queryWrapper);
  504. //遍历节点
  505. List<String> reStateValues = new ArrayList<>(values);
  506. treeNodes.forEach(item -> {
  507. String path = item.getPath();
  508. if (path != null && path.trim() != "") {
  509. List<String> a = Arrays.asList(path.split("/"));
  510. reStateValues.addAll(a);
  511. }
  512. });
  513. List<String> disReStateValues = new ArrayList<>(new HashSet<>(reStateValues));
  514. patent.getESCustomField().setStatsValue(disReStateValues);
  515. patent.getESCustomField().setFieldValue(values);
  516. }
  517. //更新自定义栏位
  518. esService.updatePatent(patent, id);
  519. //新增历史
  520. ESCustomFieldHistory newEsCustomFieldHistory = new ESCustomFieldHistory();
  521. newEsCustomFieldHistory.setField(patent.getESCustomField().getField());
  522. newEsCustomFieldHistory.setFieldType(patent.getESCustomField().getFieldType());
  523. newEsCustomFieldHistory.setCreateTime(new Date());
  524. newEsCustomFieldHistory.setFieldValue(patent.getESCustomField().getFieldValue());
  525. newEsCustomFieldHistory.setHistoryType(3);
  526. newEsCustomFieldHistory.setTaskId(patent.getESCustomField().getTaskId());
  527. newEsCustomFieldHistory.setPersonId("1");
  528. newEsCustomFieldHistory.setProjectId(patent.getESCustomField().getProjectId());
  529. newEsCustomFieldHistory.setCustomFieldId(id);
  530. this.addCustomFieldHistory(esCustomFieldHistory);
  531. }
  532. //查询栏位历史
  533. public Hit<ESCustomFieldHistory> getEsCustomFieldHistoryById(String historyId) throws Exception {
  534. Hit<ESCustomFieldHistory> esCustomFieldHistoryHit = null;
  535. SearchRequest.Builder builder = new SearchRequest.Builder();
  536. builder.index("custom_field_history");
  537. Query q = QueryBuilders.ids(i -> i.values(Arrays.asList(historyId)));
  538. builder.query(q);
  539. SearchResponse<ESCustomFieldHistory> response = client.search(builder.build(), ESCustomFieldHistory.class);
  540. long total = response.hits().total().value();
  541. if (total > 0) {
  542. esCustomFieldHistoryHit = response.hits().hits().get(0);
  543. }
  544. return esCustomFieldHistoryHit;
  545. }
  546. public PatentWithIdVO getPatentLabel(AddPatentLabelDTO addPatentLabelDTO) throws Exception {
  547. PatentWithIdVO patentWithIdVO = new PatentWithIdVO();
  548. Integer projectId = addPatentLabelDTO.getProjectId();
  549. SearchRequest.Builder builder = new SearchRequest.Builder();
  550. String patentNo = addPatentLabelDTO.getPatentNo();
  551. //设置查询索引
  552. builder.index("patent");
  553. //栏位
  554. Query q1 = QueryBuilders.term(t -> t.field("custom_field.project_id").value(projectId));
  555. Query q4 = QueryBuilders.term(t -> t.field("custom_field.field_type").value(10));
  556. Query parentQ1 = QueryBuilders.term(t -> t.field("app_no.keyword").value(patentNo));
  557. //公开号
  558. Query parentQ2 = QueryBuilders.term(t -> t.field("public_no.keyword").value(patentNo));
  559. //授权号
  560. Query parentQ3 = QueryBuilders.term(t -> t.field("grant_no.keyword").value(patentNo));
  561. Query parentQ = QueryBuilders.bool(i -> i.should(parentQ1, parentQ2, parentQ3));
  562. Query q3 = QueryBuilders.hasParent(t -> t.parentType("patent").query(parentQ));
  563. Query bool = null;
  564. bool = QueryBuilders.bool(i -> i.must(q1, q3, q4));
  565. builder.query(bool);
  566. SearchResponse<Patent> response = null;
  567. try {
  568. response = client.search(builder.build(), Patent.class);
  569. } catch (Exception e) {
  570. throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "ES检索失败");
  571. }
  572. long total = response.hits().total().value();
  573. if (total > 0) {
  574. List<Hit<Patent>> hits = response.hits().hits();
  575. Hit<Patent> hit = hits.get(0);
  576. Patent patent = hit.source();
  577. patentWithIdVO.setPatent(patent);
  578. patentWithIdVO.setId(hit.id());
  579. } else {
  580. patentWithIdVO = null;
  581. }
  582. return patentWithIdVO;
  583. }
  584. public List<ESCustomField> getPatentCustomFields(String projectId, String patentId) {
  585. SearchRequest.Builder builder = new SearchRequest.Builder();
  586. //设置查询索引
  587. builder.index("patent");
  588. Query q1 = QueryBuilders.term(t -> t.field("project_id").value(projectId));
  589. Query q2 = QueryBuilders.parentId(parent -> parent.type("patent").id(patentId));
  590. Query bool = QueryBuilders.bool(i -> i.must(q1, q2));
  591. try {
  592. SearchResponse<Patent> response = null;
  593. try {
  594. response = client.search(builder.build(), Patent.class);
  595. } catch (Exception e) {
  596. throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "ES检索失败");
  597. }
  598. List<Hit<Patent>> hits = response.hits().hits();
  599. hits.forEach(item -> {
  600. });
  601. } catch (Exception e) {
  602. }
  603. return null;
  604. }
  605. /**
  606. * 查询自定义栏位和值
  607. *
  608. * @param esQueryPatentFieldsDTO
  609. * @return
  610. * @throws Exception
  611. */
  612. public List<EsPatentFieldsVO> getPatentFields(EsQueryPatentFieldsDTO esQueryPatentFieldsDTO) throws Exception {
  613. List<EsPatentFieldsVO> esPatentFieldsVOS = new ArrayList<>();
  614. Integer projectId = esQueryPatentFieldsDTO.getProjectId();
  615. Integer taskId = esQueryPatentFieldsDTO.getTaskId();
  616. List<String> patentNos = esQueryPatentFieldsDTO.getPatentNos();
  617. List<InnerFields> innerFields = esQueryPatentFieldsDTO.getInnerFields();
  618. if(innerFields.size()==0){
  619. return esPatentFieldsVOS;
  620. }
  621. for (String patentNo : patentNos) {
  622. EsPatentFieldsVO esPatentFieldsVO = new EsPatentFieldsVO();
  623. esPatentFieldsVO.setPatentNo(patentNo);
  624. SearchRequest.Builder builder = new SearchRequest.Builder();
  625. //设置查询索引
  626. builder.index("patent");
  627. builder.sort(sortOptionsBuilder -> sortOptionsBuilder
  628. .field(fieldSortBuilder -> fieldSortBuilder
  629. .field("custom_field.create_time").order(SortOrder.Desc)));
  630. Query queries = this.getQueries(patentNo, innerFields, projectId, taskId);
  631. builder.size(999);
  632. builder.query(queries);
  633. SearchResponse<Patent> response = null;
  634. try {
  635. response = client.search(builder.build(), Patent.class);
  636. } catch (Exception e) {
  637. throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "ES检索失败");
  638. }
  639. long total = response.hits().total().value();
  640. List<ESCustomField> esCustomFields = new ArrayList<>();
  641. List<InnerPatentFieldsVO> innerPatentFieldsVOS = new ArrayList<>();
  642. if (total > 0) {
  643. List<Hit<Patent>> hits = response.hits().hits();
  644. for (Hit<Patent> hit : hits) {
  645. Patent patent = hit.source();
  646. if (patent.getESCustomField() != null) {
  647. ESCustomField esCustomField = patent.getESCustomField();
  648. ESCustomField esCustomField1 = esCustomFields.stream()
  649. .filter(item -> item.getField().equals(esCustomField.getField()) && item.getFieldType().equals(esCustomField.getFieldType()))
  650. .findFirst().orElse(null);
  651. if (esCustomField1 == null) {
  652. esCustomFields.add(esCustomField);
  653. InnerPatentFieldsVO innerPatentFieldsVO = new InnerPatentFieldsVO();
  654. innerPatentFieldsVO.setField(esCustomField.getField());
  655. innerPatentFieldsVO.setFieldType(esCustomField.getFieldType());
  656. List<FieldValueVO> fieldValueVOS = this.getCustomFieldValues(esCustomField.getFieldType(), esCustomField.getFieldValue());
  657. innerPatentFieldsVO.setFieldValueVOS(fieldValueVOS);
  658. innerPatentFieldsVOS.add(innerPatentFieldsVO);
  659. }
  660. }
  661. }
  662. }
  663. esPatentFieldsVO.setInnerClassFields(innerPatentFieldsVOS);
  664. esPatentFieldsVOS.add(esPatentFieldsVO);
  665. }
  666. return esPatentFieldsVOS;
  667. }
  668. private Query getQueries(String patentNo, List<InnerFields> innerFields, Integer projectId, Integer taskId) {
  669. Query parentQ1 = QueryBuilders.term(t -> t.field("app_no.keyword").value(patentNo));
  670. //公开号
  671. Query parentQ2 = QueryBuilders.term(t -> t.field("public_no.keyword").value(patentNo));
  672. //授权号
  673. Query parentQ3 = QueryBuilders.term(t -> t.field("grant_no.keyword").value(patentNo));
  674. Query parentQ = QueryBuilders.bool(i -> i.should(parentQ1, parentQ2, parentQ3));
  675. Query patentQ1 = QueryBuilders.hasParent(t -> t.parentType("patent").query(parentQ));
  676. List<Query> queries = new ArrayList<>();
  677. for (InnerFields innerField : innerFields) {
  678. String filedId = innerField.getFieldId();
  679. Integer fieldType = innerField.getFieldType();
  680. Query q1 = QueryBuilders.term(t -> t.field("custom_field.project_id").value(projectId));
  681. Query q2 = QueryBuilders.term((t -> t.field("custom_field.field").value(filedId)));
  682. Query q3 = QueryBuilders.term(t -> t.field("custom_field.field_type").value(fieldType));
  683. Query q5 = QueryBuilders.term(t -> t.field("custom_field.if_new").value(1));
  684. Query fQ = null;
  685. if (taskId != null) {
  686. Query q4 = QueryBuilders.term(t -> t.field("custom_field.task_id").value(taskId));
  687. fQ = QueryBuilders.bool(i -> i.must(q1, q2, q3, q4, q5));
  688. } else {
  689. fQ = QueryBuilders.bool(i -> i.must(q1, q2, q3, q5));
  690. }
  691. queries.add(fQ);
  692. }
  693. Query query = QueryBuilders.bool(i -> i.should(queries));
  694. Query query1 = QueryBuilders.bool(i -> i.must(query, patentQ1));
  695. return query1;
  696. }
  697. /**
  698. * 获得自定义字段的值
  699. *
  700. * @param type
  701. * @param value
  702. * @return
  703. */
  704. public List<FieldValueVO> getCustomFieldValues(Integer type, List<String> value) {
  705. List<FieldValueVO> fieldValueVOS = new ArrayList<>();
  706. switch (type) {
  707. case 0:
  708. case 1:
  709. case 2:
  710. case 10:
  711. value.forEach(item -> {
  712. FieldValueVO fieldValueVO = new FieldValueVO();
  713. fieldValueVO.setValue(item);
  714. fieldValueVOS.add(fieldValueVO);
  715. });
  716. break;
  717. case 3:
  718. case 4:
  719. case 5:
  720. if (value != null && value.size() > 0) {
  721. List<Integer> ids = FormatUtil.StringTOIntegerList(value);
  722. LambdaQueryWrapper<CustomOption> queryWrapper = new LambdaQueryWrapper<>();
  723. queryWrapper.in(CustomOption::getId, ids);
  724. List<CustomOption> customOptions = customOptionService.list(queryWrapper);
  725. customOptions.forEach(item -> {
  726. FieldValueVO fieldValueVO = new FieldValueVO();
  727. fieldValueVO.setValueId(item.getId());
  728. fieldValueVO.setValue(item.getName());
  729. fieldValueVOS.add(fieldValueVO);
  730. });
  731. }
  732. break;
  733. case 6:
  734. case 7:
  735. case 8:
  736. case 9:
  737. if (value != null && value.size() > 0) {
  738. List<Integer> ids = FormatUtil.StringTOIntegerList(value);
  739. LambdaQueryWrapper<TreeNode> queryWrapper = new LambdaQueryWrapper<>();
  740. queryWrapper.in(TreeNode::getId, ids);
  741. List<TreeNode> treeNodes = treeNodeService.list(queryWrapper);
  742. treeNodes.forEach(item -> {
  743. FieldValueVO fieldValueVO = new FieldValueVO();
  744. fieldValueVO.setValueId(item.getId());
  745. List<String> idStrs = new ArrayList<>();
  746. List<String> pathNames = new ArrayList<>();
  747. if (item.getPath() != null && !item.getPath().equals("")) {
  748. idStrs = Arrays.asList(item.getPath().split("/"));
  749. pathNames = treeNodeService.getBaseMapper().getTreeFieldPath(idStrs);
  750. }
  751. pathNames.add(item.getName());
  752. String pathValue = StringUtils.join(pathNames, "\\");
  753. fieldValueVO.setValue(pathValue);
  754. fieldValueVO.setPath(item.getPath());
  755. fieldValueVOS.add(fieldValueVO);
  756. });
  757. }
  758. break;
  759. }
  760. return fieldValueVOS;
  761. }
  762. public CustomFiledRecord getEsCustomFields(String filedId, Integer type, Integer projectId, Long current, Long size) {
  763. CustomFiledRecord customFiledRecord = new CustomFiledRecord();
  764. Query q1 = QueryBuilders.term(t -> t.field("custom_field.project_id").value(projectId));
  765. Query q2 = QueryBuilders.term((t -> t.field("custom_field.field").value(filedId)));
  766. Query q3 = QueryBuilders.term(t -> t.field("custom_field.field_type").value(type));
  767. Query fQ = QueryBuilders.bool(i -> i.must(q1, q2, q3));
  768. SearchRequest.Builder builder = new SearchRequest.Builder();
  769. builder.query(fQ);
  770. builder.sort(sortOptionsBuilder -> sortOptionsBuilder
  771. .field(fieldSortBuilder -> fieldSortBuilder
  772. .field("custom_field.create_time").order(SortOrder.Desc)));
  773. if (current != null && size != null && current > 0 && size > 0) {
  774. builder.from((current.intValue() - 1) * size.intValue()).size(size.intValue());
  775. } else {
  776. builder.from(0).size(10000);
  777. }
  778. try {
  779. SearchResponse<Patent> response = null;
  780. try {
  781. response = client.search(builder.build(), Patent.class);
  782. } catch (Exception e) {
  783. throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "ES检索失败");
  784. }
  785. long total = response.hits().total().value();
  786. customFiledRecord.setTotal(total);
  787. if (total > 0) {
  788. List<Hit<Patent>> hits = response.hits().hits();
  789. for (Hit<Patent> hit : hits) {
  790. customFiledRecord.getPatents().add(hit.source());
  791. }
  792. }
  793. } catch (Exception e) {
  794. }
  795. return customFiledRecord;
  796. }
  797. public List<PatentWithIdVO> getEsCustomFields(String filedId, Integer type, Integer projectId) {
  798. List<PatentWithIdVO> patentWithIdVOS = new ArrayList<>();
  799. Query q1 = QueryBuilders.term(t -> t.field("custom_field.project_id").value(projectId));
  800. Query q2 = QueryBuilders.term((t -> t.field("custom_field.field").value(filedId)));
  801. Query q3 = QueryBuilders.term(t -> t.field("custom_field.field_type").value(type));
  802. Query fQ = QueryBuilders.bool(i -> i.must(q1, q2, q3));
  803. SearchRequest.Builder builder = new SearchRequest.Builder();
  804. builder.size(999);
  805. builder.query(fQ);
  806. builder.sort(sortOptionsBuilder -> sortOptionsBuilder
  807. .field(fieldSortBuilder -> fieldSortBuilder
  808. .field("custom_field.create_time").order(SortOrder.Desc)));
  809. try {
  810. SearchResponse<Patent> response = null;
  811. try {
  812. response = client.search(builder.build(), Patent.class);
  813. } catch (Exception e) {
  814. throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "ES检索失败");
  815. }
  816. long total = response.hits().total().value();
  817. if (total > 0) {
  818. List<Hit<Patent>> hits = response.hits().hits();
  819. for (Hit<Patent> hit : hits) {
  820. PatentWithIdVO patentWithIdVO = new PatentWithIdVO();
  821. patentWithIdVO.setPatent(hit.source());
  822. patentWithIdVO.setId(hit.id());
  823. PatentWithIdVO patentWithIdVO1 = patentWithIdVOS.stream().filter(item -> item.getPatent().getPatentJoin().getParent().equals(hit.source().getPatentJoin().getParent())).findFirst().orElse(null);
  824. if (patentWithIdVO1 == null) {
  825. patentWithIdVOS.add(patentWithIdVO);
  826. }
  827. }
  828. }
  829. } catch (Exception e) {
  830. }
  831. return patentWithIdVOS;
  832. }
  833. //查询自定义字段
  834. public PatentWithIdVO getEsCustomFieldNow(EsCustomFieldDTO esCustomFieldDTO) throws Exception {
  835. PatentWithIdVO patentWithIdVO = new PatentWithIdVO();
  836. Integer projectId = esCustomFieldDTO.getProjectId();
  837. Integer taskId = esCustomFieldDTO.getTaskId();
  838. SearchRequest.Builder builder = new SearchRequest.Builder();
  839. String patentNo = esCustomFieldDTO.getPatentNo();
  840. //设置查询索引
  841. builder.index("patent");
  842. //栏位
  843. Query q1 = QueryBuilders.term(t -> t.field("custom_field.project_id").value(projectId));
  844. Query q2 = QueryBuilders.term((t -> t.field("custom_field.field").value(esCustomFieldDTO.getFieldId())));
  845. Query q4 = QueryBuilders.term(t -> t.field("custom_field.field_type").value(esCustomFieldDTO.getFieldType()));
  846. Query parentQ1 = QueryBuilders.term(t -> t.field("app_no.keyword").value(patentNo));
  847. //公开号
  848. Query parentQ2 = QueryBuilders.term(t -> t.field("public_no.keyword").value(patentNo));
  849. //授权号
  850. Query parentQ3 = QueryBuilders.term(t -> t.field("grant_no.keyword").value(patentNo));
  851. Query parentQ = QueryBuilders.bool(i -> i.should(parentQ1, parentQ2, parentQ3));
  852. Query q3 = QueryBuilders.hasParent(t -> t.parentType("patent").query(parentQ));
  853. Query bool = null;
  854. if (taskId == null) {
  855. bool = QueryBuilders.bool(i -> i.must(q1, q2, q3, q4));
  856. } else {
  857. Query q5 = QueryBuilders.term((t -> t.field("custom_field.task_id").value(taskId)));
  858. bool = QueryBuilders.bool(i -> i.must(q1, q2, q3, q4, q5));
  859. }
  860. builder.query(bool);
  861. builder.sort(sortOptionsBuilder -> sortOptionsBuilder
  862. .field(fieldSortBuilder -> fieldSortBuilder
  863. .field("custom_field.create_time").order(SortOrder.Desc)));
  864. SearchResponse<Patent> response = null;
  865. try {
  866. response = client.search(builder.build(), Patent.class);
  867. } catch (Exception e) {
  868. throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "ES检索失败");
  869. }
  870. long total = response.hits().total().value();
  871. if (total > 0) {
  872. List<Hit<Patent>> hits = response.hits().hits();
  873. Hit<Patent> hit = hits.get(0);
  874. Patent patent = hit.source();
  875. patentWithIdVO.setPatent(patent);
  876. patentWithIdVO.setId(hit.id());
  877. } else {
  878. patentWithIdVO = null;
  879. }
  880. return patentWithIdVO;
  881. }
  882. //查询自定义字段
  883. public PatentWithIdVO updateEsCustomFieldState(EsCustomFieldDTO esCustomFieldDTO) throws Exception {
  884. PatentWithIdVO patentWithIdVO = new PatentWithIdVO();
  885. PatentWithIdVO patent = this.getEsCustomField(esCustomFieldDTO);
  886. return patentWithIdVO;
  887. }
  888. }