EsPatentService.java 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869
  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.dto.es.EsCustomFieldValueDTO;
  6. import cn.cslg.pas.common.model.addPatentToReport.PatentNoWithIdVO;
  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.FormatUtil;
  14. import cn.cslg.pas.common.utils.PatentRightUtils;
  15. import cn.cslg.pas.common.utils.parseQueryToTree.expressManager;
  16. import cn.cslg.pas.common.utils.parseQueryToTree.operateNode;
  17. import cn.cslg.pas.common.utils.parseQueryToTree.treeNode;
  18. import cn.cslg.pas.common.vo.ContentVO;
  19. import cn.cslg.pas.common.vo.EsConfigVO;
  20. import cn.cslg.pas.common.vo.PatentPageMessageVO;
  21. import cn.cslg.pas.common.vo.PatentWithIdVO;
  22. import cn.cslg.pas.common.vo.business.PatentKinDetailVO;
  23. import cn.cslg.pas.common.vo.business.PatentKinVO;
  24. import cn.cslg.pas.common.vo.business.PatentNoVO;
  25. import cn.cslg.pas.common.vo.business.SelectProductVO;
  26. import cn.cslg.pas.common.vo.es.EsPatentCommonVO;
  27. import cn.cslg.pas.domain.es.*;
  28. import cn.cslg.pas.mapper.ProductCategoryMapper;
  29. import cn.cslg.pas.mapper.ProductMapper;
  30. import cn.cslg.pas.service.business.CommonService;
  31. import cn.cslg.pas.service.business.ProductService;
  32. import cn.cslg.pas.service.common.FileManagerService;
  33. import cn.cslg.pas.service.permissions.PermissionService;
  34. import cn.cslg.pas.service.query.FormatQueryService;
  35. import co.elastic.clients.elasticsearch.ElasticsearchClient;
  36. import co.elastic.clients.elasticsearch._types.SortOptions;
  37. import co.elastic.clients.elasticsearch._types.SortOrder;
  38. import co.elastic.clients.elasticsearch._types.aggregations.Aggregate;
  39. import co.elastic.clients.elasticsearch._types.aggregations.StringTermsBucket;
  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.FieldCollapse;
  46. import co.elastic.clients.elasticsearch.core.search.Hit;
  47. import com.alibaba.fastjson.JSON;
  48. import com.alibaba.fastjson.JSONArray;
  49. import com.alibaba.fastjson2.JSONObject;
  50. import lombok.RequiredArgsConstructor;
  51. import org.apache.commons.lang3.ObjectUtils;
  52. import org.apache.commons.lang3.StringUtils;
  53. import org.springframework.beans.BeanUtils;
  54. import org.springframework.beans.factory.annotation.Autowired;
  55. import org.springframework.context.annotation.Lazy;
  56. import org.springframework.stereotype.Service;
  57. import org.springframework.util.CollectionUtils;
  58. import java.io.IOException;
  59. import java.util.*;
  60. import java.util.stream.Collectors;
  61. @Service
  62. @RequiredArgsConstructor(onConstructor_ = {@Lazy})
  63. public class EsPatentService {
  64. private final ElasticsearchClient client;
  65. private final FormatQueryService formatQueryService;
  66. @Autowired
  67. private PermissionService permissionService;
  68. @Autowired
  69. private FileManagerService fileManagerService;
  70. @Autowired
  71. private ProductMapper productMapper;
  72. @Autowired
  73. private ProductCategoryMapper productCategoryMapper;
  74. @Autowired
  75. private ProductService productService;
  76. @Autowired
  77. @Lazy
  78. private EsService esService;
  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. dto = esService.getPatentColumnDTO(esMess, vo.getProjectId(), hit.id());
  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. if (esMess.getPatentNo().equals(vo.getPatentNo())) {
  111. break;
  112. }
  113. }
  114. dto.setPictureGuid(FormatUtil.getPictureFormat(dto.getAppNo()));
  115. List<LegalEvent> legalEvents = this.getLegalEvents(dto.getPatentNo());
  116. dto.setLegalEvents(legalEvents);
  117. return dto;
  118. }
  119. public List<LegalEvent> getLegalEvents(String patentNo) throws IOException {
  120. List<LegalEvent> events = new ArrayList<>();
  121. SearchRequest.Builder builder = new SearchRequest.Builder();
  122. //设置查询索引
  123. builder.index("legal_event");
  124. List<Query> queries = new ArrayList<>();
  125. Query q1 = QueryBuilders.term(i -> i.field("app_no").value(patentNo));
  126. queries.add(q1);
  127. Query q2 = QueryBuilders.term(i -> i.field("public_no").value(patentNo));
  128. queries.add(q2);
  129. Query q3 = QueryBuilders.term(i -> i.field("grant_no").value(patentNo));
  130. queries.add(q3);
  131. if (!CollectionUtils.isEmpty(queries)) {
  132. Query query = QueryBuilders.bool(i -> i.should(queries));
  133. builder.query(query);
  134. SearchResponse<LegalEvent> response = client.search(builder.build(), LegalEvent.class);
  135. List<Hit<LegalEvent>> hits = response.hits().hits();
  136. for (Hit<LegalEvent> hit : hits) {
  137. LegalEvent event = hit.source();
  138. events.add(event);
  139. }
  140. }
  141. return events;
  142. }
  143. //通用返回摘要、标题、权利要求具体内容
  144. public ContentVO loadContent(List<Text> list) {
  145. ContentVO contentVO = new ContentVO();
  146. String content = StringUtils.strip(JSON.toJSONString(list), "[]");
  147. ContentDetailDTO contentDetailDTO = JSONObject.parseObject(content, ContentDetailDTO.class);
  148. contentVO.setContent(contentDetailDTO.getTextContent());
  149. return contentVO;
  150. }
  151. //通用返回申请人、权利人、发明人
  152. public List<String> loadName(List<PatentPerson> list) {
  153. List<String> collect = new ArrayList<>();
  154. if (!CollectionUtils.isEmpty(list)) {
  155. collect = list.stream().filter(i -> StringUtils.isNotEmpty(i.getName())).map(PatentPerson::getName).collect(Collectors.toList());
  156. }
  157. return collect;
  158. }
  159. //通用返回合并申请人、合并权利人、合并发明人
  160. public List<String> loadMergeName(List<PatentMergePerson> list) {
  161. List<String> collect = new ArrayList<>();
  162. if (!CollectionUtils.isEmpty(list)) {
  163. collect = list.stream().map(PatentMergePerson::getName).distinct().collect(Collectors.toList());
  164. }
  165. return collect;
  166. }
  167. //获取合并申请人
  168. public List<String> getMergeApp(Integer projectId, String id) throws IOException {
  169. SearchRequest.Builder builder = new SearchRequest.Builder();
  170. //设置查询索引
  171. builder.index("patent");
  172. Query q1 = QueryBuilders.term(i -> i.field("merge_applicant.project_id").value(projectId));
  173. Query exist1 = QueryBuilders.exists(i -> i.field("merge_applicant"));
  174. Query bool = QueryBuilders.bool(i -> i.must(q1, exist1));
  175. Query nested = QueryBuilders.nested(i -> i.path("merge_applicant").query(bool));
  176. Query ids = QueryBuilders.ids(i -> i.values(Arrays.asList(id)));
  177. Query query = QueryBuilders.hasParent(i -> i.parentType("patent").query(ids));
  178. Query q = QueryBuilders.bool(i -> i.must(nested, query));
  179. builder.query(q);
  180. SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
  181. List<Hit<Patent>> hits = response.hits().hits();
  182. List<PatentMergePerson> list = new ArrayList<>();
  183. for (Hit<Patent> hit : hits) {
  184. Patent patent = hit.source();
  185. if (!CollectionUtils.isEmpty(patent.getMergeApplicant())) {
  186. list.addAll(patent.getMergeApplicant());
  187. }
  188. }
  189. List<String> data = new ArrayList<>();
  190. if (!CollectionUtils.isEmpty(list)) {
  191. data = this.loadMergeName(list);
  192. }
  193. return data;
  194. }
  195. //获取合并权利人
  196. public List<String> getMergeRight(Integer projectId, String id) throws IOException {
  197. SearchRequest.Builder builder = new SearchRequest.Builder();
  198. //设置查询索引
  199. builder.index("patent");
  200. Query q1 = QueryBuilders.term(i -> i.field("merge_right_holder.project_id").value(projectId));
  201. Query exist1 = QueryBuilders.exists(i -> i.field("merge_right_holder"));
  202. Query bool = QueryBuilders.bool(i -> i.must(q1, exist1));
  203. Query nested = QueryBuilders.nested(i -> i.path("merge_right_holder").query(bool));
  204. Query ids = QueryBuilders.ids(i -> i.values(Arrays.asList(id)));
  205. Query query = QueryBuilders.hasParent(i -> i.parentType("patent").query(ids));
  206. Query q = QueryBuilders.bool(i -> i.must(nested, query));
  207. builder.query(q);
  208. SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
  209. List<Hit<Patent>> hits = response.hits().hits();
  210. List<PatentMergePerson> list = new ArrayList<>();
  211. for (Hit<Patent> hit : hits) {
  212. Patent patent = hit.source();
  213. if (!CollectionUtils.isEmpty(patent.getMergeRightHolder())) {
  214. list.addAll(patent.getMergeRightHolder());
  215. }
  216. }
  217. List<String> data = new ArrayList<>();
  218. if (!CollectionUtils.isEmpty(list)) {
  219. data = this.loadMergeName(list);
  220. }
  221. return data;
  222. }
  223. //获取合并发明人
  224. public List<String> getMergeInventor(Integer projectId, String id) throws IOException {
  225. SearchRequest.Builder builder = new SearchRequest.Builder();
  226. //设置查询索引
  227. builder.index("patent");
  228. Query q1 = QueryBuilders.term(i -> i.field("merge_inventor.project_id").value(projectId));
  229. Query exist1 = QueryBuilders.exists(i -> i.field("merge_inventor"));
  230. Query bool = QueryBuilders.bool(i -> i.must(q1, exist1));
  231. Query nested = QueryBuilders.nested(i -> i.path("merge_inventor").query(bool));
  232. Query ids = QueryBuilders.ids(i -> i.values(Arrays.asList(id)));
  233. Query query = QueryBuilders.hasParent(i -> i.parentType("patent").query(ids));
  234. Query q = QueryBuilders.bool(i -> i.must(nested, query));
  235. builder.query(q);
  236. SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
  237. List<Hit<Patent>> hits = response.hits().hits();
  238. List<PatentMergePerson> list = new ArrayList<>();
  239. for (Hit<Patent> hit : hits) {
  240. Patent patent = hit.source();
  241. if (!CollectionUtils.isEmpty(patent.getMergeInventor())) {
  242. list.addAll(patent.getMergeInventor());
  243. }
  244. }
  245. List<String> data = new ArrayList<>();
  246. if (!CollectionUtils.isEmpty(list)) {
  247. data = this.loadMergeName(list);
  248. }
  249. return data;
  250. }
  251. /**
  252. * 获得中国专利pdf全文
  253. *
  254. * @param appNo
  255. * @return
  256. * @throws IOException
  257. */
  258. public List<InnerPatentPdfDTO> getTextPdf(String appNo) throws IOException {
  259. List<InnerPatentPdfDTO> list = new ArrayList<>();
  260. //公开说明书pdf
  261. String pdfFormat1 = FormatUtil.getPDFFormat(appNo, 0);
  262. //授权说明书pdf
  263. String pdfFormat2 = FormatUtil.getPDFFormat(appNo, 1);
  264. //查询文件是否存在
  265. List<SystemFile> systemFiles = new ArrayList<>();
  266. try {
  267. String res = fileManagerService.getSystemFileFromFMS(Arrays.asList(pdfFormat1, pdfFormat2));
  268. systemFiles = com.alibaba.fastjson.JSONObject.parseArray(res, SystemFile.class);
  269. } catch (Exception e) {
  270. }
  271. if (!CollectionUtils.isEmpty(systemFiles)) {
  272. SystemFile systemFile1 = systemFiles.stream().filter(item -> item.getGuid().equals(pdfFormat1)).findFirst().orElse(null);
  273. SystemFile systemFile2 = systemFiles.stream().filter(item -> item.getGuid().equals(pdfFormat2)).findFirst().orElse(null);
  274. if (systemFile1 != null) {
  275. InnerPatentPdfDTO dto = new InnerPatentPdfDTO();
  276. dto.setPdfGuid(pdfFormat1);
  277. dto.setType(0);
  278. list.add(dto);
  279. }
  280. if (systemFile2 != null) {
  281. InnerPatentPdfDTO dto = new InnerPatentPdfDTO();
  282. dto.setPdfGuid(pdfFormat2);
  283. dto.setType(1);
  284. list.add(dto);
  285. }
  286. }
  287. return list;
  288. }
  289. /**
  290. * 获取附图
  291. *
  292. * @param appNo
  293. * @return
  294. */
  295. public List<String> getFigure(String appNo) throws IOException {
  296. List<String> list = new ArrayList<>();
  297. String guids = fileManagerService.getPatentPictureGuids(appNo);
  298. if (StringUtils.isNotEmpty(guids)) {
  299. JSONObject jsonObject = JSONObject.parseObject(guids);
  300. String data = jsonObject.get("data").toString();
  301. if (StringUtils.isNotEmpty(data)) {
  302. list = JSONArray.parseArray(data, String.class);
  303. }
  304. }
  305. return list;
  306. }
  307. /**
  308. * 根据专利号查询出同族专利列表
  309. *
  310. * @param vo
  311. * @return
  312. * @throws IOException
  313. */
  314. public Records selectKinByPatentNo(PatentKinVO vo) throws IOException {
  315. //1.根据专利号查询出同族
  316. String no = vo.getNo();
  317. Integer pageNum = vo.getPageNum();
  318. Integer pageSize = vo.getPageSize();
  319. String type = vo.getType();
  320. String patentNo = vo.getPatentNo();
  321. SearchRequest.Builder builder = new SearchRequest.Builder();
  322. //设置查询索引
  323. builder.index("patent_family");
  324. //申请号
  325. Query q1 = QueryBuilders.term(t -> t.field("patent.app_no").value(no));
  326. //公开号
  327. Query q2 = QueryBuilders.term(t -> t.field("patent.public_no").value(no));
  328. //授权号
  329. Query q3 = QueryBuilders.term(t -> t.field("patent.grant_no").value(no));
  330. //同族类型
  331. Query q4 = QueryBuilders.term(t -> t.field("family_type").value(type));
  332. Query q = QueryBuilders.bool(i -> i.should(q1, q2, q3));
  333. Query bool = QueryBuilders.bool(i -> i.must(q4, q));
  334. builder.query(bool);
  335. //分页
  336. if (pageNum > 0 && pageSize > 0) {
  337. builder.from((pageNum - 1) * pageSize).size(pageSize);
  338. }
  339. SearchResponse<PatentFamilyMessage> response = client.search(builder.build(), PatentFamilyMessage.class);
  340. List<Hit<PatentFamilyMessage>> hits = response.hits().hits();
  341. List<PatentKinDTO> kinDTOS = new ArrayList<>();
  342. for (Hit<PatentFamilyMessage> hit : hits) {
  343. PatentFamilyMessage familyMessage = hit.source();
  344. List<FamilyPatent> patentList = familyMessage.getPatent();
  345. if (!CollectionUtils.isEmpty(patentList)) {
  346. for (FamilyPatent familyPatent : patentList) {
  347. PatentKinDetailVO kinDetailVO = new PatentKinDetailVO();
  348. kinDetailVO.setPageNum(vo.getPageNum());
  349. kinDetailVO.setPageSize(vo.getPageSize());
  350. kinDetailVO.setAppNo(familyPatent.getAppNo());
  351. kinDetailVO.setPublicNo(familyPatent.getPublicNo());
  352. kinDetailVO.setGrantNo(familyPatent.getGrantNo());
  353. if (StringUtils.isNotEmpty(patentNo)) {
  354. PatentKinDTO kinDTO = this.selectPatentKindDetail(kinDetailVO, patentNo)
  355. .stream().findFirst().orElse(null);
  356. if (kinDTO != null) {
  357. kinDTOS.add(kinDTO);
  358. }
  359. break;
  360. } else {
  361. PatentKinDTO kinDTO = this.selectPatentKindDetail(kinDetailVO, patentNo)
  362. .stream().findFirst().orElse(null);
  363. if (kinDTO != null) {
  364. kinDTOS.add(kinDTO);
  365. }
  366. }
  367. }
  368. }
  369. }
  370. Records records = new Records();
  371. records.setCurrent(vo.getPageNum().longValue());
  372. records.setSize(vo.getPageSize().longValue());
  373. records.setData(kinDTOS);
  374. records.setTotal(Long.valueOf(String.valueOf(kinDTOS.size())));
  375. return records;
  376. }
  377. public List<PatentKinDTO> selectPatentKindDetail(PatentKinDetailVO vo, String patentNo) throws IOException {
  378. Integer pageNum = vo.getPageNum();
  379. Integer pageSize = vo.getPageSize();
  380. List<PatentKinDTO> list = new ArrayList<>();
  381. SearchRequest.Builder builder = new SearchRequest.Builder();
  382. //设置查询索引
  383. builder.index("patent");
  384. //申请号
  385. Query q1 = null;
  386. if (StringUtils.isNotEmpty(vo.getAppNo())) {
  387. q1 = QueryBuilders.term(t -> t.field("app_no.keyword").value(vo.getAppNo()));
  388. }
  389. //公开号
  390. Query q2 = null;
  391. if (StringUtils.isNotEmpty(vo.getPublicNo())) {
  392. q2 = QueryBuilders.term(t -> t.field("public_no.keyword").value(vo.getPublicNo()));
  393. }
  394. //授权号
  395. // Query q3 = QueryBuilders.term(t -> t.field("patent_no.keyword").value(vo.getGrantNo()));
  396. Query bool = null;
  397. Query query1 = q1;
  398. Query query2 = q2;
  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. if (query1 != null && query2 == null) {
  404. bool = QueryBuilders.bool(i -> i.should(query1).must(query));
  405. } else if (query2 != null && query1 == null) {
  406. bool = QueryBuilders.bool(i -> i.should(query2).must(query));
  407. } else {
  408. bool = QueryBuilders.bool(i -> i.should(query1, query2).must(query));
  409. }
  410. } else {
  411. if (query1 != null && query2 == null) {
  412. bool = QueryBuilders.bool(i -> i.should(query1));
  413. } else if (query2 != null && query1 == null) {
  414. bool = QueryBuilders.bool(i -> i.should(query2));
  415. } else {
  416. bool = QueryBuilders.bool(i -> i.should(query1, query2));
  417. }
  418. }
  419. builder.query(bool);
  420. //分页
  421. // if (pageNum > 0 && pageSize > 0) {
  422. // builder.from((pageNum - 1) * pageSize).size(pageSize);
  423. // }
  424. SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
  425. List<Hit<Patent>> hits = response.hits().hits();
  426. for (Hit<Patent> hit : hits) {
  427. PatentKinDTO kinDTO = new PatentKinDTO();
  428. Patent patent = hit.source();
  429. if (patent != null) {
  430. kinDTO.setPatentNo(patent.getPatentNo());
  431. kinDTO.setAppNo(patent.getAppNo());
  432. kinDTO.setPublicNo(patent.getPublicNo());
  433. kinDTO.setGrantNo(patent.getGrantNo());
  434. kinDTO.setTitle(patent.getTitle());
  435. kinDTO.setAbstractStr(patent.getAbstractStr());
  436. kinDTO.setApplicant(this.loadName(patent.getApplicant()));
  437. kinDTO.setRightHolder(this.loadName(patent.getRightHolder()));
  438. kinDTO.setPictureGuid(FormatUtil.getPictureFormat(kinDTO.getAppNo()));
  439. list.add(kinDTO);
  440. }
  441. }
  442. return list;
  443. }
  444. /**
  445. * 根据专利号查询出商品化专利
  446. *
  447. * @param vo
  448. * @return
  449. * @throws IOException
  450. */
  451. public Object selectProductByPatentNo(SelectProductVO vo) throws Exception {
  452. String patentNo = vo.getPatentNo();
  453. QueryRequest queryRequest = new QueryRequest();
  454. if (ObjectUtils.isNotEmpty(vo.getQueryRequest())) {
  455. queryRequest = vo.getQueryRequest();
  456. }
  457. List<Integer> productIds = new ArrayList<>();
  458. SearchRequest.Builder builder = new SearchRequest.Builder();
  459. //设置查询索引
  460. builder.index("patent");
  461. //申请号
  462. Query q1 = QueryBuilders.term(t -> t.field("app_no.keyword").value(patentNo));
  463. //公开号
  464. Query q2 = QueryBuilders.term(t -> t.field("public_no.keyword").value(patentNo));
  465. //授权号
  466. Query q3 = QueryBuilders.term(t -> t.field("grant_no.keyword").value(patentNo));
  467. Query bool = QueryBuilders.bool(i -> i.should(q1, q2, q3));
  468. Query q = QueryBuilders.exists(i -> i.field("product_id"));
  469. Query query = QueryBuilders.hasParent(parent -> parent.parentType("patent").query(bool));
  470. Query bool1 = QueryBuilders.bool(i -> i.must(q, query));
  471. builder.query(bool1);
  472. SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
  473. List<Hit<Patent>> hits = response.hits().hits();
  474. for (Hit<Patent> hit : hits) {
  475. Patent patent = hit.source();
  476. if (patent.getProductId() != null) {
  477. productIds.add(patent.getProductId());
  478. }
  479. }
  480. queryRequest.setProductIds(productIds.stream().distinct().collect(Collectors.toList()));
  481. return productService.selectProduct(queryRequest);
  482. }
  483. /**
  484. * 根据专利号批量查询专利
  485. *
  486. * @param patentNos
  487. * @return
  488. * @throws Exception
  489. */
  490. public List<Patent> getPatentsByNo(List<String> patentNos, Boolean ifGetAll, Long current, Long size) throws Exception {
  491. List<Patent> patentList = new ArrayList<>();
  492. if(patentNos==null||patentNos.size()==0){
  493. return patentList;
  494. }
  495. SearchRequest.Builder builder = new SearchRequest.Builder();
  496. //设置查询索引
  497. builder.index("patent");
  498. List<Query> querys = new ArrayList<>();
  499. for (String patentNo : patentNos) {
  500. Query q1 = QueryBuilders.term(t -> t.field("app_no.keyword").value(patentNo));
  501. //公开号
  502. Query q2 = QueryBuilders.term(t -> t.field("public_no.keyword").value(patentNo));
  503. //授权号
  504. Query q3 = QueryBuilders.term(t -> t.field("grant_no.keyword").value(patentNo));
  505. Query query = QueryBuilders.bool(i -> i.should(q1, q2, q3));
  506. querys.add(query);
  507. }
  508. Query finalQuery = QueryBuilders.bool((i -> i.should(querys)));
  509. builder.query(finalQuery);
  510. if (!ifGetAll) {
  511. List<String> reSources = this.rePatentSource();
  512. builder.source(sourceOptionsBuilder -> sourceOptionsBuilder
  513. .filter(fieldSourceBuilder -> fieldSourceBuilder
  514. .includes(reSources)));
  515. }
  516. if (current != null && size != null && current > 0 && size > 0) {
  517. builder.from((current.intValue() - 1) * size.intValue()).size(size.intValue());
  518. } else {
  519. builder.from(0).size(10000);
  520. }
  521. SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
  522. List<Hit<Patent>> hits = response.hits().hits();
  523. if (hits != null && hits.size() > 0) {
  524. hits.forEach(item -> {
  525. Patent patent = item.source();
  526. patentList.add(patent);
  527. }
  528. );
  529. }
  530. return patentList;
  531. }
  532. private List<String> rePatentSource() {
  533. List<String> rePatentSource = new ArrayList<>();
  534. rePatentSource.add("patent_no");
  535. rePatentSource.add("app_no");
  536. rePatentSource.add("app_date");
  537. rePatentSource.add("public_no");
  538. rePatentSource.add("public_date");
  539. rePatentSource.add("grant_no");
  540. rePatentSource.add("grant_date");
  541. rePatentSource.add("title");
  542. rePatentSource.add("project_id");
  543. return rePatentSource;
  544. }
  545. /**
  546. * 检索上一页下一页信息
  547. *
  548. * @param queryRequest 检索条件
  549. * @return
  550. */
  551. public Records getPatentPageMessage(QueryRequest queryRequest) throws Exception {
  552. List<PatentPageMessageVO> patentPageMessageVOS = new ArrayList<>();
  553. Long current = queryRequest.getCurrent();
  554. Long size = queryRequest.getSize();
  555. EsPatentCommonVO esPatentCommonVO = esService.tranPatentRequestToComVO(queryRequest);
  556. esPatentCommonVO.setStartNum(current);
  557. esPatentCommonVO.setEndNum(current + size);
  558. esPatentCommonVO.setCurrent(null);
  559. esPatentCommonVO.setSize(null);
  560. SearchRequest.Builder builder = esService.getCommonPatent(esPatentCommonVO);
  561. Records records = new Records();
  562. SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
  563. List<Hit<Patent>> hits = response.hits().hits();
  564. for (Hit<Patent> hit : hits) {
  565. PatentPageMessageVO patentPageMessageVO = new PatentPageMessageVO();
  566. patentPageMessageVO.setPatentNo(hit.source().getPatentNo());
  567. patentPageMessageVOS.add(patentPageMessageVO);
  568. }
  569. long total = 0L;
  570. if (StringUtils.isNotEmpty(esPatentCommonVO.getEsField())) {
  571. Aggregate aggregate = response.aggregations().get("count");
  572. total = aggregate.cardinality().value();
  573. } else {
  574. total = response.hits().total().value();
  575. }
  576. records.setTotal(total);
  577. records.setSize(size);
  578. records.setCurrent(current);
  579. records.setData(patentPageMessageVOS);
  580. return records;
  581. }
  582. /**
  583. * 检索上一页下一页信息
  584. *
  585. * @param queryRequest 检索条件
  586. * @return
  587. */
  588. public List<Patent> getPatentsWithNotNo(QueryRequest queryRequest, List<String> patentNos) throws Exception {
  589. List<Patent> patentList = new ArrayList<>();
  590. SearchRequest.Builder builder = new SearchRequest.Builder();
  591. Long current = queryRequest.getCurrent();
  592. Long size = queryRequest.getSize();
  593. //设置查询索引
  594. builder.index("patent");
  595. Query q = this.getQuery(queryRequest);
  596. Query reQuery = null;
  597. if (patentNos != null && patentNos.size() > 0) {
  598. List<Query> notInQuery = this.getNoNotInQuery(patentNos);
  599. reQuery = QueryBuilders.bool(i -> i.must(q).mustNot(notInQuery));
  600. } else {
  601. reQuery = QueryBuilders.bool(i -> i.must(q));
  602. }
  603. //4. 返回数据
  604. builder.query(reQuery);
  605. if (current > 0 && size > 0) {
  606. builder.from(current.intValue() - 1).size(size.intValue());
  607. }
  608. List<String> reSources = this.rePatentSource();
  609. builder.source(sourceOptionsBuilder -> sourceOptionsBuilder
  610. .filter(fieldSourceBuilder -> fieldSourceBuilder
  611. .includes(reSources)));
  612. SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
  613. List<Hit<Patent>> hits = response.hits().hits();
  614. for (Hit<Patent> hit : hits) {
  615. if (hits != null && hits.size() > 0) {
  616. Patent patent = hit.source();
  617. patentList.add(patent);
  618. }
  619. }
  620. return patentList;
  621. }
  622. public Long getTotalNum(QueryRequest queryRequest) throws Exception {
  623. SearchRequest.Builder builder = new SearchRequest.Builder();
  624. //设置查询索引
  625. builder.index("patent");
  626. Query q = this.getQuery(queryRequest);
  627. //4. 返回数据
  628. Query reQuery = QueryBuilders.bool(i -> i.must(q));
  629. builder.query(reQuery);
  630. List<String> reSources = this.rePatentSource();
  631. builder.source(sourceOptionsBuilder -> sourceOptionsBuilder
  632. .filter(fieldSourceBuilder -> fieldSourceBuilder
  633. .includes(reSources)));
  634. SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
  635. return response.hits().total().value();
  636. }
  637. public Query getQuery(QueryRequest queryRequest) throws Exception {
  638. String searchCondition = "";
  639. Integer projectId = queryRequest.getProjectId();
  640. Integer taskId = queryRequest.getTaskId();
  641. //判断表达式
  642. if (queryRequest instanceof StringRequest) {
  643. searchCondition = ((StringRequest) queryRequest).getSearchQuery();
  644. } else if (queryRequest instanceof MapRequest) {
  645. Map<String, Object> map = ((MapRequest) queryRequest).getSearchQuery();
  646. StringBuilder stringBuilder = new StringBuilder();
  647. for (String key : map.keySet()) {
  648. Object value = map.get(key);
  649. if (!"".contentEquals(stringBuilder)) {
  650. stringBuilder = stringBuilder.append(" AND ").append(key).append("=").append(value);
  651. } else {
  652. stringBuilder = stringBuilder.append(key).append("=").append(value);
  653. }
  654. }
  655. searchCondition = stringBuilder.toString();
  656. }
  657. if (taskId != null) {
  658. if (searchCondition != null && !"".equals(searchCondition.trim())) {
  659. searchCondition = "taskId = " + taskId + " AND " + searchCondition;
  660. } else {
  661. searchCondition = "taskId = " + taskId;
  662. }
  663. } else if (projectId != null) {
  664. if (searchCondition != null && !"".equals(searchCondition.trim())) {
  665. searchCondition = "projectId = " + projectId + " AND " + searchCondition;
  666. } else {
  667. searchCondition = "projectId = " + projectId;
  668. }
  669. }
  670. List<EsCustomFieldValueDTO> customFields = queryRequest.getCustomFields();
  671. if (!CollectionUtils.isEmpty(customFields)) {
  672. String customFieldCondition = esService.parseCustomField(customFields, projectId, taskId);
  673. if (StringUtils.isNotEmpty(searchCondition)) {
  674. searchCondition = searchCondition + " AND " + customFieldCondition;
  675. } else {
  676. searchCondition = customFieldCondition;
  677. }
  678. }
  679. //1. 解析检索条件
  680. treeNode tree = expressManager.getInstance().Parse(searchCondition, false);
  681. //格式化检索式
  682. //3. 从es中检索数据
  683. Query q = formatQueryService.EsQueryToQuery((operateNode) tree, "patent", null);
  684. return q;
  685. }
  686. public List<Query> getNoNotInQuery(List<String> patentNos) {
  687. List<Query> queryList = new ArrayList<>();
  688. for (String patentNo : patentNos) {
  689. Query q1 = QueryBuilders.term(t -> t.field("patent_no.keyword").value(patentNo));
  690. queryList.add(q1);
  691. }
  692. return queryList;
  693. }
  694. public Query getEntireNotInQuery(EsPatentCommonVO commonVO) throws Exception {
  695. Integer projectId = commonVO.getProjectId();
  696. Integer productId = commonVO.getProductId();
  697. Integer taskId = commonVO.getTaskId();
  698. String searchCondition = commonVO.getSearchCondition();
  699. String productFrom = commonVO.getProductFrom();
  700. List<EsCustomFieldValueDTO> customFields = commonVO.getCustomFields();
  701. List<String> patentNos = commonVO.getIsDelete();
  702. if (!CollectionUtils.isEmpty(customFields)) {
  703. String customFieldCondition = esService.parseCustomField(customFields, projectId, taskId);
  704. if (StringUtils.isNotEmpty(searchCondition)) {
  705. searchCondition = searchCondition + " AND " + customFieldCondition;
  706. } else {
  707. searchCondition = customFieldCondition;
  708. }
  709. }
  710. String condition = esService.appendIdsCondition(searchCondition, taskId, productFrom, projectId, productId);
  711. //1. 解析检索条件
  712. treeNode tree = expressManager.getInstance().Parse(condition, false);
  713. //3. 从es中检索数据
  714. Query q = formatQueryService.EsQueryToQuery((operateNode) tree, "patent", projectId);
  715. Query reQuery = null;
  716. if (patentNos != null && patentNos.size() > 0) {
  717. List<Query> notInQuery = this.getNoNotInQuery(patentNos);
  718. reQuery = QueryBuilders.bool(i -> i.must(q).mustNot(notInQuery));
  719. } else {
  720. reQuery = q;
  721. }
  722. return reQuery;
  723. }
  724. /**
  725. * 根据id查询
  726. *
  727. * @param ids
  728. * @return
  729. * @throws Exception
  730. */
  731. public List<Hit<Patent>> getById(List<String> ids) throws Exception {
  732. List<Hit<Patent>> patents = new ArrayList<>();
  733. SearchRequest.Builder builder = new SearchRequest.Builder();
  734. builder.index("patent");
  735. Query q = QueryBuilders.ids(i -> i.values(ids));
  736. builder.query(q);
  737. SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
  738. long total = response.hits().total().value();
  739. if (total > 0) {
  740. patents = response.hits().hits();
  741. }
  742. return patents;
  743. }
  744. public void removeById(String id) throws IOException {
  745. DeleteResponse deleteResponse = client.delete(deleteRequest ->
  746. deleteRequest.index("patent").id(id)
  747. );
  748. }
  749. public List<PatentNoWithIdVO> getPatentIdsWithNotNo(QueryRequest queryRequest, List<String> patentNos, Long startNum, Long endNum) throws Exception {
  750. List<PatentNoWithIdVO> patentWithIdVOS = new ArrayList<>();
  751. EsPatentCommonVO esPatentCommonVO = esService.tranPatentRequestToComVO(queryRequest);
  752. esPatentCommonVO.setIsDelete(patentNos);
  753. esPatentCommonVO.setStartNum(startNum);
  754. esPatentCommonVO.setEndNum(endNum);
  755. SearchRequest.Builder builder = esService.getCommonPatent(esPatentCommonVO);
  756. SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
  757. List<Hit<Patent>> hits = response.hits().hits();
  758. for (Hit<Patent> hit : hits) {
  759. if ((patentNos == null || patentNos.size() == 0) || (!patentNos.contains(hit.source().getPatentNo()))) {
  760. PatentNoWithIdVO patentWithIdVO = new PatentNoWithIdVO();
  761. patentWithIdVO.setId(hit.id());
  762. patentWithIdVO.setPatentNo(hit.source().getPatentNo());
  763. patentWithIdVOS.add(patentWithIdVO);
  764. }
  765. }
  766. return patentWithIdVOS;
  767. }
  768. //根据专利号模糊查询
  769. public List<Integer> getProjectIds(String patentNo) throws Exception {
  770. List<Integer> projectIds = new ArrayList<>();
  771. List<Patent> patentList = new ArrayList<>();
  772. SearchRequest.Builder builder = new SearchRequest.Builder();
  773. //设置查询索引
  774. builder.index("patent");
  775. String searchPatentNo = "*" + patentNo + "*";
  776. Query q1 = QueryBuilders.wildcard(i -> i.field("app_no.keyword").value(searchPatentNo));
  777. //公开号
  778. Query q2 = QueryBuilders.wildcard(t -> t.field("public_no.keyword").value(searchPatentNo));
  779. //授权号
  780. Query q3 = QueryBuilders.wildcard(t -> t.field("grant_no.keyword").value(searchPatentNo));
  781. Query query = QueryBuilders.bool(i -> i.should(q1, q2, q3));
  782. Query query1 = QueryBuilders.hasParent(i -> i.parentType("patent").query(query));
  783. Query query2 = QueryBuilders.exists(i -> i.field("project_id"));
  784. Query finalQuery = QueryBuilders.bool((i -> i.must(query1, query2)));
  785. builder.query(finalQuery);
  786. List<String> reSources = this.rePatentSource();
  787. builder.source(sourceOptionsBuilder -> sourceOptionsBuilder
  788. .filter(fieldSourceBuilder -> fieldSourceBuilder
  789. .includes(reSources)));
  790. builder.from(0).size(1000);
  791. FieldCollapse collapse = FieldCollapse.of(i -> i.field("project_id"));
  792. builder.collapse(collapse);
  793. builder.trackTotalHits(i -> i.enabled(true));
  794. SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
  795. List<Hit<Patent>> hits = response.hits().hits();
  796. if (hits != null && hits.size() > 0) {
  797. hits.forEach(item -> {
  798. Patent patent = item.source();
  799. projectIds.add(patent.getProjectId());
  800. }
  801. );
  802. }
  803. return projectIds;
  804. }
  805. }