GetPatentStarPartService.java 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465
  1. package cn.cslg.pas.service.getPatentStarPart;
  2. import cn.cslg.pas.common.model.dto.GetPatentStarPartDTO;
  3. import cn.cslg.pas.common.model.dto.PatentDTO;
  4. import cn.cslg.pas.common.model.outApi.PatentStarListDto;
  5. import cn.cslg.pas.common.model.vo.KeyValueVO;
  6. import cn.cslg.pas.common.model.vo.PageVO;
  7. import cn.cslg.pas.common.model.vo.UploadParamsVO;
  8. import cn.cslg.pas.common.model.vo.outApi.StarPatentVO;
  9. import cn.cslg.pas.domain.*;
  10. import cn.cslg.pas.service.outApi.PatentStarApiService;
  11. import cn.cslg.pas.service.upLoadPatent.ExcutePatentDataStar;
  12. import com.alibaba.fastjson.JSON;
  13. import lombok.RequiredArgsConstructor;
  14. import lombok.extern.slf4j.Slf4j;
  15. import org.apache.commons.codec.binary.Base64;
  16. import org.apache.commons.lang3.StringUtils;
  17. import org.springframework.stereotype.Service;
  18. import java.io.ByteArrayOutputStream;
  19. import java.io.IOException;
  20. import java.io.InputStream;
  21. import java.net.URL;
  22. import java.sql.SQLException;
  23. import java.util.*;
  24. import java.util.stream.Collectors;
  25. /**
  26. * 获取专利之星专利某部分(如权要、说明书等一项)业务层
  27. *
  28. * @Author chenyu
  29. * @Date 2023/6/30
  30. */
  31. @Slf4j
  32. @Service
  33. @RequiredArgsConstructor
  34. public class GetPatentStarPartService {
  35. private final ExcutePatentDataStar excutePatentDataStar;
  36. private final PatentStarApiService patentStarApiService;
  37. /**
  38. * 根据专利号或申请号获取专利指定部分项
  39. *
  40. * @param getPatentStarPartDTO 前端传输DTO对象
  41. * @return 返回装载着指定专利项的对象
  42. */
  43. public PatentDTO getPatentPart(GetPatentStarPartDTO getPatentStarPartDTO) throws IOException, SQLException {
  44. log.info("开始处理【根据专利号或申请号获取专利指定部分项】的业务,参数为:{}", getPatentStarPartDTO);
  45. Integer patentCell = getPatentStarPartDTO.getPatentCell();
  46. String appNo = getPatentStarPartDTO.getAppNo();
  47. String patentNo = getPatentStarPartDTO.getPatentNo();
  48. PatentDTO patentDTO;
  49. if (patentCell == 1) {
  50. patentDTO = getParentRight(appNo); //拿权要
  51. } else if (patentCell == 2) {
  52. patentDTO = getInstructionText(appNo); //拿说明书文本
  53. } else if (patentCell == 3) {
  54. patentDTO = getInstructionPDF(appNo, patentNo); //拿说明书pdf
  55. } else if (patentCell == 4) {
  56. patentDTO = getPatentImage(appNo); //拿摘要附图
  57. } else if (patentCell == 5) {
  58. patentDTO = getSimpleFamily(getPatentStarPartDTO); //拿同族专利信息
  59. } else if (patentCell == 6) {
  60. patentDTO = getAffair(appNo); //拿法律事务信息
  61. } else {
  62. patentDTO = new PatentDTO();
  63. }
  64. return patentDTO;
  65. }
  66. /**
  67. * 获取专利之星专利的权要
  68. *
  69. * @param appNo 申请号
  70. * @return 返回装载着权要的对象
  71. */
  72. public PatentDTO getParentRight(String appNo) throws IOException {
  73. StarPatentVO starPatentVO = new StarPatentVO()
  74. .setApplicationNo(appNo);
  75. UploadParamsVO uploadParamsVO = new UploadParamsVO();
  76. //调用"获得中国专利全文文本"接口,处理xml格式权要
  77. excutePatentDataStar.setPatentClaim(starPatentVO, uploadParamsVO, null);
  78. PatentDTO patentDTO = new PatentDTO();
  79. ArrayList<PatentRight> patentRights = new ArrayList<>();
  80. patentRights.add(uploadParamsVO.getPatentRight());
  81. patentDTO.setRights(patentRights);
  82. return patentDTO;
  83. }
  84. /**
  85. * 获取专利之星专利的说明书文本
  86. *
  87. * @param appNo 申请号
  88. * @return 返回装载着说明书文本的对象
  89. */
  90. public PatentDTO getInstructionText(String appNo) throws IOException {
  91. StarPatentVO starPatentVO = new StarPatentVO()
  92. .setApplicationNo(appNo);
  93. UploadParamsVO uploadParamsVO = new UploadParamsVO();
  94. //调用"获得中国专利全文文本"接口,处理xml格式说明书文本
  95. excutePatentDataStar.setPatentInstructionText(starPatentVO, uploadParamsVO, null);
  96. PatentDTO patentDTO = new PatentDTO();
  97. patentDTO.setInstruction(uploadParamsVO.getPatentInstructionText());
  98. return patentDTO;
  99. }
  100. /**
  101. * 获取专利之星专利的说明书pdf
  102. *
  103. * @param patentNo 专利号(公开号)
  104. * @return 返回装载着说明书pdf的对象
  105. */
  106. public PatentDTO getInstructionPDF(String appNo, String patentNo) throws IOException, SQLException {
  107. String applicationNo = appNo + "";
  108. if (appNo.contains(".")) {
  109. appNo = appNo.substring(0, appNo.lastIndexOf("."));
  110. }
  111. ArrayList<PatentInstruction> patentInstructions = new ArrayList<>();
  112. PatentDTO patentDTO = new PatentDTO();
  113. String pdfUrl = "", pdfUrl1 = "", pdfUrl2 = "";
  114. if (patentNo.contains("CN")) {
  115. //调用"获得中国专利pdf"接口,获得公开和授权中的1个或2个url
  116. String pdfUrlStr = patentStarApiService.getCnPdfApi(appNo);
  117. //若没有取到说明书pdf,则将当前申请号和备注信息存入问题记录表,并返回空对象
  118. if (pdfUrlStr.equals("")) {
  119. excutePatentDataStar.recordQuestionPatent(applicationNo, null, 4);
  120. return new PatentDTO();
  121. }
  122. if (pdfUrlStr.contains("|http")) { //若两个都有
  123. String[] pdfUrlArr = pdfUrlStr.split("\\|http");
  124. pdfUrl1 = pdfUrlArr[0].substring(pdfUrlArr[0].indexOf("http"), pdfUrlArr[0].indexOf("?"));
  125. pdfUrlArr[1] = "http" + pdfUrlArr[1];
  126. pdfUrl2 = pdfUrlArr[1].substring(pdfUrlArr[1].indexOf("http"), pdfUrlArr[1].indexOf("?"));
  127. PatentInstruction patentInstruction = new PatentInstruction();
  128. PatentInstruction patentInstruction2 = new PatentInstruction();
  129. patentInstruction.setUrl(pdfUrl1);
  130. patentInstruction2.setUrl(pdfUrl2);
  131. patentInstruction.setPictureStringData(urlToBytes(pdfUrl1));
  132. patentInstruction2.setPictureStringData(urlToBytes(pdfUrl2));
  133. if (pdfUrl1.contains("0A_CN_0.pdf")) {
  134. patentInstruction.setType(1);
  135. patentInstruction2.setType(2);
  136. } else {
  137. patentInstruction.setType(2);
  138. patentInstruction2.setType(1);
  139. }
  140. patentInstructions.add(patentInstruction);
  141. patentInstructions.add(patentInstruction2);
  142. } else { //若只有一个
  143. pdfUrl1 = pdfUrlStr.substring(pdfUrlStr.indexOf("http"), pdfUrlStr.indexOf("?"));
  144. PatentInstruction patentInstruction = new PatentInstruction();
  145. patentInstruction.setUrl(pdfUrl1);
  146. patentInstruction.setPictureStringData(urlToBytes(pdfUrl1));
  147. if (pdfUrl1.contains("0A_CN_0.pdf")) {
  148. patentInstruction.setType(1);
  149. } else {
  150. patentInstruction.setType(2);
  151. }
  152. patentInstructions.add(patentInstruction);
  153. }
  154. } else {
  155. //根据专利号调用"获得世界专利pdf"接口,获得pdf的url地址
  156. pdfUrl = patentStarApiService.getEnPdfApi(patentNo);
  157. //若没有取到说明书pdf,则将当前申请号和备注信息存入问题记录表,并返回空对象
  158. if (pdfUrl.equals("") || pdfUrl.equals("{}")) {
  159. excutePatentDataStar.recordQuestionPatent(applicationNo, null, 4);
  160. return new PatentDTO();
  161. }
  162. PatentInstruction patentInstruction = new PatentInstruction();
  163. patentInstruction.setUrl(pdfUrl);
  164. patentInstruction.setPictureStringData(urlToBytes(pdfUrl));
  165. patentInstruction.setType(1);
  166. patentInstructions.add(patentInstruction);
  167. }
  168. patentDTO.setPdf(patentInstructions);
  169. return patentDTO;
  170. }
  171. /**
  172. * 获取专利之星专利的摘要附图
  173. *
  174. * @param appNo 申请号
  175. * @return 返回装载着摘要附图的对象
  176. */
  177. public PatentDTO getPatentImage(String appNo) {
  178. //以下 ↓调用的是"获得中国专利摘要附图"接口,获得摘要附图的url地址
  179. if (appNo.contains(".")) {
  180. appNo = appNo.substring(0, appNo.lastIndexOf("."));
  181. }
  182. String pictureUrl = patentStarApiService.getPictureApi(appNo);
  183. PatentDTO patentDTO = new PatentDTO();
  184. ArrayList<PatentImage> patentImages = new ArrayList<>();
  185. PatentImage patentImage = new PatentImage();
  186. patentImage.setUrl(pictureUrl);
  187. patentImages.add(patentImage);
  188. patentDTO.setImage(patentImages);
  189. return patentDTO;
  190. }
  191. /**
  192. * 获取专利之星专利的同族专利
  193. *
  194. * @param getPatentStarPartDTO 获取专利之星专利指定项DTO类
  195. * @return 返回装载着同族专利的对象集合
  196. */
  197. public PatentDTO getSimpleFamily(GetPatentStarPartDTO getPatentStarPartDTO) throws IOException {
  198. //从DTO中取出公开号、当前页、每页条数
  199. String patentNo = getPatentStarPartDTO.getPatentNo();
  200. Integer current = getPatentStarPartDTO.getCurrent();
  201. Integer size = getPatentStarPartDTO.getSize();
  202. PatentDTO patentDTO = new PatentDTO();
  203. PageVO pageVO = new PageVO()
  204. .setCurrent(current) //装载当前页
  205. .setSize(size); //装载每页条数
  206. try {
  207. //1.从同族接口获取同族号单
  208. String familyPatentNoStr = patentStarApiService.getFamilyByPubNoApi(patentNo);
  209. //若接口返回"no data"即没有同族号,则返回空集合同族信息
  210. if (familyPatentNoStr.equals("no data")) {
  211. pageVO.setRecords(new ArrayList<>())
  212. .setTotal(0);
  213. patentDTO.setFamilyPatentResult(pageVO);
  214. return patentDTO;
  215. }
  216. FamilyPatentNo familyPatentNo = JSON.parseObject(familyPatentNoStr, FamilyPatentNo.class);
  217. List<String> familyPatentNos = Arrays.asList(familyPatentNo.getFamilyinfo().split(";"));
  218. //装载总条数
  219. pageVO.setTotal(familyPatentNos.size());
  220. //2.根据分页条件截取需要位置的条数
  221. List<String> needShowFamilyPatentNos = pageBySubList(familyPatentNos, current, size);
  222. //3.拼接成检索式
  223. List<String> cNfamilyPatentNos = needShowFamilyPatentNos.stream().filter(item -> item.contains("CN")).collect(Collectors.toList());
  224. List<String> wDfamilyPatentNos = needShowFamilyPatentNos.stream().filter(item -> !item.contains("CN")).collect(Collectors.toList());
  225. String cNconditions = "", wDconditions = "";
  226. if (cNfamilyPatentNos.size() > 0) {
  227. cNconditions = "PN=(" + StringUtils.join(cNfamilyPatentNos, " OR ") + ")";
  228. }
  229. if (wDfamilyPatentNos.size() > 0) {
  230. wDconditions = "PN=(" + StringUtils.join(wDfamilyPatentNos, " OR ") + ")";
  231. }
  232. //根据专利的国家类型调用并使用对应的库(中国/世界库),返回这些同族号专利的著录相关数据(标题、申请人、权利人、摘要附图)
  233. List<StarPatentVO> cNpatents = new ArrayList<>();
  234. List<StarPatentVO> wDpatents = new ArrayList<>();
  235. if (!cNconditions.equals("")) {
  236. PatentStarListDto patentStarListDto = new PatentStarListDto()
  237. .setCurrentQuery(cNconditions)
  238. .setOrderBy("ID")
  239. .setOrderByType("DESC")
  240. .setPageNum(1)
  241. .setRowCount(size)
  242. .setDBType("CN");
  243. Map<String, Object> resultMap = patentStarApiService.patentStarSearchApi(patentStarListDto);
  244. if (resultMap == null || (Integer) resultMap.get("total") == 0) {
  245. for (String cNfamilyPatentNo : cNfamilyPatentNos) {
  246. cNpatents.add(new StarPatentVO().setPatentNo(cNfamilyPatentNo));
  247. }
  248. } else {
  249. cNpatents = (List<StarPatentVO>) resultMap.get("records");
  250. }
  251. }
  252. if (!wDconditions.equals("")) {
  253. PatentStarListDto patentStarListDto = new PatentStarListDto()
  254. .setCurrentQuery(wDconditions)
  255. .setOrderBy("ID")
  256. .setOrderByType("DESC")
  257. .setPageNum(1)
  258. .setRowCount(size)
  259. .setDBType("WD");
  260. Map<String, Object> resultMap = patentStarApiService.patentStarSearchApi(patentStarListDto);
  261. if (resultMap == null || (Integer) resultMap.get("total") == 0) {
  262. for (String wDfamilyPatentNo : wDfamilyPatentNos) {
  263. wDpatents.add(new StarPatentVO().setPatentNo(wDfamilyPatentNo));
  264. }
  265. } else {
  266. wDpatents = (List<StarPatentVO>) resultMap.get("records");
  267. }
  268. }
  269. //将中国和外国专利数据合并
  270. ArrayList<StarPatentVO> patents = new ArrayList<>();
  271. patents.addAll(cNpatents);
  272. patents.addAll(wDpatents);
  273. List<PatentSimpleFamilyLink> records = new ArrayList<>();
  274. for (StarPatentVO starPatent : patents) {
  275. PatentSimpleFamilyLink patentSimpleFamilyLink = new PatentSimpleFamilyLink();
  276. patentSimpleFamilyLink.setPatentNo(starPatent.getPatentNo()); //装载专利号
  277. patentSimpleFamilyLink.setPublicNo(starPatent.getPublicNo()); //装载公开号
  278. patentSimpleFamilyLink.setApplicationNo(starPatent.getApplicationNo()); //装载申请号
  279. patentSimpleFamilyLink.setPublicDate(starPatent.getPublicDate()); //装载公开日
  280. patentSimpleFamilyLink.setPublicAccreditDate(starPatent.getPublicAccreditDate()); //装载公告日
  281. patentSimpleFamilyLink.setName(starPatent.getName()); //装载标题
  282. //装载申请人和权利人
  283. ArrayList<PatentApplicant> patentApplicants = new ArrayList<>();
  284. //装载申请人
  285. if (starPatent.getApplicantStr() != null && !starPatent.getApplicantStr().equals("")) {
  286. String[] patentApplicantOriginalNames = starPatent.getApplicantStr().split(";");
  287. for (String patentApplicantOriginalName : patentApplicantOriginalNames) {
  288. PatentApplicant patentApplicant = new PatentApplicant();
  289. patentApplicant.setName(patentApplicantOriginalName);
  290. patentApplicant.setDataType(2);
  291. patentApplicants.add(patentApplicant); //装载申请人
  292. }
  293. }
  294. //装载权利人
  295. if (starPatent.getCurrentApplicantStr() != null && !starPatent.getCurrentApplicantStr().equals("")) {
  296. String[] patentApplicantCurrentNames = (starPatent.getCurrentApplicantStr().split(";"));
  297. for (String patentApplicantCurrentName : patentApplicantCurrentNames) {
  298. PatentApplicant patentApplicant = new PatentApplicant();
  299. patentApplicant.setName(patentApplicantCurrentName);
  300. patentApplicant.setDataType(1);
  301. patentApplicants.add(patentApplicant); //装载权利人
  302. }
  303. }
  304. patentSimpleFamilyLink.setApplicant(patentApplicants);
  305. records.add(patentSimpleFamilyLink);
  306. }
  307. pageVO.setRecords(records); //装载结果集
  308. patentDTO.setFamilyPatentResult(pageVO);
  309. } catch (Exception e) {
  310. pageVO.setRecords(new ArrayList<>())
  311. .setTotal(0);
  312. patentDTO.setFamilyPatentResult(pageVO);
  313. return patentDTO;
  314. }
  315. return patentDTO;
  316. }
  317. public PatentDTO getAffair(String appNo) throws IOException {
  318. PatentDTO patentDTO = new PatentDTO();
  319. if (appNo.contains(".")) {
  320. appNo = appNo.substring(0, appNo.lastIndexOf("."));
  321. }
  322. //以下 ↓装载的是调用"获得中国专利法律状态"接口返回的专利相关数据
  323. try {
  324. String cnLegalApiStr = patentStarApiService.getCnLegalApi(appNo);
  325. if (!cnLegalApiStr.equals("")) {
  326. List<ChinaLeagalStatus> chinaLeagalStatuses = JSON.parseArray(cnLegalApiStr, ChinaLeagalStatus.class);
  327. if (chinaLeagalStatuses != null && chinaLeagalStatuses.size() > 0) {
  328. ArrayList<KeyValueVO> lst = new ArrayList<>();
  329. HashMap<Integer, String> nameMap = new HashMap<>();
  330. HashMap<Integer, String> contentMap = new HashMap<>();
  331. nameMap.put(0, "发生日期");
  332. nameMap.put(1, "法律状态");
  333. nameMap.put(2, "详细法律状态");
  334. nameMap.put(3, "详细信息");
  335. for (ChinaLeagalStatus chinaLeagalStatus : chinaLeagalStatuses) {
  336. contentMap.put(0, chinaLeagalStatus.getLegalDate());
  337. contentMap.put(1, chinaLeagalStatus.getLegalStatus());
  338. contentMap.put(2, chinaLeagalStatus.getLegalStatusInfo());
  339. contentMap.put(3, chinaLeagalStatus.getDETAIL());
  340. ArrayList<KeyValueVO.InpadocData> inpadocDatas = new ArrayList<>();
  341. for (int i = 0; i < 4; i++) {
  342. KeyValueVO.InpadocData inpadocData = new KeyValueVO.InpadocData();
  343. inpadocData.setName(nameMap.get(i));
  344. inpadocData.setContent(contentMap.get(i));
  345. inpadocDatas.add(inpadocData);
  346. }
  347. KeyValueVO keyValueVO = new KeyValueVO();
  348. keyValueVO.setInpadocData(inpadocDatas);
  349. lst.add(keyValueVO);
  350. }
  351. ArrayList<PatentAffair> patentAffairs = new ArrayList<>();
  352. PatentAffair patentAffair = new PatentAffair();
  353. patentAffair.setInpadoc(lst);
  354. patentAffairs.add(patentAffair);
  355. patentDTO.setAffair(patentAffairs);
  356. }
  357. }
  358. } catch (Exception e) {
  359. return patentDTO;
  360. }
  361. return patentDTO;
  362. }
  363. public String urlToBytes(String pdfUrl) throws IOException {
  364. ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
  365. URL url = new URL(pdfUrl); //想要读取的url地址
  366. InputStream in = url.openStream();
  367. int bytesRead;
  368. byte[] buffer = new byte[8192];
  369. //读取url地址文件
  370. while ((bytesRead = in.read(buffer)) != -1) {
  371. outputStream.write(buffer, 0, bytesRead);
  372. }
  373. //关闭释放流
  374. in.close();
  375. byte[] bytes = outputStream.toByteArray();
  376. //BASE64Encoder encoder = new BASE64Encoder();
  377. //String data = encoder.encode(bytes);
  378. String data = Base64.encodeBase64String(bytes);
  379. return data;
  380. }
  381. /**
  382. * 根据分页信息,取同族号集合中分页区间内的同族号
  383. *
  384. * @param list 同族号集合
  385. * @param current 当前页
  386. * @param size 每页条数
  387. * @return 返回需要的同族号集合
  388. */
  389. public static List<String> pageBySubList(List<String> list, int current, int size) {
  390. int totalcount = list.size();
  391. int pagecount = 0;
  392. List<String> subList;
  393. int m = totalcount % size;
  394. if (m > 0) {
  395. pagecount = totalcount / size + 1;
  396. } else {
  397. pagecount = totalcount / size;
  398. }
  399. if (m == 0) {
  400. subList = list.subList((current - 1) * size, size * (current));
  401. } else {
  402. if (current == pagecount) {
  403. subList = list.subList((current - 1) * size, totalcount);
  404. } else {
  405. subList = list.subList((current - 1) * size, size * (current));
  406. }
  407. }
  408. return subList;
  409. }
  410. }