EsPatentService.java 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753
  1. package cn.cslg.pas.service.business.es;
  2. import cn.cslg.pas.common.core.base.IfConstant;
  3. import cn.cslg.pas.common.dto.*;
  4. import cn.cslg.pas.common.dto.business.ContentDetailDTO;
  5. import cn.cslg.pas.common.model.cronModel.Personnel;
  6. import cn.cslg.pas.common.model.cronModel.PersonnelVO;
  7. import cn.cslg.pas.common.model.cronModel.Records;
  8. import cn.cslg.pas.common.model.cronModel.SystemFile;
  9. import cn.cslg.pas.common.model.request.MapRequest;
  10. import cn.cslg.pas.common.model.request.OrderDTO;
  11. import cn.cslg.pas.common.model.request.QueryRequest;
  12. import cn.cslg.pas.common.model.request.StringRequest;
  13. import cn.cslg.pas.common.utils.CacheUtils;
  14. import cn.cslg.pas.common.utils.FormatUtil;
  15. import cn.cslg.pas.common.utils.PatentRightUtils;
  16. import cn.cslg.pas.common.utils.parseQueryToTree.expressManager;
  17. import cn.cslg.pas.common.utils.parseQueryToTree.operateNode;
  18. import cn.cslg.pas.common.utils.parseQueryToTree.treeNode;
  19. import cn.cslg.pas.common.vo.ContentVO;
  20. import cn.cslg.pas.common.vo.EsConfigVO;
  21. import cn.cslg.pas.common.vo.PatentPageMessageVO;
  22. import cn.cslg.pas.common.vo.PatentWithIdVO;
  23. import cn.cslg.pas.common.vo.business.PatentKinDetailVO;
  24. import cn.cslg.pas.common.vo.business.PatentKinVO;
  25. import cn.cslg.pas.common.vo.business.PatentNoVO;
  26. import cn.cslg.pas.common.vo.business.SelectProductVO;
  27. import cn.cslg.pas.domain.business.PatentClaim;
  28. import cn.cslg.pas.domain.business.Product;
  29. import cn.cslg.pas.domain.business.ProductCategory;
  30. import cn.cslg.pas.domain.es.*;
  31. import cn.cslg.pas.mapper.ProductCategoryMapper;
  32. import cn.cslg.pas.mapper.ProductMapper;
  33. import cn.cslg.pas.service.business.CommonService;
  34. import cn.cslg.pas.service.business.ProductService;
  35. import cn.cslg.pas.service.common.FileManagerService;
  36. import cn.cslg.pas.service.permissions.PermissionService;
  37. import cn.cslg.pas.service.query.FormatQueryService;
  38. import co.elastic.clients.elasticsearch.ElasticsearchClient;
  39. import co.elastic.clients.elasticsearch._types.SortOrder;
  40. import co.elastic.clients.elasticsearch._types.query_dsl.Query;
  41. import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders;
  42. import co.elastic.clients.elasticsearch.core.DeleteResponse;
  43. import co.elastic.clients.elasticsearch.core.SearchRequest;
  44. import co.elastic.clients.elasticsearch.core.SearchResponse;
  45. import co.elastic.clients.elasticsearch.core.search.Hit;
  46. import co.elastic.clients.elasticsearch.core.search.SourceConfig;
  47. import co.elastic.clients.elasticsearch.core.search.SourceConfigBuilders;
  48. import co.elastic.clients.elasticsearch.transform.Source;
  49. import com.alibaba.druid.sql.visitor.functions.If;
  50. import com.alibaba.fastjson.JSON;
  51. import com.alibaba.fastjson.JSONArray;
  52. import com.alibaba.fastjson2.JSONObject;
  53. import lombok.RequiredArgsConstructor;
  54. import org.apache.commons.lang3.ObjectUtils;
  55. import org.apache.commons.lang3.StringUtils;
  56. import org.springframework.beans.BeanUtils;
  57. import org.springframework.beans.factory.annotation.Autowired;
  58. import org.springframework.context.annotation.Lazy;
  59. import org.springframework.stereotype.Service;
  60. import org.springframework.util.CollectionUtils;
  61. import java.io.IOException;
  62. import java.util.*;
  63. import java.util.stream.Collectors;
  64. @Service
  65. @RequiredArgsConstructor(onConstructor_ = {@Lazy})
  66. public class EsPatentService {
  67. private final ElasticsearchClient client;
  68. private final FormatQueryService formatQueryService;
  69. @Autowired
  70. private PermissionService permissionService;
  71. @Autowired
  72. private FileManagerService fileManagerService;
  73. @Autowired
  74. private ProductMapper productMapper;
  75. @Autowired
  76. private ProductCategoryMapper productCategoryMapper;
  77. @Autowired
  78. private ProductService productService;
  79. /**
  80. * 根据专利号查询专利详情
  81. *
  82. * @param vo
  83. * @return
  84. * @throws IOException
  85. */
  86. public PatentColumnDTO selectPatentDetail(PatentNoVO vo) throws IOException {
  87. PatentColumnDTO dto = new PatentColumnDTO();
  88. SearchRequest.Builder builder = new SearchRequest.Builder();
  89. //设置查询索引
  90. builder.index("patent");
  91. Query q = QueryBuilders.term(i -> i.field("patent_no.keyword").value(vo.getPatentNo()));
  92. Query query = QueryBuilders.bool(i -> i.must(q));
  93. builder.query(query);
  94. SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
  95. List<Hit<Patent>> hits = response.hits().hits();
  96. for (Hit<Patent> hit : hits) {
  97. Patent esMess = hit.source();
  98. BeanUtils.copyProperties(esMess, dto);
  99. //格式化权利要求
  100. List<Text> claims = dto.getClaim();
  101. if (claims != null && claims.size() > 0) {
  102. claims.forEach(item -> {
  103. item.setTextContent(PatentRightUtils.getFormatClaim(item.getTextContent(), item.getLanguage()));
  104. });
  105. }
  106. dto.setRightHolderAddr(esMess.getRightHolderAddr());
  107. dto.setApplicantAddr(esMess.getApplicantAddr());
  108. if (!CollectionUtils.isEmpty(esMess.getApplicant())) {
  109. dto.setApplicant(this.loadName(esMess.getApplicant()));
  110. }
  111. if (!CollectionUtils.isEmpty(esMess.getRightHolder())) {
  112. dto.setRightHolder(this.loadName(esMess.getRightHolder()));
  113. }
  114. if (!CollectionUtils.isEmpty(esMess.getInventor())) {
  115. dto.setInventor(this.loadName(esMess.getInventor()));
  116. }
  117. }
  118. dto.setPictureGuid(FormatUtil.getPictureFormat(dto.getAppNo()));
  119. List<LegalEvent> legalEvents = this.getLegalEvents(dto.getPatentNo());
  120. dto.setLegalEvents(legalEvents);
  121. return dto;
  122. }
  123. public List<LegalEvent> getLegalEvents(String patentNo) throws IOException {
  124. List<LegalEvent> events = new ArrayList<>();
  125. SearchRequest.Builder builder = new SearchRequest.Builder();
  126. //设置查询索引
  127. builder.index("legal_event");
  128. List<Query> queries = new ArrayList<>();
  129. Query q1 = QueryBuilders.term(i -> i.field("app_no").value(patentNo));
  130. queries.add(q1);
  131. Query q2 = QueryBuilders.term(i -> i.field("public_no").value(patentNo));
  132. queries.add(q2);
  133. Query q3 = QueryBuilders.term(i -> i.field("grant_no").value(patentNo));
  134. queries.add(q3);
  135. if (!CollectionUtils.isEmpty(queries)) {
  136. Query query = QueryBuilders.bool(i -> i.should(queries));
  137. builder.query(query);
  138. SearchResponse<LegalEvent> response = client.search(builder.build(), LegalEvent.class);
  139. List<Hit<LegalEvent>> hits = response.hits().hits();
  140. for (Hit<LegalEvent> hit : hits) {
  141. LegalEvent event = hit.source();
  142. events.add(event);
  143. }
  144. }
  145. return events;
  146. }
  147. //通用返回摘要、标题、权利要求具体内容
  148. public ContentVO loadContent(List<Text> list) {
  149. ContentVO contentVO = new ContentVO();
  150. String content = StringUtils.strip(JSON.toJSONString(list), "[]");
  151. ContentDetailDTO contentDetailDTO = JSONObject.parseObject(content, ContentDetailDTO.class);
  152. contentVO.setContent(contentDetailDTO.getTextContent());
  153. return contentVO;
  154. }
  155. //通用返回申请人、权利人、发明人
  156. public List<String> loadName(List<PatentPerson> list) {
  157. List<String> collect = new ArrayList<>();
  158. if (!CollectionUtils.isEmpty(list)) {
  159. collect = list.stream().filter(i -> StringUtils.isNotEmpty(i.getName())).map(PatentPerson::getName).collect(Collectors.toList());
  160. }
  161. return collect;
  162. }
  163. //通用返回合并申请人、合并权利人、合并发明人
  164. public List<String> loadMergeName(List<PatentMergePerson> list) {
  165. List<String> collect = new ArrayList<>();
  166. if (!CollectionUtils.isEmpty(list)) {
  167. collect = list.stream().map(PatentMergePerson::getName).collect(Collectors.toList());
  168. }
  169. return collect;
  170. }
  171. //获取合并申请人
  172. public List<String> getMergeApp(Integer projectId, String id) throws IOException {
  173. SearchRequest.Builder builder = new SearchRequest.Builder();
  174. //设置查询索引
  175. builder.index("patent");
  176. Query q1 = QueryBuilders.term(i -> i.field("merge_applicant.project_id").value(projectId));
  177. Query exist1 = QueryBuilders.exists(i -> i.field("merge_applicant"));
  178. Query bool = QueryBuilders.bool(i -> i.must(q1, exist1));
  179. Query nested = QueryBuilders.nested(i -> i.path("merge_applicant").query(bool));
  180. Query ids = QueryBuilders.ids(i -> i.values(Arrays.asList(id)));
  181. Query query = QueryBuilders.hasParent(i -> i.parentType("patent").query(ids));
  182. Query q = QueryBuilders.bool(i -> i.must(nested, query));
  183. builder.query(q);
  184. SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
  185. List<Hit<Patent>> hits = response.hits().hits();
  186. List<PatentMergePerson> list = new ArrayList<>();
  187. for (Hit<Patent> hit : hits) {
  188. Patent patent = hit.source();
  189. if (!CollectionUtils.isEmpty(patent.getMergeApplicant())) {
  190. list.addAll(patent.getMergeApplicant());
  191. }
  192. }
  193. List<String> data = new ArrayList<>();
  194. if (!CollectionUtils.isEmpty(list)) {
  195. data = this.loadMergeName(list);
  196. }
  197. return data;
  198. }
  199. //获取合并权利人
  200. public List<String> getMergeRight(Integer projectId, String id) throws IOException {
  201. SearchRequest.Builder builder = new SearchRequest.Builder();
  202. //设置查询索引
  203. builder.index("patent");
  204. Query q1 = QueryBuilders.term(i -> i.field("merge_right_holder.project_id").value(projectId));
  205. Query exist1 = QueryBuilders.exists(i -> i.field("merge_right_holder"));
  206. Query bool = QueryBuilders.bool(i -> i.must(q1, exist1));
  207. Query nested = QueryBuilders.nested(i -> i.path("merge_right_holder").query(bool));
  208. Query ids = QueryBuilders.ids(i -> i.values(Arrays.asList(id)));
  209. Query query = QueryBuilders.hasParent(i -> i.parentType("patent").query(ids));
  210. Query q = QueryBuilders.bool(i -> i.must(nested, query));
  211. builder.query(q);
  212. SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
  213. List<Hit<Patent>> hits = response.hits().hits();
  214. List<PatentMergePerson> list = new ArrayList<>();
  215. for (Hit<Patent> hit : hits) {
  216. Patent patent = hit.source();
  217. if (!CollectionUtils.isEmpty(patent.getMergeRightHolder())) {
  218. list.addAll(patent.getMergeRightHolder());
  219. }
  220. }
  221. List<String> data = new ArrayList<>();
  222. if (!CollectionUtils.isEmpty(list)) {
  223. data = this.loadMergeName(list);
  224. }
  225. return data;
  226. }
  227. //获取合并发明人
  228. public List<String> getMergeInventor(Integer projectId, String id) throws IOException {
  229. SearchRequest.Builder builder = new SearchRequest.Builder();
  230. //设置查询索引
  231. builder.index("patent");
  232. Query q1 = QueryBuilders.term(i -> i.field("merge_inventor.project_id").value(projectId));
  233. Query exist1 = QueryBuilders.exists(i -> i.field("merge_inventor"));
  234. Query bool = QueryBuilders.bool(i -> i.must(q1, exist1));
  235. Query nested = QueryBuilders.nested(i -> i.path("merge_inventor").query(bool));
  236. Query ids = QueryBuilders.ids(i -> i.values(Arrays.asList(id)));
  237. Query query = QueryBuilders.hasParent(i -> i.parentType("patent").query(ids));
  238. Query q = QueryBuilders.bool(i -> i.must(nested, query));
  239. builder.query(q);
  240. SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
  241. List<Hit<Patent>> hits = response.hits().hits();
  242. List<PatentMergePerson> list = new ArrayList<>();
  243. for (Hit<Patent> hit : hits) {
  244. Patent patent = hit.source();
  245. if (!CollectionUtils.isEmpty(patent.getMergeInventor())) {
  246. list.addAll(patent.getMergeInventor());
  247. }
  248. }
  249. List<String> data = new ArrayList<>();
  250. if (!CollectionUtils.isEmpty(list)) {
  251. data = this.loadMergeName(list);
  252. }
  253. return data;
  254. }
  255. /**
  256. * 获得中国专利pdf全文
  257. *
  258. * @param appNo
  259. * @return
  260. * @throws IOException
  261. */
  262. public List<InnerPatentPdfDTO> getTextPdf(String appNo) throws IOException {
  263. List<InnerPatentPdfDTO> list = new ArrayList<>();
  264. //公开说明书pdf
  265. String pdfFormat1 = FormatUtil.getPDFFormat(appNo, 0);
  266. //授权说明书pdf
  267. String pdfFormat2 = FormatUtil.getPDFFormat(appNo, 1);
  268. //查询文件是否存在
  269. List<SystemFile> systemFiles = new ArrayList<>();
  270. try {
  271. String res = fileManagerService.getSystemFileFromFMS(Arrays.asList(pdfFormat1, pdfFormat2));
  272. systemFiles = com.alibaba.fastjson.JSONObject.parseArray(res, SystemFile.class);
  273. } catch (Exception e) {
  274. }
  275. if (!CollectionUtils.isEmpty(systemFiles)) {
  276. SystemFile systemFile1 = systemFiles.stream().filter(item -> item.getGuid().equals(pdfFormat1)).findFirst().orElse(null);
  277. SystemFile systemFile2 = systemFiles.stream().filter(item->item.getGuid().equals(pdfFormat2)).findFirst().orElse(null);
  278. if(systemFile1!=null) {
  279. InnerPatentPdfDTO dto = new InnerPatentPdfDTO();
  280. dto.setPdfGuid(pdfFormat1);
  281. dto.setType(0);
  282. list.add(dto);
  283. }
  284. if(systemFile2!=null) {
  285. InnerPatentPdfDTO dto = new InnerPatentPdfDTO();
  286. dto.setPdfGuid(pdfFormat2);
  287. dto.setType(1);
  288. list.add(dto);
  289. }
  290. }
  291. return list;
  292. }
  293. /**
  294. * 获取附图
  295. *
  296. * @param appNo
  297. * @return
  298. */
  299. public List<String> getFigure(String appNo) throws IOException {
  300. List<String> list = new ArrayList<>();
  301. String guids = fileManagerService.getPatentPictureGuids(appNo);
  302. if (StringUtils.isNotEmpty(guids)) {
  303. JSONObject jsonObject = JSONObject.parseObject(guids);
  304. list = JSONArray.parseArray(jsonObject.get("data").toString(), String.class);
  305. }
  306. return list;
  307. }
  308. /**
  309. * 根据专利号查询出同族专利列表
  310. *
  311. * @param vo
  312. * @return
  313. * @throws IOException
  314. */
  315. public Records selectKinByPatentNo(PatentKinVO vo) throws IOException {
  316. //1.根据专利号查询出同族
  317. String no = vo.getNo();
  318. Integer pageNum = vo.getPageNum();
  319. Integer pageSize = vo.getPageSize();
  320. String type = vo.getType();
  321. String patentNo = vo.getPatentNo();
  322. SearchRequest.Builder builder = new SearchRequest.Builder();
  323. //设置查询索引
  324. builder.index("patent_family");
  325. //申请号
  326. Query q1 = QueryBuilders.term(t -> t.field("patent.app_no").value(no));
  327. //公开号
  328. Query q2 = QueryBuilders.term(t -> t.field("patent.public_no").value(no));
  329. //授权号
  330. Query q3 = QueryBuilders.term(t -> t.field("patent.grant_no").value(no));
  331. //同族类型
  332. Query q4 = QueryBuilders.term(t -> t.field("family_type").value(type));
  333. Query q =QueryBuilders.bool(i->i.should(q1,q2,q3));
  334. Query bool = QueryBuilders.bool(i -> i.must(q4,q));
  335. builder.query(bool);
  336. //分页
  337. if (pageNum > 0 && pageSize > 0) {
  338. builder.from((pageNum - 1) * pageSize).size(pageSize);
  339. }
  340. SearchResponse<PatentFamilyMessage> response = client.search(builder.build(), PatentFamilyMessage.class);
  341. List<Hit<PatentFamilyMessage>> hits = response.hits().hits();
  342. List<PatentKinDTO> kinDTOS = new ArrayList<>();
  343. for (Hit<PatentFamilyMessage> hit : hits) {
  344. PatentFamilyMessage familyMessage = hit.source();
  345. List<FamilyPatent> patentList = familyMessage.getPatent();
  346. if (!CollectionUtils.isEmpty(patentList)) {
  347. for (FamilyPatent familyPatent : patentList) {
  348. PatentKinDetailVO kinDetailVO = new PatentKinDetailVO();
  349. kinDetailVO.setPageNum(vo.getPageNum());
  350. kinDetailVO.setPageSize(vo.getPageSize());
  351. kinDetailVO.setAppNo(familyPatent.getAppNo());
  352. kinDetailVO.setPublicNo(familyPatent.getPublicNo());
  353. kinDetailVO.setGrantNo(familyPatent.getGrantNo());
  354. if (StringUtils.isNotEmpty(patentNo)) {
  355. PatentKinDTO kinDTO = this.selectPatentKindDetail(kinDetailVO, patentNo)
  356. .stream().findFirst().orElse(null);
  357. if (kinDTO != null) {
  358. kinDTOS.add(kinDTO);
  359. }
  360. break;
  361. } else {
  362. PatentKinDTO kinDTO = this.selectPatentKindDetail(kinDetailVO, patentNo)
  363. .stream().findFirst().orElse(null);
  364. if (kinDTO != null) {
  365. kinDTOS.add(kinDTO);
  366. }
  367. }
  368. }
  369. }
  370. }
  371. Records records = new Records();
  372. records.setCurrent(vo.getPageNum().longValue());
  373. records.setSize(vo.getPageSize().longValue());
  374. records.setData(kinDTOS);
  375. records.setTotal(Long.valueOf(String.valueOf(kinDTOS.size())));
  376. return records;
  377. }
  378. public List<PatentKinDTO> selectPatentKindDetail(PatentKinDetailVO vo, String patentNo) throws IOException {
  379. Integer pageNum = vo.getPageNum();
  380. Integer pageSize = vo.getPageSize();
  381. List<PatentKinDTO> list = new ArrayList<>();
  382. SearchRequest.Builder builder = new SearchRequest.Builder();
  383. //设置查询索引
  384. builder.index("patent");
  385. //申请号
  386. Query q1 = QueryBuilders.term(t -> t.field("app_no.keyword").value(vo.getAppNo()));
  387. //公开号
  388. Query q2 = QueryBuilders.term(t -> t.field("public_no.keyword").value(vo.getPublicNo()));
  389. //授权号
  390. // Query q3 = QueryBuilders.term(t -> t.field("patent_no.keyword").value(vo.getGrantNo()));
  391. Query bool = null;
  392. if (StringUtils.isNotEmpty(patentNo)) {
  393. String str = "*";
  394. String s = str.concat(patentNo).concat("*");
  395. Query query = QueryBuilders.wildcard(i -> i.field("patent_no.keyword").value(s));
  396. bool = QueryBuilders.bool(i -> i.should(q1, q2).must(query));
  397. } else {
  398. bool = QueryBuilders.bool(i -> i.should(q1, q2));
  399. }
  400. builder.query(bool);
  401. //分页
  402. if (pageNum > 0 && pageSize > 0) {
  403. builder.from((pageNum - 1) * pageSize).size(pageSize);
  404. }
  405. SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
  406. List<Hit<Patent>> hits = response.hits().hits();
  407. for (Hit<Patent> hit : hits) {
  408. PatentKinDTO kinDTO = new PatentKinDTO();
  409. Patent patent = hit.source();
  410. if (patent != null) {
  411. kinDTO.setPatentNo(patent.getPatentNo());
  412. kinDTO.setAppNo(patent.getAppNo());
  413. kinDTO.setPublicNo(patent.getPublicNo());
  414. kinDTO.setGrantNo(patent.getGrantNo());
  415. kinDTO.setTitle(patent.getTitle());
  416. kinDTO.setAbstractStr(patent.getAbstractStr());
  417. kinDTO.setApplicant(this.loadName(patent.getApplicant()));
  418. kinDTO.setRightHolder(this.loadName(patent.getRightHolder()));
  419. kinDTO.setPictureGuid(FormatUtil.getPictureFormat(kinDTO.getAppNo()));
  420. list.add(kinDTO);
  421. }
  422. }
  423. return list;
  424. }
  425. /**
  426. * 根据专利号查询出商品化专利
  427. *
  428. * @param vo
  429. * @return
  430. * @throws IOException
  431. */
  432. public Object selectProductByPatentNo(SelectProductVO vo) throws Exception {
  433. String patentNo = vo.getPatentNo();
  434. QueryRequest queryRequest = new QueryRequest();
  435. if (ObjectUtils.isNotEmpty(vo.getQueryRequest())) {
  436. queryRequest = vo.getQueryRequest();
  437. }
  438. List<Integer> productIds = new ArrayList<>();
  439. SearchRequest.Builder builder = new SearchRequest.Builder();
  440. //设置查询索引
  441. builder.index("patent");
  442. //申请号
  443. Query q1 = QueryBuilders.term(t -> t.field("app_no.keyword").value(patentNo));
  444. //公开号
  445. Query q2 = QueryBuilders.term(t -> t.field("public_no.keyword").value(patentNo));
  446. //授权号
  447. Query q3 = QueryBuilders.term(t -> t.field("grant_no.keyword").value(patentNo));
  448. Query bool = QueryBuilders.bool(i -> i.should(q1, q2, q3));
  449. Query q = QueryBuilders.exists(i -> i.field("product_id"));
  450. Query query = QueryBuilders.hasParent(parent -> parent.parentType("patent").query(bool));
  451. Query bool1 = QueryBuilders.bool(i -> i.must(q, query));
  452. builder.query(bool1);
  453. SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
  454. List<Hit<Patent>> hits = response.hits().hits();
  455. for (Hit<Patent> hit : hits) {
  456. Patent patent = hit.source();
  457. if (patent.getProductId() != null) {
  458. productIds.add(patent.getProductId());
  459. }
  460. }
  461. queryRequest.setProductIds(productIds.stream().distinct().collect(Collectors.toList()));
  462. return productService.selectProduct(queryRequest);
  463. }
  464. /**
  465. * 根据专利号批量查询专利
  466. *
  467. * @param patentNos
  468. * @return
  469. * @throws Exception
  470. */
  471. public List<Patent> getPatentsByNo(List<String> patentNos, Boolean ifGetAll, Long current, Long size) throws Exception {
  472. List<Patent> patentList = new ArrayList<>();
  473. SearchRequest.Builder builder = new SearchRequest.Builder();
  474. //设置查询索引
  475. builder.index("patent");
  476. List<Query> querys = new ArrayList<>();
  477. for (String patentNo : patentNos) {
  478. Query q1 = QueryBuilders.term(t -> t.field("app_no.keyword").value(patentNo));
  479. //公开号
  480. Query q2 = QueryBuilders.term(t -> t.field("public_no.keyword").value(patentNo));
  481. //授权号
  482. Query q3 = QueryBuilders.term(t -> t.field("grant_no.keyword").value(patentNo));
  483. Query query = QueryBuilders.bool(i -> i.should(q1, q2, q3));
  484. querys.add(query);
  485. }
  486. Query finalQuery = QueryBuilders.bool((i -> i.should(querys)));
  487. builder.query(finalQuery);
  488. if (!ifGetAll) {
  489. List<String> reSources = this.rePatentSource();
  490. builder.source(sourceOptionsBuilder -> sourceOptionsBuilder
  491. .filter(fieldSourceBuilder -> fieldSourceBuilder
  492. .includes(reSources)));
  493. }
  494. if (current != null && size != null && current > 0 && size > 0) {
  495. builder.from((current.intValue() - 1) * size.intValue()).size(size.intValue());
  496. } else {
  497. builder.from(0).size(10000);
  498. }
  499. SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
  500. List<Hit<Patent>> hits = response.hits().hits();
  501. if (hits != null && hits.size() > 0) {
  502. hits.forEach(item -> {
  503. Patent patent = item.source();
  504. patentList.add(patent);
  505. }
  506. );
  507. }
  508. return patentList;
  509. }
  510. private List<String> rePatentSource() {
  511. List<String> rePatentSource = new ArrayList<>();
  512. rePatentSource.add("patent_no");
  513. rePatentSource.add("app_no");
  514. rePatentSource.add("app_date");
  515. rePatentSource.add("public_no");
  516. rePatentSource.add("public_date");
  517. rePatentSource.add("grant_no");
  518. rePatentSource.add("grant_date");
  519. rePatentSource.add("title");
  520. return rePatentSource;
  521. }
  522. /**
  523. * 检索上一页下一页信息
  524. *
  525. * @param queryRequest 检索条件
  526. * @return
  527. */
  528. public Records getPatentPageMessage(QueryRequest queryRequest) throws Exception {
  529. List<PatentPageMessageVO> patentPageMessageVOS = new ArrayList<>();
  530. Long current = queryRequest.getCurrent();
  531. Long size = queryRequest.getSize();
  532. SearchRequest.Builder builder = new SearchRequest.Builder();
  533. //设置查询索引
  534. builder.index("patent");
  535. Query q = this.getQuery(queryRequest);
  536. //4. 返回数据
  537. builder.query(q);
  538. //排序
  539. List<OrderDTO> dtoList = queryRequest.getOrderDTOList();
  540. if (!CollectionUtils.isEmpty(dtoList)) {
  541. String json = CommonService.readJsonFile("patent.json");
  542. List<EsConfigVO> esConfigVOS = JSON.parseArray(json, EsConfigVO.class);
  543. for (OrderDTO orderDTO : dtoList) {
  544. EsConfigVO configVO = esConfigVOS.stream().filter(item -> item.getField().equals(orderDTO.getOrderBy())).findFirst().orElse(null);
  545. if (configVO != null) {
  546. if (orderDTO.getOrderType().equals(IfConstant.NO)) {
  547. builder.sort(sortOptionsBuilder -> sortOptionsBuilder
  548. .field(fieldSortBuilder -> fieldSortBuilder
  549. .field(configVO.getEsField()).order(SortOrder.Asc)));
  550. } else {
  551. builder.sort(sortOptionsBuilder -> sortOptionsBuilder
  552. .field(fieldSortBuilder -> fieldSortBuilder
  553. .field(configVO.getEsField()).order(SortOrder.Desc)));
  554. }
  555. }
  556. }
  557. } else {
  558. builder.sort(sortOptionsBuilder -> sortOptionsBuilder
  559. .field(fieldSortBuilder -> fieldSortBuilder
  560. .field("patent_no.keyword").order(SortOrder.Desc)));
  561. }
  562. //分页
  563. if (current > 0 && size > 0) {
  564. builder.from(current.intValue() - 1).size(size.intValue());
  565. }
  566. SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
  567. List<Hit<Patent>> hits = response.hits().hits();
  568. for (Hit<Patent> hit : hits) {
  569. PatentPageMessageVO patentPageMessageVO = new PatentPageMessageVO();
  570. patentPageMessageVO.setPatentNo(hit.source().getPatentNo());
  571. patentPageMessageVOS.add(patentPageMessageVO);
  572. }
  573. Records records = new Records();
  574. records.setTotal(response.hits().total().value());
  575. records.setSize(size);
  576. records.setCurrent(current);
  577. records.setData(patentPageMessageVOS);
  578. return records;
  579. }
  580. /**
  581. * 检索上一页下一页信息
  582. *
  583. * @param queryRequest 检索条件
  584. * @return
  585. */
  586. public List<Patent> getPatentsWithNotNo(QueryRequest queryRequest, List<String> patentNos) throws Exception {
  587. List<Patent> patentList = new ArrayList<>();
  588. SearchRequest.Builder builder = new SearchRequest.Builder();
  589. Long current =queryRequest.getCurrent();
  590. Long size =queryRequest.getSize();
  591. //设置查询索引
  592. builder.index("patent");
  593. Query q = this.getQuery(queryRequest);
  594. Query reQuery = null;
  595. if (patentNos != null && patentNos.size() > 0) {
  596. List<Query> notInQuery = this.getNoNotInQuery(patentNos);
  597. reQuery = QueryBuilders.bool(i -> i.must(q).mustNot(notInQuery));
  598. } else {
  599. reQuery = QueryBuilders.bool(i -> i.must(q));
  600. }
  601. //4. 返回数据
  602. builder.query(reQuery);
  603. if (current > 0 && size > 0) {
  604. builder.from(current.intValue() - 1).size(size.intValue());
  605. }
  606. List<String> reSources = this.rePatentSource();
  607. builder.source(sourceOptionsBuilder -> sourceOptionsBuilder
  608. .filter(fieldSourceBuilder -> fieldSourceBuilder
  609. .includes(reSources)));
  610. SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
  611. List<Hit<Patent>> hits = response.hits().hits();
  612. for (Hit<Patent> hit : hits) {
  613. if (hits != null && hits.size() > 0) {
  614. Patent patent = hit.source();
  615. patentList.add(patent);
  616. }
  617. }
  618. return patentList;
  619. }
  620. public Long getTotalNum(QueryRequest queryRequest) throws Exception {
  621. SearchRequest.Builder builder = new SearchRequest.Builder();
  622. //设置查询索引
  623. builder.index("patent");
  624. Query q = this.getQuery(queryRequest);
  625. //4. 返回数据
  626. Query reQuery = QueryBuilders.bool(i -> i.must(q));
  627. builder.query(reQuery);
  628. List<String> reSources = this.rePatentSource();
  629. builder.source(sourceOptionsBuilder -> sourceOptionsBuilder
  630. .filter(fieldSourceBuilder -> fieldSourceBuilder
  631. .includes(reSources)));
  632. SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
  633. return response.hits().total().value();
  634. }
  635. public Query getQuery(QueryRequest queryRequest) throws Exception {
  636. String searchCondition = "";
  637. Integer projectId = queryRequest.getProjectId();
  638. //判断表达式
  639. if (queryRequest instanceof StringRequest) {
  640. searchCondition = ((StringRequest) queryRequest).getSearchQuery();
  641. } else if (queryRequest instanceof MapRequest) {
  642. Map<String, Object> map = ((MapRequest) queryRequest).getSearchQuery();
  643. StringBuilder stringBuilder = new StringBuilder();
  644. for (String key : map.keySet()) {
  645. Object value = map.get(key);
  646. if (!"".contentEquals(stringBuilder)) {
  647. stringBuilder = stringBuilder.append(" AND ").append(key).append("=").append(value);
  648. } else {
  649. stringBuilder = stringBuilder.append(key).append("=").append(value);
  650. }
  651. }
  652. searchCondition = stringBuilder.toString();
  653. }
  654. if (projectId != null) {
  655. if (searchCondition != null && !"".equals(searchCondition.trim())) {
  656. searchCondition = "projectId = " + projectId + " AND " + searchCondition;
  657. } else {
  658. searchCondition = "projectId = " + projectId;
  659. }
  660. }
  661. //1. 解析检索条件
  662. treeNode tree = expressManager.getInstance().Parse(searchCondition, false);
  663. //格式化检索式
  664. //3. 从es中检索数据
  665. Query q = formatQueryService.EsQueryToQuery((operateNode) tree, "patent");
  666. return q;
  667. }
  668. private List<Query> getNoNotInQuery(List<String> patentNos) {
  669. List<Query> queryList = new ArrayList<>();
  670. for (String patentNo : patentNos) {
  671. Query q1 = QueryBuilders.term(t -> t.field("patent_no.keyword").value(patentNo));
  672. queryList.add(q1);
  673. }
  674. return queryList;
  675. }
  676. /**
  677. * 根据id查询
  678. *
  679. * @param ids
  680. * @return
  681. * @throws Exception
  682. */
  683. public List<Hit<Patent>> getById(List<String> ids) throws Exception {
  684. List<Hit<Patent>> patents = new ArrayList<>();
  685. SearchRequest.Builder builder = new SearchRequest.Builder();
  686. builder.index("patent");
  687. Query q = QueryBuilders.ids(i -> i.values(ids));
  688. builder.query(q);
  689. SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
  690. long total = response.hits().total().value();
  691. if (total > 0) {
  692. patents = response.hits().hits();
  693. }
  694. return patents;
  695. }
  696. public void removeById(String id) throws IOException {
  697. DeleteResponse deleteResponse = client.delete(deleteRequest ->
  698. deleteRequest.index("patent").id(id)
  699. );
  700. }
  701. }