EsCustomFieldService.java 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894
  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,projectId,taskId);
  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. bool = QueryBuilders.bool(i -> i.must(q1, q2, q3, q4));
  410. } else {
  411. Query q5 = QueryBuilders.term((t -> t.field("custom_field.task_id").value(taskId)));
  412. bool = QueryBuilders.bool(i -> i.must(q1, q2, q3, q4, q5));
  413. }
  414. builder.query(bool);
  415. builder.sort(sortOptionsBuilder -> sortOptionsBuilder
  416. .field(fieldSortBuilder -> fieldSortBuilder
  417. .field("custom_field.create_time").order(SortOrder.Desc)));
  418. SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
  419. long total = response.hits().total().value();
  420. if (total > 0) {
  421. List<Hit<Patent>> hits = response.hits().hits();
  422. Hit<Patent> hit = hits.get(0);
  423. Patent patent = hit.source();
  424. patentWithIdVO.setPatent(patent);
  425. patentWithIdVO.setId(hit.id());
  426. } else {
  427. patentWithIdVO = null;
  428. }
  429. return patentWithIdVO;
  430. }
  431. //将自定义字段添加到专利
  432. public String addEsCustomFieldToEs(ESCustomField esCustomField, String patentNo, String patentId) throws Exception {
  433. //根据专利号查询专利
  434. if (patentId == null) {
  435. PatentWithIdVO patentWithIdVO = esService.getIdByPatentNo(patentNo);
  436. patentId = patentWithIdVO.getId();
  437. }
  438. Patent patentChild = new Patent();
  439. PatentJoin patentJoin = new PatentJoin();
  440. patentJoin.setParent(patentId);
  441. patentJoin.setName("project_customfield");
  442. patentChild.setPatentJoin(patentJoin);
  443. patentChild.setESCustomField(esCustomField);
  444. String id = esService.addChildPatent(patentChild, patentId);
  445. return id;
  446. }
  447. public String getEsCustomFieldId(FieldHistoryDTO fieldHistoryDTO) throws Exception {
  448. String id = "";
  449. List<QueryESCustomFieldVO> vos = new ArrayList<>();
  450. String fieldId = fieldHistoryDTO.getFieldId();
  451. Integer fieldType = fieldHistoryDTO.getFieldType();
  452. String patentNo = fieldHistoryDTO.getPatentNo();
  453. Query q1 = QueryBuilders.term(t -> t.field("app_no.keyword").value(patentNo));
  454. Query parentQ1 = QueryBuilders.term(t -> t.field("app_no.keyword").value(patentNo));
  455. //公开号
  456. Query parentQ2 = QueryBuilders.term(t -> t.field("public_no.keyword").value(patentNo));
  457. //授权号
  458. Query parentQ3 = QueryBuilders.term(t -> t.field("grant_no.keyword").value(patentNo));
  459. Query parentQ = QueryBuilders.bool(i -> i.should(parentQ1, parentQ2, parentQ3));
  460. Query q3 = QueryBuilders.hasParent(t -> t.parentType("patent").query(parentQ));
  461. Query q2 = QueryBuilders.term((t -> t.field("custom_field.field").value(fieldId)));
  462. Query q4 = QueryBuilders.term(t -> t.field("custom_field.field_type").value(fieldType));
  463. Query bool = QueryBuilders.bool(i -> i.must(q1, q2, q3, q4));
  464. SearchRequest.Builder builder = new SearchRequest.Builder();
  465. builder.query(bool);
  466. SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
  467. long total = response.hits().total().value();
  468. if (total > 0) {
  469. id = response.hits().hits().get(0).id();
  470. }
  471. return id;
  472. }
  473. /**
  474. * 查询历史
  475. */
  476. public List<FieldHistoryVO> getCustomFieldHistory(FieldHistoryDTO fieldHistoryDTO) throws Exception {
  477. List<FieldHistoryVO> fieldHistoryVOS = new ArrayList<>();
  478. String customId = this.getEsCustomFieldId(fieldHistoryDTO);
  479. Query q1 = QueryBuilders.term(t -> t.field("custom_field_id").value(customId));
  480. SearchRequest.Builder builder = new SearchRequest.Builder();
  481. builder.query(q1);
  482. builder.sort(sortOptionsBuilder -> sortOptionsBuilder
  483. .field(fieldSortBuilder -> fieldSortBuilder
  484. .field("create_time").order(SortOrder.Desc)));
  485. SearchResponse<ESCustomFieldHistory> response = client.search(builder.build(), ESCustomFieldHistory.class);
  486. long total = response.hits().total().value();
  487. if (total > 0) {
  488. List<Hit<ESCustomFieldHistory>> hits = response.hits().hits();
  489. hits.forEach(item -> {
  490. FieldHistoryVO fieldHistoryVO = new FieldHistoryVO();
  491. BeanUtils.copyProperties(item.source(), fieldHistoryVO);
  492. fieldHistoryVOS.add(fieldHistoryVO);
  493. });
  494. }
  495. return fieldHistoryVOS;
  496. }
  497. /**
  498. * 回退
  499. */
  500. public void backTo(String historyId) throws Exception {
  501. Hit<ESCustomFieldHistory> hit = this.getEsCustomFieldHistoryById(historyId);
  502. ESCustomFieldHistory esCustomFieldHistory = hit.source();
  503. List<String> values = esCustomFieldHistory.getSavedValue();
  504. String customFieldId = esCustomFieldHistory.getCustomFieldId();
  505. //根据id查询customField
  506. Patent patent = new Patent();
  507. String id = "";
  508. SearchRequest.Builder builder = new SearchRequest.Builder();
  509. builder.index("patent");
  510. Query q = QueryBuilders.ids(i -> i.values(Arrays.asList(customFieldId)));
  511. builder.query(q);
  512. SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
  513. long total = response.hits().total().value();
  514. if (total > 0) {
  515. patent = response.hits().hits().get(0).source();
  516. id = response.hits().hits().get(0).id();
  517. }
  518. if (values == null || values.size() <= 0) {
  519. patent.getESCustomField().setFieldValue(null);
  520. patent.getESCustomField().setStatsValue(null);
  521. } else {
  522. List<Integer> fieldIds = FormatUtil.StringTOIntegerList(values);
  523. //根据树节点id查询树节点
  524. LambdaQueryWrapper<TreeNode> queryWrapper = new LambdaQueryWrapper<>();
  525. queryWrapper.eq(TreeNode::getId, fieldIds);
  526. List<TreeNode> treeNodes = treeNodeService.list(queryWrapper);
  527. //遍历节点
  528. List<String> reStateValues = new ArrayList<>(values);
  529. treeNodes.forEach(item -> {
  530. String path = item.getPath();
  531. if (path != null && path.trim() != "") {
  532. List<String> a = Arrays.asList(path.split("/"));
  533. reStateValues.addAll(a);
  534. }
  535. });
  536. List<String> disReStateValues = new ArrayList<>(new HashSet<>(reStateValues));
  537. patent.getESCustomField().setStatsValue(disReStateValues);
  538. patent.getESCustomField().setFieldValue(values);
  539. }
  540. //更新自定义栏位
  541. esService.updatePatent(patent, id);
  542. //新增历史
  543. ESCustomFieldHistory newEsCustomFieldHistory = new ESCustomFieldHistory();
  544. newEsCustomFieldHistory.setField(patent.getESCustomField().getField());
  545. newEsCustomFieldHistory.setFieldType(patent.getESCustomField().getFieldType());
  546. newEsCustomFieldHistory.setCreateTime(new Date());
  547. newEsCustomFieldHistory.setFieldValue(patent.getESCustomField().getFieldValue());
  548. newEsCustomFieldHistory.setHistoryType(3);
  549. newEsCustomFieldHistory.setTaskId(patent.getESCustomField().getTaskId());
  550. newEsCustomFieldHistory.setPersonId("1");
  551. newEsCustomFieldHistory.setProjectId(patent.getESCustomField().getProjectId());
  552. newEsCustomFieldHistory.setCustomFieldId(id);
  553. this.addCustomFieldHistory(esCustomFieldHistory);
  554. }
  555. //查询栏位历史
  556. public Hit<ESCustomFieldHistory> getEsCustomFieldHistoryById(String historyId) throws Exception {
  557. Hit<ESCustomFieldHistory> esCustomFieldHistoryHit = null;
  558. SearchRequest.Builder builder = new SearchRequest.Builder();
  559. builder.index("custom_field_history");
  560. Query q = QueryBuilders.ids(i -> i.values(Arrays.asList(historyId)));
  561. builder.query(q);
  562. SearchResponse<ESCustomFieldHistory> response = client.search(builder.build(), ESCustomFieldHistory.class);
  563. long total = response.hits().total().value();
  564. if (total > 0) {
  565. esCustomFieldHistoryHit = response.hits().hits().get(0);
  566. }
  567. return esCustomFieldHistoryHit;
  568. }
  569. public PatentWithIdVO getPatentLabel(AddPatentLabelDTO addPatentLabelDTO) throws Exception {
  570. PatentWithIdVO patentWithIdVO = new PatentWithIdVO();
  571. Integer projectId = addPatentLabelDTO.getProjectId();
  572. SearchRequest.Builder builder = new SearchRequest.Builder();
  573. String patentNo = addPatentLabelDTO.getPatentNo();
  574. //设置查询索引
  575. builder.index("patent");
  576. //栏位
  577. Query q1 = QueryBuilders.term(t -> t.field("custom_field.project_id").value(projectId));
  578. Query q4 = QueryBuilders.term(t -> t.field("custom_field.field_type").value(10));
  579. Query parentQ1 = QueryBuilders.term(t -> t.field("app_no.keyword").value(patentNo));
  580. //公开号
  581. Query parentQ2 = QueryBuilders.term(t -> t.field("public_no.keyword").value(patentNo));
  582. //授权号
  583. Query parentQ3 = QueryBuilders.term(t -> t.field("grant_no.keyword").value(patentNo));
  584. Query parentQ = QueryBuilders.bool(i -> i.should(parentQ1, parentQ2, parentQ3));
  585. Query q3 = QueryBuilders.hasParent(t -> t.parentType("patent").query(parentQ));
  586. Query bool = null;
  587. bool = QueryBuilders.bool(i -> i.must(q1, q3, q4));
  588. builder.query(bool);
  589. SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
  590. long total = response.hits().total().value();
  591. if (total > 0) {
  592. List<Hit<Patent>> hits = response.hits().hits();
  593. Hit<Patent> hit = hits.get(0);
  594. Patent patent = hit.source();
  595. patentWithIdVO.setPatent(patent);
  596. patentWithIdVO.setId(hit.id());
  597. } else {
  598. patentWithIdVO = null;
  599. }
  600. return patentWithIdVO;
  601. }
  602. public List<ESCustomField> getPatentCustomFields(String projectId, String patentId) {
  603. SearchRequest.Builder builder = new SearchRequest.Builder();
  604. //设置查询索引
  605. builder.index("patent");
  606. Query q1 = QueryBuilders.term(t -> t.field("project_id").value(projectId));
  607. Query q2 = QueryBuilders.parentId(parent -> parent.type("patent").id(patentId));
  608. Query bool = QueryBuilders.bool(i -> i.must(q1, q2));
  609. try {
  610. SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
  611. List<Hit<Patent>> hits = response.hits().hits();
  612. hits.forEach(item -> {
  613. });
  614. } catch (Exception e) {
  615. }
  616. return null;
  617. }
  618. /**
  619. * 查询自定义栏位和值
  620. *
  621. * @param esQueryPatentFieldsDTO
  622. * @return
  623. * @throws Exception
  624. */
  625. public List<EsPatentFieldsVO> getPatentFields(EsQueryPatentFieldsDTO esQueryPatentFieldsDTO) throws Exception {
  626. List<EsPatentFieldsVO> esPatentFieldsVOS = new ArrayList<>();
  627. Integer projectId = esQueryPatentFieldsDTO.getProjectId();
  628. Integer taskId = esQueryPatentFieldsDTO.getTaskId();
  629. List<String> patentNos = esQueryPatentFieldsDTO.getPatentNos();
  630. List<InnerFields> innerFields = esQueryPatentFieldsDTO.getInnerFields();
  631. for (String patentNo : patentNos) {
  632. EsPatentFieldsVO esPatentFieldsVO = new EsPatentFieldsVO();
  633. esPatentFieldsVO.setPatentNo(patentNo);
  634. SearchRequest.Builder builder = new SearchRequest.Builder();
  635. //设置查询索引
  636. builder.index("patent");
  637. builder.sort(sortOptionsBuilder -> sortOptionsBuilder
  638. .field(fieldSortBuilder -> fieldSortBuilder
  639. .field("custom_field.create_time").order(SortOrder.Desc)));
  640. Query queries = this.getQueries(patentNo, innerFields, projectId, taskId);
  641. builder.size(999);
  642. builder.query(queries);
  643. SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
  644. long total = response.hits().total().value();
  645. List<ESCustomField> esCustomFields = new ArrayList<>();
  646. List<InnerPatentFieldsVO> innerPatentFieldsVOS = new ArrayList<>();
  647. if (total > 0) {
  648. List<Hit<Patent>> hits = response.hits().hits();
  649. for (Hit<Patent> hit : hits) {
  650. Patent patent = hit.source();
  651. ESCustomField esCustomField = patent.getESCustomField();
  652. ESCustomField esCustomField1 = esCustomFields.stream()
  653. .filter(item -> item.getField().equals(esCustomField.getField()) && item.getFieldType().equals(esCustomField.getFieldType()))
  654. .findFirst().orElse(null);
  655. if (esCustomField1 == null) {
  656. esCustomFields.add(esCustomField);
  657. InnerPatentFieldsVO innerPatentFieldsVO = new InnerPatentFieldsVO();
  658. innerPatentFieldsVO.setField(esCustomField.getField());
  659. innerPatentFieldsVO.setFieldType(esCustomField.getFieldType());
  660. List<FieldValueVO> fieldValueVOS = this.getCustomFieldValues(esCustomField.getFieldType(), esCustomField.getFieldValue());
  661. innerPatentFieldsVO.setFieldValueVOS(fieldValueVOS);
  662. innerPatentFieldsVOS.add(innerPatentFieldsVO);
  663. }
  664. }
  665. }
  666. esPatentFieldsVO.setInnerClassFields(innerPatentFieldsVOS);
  667. esPatentFieldsVOS.add(esPatentFieldsVO);
  668. }
  669. return esPatentFieldsVOS;
  670. }
  671. private Query getQueries(String patentNo, List<InnerFields> innerFields, Integer projectId, Integer taskId) {
  672. Query parentQ1 = QueryBuilders.term(t -> t.field("app_no.keyword").value(patentNo));
  673. //公开号
  674. Query parentQ2 = QueryBuilders.term(t -> t.field("public_no.keyword").value(patentNo));
  675. //授权号
  676. Query parentQ3 = QueryBuilders.term(t -> t.field("grant_no.keyword").value(patentNo));
  677. Query parentQ = QueryBuilders.bool(i -> i.should(parentQ1, parentQ2, parentQ3));
  678. Query patentQ1 = QueryBuilders.hasParent(t -> t.parentType("patent").query(parentQ));
  679. List<Query> queries = new ArrayList<>();
  680. for (InnerFields innerField : innerFields) {
  681. String filedId = innerField.getFieldId();
  682. Integer fieldType = innerField.getFieldType();
  683. Query q1 = QueryBuilders.term(t -> t.field("custom_field.project_id").value(projectId));
  684. Query q2 = QueryBuilders.term((t -> t.field("custom_field.field").value(filedId)));
  685. Query q3 = QueryBuilders.term(t -> t.field("custom_field.field_type").value(fieldType));
  686. Query fQ =null;
  687. if (taskId != null) {
  688. Query q4 =QueryBuilders.term(t -> t.field("custom_field.task_id").value(fieldType));
  689. fQ = QueryBuilders.bool(i -> i.must(q1, q2, q3,q4));
  690. queries.add(fQ);
  691. }
  692. else {
  693. fQ = QueryBuilders.bool(i -> i.must(q1, q2, q3));
  694. queries.add(fQ);
  695. }
  696. queries.add(fQ);
  697. }
  698. Query query = QueryBuilders.bool(i -> i.should(queries));
  699. Query query1 = QueryBuilders.bool(i -> i.must(query, patentQ1));
  700. return query1;
  701. }
  702. /**
  703. * 获得自定义字段的值
  704. *
  705. * @param type
  706. * @param value
  707. * @return
  708. */
  709. public List<FieldValueVO> getCustomFieldValues(Integer type, List<String> value) {
  710. List<FieldValueVO> fieldValueVOS = new ArrayList<>();
  711. switch (type) {
  712. case 0:
  713. case 1:
  714. case 2:
  715. case 10:
  716. value.forEach(item -> {
  717. FieldValueVO fieldValueVO = new FieldValueVO();
  718. fieldValueVO.setValue(item);
  719. fieldValueVOS.add(fieldValueVO);
  720. });
  721. break;
  722. case 3:
  723. case 4:
  724. case 5:
  725. if (value != null && value.size() > 0) {
  726. List<Integer> ids = FormatUtil.StringTOIntegerList(value);
  727. LambdaQueryWrapper<CustomOption> queryWrapper = new LambdaQueryWrapper<>();
  728. queryWrapper.in(CustomOption::getId, ids);
  729. List<CustomOption> customOptions = customOptionService.list(queryWrapper);
  730. customOptions.forEach(item -> {
  731. FieldValueVO fieldValueVO = new FieldValueVO();
  732. fieldValueVO.setValueId(item.getId());
  733. fieldValueVO.setValue(item.getName());
  734. fieldValueVOS.add(fieldValueVO);
  735. });
  736. }
  737. break;
  738. case 6:
  739. case 7:
  740. case 8:
  741. case 9:
  742. if (value != null && value.size() > 0) {
  743. List<Integer> ids = FormatUtil.StringTOIntegerList(value);
  744. LambdaQueryWrapper<TreeNode> queryWrapper = new LambdaQueryWrapper<>();
  745. queryWrapper.in(TreeNode::getId, ids);
  746. List<TreeNode> treeNodes = treeNodeService.list(queryWrapper);
  747. treeNodes.forEach(item -> {
  748. FieldValueVO fieldValueVO = new FieldValueVO();
  749. fieldValueVO.setValueId(item.getId());
  750. List<String> idStrs = new ArrayList<>();
  751. List<String> pathNames = new ArrayList<>();
  752. if (item.getPath() != null && !item.getPath().equals("")) {
  753. idStrs = Arrays.asList(item.getPath().split("/"));
  754. pathNames = treeNodeService.getBaseMapper().getTreeFieldPath(idStrs);
  755. }
  756. pathNames.add(item.getName());
  757. String pathValue = cn.cslg.pas.common.utils.StringUtils.join(pathNames, "/");
  758. fieldValueVO.setValue(pathValue);
  759. fieldValueVO.setPath(item.getPath());
  760. fieldValueVOS.add(fieldValueVO);
  761. });
  762. }
  763. break;
  764. }
  765. return fieldValueVOS;
  766. }
  767. public List<PatentWithIdVO> getEsCustomFields(String filedId, Integer type, Integer projectId) {
  768. List<PatentWithIdVO> patentWithIdVOS = new ArrayList<>();
  769. Query q1 = QueryBuilders.term(t -> t.field("custom_field.project_id").value(projectId));
  770. Query q2 = QueryBuilders.term((t -> t.field("custom_field.field").value(filedId)));
  771. Query q3 = QueryBuilders.term(t -> t.field("custom_field.field_type").value(type));
  772. Query fQ = QueryBuilders.bool(i -> i.must(q1, q2, q3));
  773. SearchRequest.Builder builder = new SearchRequest.Builder();
  774. builder.size(999);
  775. builder.query(fQ);
  776. builder.sort(sortOptionsBuilder -> sortOptionsBuilder
  777. .field(fieldSortBuilder -> fieldSortBuilder
  778. .field("custom_field.create_time").order(SortOrder.Desc)));
  779. try {
  780. SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
  781. long total = response.hits().total().value();
  782. if (total > 0) {
  783. List<Hit<Patent>> hits = response.hits().hits();
  784. for (Hit<Patent> hit : hits) {
  785. PatentWithIdVO patentWithIdVO = new PatentWithIdVO();
  786. patentWithIdVO.setPatent(hit.source());
  787. patentWithIdVO.setId(hit.id());
  788. PatentWithIdVO patentWithIdVO1 = patentWithIdVOS.stream().filter(item -> item.getPatent().getPatentJoin().getParent().equals(hit.source().getPatentJoin().getParent())).findFirst().orElse(null);
  789. if (patentWithIdVO1 == null) {
  790. patentWithIdVOS.add(patentWithIdVO);
  791. }
  792. }
  793. }
  794. } catch (Exception e) {
  795. }
  796. return patentWithIdVOS;
  797. }
  798. }