ExcuteTaskToPatentService.java 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609
  1. package cn.cslg.pas.service.upLoadPatent;
  2. import cn.cslg.pas.common.model.PatentCell;
  3. import cn.cslg.pas.common.model.dto.*;
  4. import cn.cslg.pas.common.model.vo.ProjectImportPatentVO;
  5. import cn.cslg.pas.common.model.vo.UploadParamsVO;
  6. import cn.cslg.pas.common.model.vo.UploadSettingVO;
  7. import cn.cslg.pas.common.utils.*;
  8. import cn.cslg.pas.domain.*;
  9. import cn.cslg.pas.domain.asso.AssoOsTaskQrtzTask;
  10. import cn.cslg.pas.exception.XiaoShiException;
  11. import cn.cslg.pas.service.OutInterfaceService;
  12. import cn.cslg.pas.service.TaskService;
  13. import cn.cslg.pas.service.UploadPatentBatchService;
  14. import cn.cslg.pas.service.asso.AssoOsTaskQrtzTaskService;
  15. import com.alibaba.fastjson.JSONObject;
  16. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  17. import com.spire.pdf.FileFormat;
  18. import com.spire.pdf.PdfDocument;
  19. import com.spire.pdf.PdfDocumentBase;
  20. import lombok.RequiredArgsConstructor;
  21. import lombok.extern.slf4j.Slf4j;
  22. import org.apache.commons.fileupload.FileItem;
  23. import org.apache.commons.fileupload.disk.DiskFileItemFactory;
  24. import org.apache.poi.ss.usermodel.Sheet;
  25. import org.springframework.beans.BeanUtils;
  26. import org.springframework.stereotype.Service;
  27. import org.springframework.web.multipart.MultipartFile;
  28. import org.springframework.web.multipart.commons.CommonsMultipartFile;
  29. import java.io.*;
  30. import java.util.ArrayList;
  31. import java.util.Arrays;
  32. import java.util.Date;
  33. import java.util.List;
  34. /**
  35. * 根据不同类型任务生成专利入消费者队列的业务层
  36. *
  37. * @Author chenyu
  38. * @Date 2023/6/12
  39. */
  40. @Slf4j
  41. @Service
  42. @RequiredArgsConstructor
  43. public class ExcuteTaskToPatentService implements Serializable {
  44. private final FileUtils fileUtils;
  45. private final ExcuteUploadSettingService excuteUploadSettingService;
  46. private final ExcuteDataToVOService excuteDataToVOService;
  47. private final PantentQueueService pantentQueueService;
  48. private final AssoOsTaskQrtzTaskService assoOsTaskQrtzTaskService;
  49. private final OutInterfaceService outInterfaceService;
  50. private final TaskService taskService;
  51. //TODO 工厂类
  52. public void taskToPatentQueue(Task task) throws IOException {
  53. //Excel导入任务
  54. if (task.getType() == 1) {
  55. excelTaskToPatentQueue(task);
  56. //EPO网站导入任务
  57. } else if (task.getType() == 3) {
  58. epoTaskToPatentQueue(task);
  59. }
  60. }
  61. /**
  62. * Excel导入专利
  63. *
  64. * @param task Excel导入专利任务
  65. */
  66. public void excelTaskToPatentQueue(Task task) throws IOException {
  67. //从任务中取出文件路径、总条数、成功条数、前台参数json
  68. String filePath = task.getUrl(); //相对路径
  69. filePath = fileUtils.getPath(filePath); //绝对路径
  70. Integer total = task.getTotal();
  71. int lastIndex = task.getSuccessNum();
  72. String json = task.getPramJson();
  73. ProjectImportPatentVO projectImportPatentVO = JsonUtils.jsonToPojo(json, ProjectImportPatentVO.class);
  74. //解析数据源类,通过数据来源id(如1:智慧芽)解析数据源配置文件,获得数据源配置文件对象jsonData
  75. List<UploadSettingVO.Column> jsonData = excuteUploadSettingService.ExcuteUploadSetting(projectImportPatentVO.getSourceId());
  76. //解析Excel文件获得工作簿
  77. Sheet sheet = ReadExcelUtils.readExcel(filePath);
  78. //遍历专利总数量,在循环中保存专利
  79. for (int i = lastIndex; i < total; i++) {
  80. PatentData patentData = ReadExcelUtils.readExcelOneRow(filePath, sheet, i + 1);
  81. //调用装载数据类,专利数据转换为VO对象
  82. UploadParamsVO uploadParamsVO = excuteDataToVOService.fileToPatentVO(patentData, jsonData);
  83. //专利入消费者队列,并唤醒消费者执行专利入库
  84. //patentToQueueAwakeConsumer(uploadParamsVO, projectImportPatentVO);
  85. pantentQueueService.patentToQueue(uploadParamsVO, projectImportPatentVO);
  86. }
  87. }
  88. /**
  89. * EPO网站导入专利
  90. *
  91. * @param task EPO网站导入专利
  92. */
  93. public void epoTaskToPatentQueue(Task task) throws IOException {
  94. Integer taskId = task.getId();
  95. List<AssoOsTaskQrtzTask> assoOsTaskQrtzTasks = assoOsTaskQrtzTaskService.list(new LambdaQueryWrapper<AssoOsTaskQrtzTask>().eq(AssoOsTaskQrtzTask::getTaskId, taskId));
  96. AssoOsTaskQrtzTask assoOsTaskQrtzTask = assoOsTaskQrtzTasks.get(0);
  97. Integer successNum = task.getSuccessNum();
  98. //从任务关联网站导入任务对象中取出下载字段、检索信息
  99. String cellsStr = assoOsTaskQrtzTask.getConfigCells();
  100. List<String> cells = Arrays.asList(cellsStr.split(","));
  101. String conditions = assoOsTaskQrtzTask.getConditions();
  102. //定义每次检索的专利数量(每次检索50件)
  103. int size = 50;
  104. //2.根据检索式conditions先检索一件专利著录信息【此操作主要是为了获得专利总数量count】
  105. // SerachBiblioData serachBiblioData = getSerachBiblioData(conditions, 1, 1);
  106. // if (serachBiblioData == null || serachBiblioData.getTotals() == 0) {
  107. // //conditions没有检索到任何相关专利(杰哥处理)
  108. // ThrowException.throwXiaoShiException("检索失败,根据检索条件未检索出任何相关专利信息");
  109. // return;
  110. // }
  111. //获得专利总数量
  112. // Integer count = serachBiblioData.getTotals();
  113. Integer count = task.getTotal();
  114. //计算进度值
  115. // double percentage = count == 0 ? 0 : (count.equals(successNum) ? (successNum * 1D) : (successNum + 1D) / count * 100D);
  116. // percentage = MathUtils.saveTwoDecimal(percentage);
  117. //3.根据专利总数量count遍历检索专利
  118. for (int i = 1; i <= count; i += size) {
  119. //查看任务状态
  120. // QrtzTaskDetail qrtzTaskDetail1 = qrTaskDetailService.getById(webQueryDTO.getTaskId());
  121. // if (qrtzTaskDetail1.getTaskDetailState().equals(7)) {
  122. // qrtzTaskDetail1.setTaskDetailState(5);
  123. // qrtzTaskDetail1.setSuccessNum(successNum);
  124. // qrtzTaskDetail1.setTaskProcess(percentage);
  125. // qrtzTaskDetail1.updateById();
  126. // WebSocketServer.sendInfo(Response.websocket(new TaskWebSocketDTO()
  127. // .setId(webQueryDTO.getTaskId())
  128. // .setProjectId(task.getProjectId())
  129. // .setComplete(false)
  130. // .setIndex(successNum)
  131. // .setTaskDetailState(5)
  132. // .setTotal(count), ResponseEnum.PATENT_IMPORT_TASK_SUCCESS), "null");
  133. // return null;
  134. // } else if (qrtzTaskDetail1.getTaskDetailState().equals(8)) {
  135. // qrtzTaskDetail1.setTaskDetailState(6);
  136. // qrtzTaskDetail1.setSuccessNum(successNum);
  137. // qrtzTaskDetail1.setTaskProcess(percentage);
  138. // qrtzTaskDetail1.updateById();
  139. // WebSocketServer.sendInfo(Response.websocket(new TaskWebSocketDTO()
  140. // .setId(webQueryDTO.getTaskId())
  141. // .setProjectId(task.getProjectId())
  142. // .setComplete(false)
  143. // .setIndex(successNum)
  144. // .setTaskDetailState(6)
  145. // .setTotal(count), ResponseEnum.PATENT_IMPORT_TASK_SUCCESS), "null");
  146. // return null;
  147. // }
  148. //3.1根据检索式conditions、专利开始数i、专利最后数i + size - 1检索专利著录信息
  149. SerachBiblioData serachBiblioData = getSerachBiblioData(conditions, i, i + size - 1);
  150. //获取检索结果中的所有专利著录信息
  151. if (serachBiblioData == null || serachBiblioData.getTotals() == 0) {
  152. continue;
  153. }
  154. List<PatentZhuLu> patents = serachBiblioData.getPatents();
  155. //3.2遍历专利
  156. for (PatentZhuLu patent : patents) {
  157. PatentCell patentCell = new PatentCell();
  158. patentCell.setProjectId(task.getProjectId());
  159. PubNo pubNO = new PubNo();
  160. //装载专利著录
  161. if (cells.contains("1")) {
  162. setPatentZhuLu(patentCell, patent, pubNO);
  163. }
  164. //装载权要
  165. if (cells.contains("2")) {
  166. setPatentClaim(patentCell, pubNO);
  167. }
  168. //装载说明书文本
  169. if (cells.contains("3")) {
  170. setPatentInstructionText(patentCell, pubNO);
  171. }
  172. //以下代码是在准备一会要调用拿取各种附图的接口所需的参数(FullDocument->说明书pdf、Drawing->其他附图、FirstPageClipping->摘要附图)
  173. String fullDocumentLink = "", fullDocumentType = "", drawingLink = "", drawingType = "", firstPageClippingLink = "", firstPageClippingType = "";
  174. Integer fullDocumentPage = 0, drawingPage = 0, firstPageClippingPage = 0;
  175. //根据当前专利号调用接口获取一会调用拿取各种附图的接口的参数
  176. try {
  177. ImageInfo imageInfo = getImage(pubNO);
  178. for (Image image : imageInfo.getImages()) {
  179. //如果附件类型是说明书
  180. if (image.getImageType().equals("FullDocument")) {
  181. fullDocumentLink = image.getUrlLink();
  182. fullDocumentPage = image.getNumberOfPages();
  183. for (String formatOption : image.getFormatOptions()) {
  184. if (formatOption.contains("pdf")) {
  185. fullDocumentType = formatOption;
  186. }
  187. }
  188. }
  189. //如果附件类型是其他附件
  190. if (image.getImageType().equals("Drawing")) {
  191. drawingLink = image.getUrlLink();
  192. drawingPage = image.getNumberOfPages();
  193. for (String formatOption : image.getFormatOptions()) {
  194. if (formatOption.contains("tiff")) {
  195. drawingType = formatOption;
  196. }
  197. }
  198. }
  199. //如果附件类型是摘要附图
  200. if (image.getImageType().equals("FirstPageClipping")) {
  201. firstPageClippingLink = image.getUrlLink();
  202. firstPageClippingPage = image.getNumberOfPages();
  203. for (String formatOption : image.getFormatOptions()) {
  204. if (formatOption.contains("jpeg")) {
  205. firstPageClippingType = formatOption;
  206. }
  207. }
  208. }
  209. }
  210. //装载说明书pdf
  211. if (cells.contains("4")) {
  212. setFuJian(fullDocumentLink, fullDocumentPage, fullDocumentType, patentCell, ".pdf");
  213. }
  214. //装载摘要附图
  215. if (cells.contains("6")) {
  216. setFuJian(firstPageClippingLink, firstPageClippingPage, firstPageClippingType, patentCell, ".jpeg");
  217. }
  218. //装载其他附图
  219. if (cells.contains("7")) {
  220. setFuJian(drawingLink, drawingPage, drawingType, patentCell, ".tiff");
  221. }
  222. //将专利发送到分析系统(保存专利入库)
  223. if (patentCell.getPatentNo() != null) {
  224. String res = outInterfaceService.importPatents(patentCell);
  225. JSONObject jsonObject = JSONObject.parseObject(res);
  226. if (jsonObject.get("code").toString().equals("500")) {
  227. //舍弃这个专利,继续下一个专利
  228. continue;
  229. }
  230. }
  231. // QrtzTaskDetail qrtzTaskDetail11 = qrTaskDetailService.getById(qrtzTaskDetail.getId());
  232. // percentage = count == 0 ? 0 : (count.equals(successNum) ? (successNum * 1D) : (successNum + 1D) / count * 100D);
  233. // percentage = MathUtils.saveTwoDecimal(percentage);
  234. // WebSocketServer.sendInfo(Response.websocket(new TaskWebSocketDTO()
  235. // .setId(webQueryDTO.getTaskId())
  236. // .setProjectId(task.getProjectId())
  237. // .setComplete(false)
  238. // .setIndex(successNum)
  239. // .setPercentage(percentage)
  240. // .setTaskDetailState(qrtzTaskDetail11.getTaskDetailState())
  241. // .setFileName("")
  242. // .setUrl("")
  243. // .setTotal(count), ResponseEnum.PATENT_IMPORT_TASK_SUCCESS), "null");
  244. } catch (XiaoShiException e) {
  245. //虽然拿不到所有附图,但已经拿到了专利著录,能拿到啥是啥
  246. log.info(e.getMessage());
  247. } catch (Exception e) {
  248. // qrtzTaskDetail.setTaskDetailState(3);
  249. // qrtzTaskDetail.setSuccessNum(successNum);
  250. // qrtzTaskDetail.setDefaultNum(qrtzTaskDetail.getAllNum() - successNum);
  251. // qrtzTaskDetail.setFailure("拉取节点失败");
  252. // qrtzTaskDetail.setEndTime(new Date());
  253. // qrtzTaskDetail.updateById();
  254. // if (qrtzTask.getTaskType() == 1) {
  255. // qrtzTask.setTaskState(4);
  256. // } else {
  257. // qrtzTask.setTaskState(3);
  258. // }
  259. // qrtzTask.updateById();
  260. // WebSocketServer.sendInfo(Response.websocket(new TaskWebSocketDTO()
  261. // .setId(webQueryDTO.getTaskId())
  262. // .setProjectId(task.getProjectId())
  263. // .setComplete(true)
  264. // .setIndex(successNum)
  265. // .setPercentage(100D)
  266. // .setTaskDetailState(qrtzTaskDetail.getTaskDetailState())
  267. // .setFileName("")
  268. // .setUrl("")
  269. // .setTotal(successNum), ResponseEnum.PATENT_IMPORT_TASK_SUCCESS), "");
  270. }
  271. }
  272. }
  273. // WebSocketServer.sendInfo(Response.websocket(new TaskWebSocketDTO()
  274. // .setId(webQueryDTO.getTaskId())
  275. // .setProjectId(task.getProjectId())
  276. // .setComplete(true)
  277. // .setIndex(count)
  278. // .setPercentage(100D)
  279. // .setTaskDetailState(qrtzTaskDetail.getTaskDetailState())
  280. // .setFileName("")
  281. // .setUrl("")
  282. // .setTotal(count), ResponseEnum.PATENT_IMPORT_TASK_SUCCESS), "");
  283. // //任务执行情况状态设为成功,任务条件状态设为已完成(若是任务条件是定时任务则设为等待下一次执行)
  284. // qrtzTaskDetail.setTaskDetailState(2);
  285. // qrtzTaskDetail.setSuccessNum(successNum);
  286. // qrtzTaskDetail.setDefaultNum(qrtzTaskDetail.getAllNum() - successNum);
  287. // qrtzTaskDetail.setTaskProcess(100);
  288. // qrtzTaskDetail.setEndTime(new Date());
  289. // qrtzTaskDetail.updateById();
  290. // if (qrtzTask.getTaskType() == 1) {
  291. // qrtzTask.setTaskState(4);
  292. // } else {
  293. // qrtzTask.setTaskState(2);
  294. // }
  295. // qrtzTask.updateById();
  296. // return patentCells;
  297. }
  298. //调用接口获取一批专利著录信息
  299. public SerachBiblioData getSerachBiblioData(String conditions, Integer start, Integer size) throws IOException {
  300. GetSearchBiblioParamsDTO getSearchBiblioParamsDTO = new GetSearchBiblioParamsDTO()
  301. .setQuery(conditions)
  302. .setStart(start)
  303. .setEnd(size);
  304. String res = outInterfaceService.getSearchBiblio(getSearchBiblioParamsDTO);
  305. if (res == null || res.equals("")) {
  306. return null;
  307. }
  308. JSONObject jsonObject = JSONObject.parseObject(res);
  309. if (!jsonObject.get("status").toString().equals("200")) {
  310. //若发生类似400、500等异常(杰哥处理)
  311. return null;
  312. }
  313. //返回检索结果data
  314. return JSONObject.parseObject(jsonObject.get("data").toString(), SerachBiblioData.class);
  315. }
  316. /**
  317. * 装载著录方法
  318. *
  319. * @param patentCell 实体类对象
  320. * @param patent 专利对象
  321. * @param pubNo 公开号对象
  322. */
  323. private void setPatentZhuLu(PatentCell patentCell, PatentZhuLu patent, PubNo pubNo) {
  324. //装载申请号
  325. for (AppNo appNo : patent.getAppNos()) {
  326. if (appNo.getType().equals("docdb")) {
  327. patentCell.setApplicationNo(appNo.getCountry() + appNo.getNumber() + appNo.getKind());
  328. }
  329. }
  330. //装载申请日
  331. patentCell.setApplicationDate(patent.getAppDate());
  332. //装载国家/省市
  333. patentCell.setCountry(patent.getAppCountry());
  334. //装载公开号
  335. for (PubNo n : patent.getPubNos()) {
  336. if (n.getType().equals("docdb")) {
  337. BeanUtils.copyProperties(n, pubNo);
  338. patentCell.setPublicNo(n.getCountry() + n.getNumber() + n.getKind());
  339. }
  340. }
  341. //装载专利号
  342. patentCell.setPatentNo(patentCell.getPublicNo());
  343. //装载公开日
  344. patentCell.setPubilcDate(patent.getPubDate());
  345. //装载授权公告号(未找到)
  346. //装载授权公告日(未找到)
  347. //装载主分类号
  348. List<String> ipCs = patent.getIpCs();
  349. List<String> cpCs = patent.getCpCs();
  350. ipCs.addAll(cpCs);
  351. if (ipCs != null && ipCs.size() > 0) {
  352. patentCell.setMainIpc(ipCs.get(0));
  353. }
  354. //装载分类号
  355. if (ipCs != null && ipCs.size() > 0) {
  356. patentCell.setIpc(ipCs);
  357. }
  358. //装载申请人
  359. ArrayList<String> applicationPersons = new ArrayList<>();
  360. for (Application application : patent.getApplications()) {
  361. if (application.getOriginalName().contains("(标:)")) {
  362. application.setOriginalName(application.getOriginalName().substring(0, application.getOriginalName().indexOf("(标:)")));
  363. }
  364. applicationPersons.add(application.getOriginalName());
  365. }
  366. patentCell.setApplicationPersons(applicationPersons);
  367. //装载申请人地址(未找到)
  368. //装载发明人
  369. ArrayList<String> inventors = new ArrayList<>();
  370. for (Inventor inventor : patent.getInventors()) {
  371. inventors.add(inventor.getOriginalName());
  372. }
  373. patentCell.setInventors(inventors);
  374. //装载当前权利人(未找到)
  375. //装载代理人(未找到)
  376. //装载代理机构(未找到)
  377. //装载范畴分类(未找到)
  378. //装载当前状态(未找到)
  379. //装载同族号
  380. patentCell.setFamilyId(patent.getFamilyId());
  381. //装载著录标题
  382. String olTitle = patent.getOlTitle();
  383. String enTitle = patent.getEnTitle();
  384. if (olTitle == null) {
  385. patentCell.setTitle(enTitle);
  386. } else {
  387. patentCell.setTitle(olTitle);
  388. }
  389. //装载摘要
  390. String olAbstract = patent.getOlAbstract();
  391. String enAbstract = patent.getEnAbstract();
  392. if (olAbstract == null) {
  393. patentCell.setAbstrText(enAbstract);
  394. } else {
  395. patentCell.setAbstrText(olAbstract);
  396. }
  397. //装载优先权号、优先权国家、优先权日
  398. ArrayList<Priority> priorities = new ArrayList<>();
  399. List<Priorityy> priorties = patent.getPriorties();
  400. for (Priorityy priorty : priorties) {
  401. for (PriorityNumber number : priorty.getNumbers()) {
  402. if (number.getType().equals("epodoc")) {
  403. Priority priority = new Priority()
  404. .setPriorityNo(number.getNumber().substring(2))
  405. .setPriorityCountry(number.getNumber().substring(0, 2))
  406. .setPriorityDate(priorty.getDate());
  407. priorities.add(priority);
  408. }
  409. }
  410. }
  411. patentCell.setPriorities(priorities);
  412. }
  413. /**
  414. * 装载权要方法
  415. *
  416. * @param patentCell 实体类对象
  417. * @param pubNo 公开号对象
  418. */
  419. private void setPatentClaim(PatentCell patentCell, PubNo pubNo) throws IOException {
  420. GetClaimsInfoParamsDTO getClaimsInfoParamsDTO = new GetClaimsInfoParamsDTO()
  421. .setCc(pubNo.getCountry())
  422. .setNumber(pubNo.getNumber())
  423. .setKind(pubNo.getKind());
  424. String res = outInterfaceService.getClaimsInfo(getClaimsInfoParamsDTO);
  425. JSONObject jsonObject = JSONObject.parseObject(res);
  426. if (!jsonObject.get("status").toString().equals("200")) {
  427. //若发生类似400、500等异常(杰哥处理)
  428. //ThrowException.throwXiaoShiException("权要接口无法检索该国家专利");
  429. log.info("权要接口无法检索该国家专利");
  430. return;
  431. }
  432. //拿到检索结果(未格式化的含有页面等标签的权要)并格式化权要
  433. //String unformatRight = JSONObject.parseObject(jsonObject.get("data").toString(), String.class);
  434. ArrayList<String> unformatRights = JSONObject.parseObject(jsonObject.get("data").toString(), ArrayList.class);
  435. //String[] rightArr = unformatRight.split("\n");
  436. //ArrayList<String> rights = new ArrayList<>(Arrays.asList(rightArr));
  437. patentCell.setRights(unformatRights);
  438. }
  439. /**
  440. * 装载说明书方法
  441. *
  442. * @param patentCell 实体类对象
  443. * @param pubNo 公开号对象
  444. */
  445. private void setPatentInstructionText(PatentCell patentCell, PubNo pubNo) throws IOException {
  446. GetDescriptionInfoParamsDTO getDescriptionInfoParamsDTO = new GetDescriptionInfoParamsDTO()
  447. .setCc(pubNo.getCountry())
  448. .setNumber(pubNo.getNumber())
  449. .setKind(pubNo.getKind());
  450. String res = outInterfaceService.getDescriptionInfo(getDescriptionInfoParamsDTO);
  451. JSONObject jsonObject = JSONObject.parseObject(res);
  452. if (!jsonObject.get("status").toString().equals("200")) {
  453. //若发生类似400、500等异常(杰哥处理)
  454. //ThrowException.throwXiaoShiException("说明书接口无法检索该国家专利");
  455. log.info("说明书接口无法检索该国家专利");
  456. return;
  457. }
  458. //拿到检索结果(未格式化的含有页面等标签的说明书)
  459. //String unformatInstructionText = JSONObject.parseObject(jsonObject.get("data").toString(), String.class);
  460. List<String> unformatInstructionText = JSONObject.parseObject(jsonObject.get("data").toString(), List.class);
  461. StringBuilder builder = new StringBuilder();
  462. for (String n : unformatInstructionText) {
  463. builder.append(n);
  464. }
  465. // String regex = "<p>(.+?)</p>";
  466. // Matcher matcher = Pattern.compile(regex).matcher(unformatInstructionText);
  467. // if (matcher.find()) {
  468. // patentCell.setPatentInstructionText(matcher.group());
  469. // }
  470. patentCell.setPatentInstructionText(builder + "");
  471. }
  472. /**
  473. * 获取Image信息方法(从信息中获取三种附图的检索参数)
  474. *
  475. * @param pubNo 公开号对象
  476. */
  477. private ImageInfo getImage(PubNo pubNo) throws IOException {
  478. String res = outInterfaceService.getImagesInfo(pubNo);
  479. JSONObject jsonObject = JSONObject.parseObject(res);
  480. if (!jsonObject.get("status").toString().equals("200")) {
  481. //若发生类似400、500等异常(杰哥处理)
  482. ThrowException.throwXiaoShiException("Image信息接口无法检索该国家专利");
  483. }
  484. //拿到检索结果(未格式化的含有页面等标签的说明书)
  485. String unFormatData = jsonObject.get("data").toString();
  486. String data = unFormatData.substring(unFormatData.indexOf("[") + 1, unFormatData.lastIndexOf("]"));
  487. ImageInfo imageInfo = JSONObject.parseObject(data, ImageInfo.class);
  488. return imageInfo;
  489. }
  490. /**
  491. * 装载说明书附件pdf方法
  492. *
  493. * @param link 附件链接
  494. * @param page 附件页数
  495. * @param type 附件类型
  496. * @param patentCell 实体类对象
  497. */
  498. private void setFuJian(String link, Integer page, String type, PatentCell patentCell, String FuJianSuffix) throws Exception {
  499. //合并说明书pdf文档时所需的读取流数组
  500. InputStream[] streams = new InputStream[page];
  501. //其他附图url数组
  502. ArrayList<String> otherUrls = new ArrayList<>();
  503. //遍历附件页数
  504. for (int i = 1; i <= page; i++) {
  505. GetFuTuParamsDTO getFuTuParamsDTO = new GetFuTuParamsDTO()
  506. .setLink(link)
  507. .setPage(i)
  508. .setType(type);
  509. byte[] buffer = outInterfaceService.getPatentFile(getFuTuParamsDTO);
  510. InputStream inputStream = new ByteArrayInputStream(buffer);
  511. streams[i - 1] = inputStream;
  512. //如果不是说明书pdf
  513. if (!FuJianSuffix.equals(".pdf")) {
  514. File file = File.createTempFile("new_url", FuJianSuffix);
  515. FileOutputStream out = new FileOutputStream(file);
  516. out.write(buffer);
  517. out.close();
  518. streams[i - 1] = new FileInputStream(file);
  519. DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory(16, null);
  520. FileItem item = diskFileItemFactory.createItem(file.getName(), "text/plain", true, file.getName());
  521. int bytesRead = 0;
  522. buffer = new byte[8192];
  523. try {
  524. FileInputStream fis = new FileInputStream(file);
  525. OutputStream os = item.getOutputStream();
  526. int len = 8192;
  527. while ((bytesRead = fis.read(buffer, 0, len)) != -1) {
  528. os.write(buffer, 0, bytesRead);
  529. }
  530. os.close();
  531. fis.close();
  532. } catch (IOException e) {
  533. e.printStackTrace();
  534. }
  535. MultipartFile multipartFile = new CommonsMultipartFile(item);
  536. UploadFileDTO fileDTO = fileUtils.uploadFile(multipartFile);
  537. //如果是摘要附图
  538. if (FuJianSuffix.equals(".jpeg")) {
  539. patentCell.setPicUrl(fileDTO.getPath());
  540. }
  541. //如果是其他附图
  542. if (FuJianSuffix.equals(".tiff")) {
  543. otherUrls.add(fileDTO.getPath());
  544. }
  545. }
  546. }
  547. //如果是说明书pdf
  548. if (FuJianSuffix.equals(".pdf")) {
  549. //合并说明书多个pdf文件
  550. PdfDocumentBase doc = PdfDocument.mergeFiles(streams);
  551. //保存结果文件
  552. doc.save("merge.pdf", FileFormat.PDF);
  553. doc.close();
  554. //手动将合并后的pdf文件转成MultipartFile,上传文件并获取path装载到patentCell
  555. File file = new File("merge.pdf");
  556. DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory(16, null);
  557. FileItem item = diskFileItemFactory.createItem(file.getName(), "text/plain", true, file.getName());
  558. int bytesRead = 0;
  559. byte[] buffer = new byte[8192];
  560. try {
  561. FileInputStream fis = new FileInputStream(file);
  562. OutputStream os = item.getOutputStream();
  563. int len = 8192;
  564. while ((bytesRead = fis.read(buffer, 0, len)) != -1) {
  565. os.write(buffer, 0, bytesRead);
  566. }
  567. os.close();
  568. fis.close();
  569. } catch (IOException e) {
  570. e.printStackTrace();
  571. }
  572. MultipartFile multipartFile = new CommonsMultipartFile(item);
  573. UploadFileDTO fileDTO = fileUtils.uploadFile(multipartFile);
  574. patentCell.setPdf(fileDTO);
  575. } else if (FuJianSuffix.equals(".tiff")) {
  576. patentCell.setOtherUrls(otherUrls);
  577. }
  578. }
  579. }