EsPatentService.java 50 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205
  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.es.GetVectorVO;
  10. import cn.cslg.pas.common.model.request.MapRequest;
  11. import cn.cslg.pas.common.model.request.OrderDTO;
  12. import cn.cslg.pas.common.model.request.QueryRequest;
  13. import cn.cslg.pas.common.model.request.StringRequest;
  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.common.vo.es.EsPatentCommonVO;
  28. import cn.cslg.pas.domain.es.*;
  29. import cn.cslg.pas.exception.ExceptionEnum;
  30. import cn.cslg.pas.exception.XiaoShiException;
  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.ElasticsearchException;
  40. import co.elastic.clients.elasticsearch._types.SortOptions;
  41. import co.elastic.clients.elasticsearch._types.SortOrder;
  42. import co.elastic.clients.elasticsearch._types.aggregations.Aggregate;
  43. import co.elastic.clients.elasticsearch._types.aggregations.StringTermsBucket;
  44. import co.elastic.clients.elasticsearch._types.query_dsl.Query;
  45. import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders;
  46. import co.elastic.clients.elasticsearch.core.DeleteByQueryRequest;
  47. import co.elastic.clients.elasticsearch.core.DeleteResponse;
  48. import co.elastic.clients.elasticsearch.core.SearchRequest;
  49. import co.elastic.clients.elasticsearch.core.SearchResponse;
  50. import co.elastic.clients.elasticsearch.core.search.FieldCollapse;
  51. import co.elastic.clients.elasticsearch.core.search.Hit;
  52. import com.alibaba.fastjson.JSON;
  53. import com.alibaba.fastjson.JSONArray;
  54. import com.alibaba.fastjson2.JSONObject;
  55. import lombok.RequiredArgsConstructor;
  56. import org.apache.commons.lang3.ObjectUtils;
  57. import org.apache.commons.lang3.StringUtils;
  58. import org.apache.ibatis.javassist.runtime.Desc;
  59. import org.springframework.beans.BeanUtils;
  60. import org.springframework.beans.factory.annotation.Autowired;
  61. import org.springframework.context.annotation.Lazy;
  62. import org.springframework.stereotype.Service;
  63. import org.springframework.util.CollectionUtils;
  64. import java.io.IOException;
  65. import java.text.ParseException;
  66. import java.util.*;
  67. import java.util.stream.Collectors;
  68. @Service
  69. @RequiredArgsConstructor(onConstructor_ = {@Lazy})
  70. public class EsPatentService {
  71. private final ElasticsearchClient client;
  72. private final FormatQueryService formatQueryService;
  73. @Autowired
  74. private PermissionService permissionService;
  75. @Autowired
  76. private FileManagerService fileManagerService;
  77. @Autowired
  78. private ProductMapper productMapper;
  79. @Autowired
  80. private ProductCategoryMapper productCategoryMapper;
  81. @Autowired
  82. private ProductService productService;
  83. @Autowired
  84. @Lazy
  85. private EsService esService;
  86. /**
  87. * 根据专利号查询专利详情
  88. *
  89. * @param vo
  90. * @return
  91. * @throws IOException
  92. */
  93. public PatentColumnDTO selectPatentDetail(PatentNoVO vo) throws IOException {
  94. PatentColumnDTO dto = new PatentColumnDTO();
  95. SearchRequest.Builder builder = new SearchRequest.Builder();
  96. //设置查询索引
  97. builder.index("patent");
  98. Query q1 = QueryBuilders.term(t -> t.field("patent_no.keyword").value(vo.getPatentNo()));
  99. Query query = QueryBuilders.bool(i -> i.should(q1));
  100. builder.query(query);
  101. SearchResponse<Patent> response = null;
  102. try {
  103. response = client.search(builder.build(), Patent.class);
  104. } catch (Exception e) {
  105. throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "ES检索失败");
  106. }
  107. List<Hit<Patent>> hits = response.hits().hits();
  108. for (Hit<Patent> hit : hits) {
  109. Patent esMess = hit.source();
  110. dto = esService.getPatentColumnDTO(esMess, vo.getProjectId(), hit.id(), "");
  111. //格式化权利要求
  112. List<Text> claims = dto.getClaim();
  113. if (claims != null && claims.size() > 0) {
  114. claims.forEach(item -> {
  115. item.setTextContent(PatentRightUtils.getFormatClaim(item.getTextContent(), item.getLanguage()));
  116. });
  117. }
  118. if (esMess.getPatentNo().equals(vo.getPatentNo())) {
  119. break;
  120. }
  121. }
  122. dto.setPictureGuid(FormatUtil.getPictureFormat(dto.getAppNo()));
  123. List<LegalEvent> legalEvents = this.getLegalEvents(vo.getPatentNo());
  124. dto.setLegalEvents(legalEvents);
  125. return dto;
  126. }
  127. public List<LegalEvent> getLegalEvents(String patentNo) throws IOException {
  128. List<LegalEvent> events = new ArrayList<>();
  129. SearchRequest.Builder builder = new SearchRequest.Builder();
  130. //设置查询索引
  131. builder.index("legal_event");
  132. List<Query> queries = new ArrayList<>();
  133. Query q1 = QueryBuilders.term(i -> i.field("app_no").value(patentNo));
  134. queries.add(q1);
  135. Query q2 = QueryBuilders.term(i -> i.field("public_no").value(patentNo));
  136. queries.add(q2);
  137. Query q3 = QueryBuilders.term(i -> i.field("grant_no").value(patentNo));
  138. queries.add(q3);
  139. if (!CollectionUtils.isEmpty(queries)) {
  140. Query query = QueryBuilders.bool(i -> i.should(queries));
  141. builder.query(query);
  142. SearchResponse<LegalEvent> response = null;
  143. try {
  144. response = client.search(builder.build(), LegalEvent.class);
  145. } catch (Exception e) {
  146. throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "ES检索失败");
  147. }
  148. List<Hit<LegalEvent>> hits = response.hits().hits();
  149. for (Hit<LegalEvent> hit : hits) {
  150. LegalEvent event = hit.source();
  151. events.add(event);
  152. }
  153. }
  154. events = events.stream().sorted(Comparator.comparing(LegalEvent::getEventDate).reversed()).collect(Collectors.toList());
  155. return events;
  156. }
  157. //通用返回摘要、标题、权利要求具体内容
  158. public ContentVO loadContent(List<Text> list) {
  159. ContentVO contentVO = new ContentVO();
  160. String content = StringUtils.strip(JSON.toJSONString(list), "[]");
  161. ContentDetailDTO contentDetailDTO = JSONObject.parseObject(content, ContentDetailDTO.class);
  162. contentVO.setContent(contentDetailDTO.getTextContent());
  163. return contentVO;
  164. }
  165. //通用返回申请人、权利人、发明人
  166. public List<String> loadName(List<PatentPerson> list) {
  167. List<String> collect = new ArrayList<>();
  168. if (!CollectionUtils.isEmpty(list)) {
  169. collect = list.stream().filter(i -> StringUtils.isNotEmpty(i.getName())).map(PatentPerson::getName).collect(Collectors.toList());
  170. }
  171. return collect;
  172. }
  173. //通用返回合并申请人、合并权利人、合并发明人
  174. public List<String> loadMergeName(List<PatentMergePerson> list) {
  175. List<String> collect = new ArrayList<>();
  176. if (!CollectionUtils.isEmpty(list)) {
  177. collect = list.stream().map(PatentMergePerson::getName).distinct().collect(Collectors.toList());
  178. }
  179. return collect;
  180. }
  181. //获取合并申请人
  182. public List<String> getMergeApp(Integer projectId, String id) throws IOException {
  183. SearchRequest.Builder builder = new SearchRequest.Builder();
  184. //设置查询索引
  185. builder.index("patent");
  186. Query q1 = QueryBuilders.term(i -> i.field("merge_applicant.project_id").value(projectId));
  187. Query exist1 = QueryBuilders.exists(i -> i.field("merge_applicant"));
  188. Query bool = QueryBuilders.bool(i -> i.must(q1, exist1));
  189. Query nested = QueryBuilders.nested(i -> i.path("merge_applicant").query(bool));
  190. Query ids = QueryBuilders.ids(i -> i.values(Arrays.asList(id)));
  191. Query query = QueryBuilders.hasParent(i -> i.parentType("patent").query(ids));
  192. Query q = QueryBuilders.bool(i -> i.must(nested, query));
  193. builder.query(q);
  194. SearchResponse<Patent> response = null;
  195. try {
  196. response = client.search(builder.build(), Patent.class);
  197. } catch (IOException e) {
  198. throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "ES检索失败");
  199. }
  200. List<Hit<Patent>> hits = response.hits().hits();
  201. List<PatentMergePerson> list = new ArrayList<>();
  202. for (Hit<Patent> hit : hits) {
  203. Patent patent = hit.source();
  204. if (!CollectionUtils.isEmpty(patent.getMergeApplicant())) {
  205. list.addAll(patent.getMergeApplicant());
  206. }
  207. }
  208. List<String> data = new ArrayList<>();
  209. if (!CollectionUtils.isEmpty(list)) {
  210. data = this.loadMergeName(list);
  211. }
  212. return data;
  213. }
  214. //获取合并权利人
  215. public List<String> getMergeRight(Integer projectId, String id) throws IOException {
  216. SearchRequest.Builder builder = new SearchRequest.Builder();
  217. //设置查询索引
  218. builder.index("patent");
  219. Query q1 = QueryBuilders.term(i -> i.field("merge_right_holder.project_id").value(projectId));
  220. Query exist1 = QueryBuilders.exists(i -> i.field("merge_right_holder"));
  221. Query bool = QueryBuilders.bool(i -> i.must(q1, exist1));
  222. Query nested = QueryBuilders.nested(i -> i.path("merge_right_holder").query(bool));
  223. Query ids = QueryBuilders.ids(i -> i.values(Arrays.asList(id)));
  224. Query query = QueryBuilders.hasParent(i -> i.parentType("patent").query(ids));
  225. Query q = QueryBuilders.bool(i -> i.must(nested, query));
  226. builder.query(q);
  227. SearchResponse<Patent> response = null;
  228. try {
  229. response = client.search(builder.build(), Patent.class);
  230. } catch (IOException e) {
  231. throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "ES检索失败");
  232. }
  233. List<Hit<Patent>> hits = response.hits().hits();
  234. List<PatentMergePerson> list = new ArrayList<>();
  235. for (Hit<Patent> hit : hits) {
  236. Patent patent = hit.source();
  237. if (!CollectionUtils.isEmpty(patent.getMergeRightHolder())) {
  238. list.addAll(patent.getMergeRightHolder());
  239. }
  240. }
  241. List<String> data = new ArrayList<>();
  242. if (!CollectionUtils.isEmpty(list)) {
  243. data = this.loadMergeName(list);
  244. }
  245. return data;
  246. }
  247. //获取合并发明人
  248. public List<String> getMergeInventor(Integer projectId, String id) throws IOException {
  249. SearchRequest.Builder builder = new SearchRequest.Builder();
  250. //设置查询索引
  251. builder.index("patent");
  252. Query q1 = QueryBuilders.term(i -> i.field("merge_inventor.project_id").value(projectId));
  253. Query exist1 = QueryBuilders.exists(i -> i.field("merge_inventor"));
  254. Query bool = QueryBuilders.bool(i -> i.must(q1, exist1));
  255. Query nested = QueryBuilders.nested(i -> i.path("merge_inventor").query(bool));
  256. Query ids = QueryBuilders.ids(i -> i.values(Arrays.asList(id)));
  257. Query query = QueryBuilders.hasParent(i -> i.parentType("patent").query(ids));
  258. Query q = QueryBuilders.bool(i -> i.must(nested, query));
  259. builder.query(q);
  260. SearchResponse<Patent> response = null;
  261. try {
  262. response = client.search(builder.build(), Patent.class);
  263. } catch (IOException e) {
  264. throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "ES检索失败");
  265. }
  266. List<Hit<Patent>> hits = response.hits().hits();
  267. List<PatentMergePerson> list = new ArrayList<>();
  268. for (Hit<Patent> hit : hits) {
  269. Patent patent = hit.source();
  270. if (!CollectionUtils.isEmpty(patent.getMergeInventor())) {
  271. list.addAll(patent.getMergeInventor());
  272. }
  273. }
  274. List<String> data = new ArrayList<>();
  275. if (!CollectionUtils.isEmpty(list)) {
  276. data = this.loadMergeName(list);
  277. }
  278. return data;
  279. }
  280. /**
  281. * 获得中国专利pdf全文
  282. *
  283. * @param appNo
  284. * @return
  285. * @throws IOException
  286. */
  287. public List<InnerPatentPdfDTO> getTextPdf(String appNo) throws IOException {
  288. List<InnerPatentPdfDTO> list = new ArrayList<>();
  289. //公开说明书pdf
  290. String pdfFormat1 = FormatUtil.getPDFFormat(appNo, 0);
  291. //授权说明书pdf
  292. String pdfFormat2 = FormatUtil.getPDFFormat(appNo, 1);
  293. //查询文件是否存在
  294. List<SystemFile> systemFiles = new ArrayList<>();
  295. try {
  296. String res = fileManagerService.getSystemFileFromFMS(Arrays.asList(pdfFormat1, pdfFormat2));
  297. systemFiles = com.alibaba.fastjson.JSONObject.parseArray(res, SystemFile.class);
  298. } catch (Exception e) {
  299. }
  300. if (!CollectionUtils.isEmpty(systemFiles)) {
  301. SystemFile systemFile1 = systemFiles.stream().filter(item -> item.getGuid().equals(pdfFormat1)).findFirst().orElse(null);
  302. SystemFile systemFile2 = systemFiles.stream().filter(item -> item.getGuid().equals(pdfFormat2)).findFirst().orElse(null);
  303. if (systemFile1 != null) {
  304. InnerPatentPdfDTO dto = new InnerPatentPdfDTO();
  305. dto.setPdfGuid(pdfFormat1);
  306. dto.setType(0);
  307. list.add(dto);
  308. }
  309. if (systemFile2 != null) {
  310. InnerPatentPdfDTO dto = new InnerPatentPdfDTO();
  311. dto.setPdfGuid(pdfFormat2);
  312. dto.setType(1);
  313. list.add(dto);
  314. }
  315. }
  316. return list;
  317. }
  318. /**
  319. * 获取附图
  320. *
  321. * @param appNo
  322. * @return
  323. */
  324. public List<String> getFigure(String appNo) throws IOException {
  325. List<String> list = new ArrayList<>();
  326. String guids = fileManagerService.getPatentPictureGuids(appNo);
  327. if (StringUtils.isNotEmpty(guids)) {
  328. JSONObject jsonObject = JSONObject.parseObject(guids);
  329. String data = jsonObject.get("data").toString();
  330. if (StringUtils.isNotEmpty(data)) {
  331. list = JSONArray.parseArray(data, String.class);
  332. }
  333. }
  334. return list;
  335. }
  336. /**
  337. * 根据专利号查询出同族专利列表
  338. *
  339. * @param vo
  340. * @return
  341. * @throws IOException
  342. */
  343. public Records selectKinByPatentNo(PatentKinVO vo) throws IOException {
  344. //1.根据专利号查询出同族
  345. String no = vo.getNo();
  346. Integer pageNum = vo.getPageNum();
  347. Integer pageSize = vo.getPageSize();
  348. String type = vo.getType();
  349. String patentNo = vo.getPatentNo();
  350. SearchRequest.Builder builder = new SearchRequest.Builder();
  351. //设置查询索引
  352. builder.index("patent_family");
  353. //申请号
  354. Query q1 = QueryBuilders.term(t -> t.field("patent.app_no").value(no));
  355. //公开号
  356. Query q2 = QueryBuilders.term(t -> t.field("patent.public_no").value(no));
  357. //授权号
  358. Query q3 = QueryBuilders.term(t -> t.field("patent.grant_no").value(no));
  359. //同族类型
  360. Query q4 = QueryBuilders.term(t -> t.field("family_type").value(type));
  361. Query q = QueryBuilders.bool(i -> i.should(q1, q2, q3));
  362. Query bool = QueryBuilders.bool(i -> i.must(q4, q));
  363. builder.query(bool);
  364. //分页
  365. if (pageNum > 0 && pageSize > 0) {
  366. builder.from((pageNum - 1) * pageSize).size(pageSize);
  367. }
  368. SearchResponse<PatentFamilyMessage> response = null;
  369. try {
  370. response = client.search(builder.build(), PatentFamilyMessage.class);
  371. } catch (Exception e) {
  372. throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "ES检索失败");
  373. }
  374. List<Hit<PatentFamilyMessage>> hits = response.hits().hits();
  375. List<PatentKinDTO> kinDTOS = new ArrayList<>();
  376. for (Hit<PatentFamilyMessage> hit : hits) {
  377. PatentFamilyMessage familyMessage = hit.source();
  378. List<FamilyPatent> patentList = familyMessage.getPatent();
  379. if (!CollectionUtils.isEmpty(patentList)) {
  380. for (FamilyPatent familyPatent : patentList) {
  381. PatentKinDetailVO kinDetailVO = new PatentKinDetailVO();
  382. kinDetailVO.setPageNum(vo.getPageNum());
  383. kinDetailVO.setPageSize(vo.getPageSize());
  384. kinDetailVO.setAppNo(familyPatent.getAppNo());
  385. kinDetailVO.setPublicNo(familyPatent.getPublicNo());
  386. kinDetailVO.setGrantNo(familyPatent.getGrantNo());
  387. if (StringUtils.isNotEmpty(patentNo)) {
  388. PatentKinDTO kinDTO = this.selectPatentKindDetail(kinDetailVO, patentNo)
  389. .stream().findFirst().orElse(null);
  390. if (kinDTO != null) {
  391. kinDTOS.add(kinDTO);
  392. }
  393. break;
  394. } else {
  395. PatentKinDTO kinDTO = this.selectPatentKindDetail(kinDetailVO, patentNo)
  396. .stream().findFirst().orElse(null);
  397. if (kinDTO != null) {
  398. kinDTOS.add(kinDTO);
  399. }
  400. }
  401. }
  402. }
  403. }
  404. Records records = new Records();
  405. records.setCurrent(vo.getPageNum().longValue());
  406. records.setSize(vo.getPageSize().longValue());
  407. records.setData(kinDTOS);
  408. records.setTotal(Long.valueOf(String.valueOf(kinDTOS.size())));
  409. return records;
  410. }
  411. public List<PatentKinDTO> selectPatentKindDetail(PatentKinDetailVO vo, String patentNo) throws IOException {
  412. Integer pageNum = vo.getPageNum();
  413. Integer pageSize = vo.getPageSize();
  414. List<PatentKinDTO> list = new ArrayList<>();
  415. SearchRequest.Builder builder = new SearchRequest.Builder();
  416. //设置查询索引
  417. builder.index("patent");
  418. //申请号
  419. Query q1 = null;
  420. if (StringUtils.isNotEmpty(vo.getAppNo())) {
  421. q1 = QueryBuilders.term(t -> t.field("app_no.keyword").value(vo.getAppNo()));
  422. }
  423. //公开号
  424. Query q2 = null;
  425. if (StringUtils.isNotEmpty(vo.getPublicNo())) {
  426. q2 = QueryBuilders.term(t -> t.field("public_no.keyword").value(vo.getPublicNo()));
  427. }
  428. //授权号
  429. // Query q3 = QueryBuilders.term(t -> t.field("patent_no.keyword").value(vo.getGrantNo()));
  430. Query bool = null;
  431. Query query1 = q1;
  432. Query query2 = q2;
  433. if (StringUtils.isNotEmpty(patentNo)) {
  434. String str = "*";
  435. String s = str.concat(patentNo).concat("*");
  436. Query query = QueryBuilders.wildcard(i -> i.field("patent_no.keyword").value(s));
  437. if (query1 != null && query2 == null) {
  438. bool = QueryBuilders.bool(i -> i.should(query1).must(query));
  439. } else if (query2 != null && query1 == null) {
  440. bool = QueryBuilders.bool(i -> i.should(query2).must(query));
  441. } else {
  442. bool = QueryBuilders.bool(i -> i.should(query1, query2).must(query));
  443. }
  444. } else {
  445. if (query1 != null && query2 == null) {
  446. bool = QueryBuilders.bool(i -> i.should(query1));
  447. } else if (query2 != null && query1 == null) {
  448. bool = QueryBuilders.bool(i -> i.should(query2));
  449. } else {
  450. bool = QueryBuilders.bool(i -> i.should(query1, query2));
  451. }
  452. }
  453. builder.query(bool);
  454. //分页
  455. // if (pageNum > 0 && pageSize > 0) {
  456. // builder.from((pageNum - 1) * pageSize).size(pageSize);
  457. // }
  458. SearchResponse<Patent> response = null;
  459. try {
  460. response = client.search(builder.build(), Patent.class);
  461. } catch (Exception e) {
  462. throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "ES检索失败");
  463. }
  464. List<Hit<Patent>> hits = response.hits().hits();
  465. for (Hit<Patent> hit : hits) {
  466. PatentKinDTO kinDTO = new PatentKinDTO();
  467. Patent patent = hit.source();
  468. if (patent != null) {
  469. kinDTO.setPatentNo(patent.getPatentNo());
  470. kinDTO.setAppNo(patent.getAppNo());
  471. kinDTO.setPublicNo(patent.getPublicNo());
  472. kinDTO.setGrantNo(patent.getGrantNo());
  473. kinDTO.setTitle(patent.getTitle());
  474. kinDTO.setAbstractStr(patent.getAbstractStr());
  475. kinDTO.setApplicant(this.loadName(patent.getApplicant()));
  476. kinDTO.setRightHolder(this.loadName(patent.getRightHolder()));
  477. kinDTO.setPictureGuid(FormatUtil.getPictureFormat(kinDTO.getAppNo()));
  478. list.add(kinDTO);
  479. }
  480. }
  481. return list;
  482. }
  483. /**
  484. * 根据专利号查询出商品化专利
  485. *
  486. * @param vo
  487. * @return
  488. * @throws IOException
  489. */
  490. public Object selectProductByPatentNo(SelectProductVO vo) throws Exception {
  491. String patentNo = vo.getPatentNo();
  492. QueryRequest queryRequest = new QueryRequest();
  493. if (ObjectUtils.isNotEmpty(vo.getQueryRequest())) {
  494. queryRequest = vo.getQueryRequest();
  495. }
  496. List<Integer> productIds = new ArrayList<>();
  497. SearchRequest.Builder builder = new SearchRequest.Builder();
  498. //设置查询索引
  499. builder.index("patent");
  500. //申请号
  501. Query q1 = QueryBuilders.term(t -> t.field("app_no.keyword").value(patentNo));
  502. //公开号
  503. Query q2 = QueryBuilders.term(t -> t.field("public_no.keyword").value(patentNo));
  504. //授权号
  505. Query q3 = QueryBuilders.term(t -> t.field("grant_no.keyword").value(patentNo));
  506. Query bool = QueryBuilders.bool(i -> i.should(q1, q2, q3));
  507. Query q = QueryBuilders.exists(i -> i.field("product_id"));
  508. Query query = QueryBuilders.hasParent(parent -> parent.parentType("patent").query(bool));
  509. Query bool1 = QueryBuilders.bool(i -> i.must(q, query));
  510. builder.query(bool1);
  511. SearchResponse<Patent> response = null;
  512. try {
  513. response = client.search(builder.build(), Patent.class);
  514. } catch (Exception e) {
  515. throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "ES检索失败");
  516. }
  517. List<Hit<Patent>> hits = response.hits().hits();
  518. for (Hit<Patent> hit : hits) {
  519. Patent patent = hit.source();
  520. if (patent.getProductId() != null) {
  521. productIds.add(patent.getProductId());
  522. }
  523. }
  524. queryRequest.setProductIds(productIds.stream().distinct().collect(Collectors.toList()));
  525. return productService.selectProduct(queryRequest);
  526. }
  527. /**
  528. * 根据专利号批量查询专利
  529. *
  530. * @param patentNos
  531. * @return
  532. * @throws Exception
  533. */
  534. public List<Patent> getPatentsByNo(List<String> patentNos, Boolean ifGetAll, Long current, Long size) throws Exception {
  535. List<Patent> patentList = new ArrayList<>();
  536. if (patentNos == null || patentNos.size() == 0) {
  537. return patentList;
  538. }
  539. SearchRequest.Builder builder = new SearchRequest.Builder();
  540. //设置查询索引
  541. builder.index("patent");
  542. List<Query> querys = new ArrayList<>();
  543. for (String patentNo : patentNos) {
  544. Query q1 = QueryBuilders.term(t -> t.field("patent_no.keyword").value(patentNo));
  545. Query query = QueryBuilders.bool(i -> i.should(q1));
  546. querys.add(query);
  547. }
  548. Query finalQuery = QueryBuilders.bool((i -> i.should(querys)));
  549. builder.query(finalQuery);
  550. if (!ifGetAll) {
  551. List<String> reSources = this.rePatentSource();
  552. builder.source(sourceOptionsBuilder -> sourceOptionsBuilder
  553. .filter(fieldSourceBuilder -> fieldSourceBuilder
  554. .includes(reSources)));
  555. }
  556. if (current != null && size != null && current > 0 && size > 0) {
  557. builder.from((current.intValue() - 1) * size.intValue()).size(size.intValue());
  558. } else {
  559. builder.from(0).size(10000);
  560. }
  561. SearchResponse<Patent> response = null;
  562. try {
  563. response = client.search(builder.build(), Patent.class);
  564. } catch (Exception e) {
  565. throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "ES检索失败");
  566. }
  567. List<Hit<Patent>> hits = response.hits().hits();
  568. if (hits != null && hits.size() > 0) {
  569. hits.forEach(item -> {
  570. Patent patent = item.source();
  571. patentList.add(patent);
  572. }
  573. );
  574. }
  575. return patentList;
  576. }
  577. public List<PatentColumnDTO> getPatentsByNo1(List<String> patentNos, Boolean ifGetAll, Long current, Long size, Integer projectId) throws Exception {
  578. List<PatentColumnDTO> patentList = new ArrayList<>();
  579. if (patentNos == null || patentNos.size() == 0) {
  580. return patentList;
  581. }
  582. SearchRequest.Builder builder = new SearchRequest.Builder();
  583. //设置查询索引
  584. builder.index("patent");
  585. List<Query> querys = new ArrayList<>();
  586. for (String patentNo : patentNos) {
  587. Query q1 = QueryBuilders.term(t -> t.field("app_no.keyword").value(patentNo));
  588. //公开号
  589. Query q2 = QueryBuilders.term(t -> t.field("public_no.keyword").value(patentNo));
  590. //授权号
  591. Query q3 = QueryBuilders.term(t -> t.field("grant_no.keyword").value(patentNo));
  592. Query query = QueryBuilders.bool(i -> i.should(q1, q2, q3));
  593. querys.add(query);
  594. }
  595. Query finalQuery = QueryBuilders.bool((i -> i.should(querys)));
  596. builder.query(finalQuery);
  597. if (!ifGetAll) {
  598. List<String> reSources = this.rePatentSource();
  599. builder.source(sourceOptionsBuilder -> sourceOptionsBuilder
  600. .filter(fieldSourceBuilder -> fieldSourceBuilder
  601. .includes(reSources)));
  602. }
  603. if (current != null && size != null && current > 0 && size > 0) {
  604. builder.from((current.intValue() - 1) * size.intValue()).size(size.intValue());
  605. } else {
  606. builder.from(0).size(10000);
  607. }
  608. SearchResponse<Patent> response = null;
  609. try {
  610. response = client.search(builder.build(), Patent.class);
  611. } catch (Exception e) {
  612. throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "ES检索失败");
  613. }
  614. List<Hit<Patent>> hits = response.hits().hits();
  615. if (hits != null && hits.size() > 0) {
  616. hits.forEach(item -> {
  617. Patent patent = item.source();
  618. String id = item.id();
  619. PatentColumnDTO columnDTO = esService.getPatentColumnDTO(patent, projectId, id, "1");
  620. patentList.add(columnDTO);
  621. }
  622. );
  623. }
  624. return patentList;
  625. }
  626. private List<String> rePatentSource() {
  627. List<String> rePatentSource = new ArrayList<>();
  628. rePatentSource.add("patent_no");
  629. rePatentSource.add("app_no");
  630. rePatentSource.add("app_date");
  631. rePatentSource.add("public_no");
  632. rePatentSource.add("public_date");
  633. rePatentSource.add("grant_no");
  634. rePatentSource.add("grant_date");
  635. rePatentSource.add("title");
  636. rePatentSource.add("project_id");
  637. rePatentSource.add("applicant");
  638. rePatentSource.add("abstract_str");
  639. return rePatentSource;
  640. }
  641. /**
  642. * 检索上一页下一页信息
  643. *
  644. * @param queryRequest 检索条件
  645. * @return
  646. */
  647. public Records getPatentPageMessage(QueryRequest queryRequest) throws Exception {
  648. List<PatentPageMessageVO> patentPageMessageVOS = new ArrayList<>();
  649. Long current = queryRequest.getCurrent();
  650. Long size = queryRequest.getSize();
  651. EsPatentCommonVO esPatentCommonVO = esService.tranPatentRequestToComVO(queryRequest);
  652. esPatentCommonVO.setStartNum(current);
  653. esPatentCommonVO.setEndNum(current + size);
  654. esPatentCommonVO.setCurrent(null);
  655. esPatentCommonVO.setSize(null);
  656. SearchRequest.Builder builder = esService.getCommonPatent(esPatentCommonVO);
  657. Records records = new Records();
  658. SearchResponse<Patent> response = null;
  659. try {
  660. response = client.search(builder.build(), Patent.class);
  661. } catch (Exception e) {
  662. throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "ES检索失败");
  663. }
  664. List<Hit<Patent>> hits = response.hits().hits();
  665. for (Hit<Patent> hit : hits) {
  666. PatentPageMessageVO patentPageMessageVO = new PatentPageMessageVO();
  667. patentPageMessageVO.setPatentNo(hit.source().getPatentNo());
  668. patentPageMessageVOS.add(patentPageMessageVO);
  669. }
  670. long total = 0L;
  671. if (StringUtils.isNotEmpty(esPatentCommonVO.getEsField())) {
  672. Aggregate aggregate = response.aggregations().get("count");
  673. total = aggregate.cardinality().value();
  674. } else {
  675. total = response.hits().total().value();
  676. }
  677. records.setTotal(total);
  678. records.setSize(size);
  679. records.setCurrent(current);
  680. records.setData(patentPageMessageVOS);
  681. return records;
  682. }
  683. /**
  684. * 检索上一页下一页信息
  685. *
  686. * @param queryRequest 检索条件
  687. * @return
  688. */
  689. public List<Patent> getPatentsWithNotNo(QueryRequest queryRequest, List<String> patentNos) throws Exception {
  690. List<Patent> patentList = new ArrayList<>();
  691. SearchRequest.Builder builder = new SearchRequest.Builder();
  692. Long current = queryRequest.getCurrent();
  693. Long size = queryRequest.getSize();
  694. //设置查询索引
  695. builder.index("patent");
  696. Query q = this.getQuery(queryRequest);
  697. Query reQuery = null;
  698. if (patentNos != null && patentNos.size() > 0) {
  699. List<Query> notInQuery = this.getNoNotInQuery(patentNos);
  700. reQuery = QueryBuilders.bool(i -> i.must(q).mustNot(notInQuery));
  701. } else {
  702. reQuery = QueryBuilders.bool(i -> i.must(q));
  703. }
  704. //4. 返回数据
  705. builder.query(reQuery);
  706. if (current > 0 && size > 0) {
  707. builder.from(current.intValue() - 1).size(size.intValue());
  708. }
  709. List<String> reSources = this.rePatentSource();
  710. builder.source(sourceOptionsBuilder -> sourceOptionsBuilder
  711. .filter(fieldSourceBuilder -> fieldSourceBuilder
  712. .includes(reSources)));
  713. SearchResponse<Patent> response = null;
  714. try {
  715. response = client.search(builder.build(), Patent.class);
  716. } catch (Exception e) {
  717. throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "ES检索失败");
  718. }
  719. List<Hit<Patent>> hits = response.hits().hits();
  720. for (Hit<Patent> hit : hits) {
  721. if (hits != null && hits.size() > 0) {
  722. Patent patent = hit.source();
  723. patentList.add(patent);
  724. }
  725. }
  726. return patentList;
  727. }
  728. public Long getTotalNum(QueryRequest queryRequest) throws Exception {
  729. SearchRequest.Builder builder = new SearchRequest.Builder();
  730. //设置查询索引
  731. builder.index("patent");
  732. Query q = this.getQuery(queryRequest);
  733. //4. 返回数据
  734. Query reQuery = QueryBuilders.bool(i -> i.must(q));
  735. builder.query(reQuery);
  736. List<String> reSources = this.rePatentSource();
  737. builder.source(sourceOptionsBuilder -> sourceOptionsBuilder
  738. .filter(fieldSourceBuilder -> fieldSourceBuilder
  739. .includes(reSources)));
  740. SearchResponse<Patent> response = null;
  741. try {
  742. response = client.search(builder.build(), Patent.class);
  743. } catch (Exception e) {
  744. throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "ES检索失败");
  745. }
  746. return response.hits().total().value();
  747. }
  748. public Query getQuery(QueryRequest queryRequest) throws Exception {
  749. String searchCondition = "";
  750. Integer projectId = queryRequest.getProjectId();
  751. Integer taskId = queryRequest.getTaskId();
  752. //判断表达式
  753. if (queryRequest instanceof StringRequest) {
  754. searchCondition = ((StringRequest) queryRequest).getSearchQuery();
  755. } else if (queryRequest instanceof MapRequest) {
  756. Map<String, Object> map = ((MapRequest) queryRequest).getSearchQuery();
  757. StringBuilder stringBuilder = new StringBuilder();
  758. for (String key : map.keySet()) {
  759. Object value = map.get(key);
  760. if (!"".contentEquals(stringBuilder)) {
  761. stringBuilder = stringBuilder.append(" AND ").append(key).append("=").append(value);
  762. } else {
  763. stringBuilder = stringBuilder.append(key).append("=").append(value);
  764. }
  765. }
  766. searchCondition = stringBuilder.toString();
  767. }
  768. if (taskId != null) {
  769. if (searchCondition != null && !"".equals(searchCondition.trim())) {
  770. searchCondition = "taskId = " + taskId + " AND " + searchCondition;
  771. } else {
  772. searchCondition = "taskId = " + taskId;
  773. }
  774. } else if (projectId != null) {
  775. if (searchCondition != null && !"".equals(searchCondition.trim())) {
  776. searchCondition = "projectId = " + projectId + " AND " + searchCondition;
  777. } else {
  778. searchCondition = "projectId = " + projectId;
  779. }
  780. }
  781. List<EsCustomFieldValueDTO> customFields = queryRequest.getCustomFields();
  782. if (!CollectionUtils.isEmpty(customFields)) {
  783. String customFieldCondition = esService.parseCustomField(customFields, projectId, taskId);
  784. if (StringUtils.isNotEmpty(searchCondition)) {
  785. searchCondition = searchCondition + " AND " + customFieldCondition;
  786. } else {
  787. searchCondition = customFieldCondition;
  788. }
  789. }
  790. //1. 解析检索条件
  791. treeNode tree = expressManager.getInstance().Parse(searchCondition, false);
  792. //格式化检索式
  793. //3. 从es中检索数据
  794. Query q = formatQueryService.EsQueryToQuery((operateNode) tree, "patent", null);
  795. return q;
  796. }
  797. public List<Query> getNoNotInQuery(List<String> patentNos) {
  798. List<Query> queryList = new ArrayList<>();
  799. for (String patentNo : patentNos) {
  800. Query q1 = QueryBuilders.term(t -> t.field("patent_no.keyword").value(patentNo));
  801. queryList.add(q1);
  802. }
  803. return queryList;
  804. }
  805. public Query getEntireNotInQuery(EsPatentCommonVO commonVO) throws Exception {
  806. Integer projectId = commonVO.getProjectId();
  807. Integer productId = commonVO.getProductId();
  808. Integer taskId = commonVO.getTaskId();
  809. String searchCondition = commonVO.getSearchCondition();
  810. String productFrom = commonVO.getProductFrom();
  811. List<EsCustomFieldValueDTO> customFields = commonVO.getCustomFields();
  812. List<String> patentNos = commonVO.getIsDelete();
  813. if (!CollectionUtils.isEmpty(customFields)) {
  814. String customFieldCondition = esService.parseCustomField(customFields, projectId, taskId);
  815. if (StringUtils.isNotEmpty(searchCondition)) {
  816. searchCondition = searchCondition + " AND " + customFieldCondition;
  817. } else {
  818. searchCondition = customFieldCondition;
  819. }
  820. }
  821. String condition = esService.appendIdsCondition(searchCondition, taskId, productFrom, projectId, productId);
  822. Query q = null;
  823. if (StringUtils.isEmpty(condition)) {
  824. q = QueryBuilders.exists(i -> i.field("patent_no"));
  825. } else {
  826. //1. 解析检索条件
  827. treeNode tree = expressManager.getInstance().Parse(condition, false);
  828. //3. 从es中检索数据
  829. q = formatQueryService.EsQueryToQuery((operateNode) tree, "patent", projectId);
  830. }
  831. Query finalQ = q;
  832. Query reQuery = null;
  833. if (patentNos != null && patentNos.size() > 0) {
  834. List<Query> notInQuery = this.getNoNotInQuery(patentNos);
  835. reQuery = QueryBuilders.bool(i -> i.must(finalQ).mustNot(notInQuery));
  836. } else {
  837. reQuery = q;
  838. }
  839. return reQuery;
  840. }
  841. /**
  842. * 根据id查询
  843. *
  844. * @param ids
  845. * @return
  846. * @throws Exception
  847. */
  848. public List<Hit<Patent>> getById(List<String> ids) throws Exception {
  849. List<Hit<Patent>> patents = new ArrayList<>();
  850. SearchRequest.Builder builder = new SearchRequest.Builder();
  851. builder.index("patent");
  852. Query q = QueryBuilders.ids(i -> i.values(ids));
  853. builder.query(q);
  854. SearchResponse<Patent> response = null;
  855. try {
  856. response = client.search(builder.build(), Patent.class);
  857. } catch (Exception e) {
  858. throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "ES检索失败");
  859. }
  860. long total = response.hits().total().value();
  861. if (total > 0) {
  862. patents = response.hits().hits();
  863. }
  864. return patents;
  865. }
  866. public void removeById(String id) throws IOException {
  867. DeleteResponse deleteResponse = client.delete(deleteRequest ->
  868. deleteRequest.index("patent").id(id)
  869. );
  870. }
  871. public List<PatentNoWithIdVO> getPatentIdsWithNotNo(QueryRequest queryRequest, List<String> patentNos, Long startNum, Long endNum) throws Exception {
  872. List<PatentNoWithIdVO> patentWithIdVOS = new ArrayList<>();
  873. EsPatentCommonVO esPatentCommonVO = esService.tranPatentRequestToComVO(queryRequest);
  874. esPatentCommonVO.setIsDelete(patentNos);
  875. esPatentCommonVO.setStartNum(startNum);
  876. esPatentCommonVO.setEndNum(endNum);
  877. SearchRequest.Builder builder = esService.getCommonPatent(esPatentCommonVO);
  878. SearchResponse<Patent> response = null;
  879. try {
  880. response = client.search(builder.build(), Patent.class);
  881. } catch (Exception e) {
  882. throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "ES检索失败");
  883. }
  884. List<Hit<Patent>> hits = response.hits().hits();
  885. for (Hit<Patent> hit : hits) {
  886. if ((patentNos == null || patentNos.size() == 0) || (!patentNos.contains(hit.source().getPatentNo()))) {
  887. PatentNoWithIdVO patentWithIdVO = new PatentNoWithIdVO();
  888. patentWithIdVO.setId(hit.id());
  889. patentWithIdVO.setPatentNo(hit.source().getPatentNo());
  890. patentWithIdVOS.add(patentWithIdVO);
  891. }
  892. }
  893. return patentWithIdVOS;
  894. }
  895. //根据专利号模糊查询
  896. public List<Integer> getProjectIds(String patentNo) throws Exception {
  897. List<Integer> projectIds = new ArrayList<>();
  898. List<Patent> patentList = new ArrayList<>();
  899. SearchRequest.Builder builder = new SearchRequest.Builder();
  900. //设置查询索引
  901. builder.index("patent");
  902. String searchPatentNo = "*" + patentNo + "*";
  903. Query q1 = QueryBuilders.wildcard(i -> i.field("app_no.keyword").value(searchPatentNo));
  904. //公开号
  905. Query q2 = QueryBuilders.wildcard(t -> t.field("public_no.keyword").value(searchPatentNo));
  906. //授权号
  907. Query q3 = QueryBuilders.wildcard(t -> t.field("grant_no.keyword").value(searchPatentNo));
  908. Query query = QueryBuilders.bool(i -> i.should(q1, q2, q3));
  909. Query query1 = QueryBuilders.hasParent(i -> i.parentType("patent").query(query));
  910. Query query2 = QueryBuilders.exists(i -> i.field("project_id"));
  911. Query finalQuery = QueryBuilders.bool((i -> i.must(query1, query2)));
  912. builder.query(finalQuery);
  913. List<String> reSources = this.rePatentSource();
  914. builder.source(sourceOptionsBuilder -> sourceOptionsBuilder
  915. .filter(fieldSourceBuilder -> fieldSourceBuilder
  916. .includes(reSources)));
  917. builder.from(0).size(1000);
  918. FieldCollapse collapse = FieldCollapse.of(i -> i.field("project_id"));
  919. builder.collapse(collapse);
  920. builder.trackTotalHits(i -> i.enabled(true));
  921. SearchResponse<Patent> response = null;
  922. try {
  923. response = client.search(builder.build(), Patent.class);
  924. } catch (Exception e) {
  925. throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "ES检索失败");
  926. }
  927. List<Hit<Patent>> hits = response.hits().hits();
  928. if (hits != null && hits.size() > 0) {
  929. hits.forEach(item -> {
  930. Patent patent = item.source();
  931. projectIds.add(patent.getProjectId());
  932. }
  933. );
  934. }
  935. return projectIds;
  936. }
  937. public PatentNoWithIdVO addPatentToProject(PatentNoWithIdVO patentWithIdVO, Integer projectId) {
  938. try {
  939. String patentId = patentWithIdVO.getId();
  940. if (patentId == null) {
  941. PatentWithIdVO patentWithIdVO1 = esService.getIdByPatentNo(patentWithIdVO.getPatentNo());
  942. patentId = patentWithIdVO1.getId();
  943. }
  944. Boolean ifInproject = esService.searchPatent(patentId, projectId);
  945. if (!ifInproject) {
  946. Patent patentChild = new Patent();
  947. PatentJoin patentJoin = new PatentJoin();
  948. patentJoin.setParent(patentId);
  949. patentJoin.setName("project");
  950. patentChild.setPatentJoin(patentJoin);
  951. patentChild.setProjectId(projectId);
  952. esService.addChildPatent(patentChild, patentId);
  953. }
  954. return patentWithIdVO;
  955. } catch (Exception e) {
  956. throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, e.getMessage());
  957. }
  958. }
  959. /**
  960. * lrj
  961. * 为导入专利向量建立的方法,不具有普遍性,其他功能勿用
  962. *
  963. * @param queryRequest
  964. * @return
  965. * @throws Exception
  966. */
  967. public PatentDTO getPatentforVector(QueryRequest queryRequest) throws Exception {
  968. PatentDTO dto = new PatentDTO();
  969. Integer projectId = queryRequest.getProjectId();
  970. Long current = queryRequest.getCurrent();
  971. Long size = queryRequest.getSize();
  972. SearchRequest.Builder builder = new SearchRequest.Builder();
  973. //设置查询索引
  974. builder.index("patent");
  975. List<String> reSources = new ArrayList<>();
  976. reSources.add("abstract_str");
  977. reSources.add("abstract_vector");
  978. reSources.add("patent_no");
  979. builder.source(sourceOptionsBuilder -> sourceOptionsBuilder
  980. .filter(fieldSourceBuilder -> fieldSourceBuilder
  981. .includes(reSources)));
  982. //解除最大条数限制
  983. builder.trackTotalHits(i -> i.enabled(true));
  984. Query query = null;
  985. if (projectId != null) {
  986. query = QueryBuilders.hasChild(child -> child.type("project")
  987. .query(org.springframework.data.elasticsearch.client.elc.QueryBuilders.matchQueryAsQuery("project_id", projectId.toString(), null, null)));
  988. } else {
  989. query = QueryBuilders.exists(i -> i.field("patent_no"));
  990. }
  991. SearchResponse<Patent> response = null;
  992. builder.query(query);
  993. if (current > 0 && size > 0) {
  994. builder.from((current.intValue() - 1) * size.intValue()).size(size.intValue());
  995. }
  996. SortOptions sortOptions = SortOptions.of(i -> i.field(j -> j.field("patent_no.keyword").order(SortOrder.Desc).missing(-1)));
  997. builder.sort(sortOptions);
  998. try {
  999. response = client.search(builder.build(), Patent.class);
  1000. } catch (Exception e) {
  1001. // e.printStackTrace();
  1002. throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "检索错误,请检查检索式");
  1003. }
  1004. List<PatentColumnDTO> list = new ArrayList<>();
  1005. List<Hit<Patent>> hits = response.hits().hits();
  1006. long total = 0L;
  1007. total = response.hits().total().value();
  1008. for (Hit<Patent> hit : hits) {
  1009. String id = hit.id();
  1010. Patent esMess = hit.source();
  1011. PatentColumnDTO columnDTO = new PatentColumnDTO();
  1012. BeanUtils.copyProperties(esMess, columnDTO);
  1013. columnDTO.setPatentId(id);
  1014. list.add(columnDTO);
  1015. }
  1016. dto.setTotal(total);
  1017. dto.setPatents(list);
  1018. dto.setPageNum(current);
  1019. dto.setPageSize(size);
  1020. return dto;
  1021. }
  1022. public Integer removeByNo(String no) {
  1023. Query query = QueryBuilders.term(t -> t.field("patent_no.keyword").value(no));
  1024. DeleteByQueryRequest request = DeleteByQueryRequest.of(i -> i.index("patent").refresh(true).query(query)
  1025. .refresh(true));
  1026. try {
  1027. client.deleteByQuery(request);
  1028. return 1;
  1029. } catch (IOException e) {
  1030. throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "删除失败");
  1031. }
  1032. }
  1033. //获取合并申请人
  1034. public List<PatentMergePerson> getMergeApp2(Integer projectId, String id) throws IOException {
  1035. SearchRequest.Builder builder = new SearchRequest.Builder();
  1036. //设置查询索引
  1037. builder.index("patent");
  1038. Query q1 = QueryBuilders.term(i -> i.field("merge_applicat.project_id").value(projectId));
  1039. Query exist1 = QueryBuilders.exists(i -> i.field("merge_applicat"));
  1040. Query bool = QueryBuilders.bool(i -> i.must(q1, exist1));
  1041. Query nested = QueryBuilders.nested(i -> i.path("merge_applicat").query(bool));
  1042. Query ids = QueryBuilders.ids(i -> i.values(Arrays.asList(id)));
  1043. Query query = QueryBuilders.hasParent(i -> i.parentType("patent").query(ids));
  1044. Query q = QueryBuilders.bool(i -> i.must(nested, query));
  1045. builder.query(q);
  1046. SearchResponse<Patent> response = null;
  1047. try {
  1048. response = client.search(builder.build(), Patent.class);
  1049. } catch (IOException e) {
  1050. throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "ES检索失败");
  1051. }
  1052. List<Hit<Patent>> hits = response.hits().hits();
  1053. List<PatentMergePerson> list = new ArrayList<>();
  1054. for (Hit<Patent> hit : hits) {
  1055. Patent patent = hit.source();
  1056. if (!CollectionUtils.isEmpty(patent.getMergeApplicant())) {
  1057. list.addAll(patent.getMergeApplicant());
  1058. }
  1059. }
  1060. return list;
  1061. }
  1062. //获取合并权利人
  1063. public List<PatentMergePerson> getMergeRight2(Integer projectId, String id) throws IOException {
  1064. SearchRequest.Builder builder = new SearchRequest.Builder();
  1065. //设置查询索引
  1066. builder.index("patent");
  1067. Query q1 = QueryBuilders.term(i -> i.field("merge_right_holder.project_id").value(projectId));
  1068. Query exist1 = QueryBuilders.exists(i -> i.field("merge_right_holder"));
  1069. Query bool = QueryBuilders.bool(i -> i.must(q1, exist1));
  1070. Query nested = QueryBuilders.nested(i -> i.path("merge_right_holder").query(bool));
  1071. Query ids = QueryBuilders.ids(i -> i.values(Arrays.asList(id)));
  1072. Query query = QueryBuilders.hasParent(i -> i.parentType("patent").query(ids));
  1073. Query q = QueryBuilders.bool(i -> i.must(nested, query));
  1074. builder.query(q);
  1075. SearchResponse<Patent> response = null;
  1076. try {
  1077. response = client.search(builder.build(), Patent.class);
  1078. } catch (IOException e) {
  1079. throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "ES检索失败");
  1080. }
  1081. List<Hit<Patent>> hits = response.hits().hits();
  1082. List<PatentMergePerson> list = new ArrayList<>();
  1083. for (Hit<Patent> hit : hits) {
  1084. Patent patent = hit.source();
  1085. if (!CollectionUtils.isEmpty(patent.getMergeRightHolder())) {
  1086. list.addAll(patent.getMergeRightHolder());
  1087. }
  1088. }
  1089. return list;
  1090. }
  1091. //获取合并发明人
  1092. public List<PatentMergePerson> getMergeInventor2(Integer projectId, String id) throws IOException {
  1093. SearchRequest.Builder builder = new SearchRequest.Builder();
  1094. //设置查询索引
  1095. builder.index("patent");
  1096. Query q1 = QueryBuilders.term(i -> i.field("merge_inventor.project_id").value(projectId));
  1097. Query exist1 = QueryBuilders.exists(i -> i.field("merge_inventor"));
  1098. Query bool = QueryBuilders.bool(i -> i.must(q1, exist1));
  1099. Query nested = QueryBuilders.nested(i -> i.path("merge_inventor").query(bool));
  1100. Query ids = QueryBuilders.ids(i -> i.values(Arrays.asList(id)));
  1101. Query query = QueryBuilders.hasParent(i -> i.parentType("patent").query(ids));
  1102. Query q = QueryBuilders.bool(i -> i.must(nested, query));
  1103. builder.query(q);
  1104. SearchResponse<Patent> response = null;
  1105. try {
  1106. response = client.search(builder.build(), Patent.class);
  1107. } catch (IOException e) {
  1108. throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "ES检索失败");
  1109. }
  1110. List<Hit<Patent>> hits = response.hits().hits();
  1111. List<PatentMergePerson> list = new ArrayList<>();
  1112. for (Hit<Patent> hit : hits) {
  1113. Patent patent = hit.source();
  1114. if (!CollectionUtils.isEmpty(patent.getMergeInventor())) {
  1115. list.addAll(patent.getMergeInventor());
  1116. }
  1117. }
  1118. return list;
  1119. }
  1120. }