EsCustomFieldService.java 41 KB

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