EsPatentService.java 36 KB

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