EsCustomFieldService.java 41 KB

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