EsCustomFieldService.java 39 KB

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