EsPatentService.java 32 KB

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