GetPatentStarPartService.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  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.common.utils.ThrowException;
  10. import cn.cslg.pas.domain.*;
  11. import cn.cslg.pas.service.outApi.PatentStarApiService;
  12. import cn.cslg.pas.service.upLoadPatent.ExcutePatentDataStar;
  13. import com.alibaba.fastjson.JSON;
  14. import lombok.RequiredArgsConstructor;
  15. import lombok.extern.slf4j.Slf4j;
  16. import org.apache.commons.lang3.StringUtils;
  17. import org.springframework.stereotype.Service;
  18. import java.io.IOException;
  19. import java.util.*;
  20. /**
  21. * 获取专利之星专利某部分(如权要、说明书等一项)业务层
  22. *
  23. * @Author chenyu
  24. * @Date 2023/6/30
  25. */
  26. @Slf4j
  27. @Service
  28. @RequiredArgsConstructor
  29. public class GetPatentStarPartService {
  30. private final ExcutePatentDataStar excutePatentDataStar;
  31. private final PatentStarApiService patentStarApiService;
  32. /**
  33. * 根据专利号或申请号获取专利指定部分项
  34. *
  35. * @param getPatentStarPartDTO 前端传输DTO对象
  36. * @return 返回装载着指定专利项的对象
  37. */
  38. public PatentDTO getPatentPart(GetPatentStarPartDTO getPatentStarPartDTO) throws IOException {
  39. log.info("开始处理【根据专利号或申请号获取专利指定部分项】的业务,参数为:{}", getPatentStarPartDTO);
  40. Integer patentCell = getPatentStarPartDTO.getPatentCell();
  41. String appNo = getPatentStarPartDTO.getAppNo();
  42. String patentNo = getPatentStarPartDTO.getPatentNo();
  43. PatentDTO patentDTO;
  44. if (patentCell == 1) {
  45. patentDTO = getParentRight(appNo); //拿权要
  46. } else if (patentCell == 2) {
  47. patentDTO = getInstructionText(appNo); //拿说明书文本
  48. } else if (patentCell == 3) {
  49. patentDTO = getInstructionPDF(patentNo); //拿说明书pdf
  50. } else if (patentCell == 4) {
  51. patentDTO = getPatentImage(appNo); //拿摘要附图
  52. } else if (patentCell == 5) {
  53. patentDTO = getSimpleFamily(getPatentStarPartDTO); //拿同族专利信息
  54. } else if (patentCell == 6) {
  55. patentDTO = getAffair(appNo); //拿法律事务信息
  56. } else {
  57. patentDTO = new PatentDTO();
  58. }
  59. return patentDTO;
  60. }
  61. /**
  62. * 获取专利之星专利的权要
  63. *
  64. * @param appNo 申请号
  65. * @return 返回装载着权要的对象
  66. */
  67. public PatentDTO getParentRight(String appNo) {
  68. StarPatentVO starPatentVO = new StarPatentVO()
  69. .setApplicationNo(appNo);
  70. UploadParamsVO uploadParamsVO = new UploadParamsVO();
  71. //调用"获得中国专利全文文本"接口,处理xml格式权要
  72. excutePatentDataStar.setPatentClaim(starPatentVO, uploadParamsVO);
  73. PatentDTO patentDTO = new PatentDTO();
  74. ArrayList<PatentRight> patentRights = new ArrayList<>();
  75. patentRights.add(uploadParamsVO.getPatentRight());
  76. patentDTO.setRights(patentRights);
  77. return patentDTO;
  78. }
  79. /**
  80. * 获取专利之星专利的说明书文本
  81. *
  82. * @param appNo 申请号
  83. * @return 返回装载着说明书文本的对象
  84. */
  85. public PatentDTO getInstructionText(String appNo) {
  86. StarPatentVO starPatentVO = new StarPatentVO()
  87. .setApplicationNo(appNo);
  88. UploadParamsVO uploadParamsVO = new UploadParamsVO();
  89. //调用"获得中国专利全文文本"接口,处理xml格式说明书文本
  90. excutePatentDataStar.setPatentInstructionText(starPatentVO, uploadParamsVO);
  91. PatentDTO patentDTO = new PatentDTO();
  92. patentDTO.setInstruction(uploadParamsVO.getPatentInstructionText());
  93. return patentDTO;
  94. }
  95. /**
  96. * 获取专利之星专利的说明书pdf
  97. *
  98. * @param patentNo 专利号(公开号)
  99. * @return 返回装载着说明书pdf的对象
  100. */
  101. public PatentDTO getInstructionPDF(String patentNo) {
  102. //调用"获得世界专利pdf"接口,获得pdf的url地址
  103. String pdfUrl = patentStarApiService.getEnPdfApi(patentNo);
  104. PatentDTO patentDTO = new PatentDTO();
  105. ArrayList<PatentInstruction> patentInstructions = new ArrayList<>();
  106. PatentInstruction patentInstruction = new PatentInstruction();
  107. patentInstruction.setUrl(pdfUrl);
  108. patentInstructions.add(patentInstruction);
  109. patentDTO.setPdf(patentInstructions);
  110. return patentDTO;
  111. }
  112. /**
  113. * 获取专利之星专利的摘要附图
  114. *
  115. * @param appNo 申请号
  116. * @return 返回装载着摘要附图的对象
  117. */
  118. public PatentDTO getPatentImage(String appNo) {
  119. //以下 ↓调用的是"获得中国专利摘要附图"接口,获得摘要附图的url地址
  120. if (appNo.contains(".")) {
  121. appNo = appNo.substring(0, appNo.lastIndexOf("."));
  122. }
  123. String pictureUrl = patentStarApiService.getPictureApi(appNo);
  124. PatentDTO patentDTO = new PatentDTO();
  125. ArrayList<PatentImage> patentImages = new ArrayList<>();
  126. PatentImage patentImage = new PatentImage();
  127. patentImage.setUrl(pictureUrl);
  128. patentImages.add(patentImage);
  129. patentDTO.setImage(patentImages);
  130. return patentDTO;
  131. }
  132. /**
  133. * 获取专利之星专利的同族专利
  134. *
  135. * @param getPatentStarPartDTO 获取专利之星专利指定项DTO类
  136. * @return 返回装载着同族专利的对象集合
  137. */
  138. public PatentDTO getSimpleFamily(GetPatentStarPartDTO getPatentStarPartDTO) throws IOException {
  139. //从DTO中取出公开号、当前页、每页条数
  140. String patentNo = getPatentStarPartDTO.getPatentNo();
  141. Integer current = getPatentStarPartDTO.getCurrent();
  142. Integer size = getPatentStarPartDTO.getSize();
  143. PatentDTO patentDTO = new PatentDTO();
  144. PageVO pageVO = new PageVO()
  145. .setCurrent(current)
  146. .setSize(size);
  147. //以下 ↓装载的是调用"获得同族专利"接口返回的专利相关数据
  148. String familyPatentNoStr = patentStarApiService.getFamilyByPubNoApi(patentNo);
  149. //若没有同族号,则返回空集合(表示该公开号暂无同族)
  150. if (familyPatentNoStr.equals("no data")) {
  151. pageVO.setRecords(new ArrayList<>())
  152. .setTotal(0);
  153. patentDTO.setFamilyPatentResult(pageVO);
  154. return patentDTO;
  155. }
  156. FamilyPatentNo familyPatentNo = JSON.parseObject(familyPatentNoStr, FamilyPatentNo.class);
  157. //familyPNStr:以分号;拼接的多个同族公开号字符串
  158. String familyPNStr = familyPatentNo.getFamilyinfo();
  159. List<String> familyPatentNos = Arrays.asList(familyPNStr.split(";"));
  160. //防止下标越界的判断(即判断所需当前页是否有数据)
  161. if ((current - 1) * size >= familyPatentNos.size()) {
  162. pageVO.setRecords(new ArrayList<>())
  163. .setTotal(familyPatentNos.size());
  164. patentDTO.setFamilyPatentResult(pageVO);
  165. return patentDTO;
  166. }
  167. //根据分页信息,取分页区间内的同族号
  168. familyPatentNos = pageBySubList(familyPatentNos, current, size);
  169. //集合转成字符串
  170. String conditions = "(PN=(" + StringUtils.join(familyPatentNos, " OR ") + "))";
  171. //调用一般接口返回这些同族号专利的著录相关数据(标题、申请人、权利人、摘要附图)
  172. PatentStarListDto patentStarListDto = new PatentStarListDto()
  173. .setCurrentQuery(conditions)
  174. .setOrderBy("ID")
  175. .setOrderByType("DESC")
  176. .setPageNum(current)
  177. .setRowCount(size)
  178. .setDBType("WD");
  179. Map<String, Object> resultMap = patentStarApiService.patentStarSearchApi(patentStarListDto);
  180. if (resultMap == null || (Integer) resultMap.get("total") == 0) {
  181. ThrowException.throwXiaoShiException("发生未知错误,一般接口未检索出专利");
  182. }
  183. List<StarPatentVO> patents = (List<StarPatentVO>) resultMap.get("records");
  184. List<PatentSimpleFamilyLink> records = new ArrayList<>();
  185. for (StarPatentVO starPatent : patents) {
  186. PatentSimpleFamilyLink patentSimpleFamilyLink = new PatentSimpleFamilyLink();
  187. patentSimpleFamilyLink.setAbstractPath(starPatent.getAbstractPath()); //装载摘要附图
  188. patentSimpleFamilyLink.setPatentNo(starPatent.getPatentNo()); //装载公开号
  189. patentSimpleFamilyLink.setName(starPatent.getName()); //装载标题
  190. //装载申请人和权利人
  191. ArrayList<PatentApplicant> patentApplicants = new ArrayList<>();
  192. List<String> applicantNames = Arrays.asList(starPatent.getApplicantStr().split(";"));
  193. for (String applicantName : applicantNames) {
  194. PatentApplicant patentApplicant = new PatentApplicant();
  195. patentApplicant.setName(applicantName);
  196. patentApplicant.setDataType(1);
  197. patentApplicants.add(patentApplicant); //装载申请人
  198. patentApplicant.setDataType(2);
  199. patentApplicants.add(patentApplicant); //装载权利人
  200. }
  201. patentSimpleFamilyLink.setApplicant(patentApplicants);
  202. records.add(patentSimpleFamilyLink);
  203. }
  204. pageVO.setRecords(records)
  205. .setTotal(familyPatentNos.size());
  206. patentDTO.setFamilyPatentResult(pageVO);
  207. return patentDTO;
  208. }
  209. public PatentDTO getAffair(String appNo) throws IOException {
  210. if (appNo.contains(".")) {
  211. appNo = appNo.substring(0, appNo.lastIndexOf("."));
  212. }
  213. //以下 ↓装载的是调用"获得中国专利法律状态"接口返回的专利相关数据
  214. String cnLegalApiStr = patentStarApiService.getCnLegalApi(appNo);
  215. List<ChinaLeagalStatus> chinaLeagalStatuses = JSON.parseArray(cnLegalApiStr, ChinaLeagalStatus.class);
  216. ArrayList<KeyValueVO> lst = new ArrayList<>();
  217. HashMap<Integer, String> nameMap = new HashMap<>();
  218. HashMap<Integer, String> contentMap = new HashMap<>();
  219. nameMap.put(0, "发生日期");
  220. nameMap.put(1, "法律状态");
  221. nameMap.put(2, "详细法律状态");
  222. // nameMap.put(3, "IPC分类");
  223. // nameMap.put(4, "申请号");
  224. // nameMap.put(5, "申请日");
  225. // nameMap.put(6, "变更编号");
  226. nameMap.put(3, "详细信息");
  227. for (ChinaLeagalStatus chinaLeagalStatus : chinaLeagalStatuses) {
  228. contentMap.put(0, chinaLeagalStatus.getLegalDate());
  229. contentMap.put(1, chinaLeagalStatus.getLegalStatus());
  230. contentMap.put(2, chinaLeagalStatus.getLegalStatusInfo());
  231. // contentMap.put(3, chinaLeagalStatus.getIPC());
  232. // contentMap.put(4, chinaLeagalStatus.getSHENQINGH());
  233. // contentMap.put(5, chinaLeagalStatus.getSHENQINGR());
  234. // contentMap.put(6, chinaLeagalStatus.getBIANGENGSXCODE());
  235. contentMap.put(3, chinaLeagalStatus.getDETAIL());
  236. ArrayList<KeyValueVO.InpadocData> inpadocDatas = new ArrayList<>();
  237. for (int i = 0; i < 4; i++) {
  238. KeyValueVO.InpadocData inpadocData = new KeyValueVO.InpadocData();
  239. inpadocData.setName(nameMap.get(i));
  240. inpadocData.setContent(contentMap.get(i));
  241. inpadocDatas.add(inpadocData);
  242. }
  243. KeyValueVO keyValueVO = new KeyValueVO();
  244. keyValueVO.setInpadocData(inpadocDatas);
  245. lst.add(keyValueVO);
  246. }
  247. PatentDTO patentDTO = new PatentDTO();
  248. ArrayList<PatentAffair> patentAffairs = new ArrayList<>();
  249. PatentAffair patentAffair = new PatentAffair();
  250. patentAffair.setInpadoc(lst);
  251. patentAffairs.add(patentAffair);
  252. patentDTO.setAffair(patentAffairs);
  253. return patentDTO;
  254. }
  255. /**
  256. * 根据分页信息,取同族号集合中分页区间内的同族号
  257. *
  258. * @param list 同族号集合
  259. * @param current 当前页
  260. * @param size 每页条数
  261. * @return 返回需要的同族号集合
  262. */
  263. public static List<String> pageBySubList(List<String> list, int current, int size) {
  264. int totalcount = list.size();
  265. int pagecount = 0;
  266. List<String> subList;
  267. int m = totalcount % size;
  268. if (m > 0) {
  269. pagecount = totalcount / size + 1;
  270. } else {
  271. pagecount = totalcount / size;
  272. }
  273. if (m == 0) {
  274. subList = list.subList((current - 1) * size, size * (current));
  275. } else {
  276. if (current == pagecount) {
  277. subList = list.subList((current - 1) * size, totalcount);
  278. } else {
  279. subList = list.subList((current - 1) * size, size * (current));
  280. }
  281. }
  282. return subList;
  283. }
  284. }