ReportExportService.java 68 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371
  1. package cn.cslg.pas.service;
  2. import cn.cslg.pas.common.dto.PatentColumnDTO;
  3. import cn.cslg.pas.common.dto.PatentDTO;
  4. import cn.cslg.pas.common.dto.es.EsCustomFieldValueDTO;
  5. import cn.cslg.pas.common.model.SystemMO;
  6. import cn.cslg.pas.common.model.cronModel.PersonnelVO;
  7. import cn.cslg.pas.common.model.request.StringRequest;
  8. import cn.cslg.pas.common.utils.*;
  9. import cn.cslg.pas.common.vo.*;
  10. import cn.cslg.pas.common.vo.business.FTOCompareRecordVO;
  11. import cn.cslg.pas.common.vo.business.TortCompareRecordVO;
  12. import cn.cslg.pas.common.vo.business.TortRightVO;
  13. import cn.cslg.pas.common.vo.business.TortVO;
  14. import cn.cslg.pas.domain.ReportDocument;
  15. import cn.cslg.pas.domain.business.*;
  16. import cn.cslg.pas.domain.es.Patent;
  17. import cn.cslg.pas.domain.es.PatentPerson;
  18. import cn.cslg.pas.domain.es.Priorities;
  19. import cn.cslg.pas.domain.es.Text;
  20. import cn.cslg.pas.exception.XiaoShiException;
  21. import cn.cslg.pas.mapper.AvoidDesignMapper;
  22. import cn.cslg.pas.service.business.*;
  23. import cn.cslg.pas.service.business.es.*;
  24. import cn.cslg.pas.service.business.invalidReport.AssoReasonLiteratureService;
  25. import cn.cslg.pas.service.business.invalidReport.EvidenceReasonService;
  26. import cn.cslg.pas.service.business.stabilityReport.AssoGroupReasonService;
  27. import cn.cslg.pas.service.common.FileManagerService;
  28. import cn.hutool.core.util.IdUtil;
  29. import com.alibaba.fastjson.JSON;
  30. import com.alibaba.fastjson.JSONObject;
  31. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  32. import com.deepoove.poi.XWPFTemplate;
  33. import com.deepoove.poi.config.Configure;
  34. import com.deepoove.poi.data.PictureRenderData;
  35. import com.deepoove.poi.data.PictureType;
  36. import com.deepoove.poi.data.Pictures;
  37. import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
  38. import lombok.extern.slf4j.Slf4j;
  39. import org.apache.commons.collections4.CollectionUtils;
  40. import org.apache.commons.lang3.StringUtils;
  41. import org.ddr.poi.html.HtmlRenderPolicy;
  42. import org.springframework.beans.factory.annotation.Autowired;
  43. import org.springframework.stereotype.Service;
  44. import java.io.File;
  45. import java.io.FileInputStream;
  46. import java.io.IOException;
  47. import java.text.SimpleDateFormat;
  48. import java.time.format.DateTimeFormatter;
  49. import java.util.*;
  50. import java.util.stream.Collectors;
  51. @Slf4j
  52. @Service
  53. public class ReportExportService {
  54. @Autowired
  55. private ReportTempleService templeService;
  56. @Autowired
  57. private FileUtils fileUtils;
  58. @Autowired
  59. private ReportProjectService reportProjectService;
  60. @Autowired
  61. private FileManagerService fileManagerService;
  62. @Autowired
  63. private EsPatentService esPatentService;
  64. @Autowired
  65. private AvoidDesignMapper avoidDesignMapper;
  66. @Autowired
  67. private TemplateConfigService templateConfigService;
  68. @Autowired
  69. private CustomFieldService customFieldService;
  70. @Autowired
  71. private EsService esService;
  72. @Autowired
  73. private FTOCompareRecordService ftoCompareRecordService;
  74. @Autowired
  75. private EsQuotePatentService esQuotePatentService;
  76. @Autowired
  77. private EsFamilyService esFamilyService;
  78. @Autowired
  79. private LoginUtils loginUtils;
  80. @Autowired
  81. private CacheUtils cacheUtils;
  82. @Autowired
  83. private EsLegalEventService esLegalEventService;
  84. @Autowired
  85. private FeatureService featureService;
  86. @Autowired
  87. private PatentSplitMessageService patentSplitMessageService;
  88. @Autowired
  89. private ProofGroupService proofGroupService;
  90. @Autowired
  91. private AssoGroupReasonService assoGroupReasonService;
  92. @Autowired
  93. private AssoReasonLiteratureService assoReasonLiteratureService;
  94. @Autowired
  95. private CompareLiteratureService compareLiteratureService;
  96. @Autowired
  97. private EvidenceReasonService evidenceReasonService;
  98. @Autowired
  99. private TortCompareRecordService tortCompareRecordService;
  100. /**
  101. * @param projectId
  102. * @param templeId
  103. * @return
  104. * @throws IOException
  105. * @function: 导出报告
  106. */
  107. public String exportReport(Integer projectId, Integer templeId) throws Exception {
  108. //根据模板ID获得模板
  109. ReportTemple reportTemplate = templeService.getById(templeId);
  110. //获得模板路径
  111. String templateFilePath = fileUtils.getPath(reportTemplate.getTemplatePath());
  112. //读取模板后保存生成word的地址
  113. String fileName = IdUtil.simpleUUID() + ".docx";
  114. String directoryName = fileUtils.createDirectory();
  115. String outPath = fileUtils.getSavePath(directoryName) + fileName;
  116. //根据ProjectId 获得报告
  117. LambdaQueryWrapper<ReportProject> queryWrapper = new LambdaQueryWrapper<>();
  118. queryWrapper.eq(ReportProject::getProjectId, projectId);
  119. ReportProject report = reportProjectService.getOne(queryWrapper, false);
  120. if (report == null) {
  121. throw new XiaoShiException("报告不存在");
  122. }
  123. XWPFTemplate template = null;
  124. if (report.getReportType() == 0 || report.getReportType() == 2) {
  125. template = this.getstabilityTemplate(projectId, templateFilePath);
  126. } else if (report.getReportType() == 3) {
  127. template = this.FTOTemplate(projectId, templateFilePath, templeId);
  128. } else if (report.getReportType() == 4) {
  129. template = this.Torttemplate(projectId, templateFilePath);
  130. } else if (report.getReportType() == 5) {
  131. template = this.avoidDesignTemplate(projectId, templateFilePath);
  132. } else if (report.getReportType() == 1) {
  133. template = this.getThirdTemplate(projectId, templateFilePath);
  134. }
  135. if (template == null) {
  136. return null;
  137. }
  138. // 读取模板、数据并渲染
  139. // 文件是否已存在,则删除
  140. File file = new File(outPath);
  141. // 生成word保存在指定目录
  142. template.writeToFile(outPath);
  143. template.close();
  144. //导出成功后,导出报告记录入库
  145. List<String> ids = fileManagerService.uploadFileGetGuid2(Arrays.asList(file));
  146. if (ids == null || ids.size() == 0) {
  147. throw new XiaoShiException("保存记录失败");
  148. }
  149. PersonnelVO personnelVO = new PersonnelVO();
  150. personnelVO.setId("1");
  151. ReportDocument reportDocument = new ReportDocument();
  152. reportDocument.setProjectId(projectId);
  153. reportDocument.setFileName(fileName);
  154. reportDocument.setFileGuid(ids.get(0));
  155. reportDocument.setCreateId(personnelVO.getId());
  156. reportDocument.setTemplateId(reportTemplate.getId());
  157. reportDocument.setTemplateName(reportTemplate.getTemplateName());
  158. reportDocument.insert();
  159. if (file.exists()) {
  160. file.delete();
  161. }
  162. return ids.get(0);
  163. }
  164. private XWPFTemplate Torttemplate(Integer reportId, String filePath) throws Exception {
  165. //根据报告Id查询标的专利号
  166. LambdaQueryWrapper<ReportProject> projectLambdaQueryWrapper = new LambdaQueryWrapper<>();
  167. projectLambdaQueryWrapper.eq(ReportProject::getProjectId, reportId);
  168. ReportProject report = reportProjectService.getOne(projectLambdaQueryWrapper, false);
  169. String patentNo = report.getSignPatentNo();
  170. List<Patent> patentList = esPatentService.getPatentsByNo(Arrays.asList(patentNo), true, null, null);
  171. if (patentList == null || patentList.size() == 0) {
  172. return null;
  173. }
  174. //装载单个专利的信息
  175. Map<String, Object> patentMap = new HashMap<>();
  176. Patent patent = patentList.get(0);
  177. String applicants = "";
  178. String rightPerson = "";
  179. if (patent.getApplicant() != null && patent.getApplicant().size() != 0) {
  180. List<String> names =patent.getApplicant().stream().map(PatentPerson::getName).collect(Collectors.toList());
  181. applicants = StringUtils.join(names, "\n");
  182. }
  183. if (patent.getRightHolder() != null && patent.getRightHolder().size() != 0) {
  184. List<String> names =patent.getRightHolder().stream().map(PatentPerson::getName).collect(Collectors.toList());
  185. rightPerson = StringUtils.join(names, "\n");
  186. }
  187. //装载同族信息
  188. List<Map<String, Object>> familyMaps = esFamilyService.getPatentFamilyByNos(Arrays.asList(patent.getPatentNo()), "simple");
  189. if (familyMaps.size() <= 0) {
  190. familyMaps = esFamilyService.getPatentFamilyByNos(Arrays.asList(patent.getPatentNo()), "inpadoc");
  191. }
  192. if (familyMaps != null && familyMaps.size() > 0) {
  193. Map<String, Object> familyMap = familyMaps.get(0);
  194. if (familyMap.get("nos") != null) {
  195. List<String> nos = (List<String>) familyMap.get("nos");
  196. if (nos != null && nos.size() > 0) {
  197. String nosStr = StringUtils.join(nos, "\n");
  198. patentMap.put("simpleFamilys", nosStr);
  199. }
  200. }
  201. }
  202. //装载引用专利
  203. Map<String, Object> map = esQuotePatentService.getEsQutePatentByNos(patent.getPatentNo());
  204. if (map.get("nos") != null) {
  205. List<String> nos = (List<String>) map.get("nos");
  206. if (nos != null && nos.size() > 0) {
  207. String nosStr = StringUtils.join(nos, "\n");
  208. patentMap.put("quotePatents", nosStr);
  209. }
  210. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
  211. if (patent.getGrantDate() != null) {
  212. patentMap.put("publicDate",dateFormat.format(patent.getGrantDate()));
  213. }
  214. else {
  215. patentMap.put("publicDate",dateFormat.format(patent.getPublicDate()));
  216. }
  217. }
  218. if (patent.getGrantNo() != null) {
  219. patentMap.put("publicNo", patent.getGrantNo());
  220. } else {
  221. patentMap.put("publicNo", patent.getPublicNo());
  222. }
  223. patentMap.put("applicant", applicants);
  224. patentMap.put("rightPerson", rightPerson);
  225. if (patent.getTitle() != null && patent.getTitle().size() > 0) {
  226. patentMap.put("name", patent.getTitle().get(0).getTextContent());
  227. }
  228. //图示
  229. String guid = FormatUtil.getPictureFormat(patent.getAppNo());
  230. PictureRenderData pictureData = this.guidToStream(guid);
  231. if (pictureData != null) {
  232. patentMap.put("abstractPath", pictureData);
  233. }
  234. if (patent.getPriorities() != null && patent.getPriorities().size() != 0) {
  235. List<String> dates = patent.getPriorities().stream().map(Priorities::getPriorityDate).collect(Collectors.toList());
  236. String nosStr = StringUtils.join(dates, ";");
  237. patentMap.put("priorityDate", nosStr);
  238. }
  239. //获得专利对比记录的信息
  240. TortCompareRecordVO tortCompareRecordVO = tortCompareRecordService.getAllTortTaskResult(reportId, null, 2);
  241. List<TortRightVO> tortRightVOS = tortCompareRecordVO.getTortRightVOS();
  242. List<Map<String, Object>> tortMaps = new ArrayList<>();
  243. Integer addI = 1;
  244. if (tortRightVOS != null && tortRightVOS.size() > 0) {
  245. addI =addI-tortRightVOS.get(0).getSort();
  246. }
  247. for (TortRightVO tortRightVO : tortRightVOS) {
  248. Integer sort = tortRightVO.getSort();
  249. List<TortVO> tortVOS = tortRightVO.getTortVOS();
  250. for (TortVO tortVO : tortVOS) {
  251. Map<String, Object> tortMap = new HashMap<>();
  252. tortMap.put("rightName", "权要" + (sort + addI));
  253. tortMap.put("content", tortVO.getContent());
  254. tortMap.put("explainText", tortVO.getExplainText());
  255. FTOCompareRecordVO ftoCompareRecordVO = tortVO.getFinalRecordVO();
  256. if (ftoCompareRecordVO != null) {
  257. tortMap.put("targetDescription", ftoCompareRecordVO.getTargetDescription());
  258. Integer result = ftoCompareRecordVO.getCompareResult();
  259. System.out.println(result);
  260. if(result!=null) {
  261. switch (result) {
  262. case 0:
  263. tortMap.put("resultStr", "字面相同");
  264. break;
  265. case 1:
  266. tortMap.put("resultStr", "等同");
  267. break;
  268. case 2:
  269. tortMap.put("resultStr", "不等同");
  270. break;
  271. case 3:
  272. tortMap.put("resultStr", "确定");
  273. break;
  274. }
  275. }
  276. tortMap.put("compareDescription", ftoCompareRecordVO.getCompareDescription());
  277. }
  278. tortMaps.add(tortMap);
  279. }
  280. }
  281. //装载对比记录的信息
  282. patentMap.put("cM", tortMaps);
  283. System.out.println(tortMaps);
  284. Map<String, Object> map1 = new HashMap<>();
  285. String date = DateUtils.formatDate(new Date(), DateUtils.YYYY_MM_DD);
  286. String[] ds = date.split("-");
  287. map1.put("sys", new SystemMO(ds[0], ds[1], ds[2], "", "reportName"));
  288. map1.put("patentMap", patentMap);
  289. System.out.println(patentMap);
  290. // 为表格的显示绑定行循环
  291. LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
  292. HtmlRenderPolicy htmlRenderPolicy = new HtmlRenderPolicy();
  293. // 将bz设置为行循环绑定的数据源的key,即key是bz的value会在模板中的{{bz}}处进行解析
  294. Configure configure = Configure.builder().bind("cM", policy).bind("targetDescription", htmlRenderPolicy).bind("compareDescription",htmlRenderPolicy).build();
  295. XWPFTemplate template = XWPFTemplate.compile(filePath, configure).render(map1);
  296. return template;
  297. }
  298. private XWPFTemplate avoidDesignTemplate(Integer projectId, String path) throws IOException {
  299. String filePath = fileUtils.getPath(path);
  300. log.info("开始处理导出规避设计报告,参数为:{}, {}", projectId, filePath);
  301. LambdaQueryWrapper<ReportProject> queryWrapper = new LambdaQueryWrapper<>();
  302. queryWrapper.eq(ReportProject::getProjectId, projectId);
  303. ReportProject report = reportProjectService.getOne(queryWrapper, false);
  304. String signPatentNo = report.getSignPatentNo();
  305. //装载年月日
  306. String date = DateUtils.formatDate(new Date(), DateUtils.YYYY_MM_DD);
  307. String[] dates = date.split("-");
  308. SystemMO systemMO = new SystemMO()
  309. .setYear(dates[0])
  310. .setMonth(dates[1])
  311. .setDay(dates[2]);
  312. //
  313. //装载特征、解释、回避设计方向、回避设计总体方向
  314. List<AvoidFeaturesVO> features = avoidDesignMapper.selectAvoidDesign(projectId);
  315. // String wholeDirection = avoidDesignWholeDirectionMapper.selectWholeDirectionByReportId(reportId);
  316. // map.put("wholeDirection", wholeDirection);
  317. //
  318. //绑定政策(绑定集合和元素循环遍历)
  319. LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
  320. //把指定元素内容识别传输成html格式
  321. HtmlRenderPolicy htmlRenderPolicy = new HtmlRenderPolicy();
  322. Configure configure = Configure.builder()
  323. .bind("signPatent.rights", policy)
  324. .bind("features", policy)
  325. .bind("explainText", htmlRenderPolicy)
  326. .bind("littleDirection", htmlRenderPolicy)
  327. .bind("wholeDirection", htmlRenderPolicy)
  328. .build();
  329. XWPFTemplate template = XWPFTemplate.compile(filePath, configure).render(new HashMap<>());
  330. return template;
  331. }
  332. private PictureRenderData guidToStream(String guid) {
  333. PictureRenderData pictureRenderData = null;
  334. byte[] bytes = null;
  335. if (guid == null) {
  336. return pictureRenderData;
  337. }
  338. try {
  339. bytes = fileManagerService.downloadSystemFileFromFMS(guid);
  340. } catch (Exception e) {
  341. }
  342. FileInputStream fileInputStream = FileUtils.byteToFile(bytes);
  343. pictureRenderData = Pictures.ofStream(fileInputStream, PictureType.PNG)
  344. .create();
  345. return pictureRenderData;
  346. }
  347. private List<Map<String, Object>> getClaimMaps(List<Text> claims, String patentNo) {
  348. List<Map<String, Object>> rights = new ArrayList<>();
  349. if (claims == null || claims.size() == 0) {
  350. return rights;
  351. }
  352. Text claim = claims.stream().filter(item -> item.getIfOrigin().equals(true)).findFirst().orElse(null);
  353. if (claim == null) {
  354. return rights;
  355. }
  356. PatentRightParams params = new PatentRightParams();
  357. params.setContent(claim.getTextContent());
  358. params.setPatentNo(patentNo);
  359. List<RePatentClaim> patentRights = PatentRightUtils.formatPatentRight(params);
  360. //给权要进行格式更改
  361. patentRights.forEach(item -> {
  362. Map<String, Object> temMap = new HashMap<>();
  363. temMap.put("rightName", "权" + (item.getSort() + 1));
  364. temMap.put("content", item.getContent());
  365. temMap.put("rightNameLong", "权利要求" + (item.getSort() + 1));
  366. temMap.put("parentSort", item.getParentSort());
  367. temMap.put("sort", item.getSort());
  368. rights.add(temMap);
  369. });
  370. return rights;
  371. }
  372. /**
  373. * @param projectId
  374. * @param filePath
  375. * @return
  376. * @description 装载FTO模板
  377. */
  378. private XWPFTemplate FTOTemplate(Integer projectId, String filePath, Integer templateId) throws IOException {
  379. //获得模板的配置信息
  380. LambdaQueryWrapper<TemplateConfig> templateConfigWrapper = new LambdaQueryWrapper<TemplateConfig>();
  381. templateConfigWrapper.eq(TemplateConfig::getTemplateId, templateId);
  382. List<TemplateConfig> templateConfigs = templateConfigService.list(templateConfigWrapper);
  383. List<Map<String, Object>> classifyMaps = new ArrayList<>();
  384. for (TemplateConfig templateConfig : templateConfigs) {
  385. Map<String, Object> classifyMap = new HashMap<>();
  386. String value = templateConfig.getValueName();
  387. //根据value 查询专利
  388. List<EsCustomFieldValueDTO> esCustomFieldDTOS = customFieldService.getCustomFieldByValueName(value, projectId);
  389. if (esCustomFieldDTOS.size() != 0) {
  390. classifyMap.put("classify", templateConfig.getMapName());
  391. StringRequest stringRequest = new StringRequest();
  392. stringRequest.setCustomFields(esCustomFieldDTOS);
  393. stringRequest.setProjectId(projectId);
  394. stringRequest.setCurrent(1L);
  395. stringRequest.setSize(999L);
  396. List<PatentColumnDTO> patentColumnDTOS = new ArrayList<>();
  397. try {
  398. PatentDTO patentDTO = esService.esSearch(stringRequest);
  399. patentColumnDTOS = patentDTO.getPatents();
  400. } catch (Exception e) {
  401. return null;
  402. }
  403. //存放公告专利
  404. List<Map<String, Object>> announcePatents = new ArrayList<>();
  405. //存放公开专利
  406. List<Map<String, Object>> publicPatents = new ArrayList<>();
  407. //存放失效专利信息
  408. List<Map<String, Object>> lapsePatents = new ArrayList<>();
  409. for (PatentColumnDTO patent : patentColumnDTOS) {
  410. String applicants = "";
  411. String rightPerson = "";
  412. if (patent.getApplicant() != null && patent.getApplicant().size() != 0) {
  413. applicants = StringUtils.join(patent.getApplicant(), "\n");
  414. }
  415. if (patent.getRightHolder() != null && patent.getRightHolder().size() != 0) {
  416. rightPerson = StringUtils.join(patent.getRightHolder(), "\n");
  417. }
  418. String affairStrs = "";
  419. if (patent.getSimpleStatus() != null) {
  420. switch (patent.getSimpleStatus()) {
  421. case "3":
  422. patent.setSimpleStatus("3");
  423. affairStrs = "有效";
  424. break;
  425. case "1":
  426. patent.setSimpleStatus("1");
  427. affairStrs = "审中";
  428. break;
  429. case "2":
  430. patent.setSimpleStatus("2");
  431. affairStrs = "失效";
  432. break;
  433. }
  434. }
  435. //装载单个专利的信息
  436. Map<String, Object> patentMap = new HashMap<>();
  437. //同族专利
  438. try {
  439. //装载同族信息
  440. List<Map<String, Object>> familyMaps = esFamilyService.getPatentFamilyByNos(Arrays.asList(patent.getPatentNo()), "simple");
  441. if (familyMaps.size() <= 0) {
  442. familyMaps = esFamilyService.getPatentFamilyByNos(Arrays.asList(patent.getPatentNo()), "inpadoc");
  443. }
  444. if (familyMaps != null && familyMaps.size() > 0) {
  445. Map<String, Object> familyMap = familyMaps.get(0);
  446. if (familyMap.get("nos") != null) {
  447. List<String> nos = (List<String>) familyMap.get("nos");
  448. if (nos != null && nos.size() > 0) {
  449. String nosStr = StringUtils.join(nos, "\n");
  450. patentMap.put("simpleFamilys", nosStr);
  451. }
  452. }
  453. }
  454. } catch (Exception e) {
  455. }
  456. //引用专利
  457. try {
  458. Map<String, Object> map = esQuotePatentService.getEsQutePatentByNos(patent.getPatentNo());
  459. if (map.get("nos") != null) {
  460. List<String> nos = (List<String>) map.get("nos");
  461. if (nos != null && nos.size() > 0) {
  462. String nosStr = StringUtils.join(nos, "\n");
  463. patentMap.put("quotePatents", nosStr);
  464. }
  465. }
  466. } catch (Exception e) {
  467. }
  468. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
  469. //申请日
  470. if (patent.getAppDate() != null) {
  471. patentMap.put("appDate", dateFormat.format(patent.getAppDate()));
  472. }
  473. //公开日
  474. if (patent.getPublicDate() != null || patent.getGrantDate() != null) {
  475. if (patent.getPublicDate() != null) {
  476. patentMap.put("publicDate", dateFormat.format(patent.getPublicDate()));
  477. } else if (patent.getGrantDate() != null) {
  478. patentMap.put("publicDate", dateFormat.format(patent.getGrantDate()));
  479. }
  480. }
  481. //专利号
  482. patentMap.put("publicNo", patent.getPatentNo());
  483. patentMap.put("firstPublicDate", patent.getPublicDate());
  484. patentMap.put("applicant", applicants);
  485. patentMap.put("rightPerson", rightPerson);
  486. patentMap.put("affair", affairStrs);
  487. if (patent.getTitle() != null && patent.getTitle().size() > 0) {
  488. patentMap.put("nameOut", patent.getTitle().get(0).getTextContent());
  489. }
  490. //优先权日
  491. // if (patent.getPriorities() != null && patent.getPriorities().size() != 0) {
  492. // List<String> dates = patent.getPriorities().stream().map(Priorities::getPriorityDate).collect(Collectors.toList());
  493. // String nosStr = StringUtils.join(dates, ";");
  494. // patentMap.put("priorityDate", nosStr);
  495. // }
  496. if (StringUtils.isNotEmpty(patent.getPriorityDate())) {
  497. String nosStr = patent.getPriorityDate().replace("<br>", ";");
  498. patentMap.put("priorityDate", nosStr);
  499. }
  500. //图示
  501. String guid = FormatUtil.getPictureFormat(patent.getAppNo());
  502. PictureRenderData pictureData = this.guidToStream(guid);
  503. if (pictureData != null) {
  504. patentMap.put("abstractPath", pictureData);
  505. }
  506. //获得专利对比记录的信息
  507. Map<String, Object> temMap = ftoCompareRecordService.LoadCompareMessageForExport(projectId, patent.getPatentNo());
  508. List<CompareMessageVO> compareMessageVOS = (List<CompareMessageVO>) temMap.get("compareMessageVOs");
  509. //装载对比记录的信息
  510. patentMap.put("cM", compareMessageVOS);
  511. patentMap.put("rightNum", temMap.get("rightNum"));
  512. patentMap.put("mainNum", temMap.get("mainRightNum"));
  513. if (patent.getSimpleStatus() == null) {
  514. patent.setSimpleStatus("1");
  515. }
  516. Integer status = Integer.parseInt(patent.getSimpleStatus());
  517. if (status == 1 || status == 5 || status == 6) {
  518. announcePatents.add(patentMap);
  519. } else if (status == 2) {
  520. lapsePatents.add(patentMap);
  521. } else if (status == 3) {
  522. publicPatents.add(patentMap);
  523. }
  524. classifyMap.put("publicPatents", publicPatents);
  525. classifyMap.put("lapsePatents", lapsePatents);
  526. classifyMap.put("announcePatents", announcePatents);
  527. }
  528. classifyMaps.add(classifyMap);
  529. }
  530. }
  531. Map<String, Object> map = new HashMap<>();
  532. String date = DateUtils.formatDate(new Date(), DateUtils.YYYY_MM_DD);
  533. String[] ds = date.split("-");
  534. map.put("sys", new SystemMO(ds[0], ds[1], ds[2], "", "reportName"));
  535. map.put("classifys", classifyMaps);
  536. // 为表格的显示绑定行循环
  537. LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
  538. HtmlRenderPolicy htmlRenderPolicy = new HtmlRenderPolicy();
  539. // 将bz设置为行循环绑定的数据源的key,即key是bz的value会在模板中的{{bz}}处进行解析
  540. Configure configure = Configure.builder().bind("cM", policy).bind("targetDescription", htmlRenderPolicy).build();
  541. XWPFTemplate template = XWPFTemplate.compile(filePath, configure).render(map);
  542. return template;
  543. }
  544. private XWPFTemplate getstabilityTemplate(Integer projectId, String filePath) throws IOException {
  545. //装载标的专利信息
  546. LambdaQueryWrapper<ReportProject> queryWrapper = new LambdaQueryWrapper<>();
  547. queryWrapper.eq(ReportProject::getProjectId, projectId);
  548. ReportProject report = reportProjectService.getOne(queryWrapper, false);
  549. String signPatentNo = report.getSignPatentNo();
  550. Map<String, Object> signPatent = this.signPantentMess(signPatentNo);
  551. PatentRightParams params = new PatentRightParams();
  552. List<RePatentClaim> patentRights = (List<RePatentClaim>) signPatent.get("claims");
  553. //获得特征
  554. List<Feature> allFeatures = new ArrayList<>();
  555. //获得拆分信息
  556. LambdaQueryWrapper<PatentSplitMessage> queryWrapper1 = new LambdaQueryWrapper<>();
  557. queryWrapper1.eq(PatentSplitMessage::getPatentNo, signPatentNo)
  558. .eq(PatentSplitMessage::getProjectId, report.getProjectId());
  559. List<PatentSplitMessage> patentSplitMessages = patentSplitMessageService.list(queryWrapper1);
  560. if (patentSplitMessages.size() > 0) {
  561. LambdaQueryWrapper<Feature> allFeaturesWrapper = new LambdaQueryWrapper<>();
  562. allFeaturesWrapper.eq(Feature::getSplitMessageId, patentSplitMessages.get(0).getId());
  563. allFeatures = featureService.list(allFeaturesWrapper);
  564. }
  565. //根据报告Id 查询出报告下所有的方案
  566. LambdaQueryWrapper<ProofGroup> proofGroupWrapper = new LambdaQueryWrapper<>();
  567. proofGroupWrapper.eq(ProofGroup::getProjectId, report.getProjectId());
  568. List<ProofGroup> compareScenarios = proofGroupService.list(proofGroupWrapper);
  569. List<Integer> scenarioIds = compareScenarios.stream().map(ProofGroup::getId).collect(Collectors.toList());
  570. //根据对比方案Id 查询所有对比方案和(对比记录-特征)关联信息
  571. List<AssoGroupReason> scenariosRecords = new ArrayList<>();
  572. if (scenarioIds != null && scenarioIds.size() != 0) {
  573. LambdaQueryWrapper<AssoGroupReason> queryRecordsByIDs = new LambdaQueryWrapper<>();
  574. queryRecordsByIDs.in(AssoGroupReason::getGroupId, scenarioIds);
  575. scenariosRecords = assoGroupReasonService.list(queryRecordsByIDs);
  576. }
  577. //获得对比记录id
  578. List<Integer> reasonIds = scenariosRecords.stream().map(AssoGroupReason::getReasonId).collect(Collectors.toList());
  579. //获得特征id
  580. List<Integer> featureIds = scenariosRecords.stream().map(AssoGroupReason::getFeatureId).collect(Collectors.toList());
  581. //查询对比记录
  582. List<EvidenceReason> evidenceReasons = new ArrayList<>();
  583. if (reasonIds != null && reasonIds.size() > 0) {
  584. LambdaQueryWrapper<EvidenceReason> evidenceReasonLambdaQueryWrapper = new LambdaQueryWrapper<>();
  585. evidenceReasonLambdaQueryWrapper.in(EvidenceReason::getId, reasonIds);
  586. evidenceReasons = evidenceReasonService.list(evidenceReasonLambdaQueryWrapper);
  587. }
  588. //查询特征
  589. List<Feature> features = new ArrayList<>();
  590. if (featureIds != null && featureIds.size() > 0) {
  591. LambdaQueryWrapper<Feature> featureLambdaQueryWrapper = new LambdaQueryWrapper<>();
  592. featureLambdaQueryWrapper.in(Feature::getId, featureIds);
  593. features = featureService.list(featureLambdaQueryWrapper);
  594. }
  595. //根据对比记录id获得对比文献
  596. List<String> patentNos = new ArrayList<>();
  597. List<AssoReasonLiterature> assoReasonLiteratures = new ArrayList<>();
  598. List<CompareLiteratureVO> compareLiteratures = new ArrayList<>();
  599. if (reasonIds.size() > 0) {
  600. LambdaQueryWrapper<AssoReasonLiterature> literatureLambdaQueryWrapper = new LambdaQueryWrapper<>();
  601. literatureLambdaQueryWrapper.in(AssoReasonLiterature::getReasonId, reasonIds);
  602. assoReasonLiteratures = assoReasonLiteratureService.list(literatureLambdaQueryWrapper);
  603. if (assoReasonLiteratures.size() > 0) {
  604. List<Integer> literatureIds = assoReasonLiteratures.stream().map(AssoReasonLiterature::getLiteratureId).collect(Collectors.toList());
  605. if (literatureIds.size() > 0) {
  606. compareLiteratures = compareLiteratureService.getByIds(literatureIds);
  607. if (compareLiteratures.size() > 0) {
  608. patentNos = compareLiteratures.stream().map(CompareLiteratureVO::getLiteratureNo).collect(Collectors.toList());
  609. }
  610. }
  611. }
  612. }
  613. //专利号别名的map
  614. Map<String, Object> OtherName = new HashMap<>();
  615. int flag = 1;
  616. for (CompareLiteratureVO item : compareLiteratures) {
  617. Integer order = item.getSysOrder() == null ? flag : item.getSysOrder();
  618. OtherName.put(item.getLiteratureNo(), order);
  619. flag++;
  620. }
  621. //根据专利号查询专利详细信息
  622. List<Patent> patentDTOS = new ArrayList<>();
  623. try {
  624. if (patentNos != null && patentNos.size() > 0) {
  625. patentDTOS = esPatentService.getPatentsByNo(patentNos, true, null, null);
  626. }
  627. } catch (Exception e) {
  628. }
  629. //存放专利信息的map集合
  630. List<Map<String, Object>> patentListMaps = new ArrayList<>();
  631. //填充专利数据到patentListMap
  632. for (int i = 0; i < patentDTOS.size(); i++) {
  633. Patent item = patentDTOS.get(i);
  634. Map<String, Object> patentListMap = new HashMap<>();
  635. List<PatentPerson> applicantJSONs = item.getApplicant();
  636. StringBuilder applicants = new StringBuilder();
  637. applicantJSONs.forEach(tem -> {
  638. applicants.append(tem.getName() + "\r");
  639. });
  640. CompareLiteratureVO compareLiteratureVO = compareLiteratures.stream().filter(t -> t.getLiteratureNo().equals(item.getPatentNo())).findFirst().orElse(null);
  641. List<AssoReasonLiterature> assoReasonLiteratures1 = new ArrayList<>();
  642. if (compareLiteratureVO != null) {
  643. assoReasonLiteratures1 = assoReasonLiteratures.stream().filter(t -> t.getLiteratureId().equals(compareLiteratureVO.getId())).collect(Collectors.toList());
  644. }
  645. //填充相关揭露(对比记录文字和特征组合)
  646. StringBuffer disclosures = new StringBuffer("");
  647. //根据专利号获得对比记录
  648. //遍历对比记录根据对比记录获得对比记录-特征关联信息并获得特征ID
  649. for (AssoReasonLiterature tem : assoReasonLiteratures1) {
  650. EvidenceReason evidenceReason = evidenceReasons.stream().filter(t -> t.getId().equals(tem.getReasonId())).findFirst().orElse(null);
  651. if (evidenceReason != null) {
  652. disclosures.append(evidenceReason.getEvidenceText());
  653. }
  654. //填充对比记录文字
  655. disclosures.append("\r");
  656. disclosures.append("(");
  657. disclosures.append(tem.getFieldName());
  658. disclosures.append("[" + (tem.getPosition()) + "]");
  659. disclosures.append(")");
  660. List<Integer> featuresIds = scenariosRecords.stream().filter(te -> te.getReasonId().equals(tem.getReasonId())).map(AssoGroupReason::getFeatureId).collect(Collectors.toList());
  661. //根据特征Id获得特征内容
  662. List<String> feaListContent = features.stream().filter(te -> featuresIds.contains(te.getId())).map(Feature::getContent).collect(Collectors.toList());
  663. feaListContent.forEach(te -> disclosures.append("(" + te + ")"));
  664. disclosures.append("\n");
  665. }
  666. int order = Integer.parseInt(OtherName.get(item.getPatentNo()).toString());
  667. if (item.getTitle() != null && item.getTitle().size() > 0) {
  668. patentListMap.put("name", item.getTitle().get(0).getTextContent());
  669. }
  670. patentListMap.put("fileName", "D" + order);
  671. patentListMap.put("publicDate", item.getPublicDate());
  672. patentListMap.put("publicNo", item.getPublicNo());
  673. patentListMap.put("SSIM", "");
  674. patentListMap.put("applicant", applicants);
  675. patentListMap.put("patentNo", item.getPatentNo());
  676. if (item.getAbstractStr() != null && item.getAbstractStr().size() > 0) {
  677. patentListMap.put("abstractStr", item.getAbstractStr().get(0).getTextContent());
  678. }
  679. patentListMap.put("compareFileName", "对比文件" + (order));
  680. patentListMap.put("applicationDate", item.getAppDate());
  681. //图示
  682. String guid = FormatUtil.getPictureFormat(item.getAppNo());
  683. PictureRenderData pictureData = this.guidToStream(guid);
  684. if (pictureData != null) {
  685. patentListMap.put("abstractPath", pictureData);
  686. }
  687. patentListMap.put("disclosures", disclosures);
  688. patentListMap.put("order", order);
  689. patentListMaps.add(patentListMap);
  690. }
  691. //存放对比方案信息的map集合
  692. List<Map<String, Object>> scenariosMaps = new ArrayList<>();
  693. //存放所有对比方案所有不重复的rightId
  694. for (int i = 0; i < compareScenarios.size(); i++) {
  695. ProofGroup item1 = compareScenarios.get(i);
  696. //获得单个对比方案的
  697. List<AssoGroupReason> partScenariosRecords = scenariosRecords.stream().filter(item -> item.getGroupId().equals(item1.getId())).collect(Collectors.toList());
  698. //获得单条权要所有的特征
  699. List<Feature> allRightFeatures = features.stream().filter(item -> item.getRightSort().equals(item1.getClaimSort())).collect(Collectors.toList());
  700. //存放单条对比结果的map
  701. Map<String, Object> temMap = new HashMap<>();
  702. String a = allRightFeatures.get(0).getRightSort() + "";
  703. if (allRightFeatures.size() != 0 && allRightFeatures.get(0).getRightType().equals(1)) {
  704. temMap.put("rightName", "独立权要" + a);
  705. } else {
  706. temMap.put("rightName", "附属权要" + a);
  707. }
  708. temMap.put("rightId", item1.getClaimSort());
  709. if (report.getReportType() == 1) {
  710. String rightContent = patentRights.stream().filter(t -> t.getSort().equals(item1.getClaimSort())).map(RePatentClaim::getContent).findFirst().orElse("");
  711. temMap.put("rightContent", rightContent);
  712. }
  713. temMap.put("remark", item1.getDescription());
  714. //存放对比方案每一个特征记录
  715. List<Map<String, Object>> maps = new ArrayList<>();
  716. for (Feature tem : allRightFeatures) {
  717. List<AssoGroupReason> assoGroupReasons = partScenariosRecords.stream().filter(item -> item.getFeatureId().equals(tem.getId())).collect(Collectors.toList());
  718. if (assoGroupReasons.size() > 0) {
  719. for (AssoGroupReason res : assoGroupReasons) {
  720. Map<String, Object> map = new LinkedHashMap<>();
  721. map.put("featureContent", tem.getContent());
  722. if (res.getReasonId().equals(0)) {
  723. map.put("compareResult", "公识");
  724. map.put("compareContent", "");
  725. maps.add(map);
  726. } else {
  727. EvidenceReason evidenceReason = evidenceReasons.stream().filter(t -> t.getId().equals(res.getReasonId())).findFirst().orElse(null);
  728. String content = evidenceReason.getEvidenceText() != null ? evidenceReason.getEvidenceText() : "";
  729. AssoReasonLiterature assoReasonLiterature = assoReasonLiteratures.stream().filter(t -> t.getReasonId().equals(res.getReasonId())).findFirst().orElse(null);
  730. String patentNo = "";
  731. if (assoReasonLiterature != null) {
  732. CompareLiteratureVO compareLiterature = compareLiteratures.stream().filter(t -> t.getId().equals(assoReasonLiterature.getLiteratureId())).findFirst().orElse(null);
  733. if (compareLiterature != null) {
  734. patentNo = compareLiterature.getLiteratureNo() != null ? compareLiterature.getLiteratureNo() : "";
  735. }
  736. if (OtherName.containsKey(patentNo)) {
  737. patentNo = "D" + OtherName.get(patentNo).toString() + ":";
  738. } else if (!patentNo.equals("")) {
  739. patentNo += ":";
  740. }
  741. }
  742. String paresingProcess = evidenceReason.getEvidenceText() != null ? "(" + evidenceReason.getEvidenceText() + ")" : "";
  743. String compareContent = patentNo + content + paresingProcess;
  744. //获取对比专利号
  745. if (maps.size() > 0) {
  746. Map<String, Object> lastMap = maps.get(maps.size() - 1);
  747. if (lastMap.get("compareContent").toString().equals(compareContent)) {
  748. lastMap.put("featureContent", lastMap.get("featureContent") + tem.getContent());
  749. } else {
  750. map.put("compareResult", res.getConclusion() != null ? res.getConclusion() : "不公开");
  751. map.put("compareContent", compareContent);
  752. PictureRenderData pictureData = this.guidToStream(evidenceReason.getFileGuid());
  753. if (pictureData != null) {
  754. map.put("figure", pictureData);
  755. }
  756. if (assoReasonLiterature.getFieldName() == null && assoReasonLiterature.getPosition() == null) {
  757. map.put("position", "");
  758. } else {
  759. map.put("position", "\r" + "(" + assoReasonLiterature.getFieldName() + "[" + assoReasonLiterature.getPosition() + "]" + ")");
  760. }
  761. maps.add(map);
  762. }
  763. } else {
  764. map.put("compareResult", res.getConclusion() != null ? res.getConclusion() : "不公开");
  765. map.put("compareContent", compareContent);
  766. PictureRenderData pictureData = this.guidToStream(evidenceReason.getFileGuid());
  767. if (pictureData != null) {
  768. map.put("figure", pictureData);
  769. }
  770. if (assoReasonLiterature.getFieldName() == null && assoReasonLiterature.getPosition() == null) {
  771. map.put("position", "");
  772. } else {
  773. map.put("position", "\r" + "(" + assoReasonLiterature.getFieldName() + "[" + assoReasonLiterature.getPosition() + "]" + ")");
  774. }
  775. maps.add(map);
  776. }
  777. }
  778. }
  779. } else {
  780. Map<String, Object> map = new LinkedHashMap<>();
  781. map.put("featureContent", tem.getContent());
  782. map.put("compareResult", "未公开");
  783. map.put("compareContent", "");
  784. maps.add(map);
  785. }
  786. }
  787. //方案内容
  788. temMap.put("fileDetails", maps);
  789. //新颖性模块
  790. //获得本方案所有的专利号
  791. List<String> patentNOs = new ArrayList<>();
  792. List<CompareLiteratureVO> partCompareLiterature = new ArrayList<>();
  793. List<Integer> partReasonIds = partScenariosRecords.stream().map(AssoGroupReason::getReasonId).collect(Collectors.toList());
  794. if (partReasonIds.size() != 0) {
  795. List<Integer> partLiteratureIds = assoReasonLiteratures.stream().filter(t -> partReasonIds.contains(t.getReasonId())).map(AssoReasonLiterature::getLiteratureId).collect(Collectors.toList());
  796. if (partLiteratureIds.size() != 0) {
  797. partCompareLiterature = compareLiteratures.stream().filter(t -> partLiteratureIds.contains(t.getId())).collect(Collectors.toList());
  798. }
  799. }
  800. //比较所有专利号和权要所有权要的大小,如果相等则将该专利加入到新颖性列表中
  801. List<String> noveltyFiles = new ArrayList<>();
  802. for (CompareLiteratureVO item : partCompareLiterature) {
  803. //根据id查询对比理由
  804. List<Integer> temReasonIds = assoReasonLiteratures.stream().filter(t -> t.getLiteratureId().equals(item.getId())).map(AssoReasonLiterature::getReasonId).collect(Collectors.toList());
  805. List<Integer> temFeatureIds = partScenariosRecords.stream().filter(t -> temReasonIds.contains(t.getReasonId())).map(AssoGroupReason::getFeatureId).distinct().collect(Collectors.toList());
  806. String tmName = item.getLiteratureNo();
  807. if (OtherName.containsKey(item)) {
  808. tmName = "D" + OtherName.get(item).toString();
  809. }
  810. if (temFeatureIds.size() == allRightFeatures.size()) {
  811. noveltyFiles.add(tmName);
  812. }
  813. }
  814. //创造性列表
  815. List<String> creativeFiles = new ArrayList<>();
  816. //当前方案所有的特征Id
  817. partCompareLiterature.forEach(
  818. item -> {
  819. String tmName = item.getLiteratureNo();
  820. if (OtherName.containsKey(tmName)) {
  821. tmName = "D" + OtherName.get(tmName).toString();
  822. }
  823. if (!creativeFiles.contains(tmName)) {
  824. creativeFiles.add(tmName);
  825. }
  826. }
  827. );
  828. List<AssoGroupReason> andRecords = partScenariosRecords.stream().filter(tm -> tm.getReasonId().equals(0)).collect(Collectors.toList());
  829. if (andRecords.size() != 0) {
  830. creativeFiles.add("C");
  831. }
  832. String creative = creativeFiles.size() == 0 ? "" : StringUtils.join(creativeFiles, "+");
  833. String novelty = noveltyFiles.size() == 0 ? "" : StringUtils.join(noveltyFiles, "-");
  834. //新颖性
  835. temMap.put("novelty", novelty);
  836. //创造性
  837. temMap.put("creative", creative);
  838. scenariosMaps.add(temMap);
  839. }
  840. List<Map<String, Object>> allRightScenarios = new ArrayList<>();
  841. List<Map<String, Object>> resultMaps = new ArrayList<>();
  842. // 存放创造性和新颖性的权要
  843. patentRights.forEach(tem -> {
  844. Map<String, Object> map = new HashMap<>();
  845. Map<String, Object> resultMap = new HashMap<>();
  846. List<Map<String, Object>> rightScenarios = new ArrayList<>();
  847. //存放新颖性信息
  848. List<String> noveList = new ArrayList<>();
  849. List<String> creaList = new ArrayList<>();
  850. //存放创造性信息
  851. for (int t = 0; t < scenariosMaps.size(); t++) {
  852. Map<String, Object> item = scenariosMaps.get(t);
  853. if (item.get("rightId").equals(tem.getSort())) {
  854. item.put("scenariosName", "对比组合" + (t + 1));
  855. rightScenarios.add(item);
  856. if (item.get("novelty").toString() != "") {
  857. if (!noveList.contains(item.get("novelty").toString())) {
  858. noveList.add(item.get("novelty").toString());
  859. }
  860. }
  861. if (item.get("creative").toString() != "") {
  862. if (!creaList.contains(item.get("creative").toString())) {
  863. creaList.add(item.get("creative").toString());
  864. }
  865. }
  866. }
  867. }
  868. map.put("rightScenrios", rightScenarios);
  869. map.put("rightName", tem.getRightName());
  870. String creative = creaList.size() == 0 ? "" : StringUtils.join(creaList, "、");
  871. String novelty = noveList.size() == 0 ? "" : StringUtils.join(noveList, "-");
  872. resultMap.put("rightName", tem.getRightName());
  873. resultMap.put("rightNovelty", novelty);
  874. resultMap.put("rightCreative", creative);
  875. allRightScenarios.add(map);
  876. resultMaps.add(resultMap);
  877. });
  878. //1.系统数据
  879. //存放单条对比结果的map
  880. Map<String, Object> map = new HashMap<>();
  881. String date = DateUtils.formatDate(new Date(), DateUtils.YYYY_MM_DD);
  882. String[] ds = date.split("-");
  883. map.put("sys", new SystemMO(ds[0], ds[1], ds[2], "", "reportName"));
  884. if (patentListMaps.size() > 1) {
  885. patentListMaps = this.sortMap(patentListMaps);
  886. }
  887. map.put("patentList", patentListMaps);
  888. map.put("combinations", allRightScenarios);
  889. map.put("allResults", resultMaps);
  890. map.put("signPatent", signPatent);
  891. map.put("pantentNo", report.getSignPatentNo());
  892. map.put("rights", signPatent.get("rights"));
  893. // 为表格的显示绑定行循环
  894. LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
  895. HtmlRenderPolicy htmlRenderPolicy = new HtmlRenderPolicy();
  896. // 将bz设置为行循环绑定的数据源的key,即key是bz的value会在模板中的{{bz}}处进行解析
  897. Configure configure = Configure.builder()
  898. .bind("patentList", policy)
  899. .bind("fileDetails", policy)
  900. .bind("allResults", policy)
  901. .bind("signPatent.rights", policy)
  902. .bind("remark", htmlRenderPolicy)
  903. .build();
  904. // 读取模板、数据并渲染
  905. XWPFTemplate template = XWPFTemplate.compile(filePath, configure).render(map);
  906. return template;
  907. }
  908. //
  909. public Map<String, Object> signPantentMess(String patentNo) throws IOException {
  910. Patent patent = new Patent();
  911. try {
  912. List<Patent> patentList = esPatentService.getPatentsByNo(Arrays.asList(patentNo), true, null, null);
  913. if (patentList.size() > 0) {
  914. patent = patentList.get(0);
  915. }
  916. } catch (Exception e) {
  917. throw new IOException();
  918. }
  919. //装载单个专利的信息
  920. Map<String, Object> patentMap = new HashMap<>();
  921. StringBuilder applicants = new StringBuilder();
  922. StringBuilder rightPerson = new StringBuilder();
  923. if (patent.getApplicant() != null && patent.getApplicant().size() > 0) {
  924. patent.getApplicant().forEach(item -> {
  925. applicants.append(item.getName() + "\r");
  926. });
  927. }
  928. if (patent.getRightHolder() != null && patent.getRightHolder().size() > 0) {
  929. patent.getRightHolder().forEach(item -> {
  930. rightPerson.append(item.getName() + "\r");
  931. });
  932. }
  933. //申请日
  934. patentMap.put("applicationDate", patent.getAppDate());
  935. //公开日
  936. patentMap.put("publicDate", patent.getPublicDate());
  937. //公开号
  938. patentMap.put("publicNo", patent.getPublicNo());
  939. //专利号
  940. patentMap.put("patentNo", patent.getPatentNo());
  941. //专利权人
  942. patentMap.put("rightPerson", rightPerson);
  943. //图示
  944. String guid = FormatUtil.getPictureFormat(patent.getAppNo());
  945. PictureRenderData pictureData = this.guidToStream(guid);
  946. if (pictureData != null) {
  947. patentMap.put("abstractPath", pictureData);
  948. }
  949. if (patent.getTitle() != null && patent.getTitle().size() > 0) {
  950. patentMap.put("name", patent.getTitle().get(0).getTextContent());
  951. }
  952. //查询专利权要
  953. List<Text> patentRights = patent.getClaim();
  954. String patentRight = null;
  955. if (patentRights != null && patentRights.size() > 0) {
  956. patentRight = patentRights.get(0).getTextContent();
  957. }
  958. PatentRightParams params = new PatentRightParams();
  959. params.setContent(patentRight);
  960. params.setPatentNo(patentNo);
  961. List<RePatentClaim> claims = PatentRightUtils.formatPatentRight(params);
  962. List<Map<String, Object>> rights = new ArrayList<>();
  963. claims.forEach(item -> {
  964. Map<String, Object> temMap = new HashMap<>();
  965. temMap.put("rightName", "权" + (item.getSort() + 1));
  966. temMap.put("content", item.getContent());
  967. temMap.put("rightNameLong", "权利要求" + (item.getSort() + 1));
  968. temMap.put("parentSort", item.getParentSort());
  969. temMap.put("sort", item.getSort());
  970. rights.add(temMap);
  971. });
  972. patentMap.put("rights", rights);
  973. patentMap.put("claims", claims);
  974. return patentMap;
  975. }
  976. public List<Map<String, Object>> sortMap(List<Map<String, Object>> maps) {
  977. for (int i = 0; i < maps.size() - 1; i++) {
  978. for (int j = 0; j < maps.size() - i - 1; j++) {
  979. Integer order1 = Integer.parseInt(maps.get(j).get("order").toString());
  980. Integer order2 = Integer.parseInt(maps.get(j + 1).get("order").toString());
  981. if (order1 > order2) {
  982. Map<String, Object> temp = maps.get(j);
  983. maps.set(j, maps.get(j + 1));
  984. maps.set(j + 1, temp);
  985. }
  986. }
  987. }
  988. return maps;
  989. }
  990. private XWPFTemplate getThirdTemplate(Integer projectId, String filePath) throws IOException {
  991. //装载标的专利信息
  992. LambdaQueryWrapper<ReportProject> queryWrapper = new LambdaQueryWrapper<>();
  993. queryWrapper.eq(ReportProject::getProjectId, projectId);
  994. ReportProject report = reportProjectService.getOne(queryWrapper, false);
  995. String signPatentNo = report.getSignPatentNo();
  996. Map<String, Object> signPatent = this.signPantentMess(signPatentNo);
  997. List<Map<String, Object>> rights = (List<Map<String, Object>>) signPatent.get("rights");
  998. List<Feature> allFeatures = new ArrayList<>();
  999. LambdaQueryWrapper<PatentSplitMessage> queryWrapper1 = new LambdaQueryWrapper<>();
  1000. queryWrapper1.eq(PatentSplitMessage::getPatentNo, signPatentNo)
  1001. .eq(PatentSplitMessage::getProjectId, report.getProjectId());
  1002. List<PatentSplitMessage> patentSplitMessages = patentSplitMessageService.list(queryWrapper1);
  1003. if (patentSplitMessages.size() > 0) {
  1004. LambdaQueryWrapper<Feature> allFeaturesWrapper = new LambdaQueryWrapper<>();
  1005. allFeaturesWrapper.eq(Feature::getSplitMessageId, patentSplitMessages.get(0).getId());
  1006. allFeatures = featureService.list(allFeaturesWrapper);
  1007. }
  1008. //根据报告Id 查询出报告下所有的方案
  1009. LambdaQueryWrapper<ProofGroup> proofGroupWrapper = new LambdaQueryWrapper<>();
  1010. proofGroupWrapper.eq(ProofGroup::getProjectId, report.getProjectId());
  1011. List<ProofGroup> compareScenarios = proofGroupService.list(proofGroupWrapper);
  1012. List<Integer> scenarioIds = compareScenarios.stream().map(ProofGroup::getId).collect(Collectors.toList());
  1013. //根据对比方案Id 查询所有对比方案和(对比记录-特征)关联信息
  1014. List<AssoGroupReason> scenariosRecords = new ArrayList<>();
  1015. if (scenarioIds != null && scenarioIds.size() != 0) {
  1016. LambdaQueryWrapper<AssoGroupReason> queryRecordsByIDs = new LambdaQueryWrapper<>();
  1017. queryRecordsByIDs.in(AssoGroupReason::getGroupId, scenarioIds);
  1018. scenariosRecords = assoGroupReasonService.list(queryRecordsByIDs);
  1019. }
  1020. //获得对比记录id
  1021. List<Integer> reasonIds = scenariosRecords.stream().map(AssoGroupReason::getReasonId).collect(Collectors.toList());
  1022. //获得特征id
  1023. List<Integer> featureIds = scenariosRecords.stream().map(AssoGroupReason::getFeatureId).collect(Collectors.toList());
  1024. //查询对比记录
  1025. List<EvidenceReason> evidenceReasons = new ArrayList<>();
  1026. if (reasonIds != null && reasonIds.size() > 0) {
  1027. LambdaQueryWrapper<EvidenceReason> evidenceReasonLambdaQueryWrapper = new LambdaQueryWrapper<>();
  1028. evidenceReasonLambdaQueryWrapper.in(EvidenceReason::getId, reasonIds);
  1029. evidenceReasons = evidenceReasonService.list(evidenceReasonLambdaQueryWrapper);
  1030. }
  1031. //查询特征
  1032. List<Feature> features = new ArrayList<>();
  1033. if (featureIds != null && featureIds.size() > 0) {
  1034. LambdaQueryWrapper<Feature> featureLambdaQueryWrapper = new LambdaQueryWrapper<>();
  1035. featureLambdaQueryWrapper.in(Feature::getId, featureIds);
  1036. features = featureService.list(featureLambdaQueryWrapper);
  1037. }
  1038. //根据对比记录id获得对比文献
  1039. List<String> patentNos = new ArrayList<>();
  1040. List<AssoReasonLiterature> assoReasonLiteratures = new ArrayList<>();
  1041. List<CompareLiteratureVO> compareLiteratures = new ArrayList<>();
  1042. if (reasonIds.size() > 0) {
  1043. LambdaQueryWrapper<AssoReasonLiterature> literatureLambdaQueryWrapper = new LambdaQueryWrapper<>();
  1044. literatureLambdaQueryWrapper.in(AssoReasonLiterature::getReasonId, reasonIds);
  1045. assoReasonLiteratures = assoReasonLiteratureService.list(literatureLambdaQueryWrapper);
  1046. if (assoReasonLiteratures.size() > 0) {
  1047. List<Integer> literatureIds = assoReasonLiteratures.stream().map(AssoReasonLiterature::getLiteratureId).collect(Collectors.toList());
  1048. if (literatureIds.size() > 0) {
  1049. compareLiteratures = compareLiteratureService.getByIds(literatureIds);
  1050. if (compareLiteratures.size() > 0) {
  1051. patentNos = compareLiteratures.stream().map(CompareLiteratureVO::getLiteratureNo).collect(Collectors.toList());
  1052. }
  1053. }
  1054. }
  1055. }
  1056. //专利号别名的map
  1057. Map<String, Object> OtherName = new HashMap<>();
  1058. int flag = 1;
  1059. for (CompareLiteratureVO item : compareLiteratures) {
  1060. Integer order = item.getSysOrder() == null ? flag : item.getSysOrder();
  1061. OtherName.put(item.getLiteratureNo(), order);
  1062. flag++;
  1063. }
  1064. //根据专利号查询专利详细信息
  1065. List<Patent> patentDTOS = new ArrayList<>();
  1066. try {
  1067. if (patentNos != null && patentNos.size() > 0) {
  1068. patentDTOS = esPatentService.getPatentsByNo(patentNos, true, null, null);
  1069. }
  1070. } catch (Exception e) {
  1071. }
  1072. //存放专利信息的map集合
  1073. List<Map<String, Object>> patentListMaps = new ArrayList<>();
  1074. //填充专利数据到patentListMap
  1075. for (int i = 0; i < patentDTOS.size(); i++) {
  1076. Patent item = patentDTOS.get(i);
  1077. Map<String, Object> patentListMap = new HashMap<>();
  1078. List<PatentPerson> applicantJSONs = item.getApplicant();
  1079. StringBuilder applicants = new StringBuilder();
  1080. if(applicantJSONs!=null) {
  1081. applicantJSONs.forEach(tem -> {
  1082. applicants.append(tem.getName() + "\r");
  1083. });
  1084. }
  1085. CompareLiteratureVO compareLiteratureVO = compareLiteratures.stream().filter(t -> t.getLiteratureNo().equals(item.getPatentNo())).findFirst().orElse(null);
  1086. List<AssoReasonLiterature> assoReasonLiteratures1 = new ArrayList<>();
  1087. if (compareLiteratureVO != null) {
  1088. assoReasonLiteratures1 = assoReasonLiteratures.stream().filter(t -> t.getLiteratureId().equals(compareLiteratureVO.getId())).collect(Collectors.toList());
  1089. }
  1090. //填充相关揭露(对比记录文字和特征组合)
  1091. StringBuffer disclosures = new StringBuffer("");
  1092. //根据专利号获得对比记录
  1093. //遍历对比记录根据对比记录获得对比记录-特征关联信息并获得特征ID
  1094. for (AssoReasonLiterature tem : assoReasonLiteratures1) {
  1095. EvidenceReason evidenceReason = evidenceReasons.stream().filter(t -> t.getId().equals(tem.getReasonId())).findFirst().orElse(null);
  1096. if (evidenceReason != null) {
  1097. disclosures.append(evidenceReason.getEvidenceText());
  1098. }
  1099. //填充对比记录文字
  1100. disclosures.append("\r");
  1101. disclosures.append("(");
  1102. disclosures.append(tem.getFieldName());
  1103. disclosures.append("[" + (tem.getPosition()) + "]");
  1104. disclosures.append(")");
  1105. List<Integer> featuresIds = scenariosRecords.stream().filter(te -> te.getReasonId().equals(tem.getReasonId())).map(AssoGroupReason::getFeatureId).collect(Collectors.toList());
  1106. //根据特征Id获得特征内容
  1107. List<String> feaListContent = features.stream().filter(te -> featuresIds.contains(te.getId())).map(Feature::getContent).collect(Collectors.toList());
  1108. feaListContent.forEach(te -> disclosures.append("(" + te + ")"));
  1109. disclosures.append("\n");
  1110. }
  1111. int order = Integer.parseInt(OtherName.get(item.getPatentNo()).toString());
  1112. patentListMap.put("name", item.getTitle());
  1113. patentListMap.put("fileName", "D" + order);
  1114. patentListMap.put("publicDate", item.getPublicDate());
  1115. patentListMap.put("publicNo", item.getPublicNo());
  1116. patentListMap.put("SSIM", "");
  1117. patentListMap.put("applicant", applicants);
  1118. patentListMap.put("patentNo", item.getPatentNo());
  1119. if (item.getAbstractStr() != null && item.getAbstractStr().size() > 0) {
  1120. patentListMap.put("abstractStr", item.getAbstractStr().get(0).getTextContent());
  1121. }
  1122. patentListMap.put("compareFileName", "对比文件" + (order));
  1123. patentListMap.put("applicationDate", item.getAppDate());
  1124. //图示
  1125. String guid = FormatUtil.getPictureFormat(item.getAppNo());
  1126. PictureRenderData pictureData = this.guidToStream(guid);
  1127. if (pictureData != null) {
  1128. patentListMap.put("abstractPath", pictureData);
  1129. }
  1130. patentListMap.put("disclosures", disclosures);
  1131. patentListMap.put("order", order);
  1132. patentListMaps.add(patentListMap);
  1133. }
  1134. List<Map<String, Object>> rightMaps = new ArrayList<>();
  1135. List<Integer> noveltyIds = new ArrayList<Integer>();
  1136. List<Integer> creativeIds = new ArrayList<Integer>();
  1137. for (Map<String, Object> right : rights) {
  1138. String text = "";
  1139. if (right.get("parentSort") != null && !right.get("parentSort").equals("-1")) {
  1140. String parentSort = "";
  1141. List<String> sorts = new ArrayList<>(Arrays.asList(right.get("parentSort").toString().split(",")));
  1142. List<Integer> sortIds = new ArrayList<>();
  1143. sorts.forEach(item -> {
  1144. sortIds.add(Integer.parseInt(item) + 1);
  1145. });
  1146. parentSort = StringUtils.join(sortIds, "、");
  1147. text = right.get("rightNameLong") + "为引用权" + parentSort + "的从属权利要求,";
  1148. }
  1149. for (int i = 0; i < compareScenarios.size(); i++) {
  1150. ProofGroup item1 = compareScenarios.get(i);
  1151. //判断是该权要的方案
  1152. if (right.get("sort").equals(item1.getClaimSort())) {
  1153. //根据方案id获得特征和记录关联表的id
  1154. List<Integer> recordIds = scenariosRecords.stream().filter(item -> item.getGroupId().equals(item1.getId())).map(AssoGroupReason::getReasonId).collect(Collectors.toList());
  1155. //获得记录
  1156. List<EvidenceReason> compareRecords1 = new ArrayList<>();
  1157. if (recordIds != null && recordIds.size() != 0) {
  1158. compareRecords1 = evidenceReasons.stream().filter(item -> recordIds.contains(item.getId())).collect(Collectors.toList());
  1159. }
  1160. //判断方案是否具有创造性或者新颖性字眼
  1161. if (item1.getDescription() != null && (item1.getDescription().contains("创造性") || item1.getDescription().contains("新颖性"))) {
  1162. //装载对比记录
  1163. List<Map<String, Object>> maps = new ArrayList<>();
  1164. for (EvidenceReason record : compareRecords1) {
  1165. Map<String, Object> map = new HashMap<>();
  1166. PictureRenderData pictureData = this.guidToStream(record.getFileGuid());
  1167. map.put("figure", pictureData);
  1168. AssoReasonLiterature assoReasonLiterature = assoReasonLiteratures.stream().filter(t -> t.getReasonId().equals(record.getId())).findFirst().orElse(null);
  1169. String patentNo = "";
  1170. if (assoReasonLiterature != null) {
  1171. if (assoReasonLiterature.getFieldName() == null && assoReasonLiterature.getPosition() == null) {
  1172. map.put("position", "");
  1173. } else {
  1174. map.put("position", "\r" + "(" + assoReasonLiterature.getFieldName() + "[" + assoReasonLiterature.getPosition() + "]" + ")");
  1175. }
  1176. CompareLiteratureVO compareLiterature = compareLiteratures.stream().filter(t -> t.getId().equals(assoReasonLiterature.getLiteratureId())).findFirst().orElse(null);
  1177. patentNo = compareLiterature.getLiteratureNo() != null ? compareLiterature.getLiteratureNo() : "";
  1178. if (OtherName.containsKey(patentNo)) {
  1179. patentNo = "D" + OtherName.get(patentNo).toString() + ":";
  1180. } else if (!patentNo.equals("")) {
  1181. patentNo += ":";
  1182. }
  1183. }
  1184. String compareContent = "";
  1185. //获取对比内容
  1186. String content = record.getEvidenceText() != null ? record.getEvidenceText() : "";
  1187. //获得对比专利号
  1188. //获得解析过程
  1189. String paresingProcess = record.getDescription() != null ? "(" + record.getDescription() + ")" : "";
  1190. compareContent = patentNo + content + paresingProcess;
  1191. map.put("compareContent", compareContent);
  1192. maps.add(map);
  1193. }
  1194. if (item1.getDescription().contains("创造性")) {
  1195. creativeIds.add(Integer.parseInt(right.get("sort").toString()) + 1);
  1196. right.put("records", maps);
  1197. right.put("text", "第3款的创造性的规定。\n" + text + right.get("rightNameLong") + "的附加技术特征为:");
  1198. rightMaps.add(right);
  1199. } else if (item1.getDescription().contains("新颖性")) {
  1200. noveltyIds.add(Integer.parseInt(right.get("sort").toString()) + 1);
  1201. right.put("text", "第2款的新颖性的规定。\n" + text + right.get("rightNameLong") + "保护的主体,具体:");
  1202. right.put("records", compareRecords1);
  1203. rightMaps.add(right);
  1204. }
  1205. }
  1206. }
  1207. }
  1208. }
  1209. String noveltyIdStr = StringUtils.join(noveltyIds, ",");
  1210. String creativeIdStr = StringUtils.join(creativeIds, ",");
  1211. Map<String, Object> map = new HashMap<>();
  1212. String date = DateUtils.formatDate(new Date(), DateUtils.YYYY_MM_DD);
  1213. String[] ds = date.split("-");
  1214. map.put("sys", new SystemMO(ds[0], ds[1], ds[2], "", "reportName"));
  1215. map.put("signPatent", signPatent);
  1216. map.put("pantentNo", report.getSignPatentNo());
  1217. map.put("rights", rightMaps);
  1218. map.put("noveltyIdStr", noveltyIdStr);
  1219. map.put("creativeIdStr", creativeIdStr);
  1220. map.put("patentList", patentListMaps);
  1221. // 为表格的显示绑定行循环
  1222. LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
  1223. HtmlRenderPolicy htmlRenderPolicy = new HtmlRenderPolicy();
  1224. // 将bz设置为行循环绑定的数据源的key,即key是bz的value会在模板中的{{bz}}处进行解析
  1225. Configure configure = Configure.builder()
  1226. .bind("patentList", policy)
  1227. .bind("fileDetails", policy)
  1228. .bind("allResults", policy)
  1229. .bind("signPatent.rights", policy)
  1230. .bind("remark", htmlRenderPolicy)
  1231. .build();
  1232. // 读取模板、数据并渲染
  1233. XWPFTemplate template = XWPFTemplate.compile(filePath, configure).render(map);
  1234. return template;
  1235. }
  1236. }