package cn.cslg.pas.service; import cn.cslg.pas.common.dto.PatentColumnDTO; import cn.cslg.pas.common.dto.PatentDTO; import cn.cslg.pas.common.dto.es.EsCustomFieldValueDTO; import cn.cslg.pas.common.model.SystemMO; import cn.cslg.pas.common.model.cronModel.PersonnelVO; import cn.cslg.pas.common.model.request.StringRequest; import cn.cslg.pas.common.utils.*; import cn.cslg.pas.common.vo.*; import cn.cslg.pas.common.vo.business.FTOCompareRecordVO; import cn.cslg.pas.common.vo.business.TortCompareRecordVO; import cn.cslg.pas.common.vo.business.TortRightVO; import cn.cslg.pas.common.vo.business.TortVO; import cn.cslg.pas.domain.ReportDocument; import cn.cslg.pas.domain.business.*; import cn.cslg.pas.domain.es.Patent; import cn.cslg.pas.domain.es.PatentPerson; import cn.cslg.pas.domain.es.Priorities; import cn.cslg.pas.domain.es.Text; import cn.cslg.pas.exception.XiaoShiException; import cn.cslg.pas.mapper.AvoidDesignMapper; import cn.cslg.pas.service.business.*; import cn.cslg.pas.service.business.es.*; import cn.cslg.pas.service.business.invalidReport.AssoReasonLiteratureService; import cn.cslg.pas.service.business.invalidReport.EvidenceReasonService; import cn.cslg.pas.service.business.stabilityReport.AssoGroupReasonService; import cn.cslg.pas.service.common.FileManagerService; import cn.hutool.core.util.IdUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; import com.deepoove.poi.data.PictureRenderData; import com.deepoove.poi.data.PictureType; import com.deepoove.poi.data.Pictures; import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.ddr.poi.html.HtmlRenderPolicy; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.text.SimpleDateFormat; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; @Slf4j @Service public class ReportExportService { @Autowired private ReportTempleService templeService; @Autowired private FileUtils fileUtils; @Autowired private ReportProjectService reportProjectService; @Autowired private FileManagerService fileManagerService; @Autowired private EsPatentService esPatentService; @Autowired private AvoidDesignMapper avoidDesignMapper; @Autowired private TemplateConfigService templateConfigService; @Autowired private CustomFieldService customFieldService; @Autowired private EsService esService; @Autowired private FTOCompareRecordService ftoCompareRecordService; @Autowired private EsQuotePatentService esQuotePatentService; @Autowired private EsFamilyService esFamilyService; @Autowired private LoginUtils loginUtils; @Autowired private CacheUtils cacheUtils; @Autowired private EsLegalEventService esLegalEventService; @Autowired private FeatureService featureService; @Autowired private PatentSplitMessageService patentSplitMessageService; @Autowired private ProofGroupService proofGroupService; @Autowired private AssoGroupReasonService assoGroupReasonService; @Autowired private AssoReasonLiteratureService assoReasonLiteratureService; @Autowired private CompareLiteratureService compareLiteratureService; @Autowired private EvidenceReasonService evidenceReasonService; @Autowired private TortCompareRecordService tortCompareRecordService; /** * @param projectId * @param templeId * @return * @throws IOException * @function: 导出报告 */ public String exportReport(Integer projectId, Integer templeId) throws Exception { //根据模板ID获得模板 ReportTemple reportTemplate = templeService.getById(templeId); //获得模板路径 String templateFilePath = fileUtils.getPath(reportTemplate.getTemplatePath()); //读取模板后保存生成word的地址 String fileName = IdUtil.simpleUUID() + ".docx"; String directoryName = fileUtils.createDirectory(); String outPath = fileUtils.getSavePath(directoryName) + fileName; //根据ProjectId 获得报告 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(ReportProject::getProjectId, projectId); ReportProject report = reportProjectService.getOne(queryWrapper, false); if (report == null) { throw new XiaoShiException("报告不存在"); } XWPFTemplate template = null; if (report.getReportType() == 0 || report.getReportType() == 2) { template = this.getstabilityTemplate(projectId, templateFilePath); } else if (report.getReportType() == 3) { template = this.FTOTemplate(projectId, templateFilePath, templeId); } else if (report.getReportType() == 4) { template = this.Torttemplate(projectId, templateFilePath); } else if (report.getReportType() == 5) { template = this.avoidDesignTemplate(projectId, templateFilePath); } else if (report.getReportType() == 1) { template = this.getThirdTemplate(projectId, templateFilePath); } if (template == null) { return null; } // 读取模板、数据并渲染 // 文件是否已存在,则删除 File file = new File(outPath); // 生成word保存在指定目录 template.writeToFile(outPath); template.close(); //导出成功后,导出报告记录入库 List ids = fileManagerService.uploadFileGetGuid2(Arrays.asList(file)); if (ids == null || ids.size() == 0) { throw new XiaoShiException("保存记录失败"); } PersonnelVO personnelVO = new PersonnelVO(); personnelVO.setId("1"); ReportDocument reportDocument = new ReportDocument(); reportDocument.setProjectId(projectId); reportDocument.setFileName(fileName); reportDocument.setFileGuid(ids.get(0)); reportDocument.setCreateId(personnelVO.getId()); reportDocument.setTemplateId(reportTemplate.getId()); reportDocument.setTemplateName(reportTemplate.getTemplateName()); reportDocument.insert(); if (file.exists()) { file.delete(); } return ids.get(0); } private XWPFTemplate Torttemplate(Integer reportId, String filePath) throws Exception { //根据报告Id查询标的专利号 LambdaQueryWrapper projectLambdaQueryWrapper = new LambdaQueryWrapper<>(); projectLambdaQueryWrapper.eq(ReportProject::getProjectId, reportId); ReportProject report = reportProjectService.getOne(projectLambdaQueryWrapper, false); String patentNo = report.getSignPatentNo(); List patentList = esPatentService.getPatentsByNo(Arrays.asList(patentNo), true, null, null); if (patentList == null || patentList.size() == 0) { return null; } //装载单个专利的信息 Map patentMap = new HashMap<>(); Patent patent = patentList.get(0); String applicants = ""; String rightPerson = ""; if (patent.getApplicant() != null && patent.getApplicant().size() != 0) { List names =patent.getApplicant().stream().map(PatentPerson::getName).collect(Collectors.toList()); applicants = StringUtils.join(names, "\n"); } if (patent.getRightHolder() != null && patent.getRightHolder().size() != 0) { List names =patent.getRightHolder().stream().map(PatentPerson::getName).collect(Collectors.toList()); rightPerson = StringUtils.join(names, "\n"); } //装载同族信息 List> familyMaps = esFamilyService.getPatentFamilyByNos(Arrays.asList(patent.getPatentNo()), "simple"); if (familyMaps.size() <= 0) { familyMaps = esFamilyService.getPatentFamilyByNos(Arrays.asList(patent.getPatentNo()), "inpadoc"); } if (familyMaps != null && familyMaps.size() > 0) { Map familyMap = familyMaps.get(0); if (familyMap.get("nos") != null) { List nos = (List) familyMap.get("nos"); if (nos != null && nos.size() > 0) { String nosStr = StringUtils.join(nos, "\n"); patentMap.put("simpleFamilys", nosStr); } } } //装载引用专利 Map map = esQuotePatentService.getEsQutePatentByNos(patent.getPatentNo()); if (map.get("nos") != null) { List nos = (List) map.get("nos"); if (nos != null && nos.size() > 0) { String nosStr = StringUtils.join(nos, "\n"); patentMap.put("quotePatents", nosStr); } SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); if (patent.getGrantDate() != null) { patentMap.put("publicDate",dateFormat.format(patent.getGrantDate())); } else { patentMap.put("publicDate",dateFormat.format(patent.getPublicDate())); } } if (patent.getGrantNo() != null) { patentMap.put("publicNo", patent.getGrantNo()); } else { patentMap.put("publicNo", patent.getPublicNo()); } patentMap.put("applicant", applicants); patentMap.put("rightPerson", rightPerson); if (patent.getTitle() != null && patent.getTitle().size() > 0) { patentMap.put("name", patent.getTitle().get(0).getTextContent()); } //图示 String guid = FormatUtil.getPictureFormat(patent.getAppNo()); PictureRenderData pictureData = this.guidToStream(guid); if (pictureData != null) { patentMap.put("abstractPath", pictureData); } if (patent.getPriorities() != null && patent.getPriorities().size() != 0) { List dates = patent.getPriorities().stream().map(Priorities::getPriorityDate).collect(Collectors.toList()); String nosStr = StringUtils.join(dates, ";"); patentMap.put("priorityDate", nosStr); } //获得专利对比记录的信息 TortCompareRecordVO tortCompareRecordVO = tortCompareRecordService.getAllTortTaskResult(reportId, null, 2); List tortRightVOS = tortCompareRecordVO.getTortRightVOS(); List> tortMaps = new ArrayList<>(); Integer addI = 1; if (tortRightVOS != null && tortRightVOS.size() > 0) { addI =addI-tortRightVOS.get(0).getSort(); } for (TortRightVO tortRightVO : tortRightVOS) { Integer sort = tortRightVO.getSort(); List tortVOS = tortRightVO.getTortVOS(); for (TortVO tortVO : tortVOS) { Map tortMap = new HashMap<>(); tortMap.put("rightName", "权要" + (sort + addI)); tortMap.put("content", tortVO.getContent()); tortMap.put("explainText", tortVO.getExplainText()); FTOCompareRecordVO ftoCompareRecordVO = tortVO.getFinalRecordVO(); if (ftoCompareRecordVO != null) { tortMap.put("targetDescription", ftoCompareRecordVO.getTargetDescription()); Integer result = ftoCompareRecordVO.getCompareResult(); System.out.println(result); if(result!=null) { switch (result) { case 0: tortMap.put("resultStr", "字面相同"); break; case 1: tortMap.put("resultStr", "等同"); break; case 2: tortMap.put("resultStr", "不等同"); break; case 3: tortMap.put("resultStr", "确定"); break; } } tortMap.put("compareDescription", ftoCompareRecordVO.getCompareDescription()); } tortMaps.add(tortMap); } } //装载对比记录的信息 patentMap.put("cM", tortMaps); System.out.println(tortMaps); Map map1 = new HashMap<>(); String date = DateUtils.formatDate(new Date(), DateUtils.YYYY_MM_DD); String[] ds = date.split("-"); map1.put("sys", new SystemMO(ds[0], ds[1], ds[2], "", "reportName")); map1.put("patentMap", patentMap); System.out.println(patentMap); // 为表格的显示绑定行循环 LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy(); HtmlRenderPolicy htmlRenderPolicy = new HtmlRenderPolicy(); // 将bz设置为行循环绑定的数据源的key,即key是bz的value会在模板中的{{bz}}处进行解析 Configure configure = Configure.builder().bind("cM", policy).bind("targetDescription", htmlRenderPolicy).bind("compareDescription",htmlRenderPolicy).build(); XWPFTemplate template = XWPFTemplate.compile(filePath, configure).render(map1); return template; } private XWPFTemplate avoidDesignTemplate(Integer projectId, String path) throws IOException { String filePath = fileUtils.getPath(path); log.info("开始处理导出规避设计报告,参数为:{}, {}", projectId, filePath); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(ReportProject::getProjectId, projectId); ReportProject report = reportProjectService.getOne(queryWrapper, false); String signPatentNo = report.getSignPatentNo(); //装载年月日 String date = DateUtils.formatDate(new Date(), DateUtils.YYYY_MM_DD); String[] dates = date.split("-"); SystemMO systemMO = new SystemMO() .setYear(dates[0]) .setMonth(dates[1]) .setDay(dates[2]); // //装载特征、解释、回避设计方向、回避设计总体方向 List features = avoidDesignMapper.selectAvoidDesign(projectId); // String wholeDirection = avoidDesignWholeDirectionMapper.selectWholeDirectionByReportId(reportId); // map.put("wholeDirection", wholeDirection); // //绑定政策(绑定集合和元素循环遍历) LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy(); //把指定元素内容识别传输成html格式 HtmlRenderPolicy htmlRenderPolicy = new HtmlRenderPolicy(); Configure configure = Configure.builder() .bind("signPatent.rights", policy) .bind("features", policy) .bind("explainText", htmlRenderPolicy) .bind("littleDirection", htmlRenderPolicy) .bind("wholeDirection", htmlRenderPolicy) .build(); XWPFTemplate template = XWPFTemplate.compile(filePath, configure).render(new HashMap<>()); return template; } private PictureRenderData guidToStream(String guid) { PictureRenderData pictureRenderData = null; byte[] bytes = null; if (guid == null) { return pictureRenderData; } try { bytes = fileManagerService.downloadSystemFileFromFMS(guid); } catch (Exception e) { } FileInputStream fileInputStream = FileUtils.byteToFile(bytes); pictureRenderData = Pictures.ofStream(fileInputStream, PictureType.PNG) .create(); return pictureRenderData; } private List> getClaimMaps(List claims, String patentNo) { List> rights = new ArrayList<>(); if (claims == null || claims.size() == 0) { return rights; } Text claim = claims.stream().filter(item -> item.getIfOrigin().equals(true)).findFirst().orElse(null); if (claim == null) { return rights; } PatentRightParams params = new PatentRightParams(); params.setContent(claim.getTextContent()); params.setPatentNo(patentNo); List patentRights = PatentRightUtils.formatPatentRight(params); //给权要进行格式更改 patentRights.forEach(item -> { Map temMap = new HashMap<>(); temMap.put("rightName", "权" + (item.getSort() + 1)); temMap.put("content", item.getContent()); temMap.put("rightNameLong", "权利要求" + (item.getSort() + 1)); temMap.put("parentSort", item.getParentSort()); temMap.put("sort", item.getSort()); rights.add(temMap); }); return rights; } /** * @param projectId * @param filePath * @return * @description 装载FTO模板 */ private XWPFTemplate FTOTemplate(Integer projectId, String filePath, Integer templateId) throws IOException { //获得模板的配置信息 LambdaQueryWrapper templateConfigWrapper = new LambdaQueryWrapper(); templateConfigWrapper.eq(TemplateConfig::getTemplateId, templateId); List templateConfigs = templateConfigService.list(templateConfigWrapper); List> classifyMaps = new ArrayList<>(); for (TemplateConfig templateConfig : templateConfigs) { Map classifyMap = new HashMap<>(); String value = templateConfig.getValueName(); //根据value 查询专利 List esCustomFieldDTOS = customFieldService.getCustomFieldByValueName(value, projectId); if (esCustomFieldDTOS.size() != 0) { classifyMap.put("classify", templateConfig.getMapName()); StringRequest stringRequest = new StringRequest(); stringRequest.setCustomFields(esCustomFieldDTOS); stringRequest.setProjectId(projectId); stringRequest.setCurrent(1L); stringRequest.setSize(999L); List patentColumnDTOS = new ArrayList<>(); try { PatentDTO patentDTO = esService.esSearch(stringRequest); patentColumnDTOS = patentDTO.getPatents(); } catch (Exception e) { return null; } //存放公告专利 List> announcePatents = new ArrayList<>(); //存放公开专利 List> publicPatents = new ArrayList<>(); //存放失效专利信息 List> lapsePatents = new ArrayList<>(); for (PatentColumnDTO patent : patentColumnDTOS) { String applicants = ""; String rightPerson = ""; if (patent.getApplicant() != null && patent.getApplicant().size() != 0) { applicants = StringUtils.join(patent.getApplicant(), "\n"); } if (patent.getRightHolder() != null && patent.getRightHolder().size() != 0) { rightPerson = StringUtils.join(patent.getRightHolder(), "\n"); } String affairStrs = ""; if (patent.getSimpleStatus() != null) { switch (patent.getSimpleStatus()) { case "3": patent.setSimpleStatus("3"); affairStrs = "有效"; break; case "1": patent.setSimpleStatus("1"); affairStrs = "审中"; break; case "2": patent.setSimpleStatus("2"); affairStrs = "失效"; break; } } //装载单个专利的信息 Map patentMap = new HashMap<>(); //同族专利 try { //装载同族信息 List> familyMaps = esFamilyService.getPatentFamilyByNos(Arrays.asList(patent.getPatentNo()), "simple"); if (familyMaps.size() <= 0) { familyMaps = esFamilyService.getPatentFamilyByNos(Arrays.asList(patent.getPatentNo()), "inpadoc"); } if (familyMaps != null && familyMaps.size() > 0) { Map familyMap = familyMaps.get(0); if (familyMap.get("nos") != null) { List nos = (List) familyMap.get("nos"); if (nos != null && nos.size() > 0) { String nosStr = StringUtils.join(nos, "\n"); patentMap.put("simpleFamilys", nosStr); } } } } catch (Exception e) { } //引用专利 try { Map map = esQuotePatentService.getEsQutePatentByNos(patent.getPatentNo()); if (map.get("nos") != null) { List nos = (List) map.get("nos"); if (nos != null && nos.size() > 0) { String nosStr = StringUtils.join(nos, "\n"); patentMap.put("quotePatents", nosStr); } } } catch (Exception e) { } SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); //申请日 if (patent.getAppDate() != null) { patentMap.put("appDate", dateFormat.format(patent.getAppDate())); } //公开日 if (patent.getPublicDate() != null || patent.getGrantDate() != null) { if (patent.getPublicDate() != null) { patentMap.put("publicDate", dateFormat.format(patent.getPublicDate())); } else if (patent.getGrantDate() != null) { patentMap.put("publicDate", dateFormat.format(patent.getGrantDate())); } } //专利号 patentMap.put("publicNo", patent.getPatentNo()); patentMap.put("firstPublicDate", patent.getPublicDate()); patentMap.put("applicant", applicants); patentMap.put("rightPerson", rightPerson); patentMap.put("affair", affairStrs); if (patent.getTitle() != null && patent.getTitle().size() > 0) { patentMap.put("nameOut", patent.getTitle().get(0).getTextContent()); } //优先权日 // if (patent.getPriorities() != null && patent.getPriorities().size() != 0) { // List dates = patent.getPriorities().stream().map(Priorities::getPriorityDate).collect(Collectors.toList()); // String nosStr = StringUtils.join(dates, ";"); // patentMap.put("priorityDate", nosStr); // } if (StringUtils.isNotEmpty(patent.getPriorityDate())) { String nosStr = patent.getPriorityDate().replace("
", ";"); patentMap.put("priorityDate", nosStr); } //图示 String guid = FormatUtil.getPictureFormat(patent.getAppNo()); PictureRenderData pictureData = this.guidToStream(guid); if (pictureData != null) { patentMap.put("abstractPath", pictureData); } //获得专利对比记录的信息 Map temMap = ftoCompareRecordService.LoadCompareMessageForExport(projectId, patent.getPatentNo()); List compareMessageVOS = (List) temMap.get("compareMessageVOs"); //装载对比记录的信息 patentMap.put("cM", compareMessageVOS); patentMap.put("rightNum", temMap.get("rightNum")); patentMap.put("mainNum", temMap.get("mainRightNum")); if (patent.getSimpleStatus() == null) { patent.setSimpleStatus("1"); } Integer status = Integer.parseInt(patent.getSimpleStatus()); if (status == 1 || status == 5 || status == 6) { announcePatents.add(patentMap); } else if (status == 2) { lapsePatents.add(patentMap); } else if (status == 3) { publicPatents.add(patentMap); } classifyMap.put("publicPatents", publicPatents); classifyMap.put("lapsePatents", lapsePatents); classifyMap.put("announcePatents", announcePatents); } classifyMaps.add(classifyMap); } } Map map = new HashMap<>(); String date = DateUtils.formatDate(new Date(), DateUtils.YYYY_MM_DD); String[] ds = date.split("-"); map.put("sys", new SystemMO(ds[0], ds[1], ds[2], "", "reportName")); map.put("classifys", classifyMaps); // 为表格的显示绑定行循环 LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy(); HtmlRenderPolicy htmlRenderPolicy = new HtmlRenderPolicy(); // 将bz设置为行循环绑定的数据源的key,即key是bz的value会在模板中的{{bz}}处进行解析 Configure configure = Configure.builder().bind("cM", policy).bind("targetDescription", htmlRenderPolicy).build(); XWPFTemplate template = XWPFTemplate.compile(filePath, configure).render(map); return template; } private XWPFTemplate getstabilityTemplate(Integer projectId, String filePath) throws IOException { //装载标的专利信息 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(ReportProject::getProjectId, projectId); ReportProject report = reportProjectService.getOne(queryWrapper, false); String signPatentNo = report.getSignPatentNo(); Map signPatent = this.signPantentMess(signPatentNo); PatentRightParams params = new PatentRightParams(); List patentRights = (List) signPatent.get("claims"); //获得特征 List allFeatures = new ArrayList<>(); //获得拆分信息 LambdaQueryWrapper queryWrapper1 = new LambdaQueryWrapper<>(); queryWrapper1.eq(PatentSplitMessage::getPatentNo, signPatentNo) .eq(PatentSplitMessage::getProjectId, report.getProjectId()); List patentSplitMessages = patentSplitMessageService.list(queryWrapper1); if (patentSplitMessages.size() > 0) { LambdaQueryWrapper allFeaturesWrapper = new LambdaQueryWrapper<>(); allFeaturesWrapper.eq(Feature::getSplitMessageId, patentSplitMessages.get(0).getId()); allFeatures = featureService.list(allFeaturesWrapper); } //根据报告Id 查询出报告下所有的方案 LambdaQueryWrapper proofGroupWrapper = new LambdaQueryWrapper<>(); proofGroupWrapper.eq(ProofGroup::getProjectId, report.getProjectId()); List compareScenarios = proofGroupService.list(proofGroupWrapper); List scenarioIds = compareScenarios.stream().map(ProofGroup::getId).collect(Collectors.toList()); //根据对比方案Id 查询所有对比方案和(对比记录-特征)关联信息 List scenariosRecords = new ArrayList<>(); if (scenarioIds != null && scenarioIds.size() != 0) { LambdaQueryWrapper queryRecordsByIDs = new LambdaQueryWrapper<>(); queryRecordsByIDs.in(AssoGroupReason::getGroupId, scenarioIds); scenariosRecords = assoGroupReasonService.list(queryRecordsByIDs); } //获得对比记录id List reasonIds = scenariosRecords.stream().map(AssoGroupReason::getReasonId).collect(Collectors.toList()); //获得特征id List featureIds = scenariosRecords.stream().map(AssoGroupReason::getFeatureId).collect(Collectors.toList()); //查询对比记录 List evidenceReasons = new ArrayList<>(); if (reasonIds != null && reasonIds.size() > 0) { LambdaQueryWrapper evidenceReasonLambdaQueryWrapper = new LambdaQueryWrapper<>(); evidenceReasonLambdaQueryWrapper.in(EvidenceReason::getId, reasonIds); evidenceReasons = evidenceReasonService.list(evidenceReasonLambdaQueryWrapper); } //查询特征 List features = new ArrayList<>(); if (featureIds != null && featureIds.size() > 0) { LambdaQueryWrapper featureLambdaQueryWrapper = new LambdaQueryWrapper<>(); featureLambdaQueryWrapper.in(Feature::getId, featureIds); features = featureService.list(featureLambdaQueryWrapper); } //根据对比记录id获得对比文献 List patentNos = new ArrayList<>(); List assoReasonLiteratures = new ArrayList<>(); List compareLiteratures = new ArrayList<>(); if (reasonIds.size() > 0) { LambdaQueryWrapper literatureLambdaQueryWrapper = new LambdaQueryWrapper<>(); literatureLambdaQueryWrapper.in(AssoReasonLiterature::getReasonId, reasonIds); assoReasonLiteratures = assoReasonLiteratureService.list(literatureLambdaQueryWrapper); if (assoReasonLiteratures.size() > 0) { List literatureIds = assoReasonLiteratures.stream().map(AssoReasonLiterature::getLiteratureId).collect(Collectors.toList()); if (literatureIds.size() > 0) { compareLiteratures = compareLiteratureService.getByIds(literatureIds); if (compareLiteratures.size() > 0) { patentNos = compareLiteratures.stream().map(CompareLiteratureVO::getLiteratureNo).collect(Collectors.toList()); } } } } //专利号别名的map Map OtherName = new HashMap<>(); int flag = 1; for (CompareLiteratureVO item : compareLiteratures) { Integer order = item.getSysOrder() == null ? flag : item.getSysOrder(); OtherName.put(item.getLiteratureNo(), order); flag++; } //根据专利号查询专利详细信息 List patentDTOS = new ArrayList<>(); try { if (patentNos != null && patentNos.size() > 0) { patentDTOS = esPatentService.getPatentsByNo(patentNos, true, null, null); } } catch (Exception e) { } //存放专利信息的map集合 List> patentListMaps = new ArrayList<>(); //填充专利数据到patentListMap for (int i = 0; i < patentDTOS.size(); i++) { Patent item = patentDTOS.get(i); Map patentListMap = new HashMap<>(); List applicantJSONs = item.getApplicant(); StringBuilder applicants = new StringBuilder(); applicantJSONs.forEach(tem -> { applicants.append(tem.getName() + "\r"); }); CompareLiteratureVO compareLiteratureVO = compareLiteratures.stream().filter(t -> t.getLiteratureNo().equals(item.getPatentNo())).findFirst().orElse(null); List assoReasonLiteratures1 = new ArrayList<>(); if (compareLiteratureVO != null) { assoReasonLiteratures1 = assoReasonLiteratures.stream().filter(t -> t.getLiteratureId().equals(compareLiteratureVO.getId())).collect(Collectors.toList()); } //填充相关揭露(对比记录文字和特征组合) StringBuffer disclosures = new StringBuffer(""); //根据专利号获得对比记录 //遍历对比记录根据对比记录获得对比记录-特征关联信息并获得特征ID for (AssoReasonLiterature tem : assoReasonLiteratures1) { EvidenceReason evidenceReason = evidenceReasons.stream().filter(t -> t.getId().equals(tem.getReasonId())).findFirst().orElse(null); if (evidenceReason != null) { disclosures.append(evidenceReason.getEvidenceText()); } //填充对比记录文字 disclosures.append("\r"); disclosures.append("("); disclosures.append(tem.getFieldName()); disclosures.append("[" + (tem.getPosition()) + "]"); disclosures.append(")"); List featuresIds = scenariosRecords.stream().filter(te -> te.getReasonId().equals(tem.getReasonId())).map(AssoGroupReason::getFeatureId).collect(Collectors.toList()); //根据特征Id获得特征内容 List feaListContent = features.stream().filter(te -> featuresIds.contains(te.getId())).map(Feature::getContent).collect(Collectors.toList()); feaListContent.forEach(te -> disclosures.append("(" + te + ")")); disclosures.append("\n"); } int order = Integer.parseInt(OtherName.get(item.getPatentNo()).toString()); if (item.getTitle() != null && item.getTitle().size() > 0) { patentListMap.put("name", item.getTitle().get(0).getTextContent()); } patentListMap.put("fileName", "D" + order); patentListMap.put("publicDate", item.getPublicDate()); patentListMap.put("publicNo", item.getPublicNo()); patentListMap.put("SSIM", ""); patentListMap.put("applicant", applicants); patentListMap.put("patentNo", item.getPatentNo()); if (item.getAbstractStr() != null && item.getAbstractStr().size() > 0) { patentListMap.put("abstractStr", item.getAbstractStr().get(0).getTextContent()); } patentListMap.put("compareFileName", "对比文件" + (order)); patentListMap.put("applicationDate", item.getAppDate()); //图示 String guid = FormatUtil.getPictureFormat(item.getAppNo()); PictureRenderData pictureData = this.guidToStream(guid); if (pictureData != null) { patentListMap.put("abstractPath", pictureData); } patentListMap.put("disclosures", disclosures); patentListMap.put("order", order); patentListMaps.add(patentListMap); } //存放对比方案信息的map集合 List> scenariosMaps = new ArrayList<>(); //存放所有对比方案所有不重复的rightId for (int i = 0; i < compareScenarios.size(); i++) { ProofGroup item1 = compareScenarios.get(i); //获得单个对比方案的 List partScenariosRecords = scenariosRecords.stream().filter(item -> item.getGroupId().equals(item1.getId())).collect(Collectors.toList()); //获得单条权要所有的特征 List allRightFeatures = features.stream().filter(item -> item.getRightSort().equals(item1.getClaimSort())).collect(Collectors.toList()); //存放单条对比结果的map Map temMap = new HashMap<>(); String a = allRightFeatures.get(0).getRightSort() + ""; if (allRightFeatures.size() != 0 && allRightFeatures.get(0).getRightType().equals(1)) { temMap.put("rightName", "独立权要" + a); } else { temMap.put("rightName", "附属权要" + a); } temMap.put("rightId", item1.getClaimSort()); if (report.getReportType() == 1) { String rightContent = patentRights.stream().filter(t -> t.getSort().equals(item1.getClaimSort())).map(RePatentClaim::getContent).findFirst().orElse(""); temMap.put("rightContent", rightContent); } temMap.put("remark", item1.getDescription()); //存放对比方案每一个特征记录 List> maps = new ArrayList<>(); for (Feature tem : allRightFeatures) { List assoGroupReasons = partScenariosRecords.stream().filter(item -> item.getFeatureId().equals(tem.getId())).collect(Collectors.toList()); if (assoGroupReasons.size() > 0) { for (AssoGroupReason res : assoGroupReasons) { Map map = new LinkedHashMap<>(); map.put("featureContent", tem.getContent()); if (res.getReasonId().equals(0)) { map.put("compareResult", "公识"); map.put("compareContent", ""); maps.add(map); } else { EvidenceReason evidenceReason = evidenceReasons.stream().filter(t -> t.getId().equals(res.getReasonId())).findFirst().orElse(null); String content = evidenceReason.getEvidenceText() != null ? evidenceReason.getEvidenceText() : ""; AssoReasonLiterature assoReasonLiterature = assoReasonLiteratures.stream().filter(t -> t.getReasonId().equals(res.getReasonId())).findFirst().orElse(null); String patentNo = ""; if (assoReasonLiterature != null) { CompareLiteratureVO compareLiterature = compareLiteratures.stream().filter(t -> t.getId().equals(assoReasonLiterature.getLiteratureId())).findFirst().orElse(null); if (compareLiterature != null) { patentNo = compareLiterature.getLiteratureNo() != null ? compareLiterature.getLiteratureNo() : ""; } if (OtherName.containsKey(patentNo)) { patentNo = "D" + OtherName.get(patentNo).toString() + ":"; } else if (!patentNo.equals("")) { patentNo += ":"; } } String paresingProcess = evidenceReason.getEvidenceText() != null ? "(" + evidenceReason.getEvidenceText() + ")" : ""; String compareContent = patentNo + content + paresingProcess; //获取对比专利号 if (maps.size() > 0) { Map lastMap = maps.get(maps.size() - 1); if (lastMap.get("compareContent").toString().equals(compareContent)) { lastMap.put("featureContent", lastMap.get("featureContent") + tem.getContent()); } else { map.put("compareResult", res.getConclusion() != null ? res.getConclusion() : "不公开"); map.put("compareContent", compareContent); PictureRenderData pictureData = this.guidToStream(evidenceReason.getFileGuid()); if (pictureData != null) { map.put("figure", pictureData); } if (assoReasonLiterature.getFieldName() == null && assoReasonLiterature.getPosition() == null) { map.put("position", ""); } else { map.put("position", "\r" + "(" + assoReasonLiterature.getFieldName() + "[" + assoReasonLiterature.getPosition() + "]" + ")"); } maps.add(map); } } else { map.put("compareResult", res.getConclusion() != null ? res.getConclusion() : "不公开"); map.put("compareContent", compareContent); PictureRenderData pictureData = this.guidToStream(evidenceReason.getFileGuid()); if (pictureData != null) { map.put("figure", pictureData); } if (assoReasonLiterature.getFieldName() == null && assoReasonLiterature.getPosition() == null) { map.put("position", ""); } else { map.put("position", "\r" + "(" + assoReasonLiterature.getFieldName() + "[" + assoReasonLiterature.getPosition() + "]" + ")"); } maps.add(map); } } } } else { Map map = new LinkedHashMap<>(); map.put("featureContent", tem.getContent()); map.put("compareResult", "未公开"); map.put("compareContent", ""); maps.add(map); } } //方案内容 temMap.put("fileDetails", maps); //新颖性模块 //获得本方案所有的专利号 List patentNOs = new ArrayList<>(); List partCompareLiterature = new ArrayList<>(); List partReasonIds = partScenariosRecords.stream().map(AssoGroupReason::getReasonId).collect(Collectors.toList()); if (partReasonIds.size() != 0) { List partLiteratureIds = assoReasonLiteratures.stream().filter(t -> partReasonIds.contains(t.getReasonId())).map(AssoReasonLiterature::getLiteratureId).collect(Collectors.toList()); if (partLiteratureIds.size() != 0) { partCompareLiterature = compareLiteratures.stream().filter(t -> partLiteratureIds.contains(t.getId())).collect(Collectors.toList()); } } //比较所有专利号和权要所有权要的大小,如果相等则将该专利加入到新颖性列表中 List noveltyFiles = new ArrayList<>(); for (CompareLiteratureVO item : partCompareLiterature) { //根据id查询对比理由 List temReasonIds = assoReasonLiteratures.stream().filter(t -> t.getLiteratureId().equals(item.getId())).map(AssoReasonLiterature::getReasonId).collect(Collectors.toList()); List temFeatureIds = partScenariosRecords.stream().filter(t -> temReasonIds.contains(t.getReasonId())).map(AssoGroupReason::getFeatureId).distinct().collect(Collectors.toList()); String tmName = item.getLiteratureNo(); if (OtherName.containsKey(item)) { tmName = "D" + OtherName.get(item).toString(); } if (temFeatureIds.size() == allRightFeatures.size()) { noveltyFiles.add(tmName); } } //创造性列表 List creativeFiles = new ArrayList<>(); //当前方案所有的特征Id partCompareLiterature.forEach( item -> { String tmName = item.getLiteratureNo(); if (OtherName.containsKey(tmName)) { tmName = "D" + OtherName.get(tmName).toString(); } if (!creativeFiles.contains(tmName)) { creativeFiles.add(tmName); } } ); List andRecords = partScenariosRecords.stream().filter(tm -> tm.getReasonId().equals(0)).collect(Collectors.toList()); if (andRecords.size() != 0) { creativeFiles.add("C"); } String creative = creativeFiles.size() == 0 ? "" : StringUtils.join(creativeFiles, "+"); String novelty = noveltyFiles.size() == 0 ? "" : StringUtils.join(noveltyFiles, "-"); //新颖性 temMap.put("novelty", novelty); //创造性 temMap.put("creative", creative); scenariosMaps.add(temMap); } List> allRightScenarios = new ArrayList<>(); List> resultMaps = new ArrayList<>(); // 存放创造性和新颖性的权要 patentRights.forEach(tem -> { Map map = new HashMap<>(); Map resultMap = new HashMap<>(); List> rightScenarios = new ArrayList<>(); //存放新颖性信息 List noveList = new ArrayList<>(); List creaList = new ArrayList<>(); //存放创造性信息 for (int t = 0; t < scenariosMaps.size(); t++) { Map item = scenariosMaps.get(t); if (item.get("rightId").equals(tem.getSort())) { item.put("scenariosName", "对比组合" + (t + 1)); rightScenarios.add(item); if (item.get("novelty").toString() != "") { if (!noveList.contains(item.get("novelty").toString())) { noveList.add(item.get("novelty").toString()); } } if (item.get("creative").toString() != "") { if (!creaList.contains(item.get("creative").toString())) { creaList.add(item.get("creative").toString()); } } } } map.put("rightScenrios", rightScenarios); map.put("rightName", tem.getRightName()); String creative = creaList.size() == 0 ? "" : StringUtils.join(creaList, "、"); String novelty = noveList.size() == 0 ? "" : StringUtils.join(noveList, "-"); resultMap.put("rightName", tem.getRightName()); resultMap.put("rightNovelty", novelty); resultMap.put("rightCreative", creative); allRightScenarios.add(map); resultMaps.add(resultMap); }); //1.系统数据 //存放单条对比结果的map Map map = new HashMap<>(); String date = DateUtils.formatDate(new Date(), DateUtils.YYYY_MM_DD); String[] ds = date.split("-"); map.put("sys", new SystemMO(ds[0], ds[1], ds[2], "", "reportName")); if (patentListMaps.size() > 1) { patentListMaps = this.sortMap(patentListMaps); } map.put("patentList", patentListMaps); map.put("combinations", allRightScenarios); map.put("allResults", resultMaps); map.put("signPatent", signPatent); map.put("pantentNo", report.getSignPatentNo()); map.put("rights", signPatent.get("rights")); // 为表格的显示绑定行循环 LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy(); HtmlRenderPolicy htmlRenderPolicy = new HtmlRenderPolicy(); // 将bz设置为行循环绑定的数据源的key,即key是bz的value会在模板中的{{bz}}处进行解析 Configure configure = Configure.builder() .bind("patentList", policy) .bind("fileDetails", policy) .bind("allResults", policy) .bind("signPatent.rights", policy) .bind("remark", htmlRenderPolicy) .build(); // 读取模板、数据并渲染 XWPFTemplate template = XWPFTemplate.compile(filePath, configure).render(map); return template; } // public Map signPantentMess(String patentNo) throws IOException { Patent patent = new Patent(); try { List patentList = esPatentService.getPatentsByNo(Arrays.asList(patentNo), true, null, null); if (patentList.size() > 0) { patent = patentList.get(0); } } catch (Exception e) { throw new IOException(); } //装载单个专利的信息 Map patentMap = new HashMap<>(); StringBuilder applicants = new StringBuilder(); StringBuilder rightPerson = new StringBuilder(); if (patent.getApplicant() != null && patent.getApplicant().size() > 0) { patent.getApplicant().forEach(item -> { applicants.append(item.getName() + "\r"); }); } if (patent.getRightHolder() != null && patent.getRightHolder().size() > 0) { patent.getRightHolder().forEach(item -> { rightPerson.append(item.getName() + "\r"); }); } //申请日 patentMap.put("applicationDate", patent.getAppDate()); //公开日 patentMap.put("publicDate", patent.getPublicDate()); //公开号 patentMap.put("publicNo", patent.getPublicNo()); //专利号 patentMap.put("patentNo", patent.getPatentNo()); //专利权人 patentMap.put("rightPerson", rightPerson); //图示 String guid = FormatUtil.getPictureFormat(patent.getAppNo()); PictureRenderData pictureData = this.guidToStream(guid); if (pictureData != null) { patentMap.put("abstractPath", pictureData); } if (patent.getTitle() != null && patent.getTitle().size() > 0) { patentMap.put("name", patent.getTitle().get(0).getTextContent()); } //查询专利权要 List patentRights = patent.getClaim(); String patentRight = null; if (patentRights != null && patentRights.size() > 0) { patentRight = patentRights.get(0).getTextContent(); } PatentRightParams params = new PatentRightParams(); params.setContent(patentRight); params.setPatentNo(patentNo); List claims = PatentRightUtils.formatPatentRight(params); List> rights = new ArrayList<>(); claims.forEach(item -> { Map temMap = new HashMap<>(); temMap.put("rightName", "权" + (item.getSort() + 1)); temMap.put("content", item.getContent()); temMap.put("rightNameLong", "权利要求" + (item.getSort() + 1)); temMap.put("parentSort", item.getParentSort()); temMap.put("sort", item.getSort()); rights.add(temMap); }); patentMap.put("rights", rights); patentMap.put("claims", claims); return patentMap; } public List> sortMap(List> maps) { for (int i = 0; i < maps.size() - 1; i++) { for (int j = 0; j < maps.size() - i - 1; j++) { Integer order1 = Integer.parseInt(maps.get(j).get("order").toString()); Integer order2 = Integer.parseInt(maps.get(j + 1).get("order").toString()); if (order1 > order2) { Map temp = maps.get(j); maps.set(j, maps.get(j + 1)); maps.set(j + 1, temp); } } } return maps; } private XWPFTemplate getThirdTemplate(Integer projectId, String filePath) throws IOException { //装载标的专利信息 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(ReportProject::getProjectId, projectId); ReportProject report = reportProjectService.getOne(queryWrapper, false); String signPatentNo = report.getSignPatentNo(); Map signPatent = this.signPantentMess(signPatentNo); List> rights = (List>) signPatent.get("rights"); List allFeatures = new ArrayList<>(); LambdaQueryWrapper queryWrapper1 = new LambdaQueryWrapper<>(); queryWrapper1.eq(PatentSplitMessage::getPatentNo, signPatentNo) .eq(PatentSplitMessage::getProjectId, report.getProjectId()); List patentSplitMessages = patentSplitMessageService.list(queryWrapper1); if (patentSplitMessages.size() > 0) { LambdaQueryWrapper allFeaturesWrapper = new LambdaQueryWrapper<>(); allFeaturesWrapper.eq(Feature::getSplitMessageId, patentSplitMessages.get(0).getId()); allFeatures = featureService.list(allFeaturesWrapper); } //根据报告Id 查询出报告下所有的方案 LambdaQueryWrapper proofGroupWrapper = new LambdaQueryWrapper<>(); proofGroupWrapper.eq(ProofGroup::getProjectId, report.getProjectId()); List compareScenarios = proofGroupService.list(proofGroupWrapper); List scenarioIds = compareScenarios.stream().map(ProofGroup::getId).collect(Collectors.toList()); //根据对比方案Id 查询所有对比方案和(对比记录-特征)关联信息 List scenariosRecords = new ArrayList<>(); if (scenarioIds != null && scenarioIds.size() != 0) { LambdaQueryWrapper queryRecordsByIDs = new LambdaQueryWrapper<>(); queryRecordsByIDs.in(AssoGroupReason::getGroupId, scenarioIds); scenariosRecords = assoGroupReasonService.list(queryRecordsByIDs); } //获得对比记录id List reasonIds = scenariosRecords.stream().map(AssoGroupReason::getReasonId).collect(Collectors.toList()); //获得特征id List featureIds = scenariosRecords.stream().map(AssoGroupReason::getFeatureId).collect(Collectors.toList()); //查询对比记录 List evidenceReasons = new ArrayList<>(); if (reasonIds != null && reasonIds.size() > 0) { LambdaQueryWrapper evidenceReasonLambdaQueryWrapper = new LambdaQueryWrapper<>(); evidenceReasonLambdaQueryWrapper.in(EvidenceReason::getId, reasonIds); evidenceReasons = evidenceReasonService.list(evidenceReasonLambdaQueryWrapper); } //查询特征 List features = new ArrayList<>(); if (featureIds != null && featureIds.size() > 0) { LambdaQueryWrapper featureLambdaQueryWrapper = new LambdaQueryWrapper<>(); featureLambdaQueryWrapper.in(Feature::getId, featureIds); features = featureService.list(featureLambdaQueryWrapper); } //根据对比记录id获得对比文献 List patentNos = new ArrayList<>(); List assoReasonLiteratures = new ArrayList<>(); List compareLiteratures = new ArrayList<>(); if (reasonIds.size() > 0) { LambdaQueryWrapper literatureLambdaQueryWrapper = new LambdaQueryWrapper<>(); literatureLambdaQueryWrapper.in(AssoReasonLiterature::getReasonId, reasonIds); assoReasonLiteratures = assoReasonLiteratureService.list(literatureLambdaQueryWrapper); if (assoReasonLiteratures.size() > 0) { List literatureIds = assoReasonLiteratures.stream().map(AssoReasonLiterature::getLiteratureId).collect(Collectors.toList()); if (literatureIds.size() > 0) { compareLiteratures = compareLiteratureService.getByIds(literatureIds); if (compareLiteratures.size() > 0) { patentNos = compareLiteratures.stream().map(CompareLiteratureVO::getLiteratureNo).collect(Collectors.toList()); } } } } //专利号别名的map Map OtherName = new HashMap<>(); int flag = 1; for (CompareLiteratureVO item : compareLiteratures) { Integer order = item.getSysOrder() == null ? flag : item.getSysOrder(); OtherName.put(item.getLiteratureNo(), order); flag++; } //根据专利号查询专利详细信息 List patentDTOS = new ArrayList<>(); try { if (patentNos != null && patentNos.size() > 0) { patentDTOS = esPatentService.getPatentsByNo(patentNos, true, null, null); } } catch (Exception e) { } //存放专利信息的map集合 List> patentListMaps = new ArrayList<>(); //填充专利数据到patentListMap for (int i = 0; i < patentDTOS.size(); i++) { Patent item = patentDTOS.get(i); Map patentListMap = new HashMap<>(); List applicantJSONs = item.getApplicant(); StringBuilder applicants = new StringBuilder(); if(applicantJSONs!=null) { applicantJSONs.forEach(tem -> { applicants.append(tem.getName() + "\r"); }); } CompareLiteratureVO compareLiteratureVO = compareLiteratures.stream().filter(t -> t.getLiteratureNo().equals(item.getPatentNo())).findFirst().orElse(null); List assoReasonLiteratures1 = new ArrayList<>(); if (compareLiteratureVO != null) { assoReasonLiteratures1 = assoReasonLiteratures.stream().filter(t -> t.getLiteratureId().equals(compareLiteratureVO.getId())).collect(Collectors.toList()); } //填充相关揭露(对比记录文字和特征组合) StringBuffer disclosures = new StringBuffer(""); //根据专利号获得对比记录 //遍历对比记录根据对比记录获得对比记录-特征关联信息并获得特征ID for (AssoReasonLiterature tem : assoReasonLiteratures1) { EvidenceReason evidenceReason = evidenceReasons.stream().filter(t -> t.getId().equals(tem.getReasonId())).findFirst().orElse(null); if (evidenceReason != null) { disclosures.append(evidenceReason.getEvidenceText()); } //填充对比记录文字 disclosures.append("\r"); disclosures.append("("); disclosures.append(tem.getFieldName()); disclosures.append("[" + (tem.getPosition()) + "]"); disclosures.append(")"); List featuresIds = scenariosRecords.stream().filter(te -> te.getReasonId().equals(tem.getReasonId())).map(AssoGroupReason::getFeatureId).collect(Collectors.toList()); //根据特征Id获得特征内容 List feaListContent = features.stream().filter(te -> featuresIds.contains(te.getId())).map(Feature::getContent).collect(Collectors.toList()); feaListContent.forEach(te -> disclosures.append("(" + te + ")")); disclosures.append("\n"); } int order = Integer.parseInt(OtherName.get(item.getPatentNo()).toString()); patentListMap.put("name", item.getTitle()); patentListMap.put("fileName", "D" + order); patentListMap.put("publicDate", item.getPublicDate()); patentListMap.put("publicNo", item.getPublicNo()); patentListMap.put("SSIM", ""); patentListMap.put("applicant", applicants); patentListMap.put("patentNo", item.getPatentNo()); if (item.getAbstractStr() != null && item.getAbstractStr().size() > 0) { patentListMap.put("abstractStr", item.getAbstractStr().get(0).getTextContent()); } patentListMap.put("compareFileName", "对比文件" + (order)); patentListMap.put("applicationDate", item.getAppDate()); //图示 String guid = FormatUtil.getPictureFormat(item.getAppNo()); PictureRenderData pictureData = this.guidToStream(guid); if (pictureData != null) { patentListMap.put("abstractPath", pictureData); } patentListMap.put("disclosures", disclosures); patentListMap.put("order", order); patentListMaps.add(patentListMap); } List> rightMaps = new ArrayList<>(); List noveltyIds = new ArrayList(); List creativeIds = new ArrayList(); for (Map right : rights) { String text = ""; if (right.get("parentSort") != null && !right.get("parentSort").equals("-1")) { String parentSort = ""; List sorts = new ArrayList<>(Arrays.asList(right.get("parentSort").toString().split(","))); List sortIds = new ArrayList<>(); sorts.forEach(item -> { sortIds.add(Integer.parseInt(item) + 1); }); parentSort = StringUtils.join(sortIds, "、"); text = right.get("rightNameLong") + "为引用权" + parentSort + "的从属权利要求,"; } for (int i = 0; i < compareScenarios.size(); i++) { ProofGroup item1 = compareScenarios.get(i); //判断是该权要的方案 if (right.get("sort").equals(item1.getClaimSort())) { //根据方案id获得特征和记录关联表的id List recordIds = scenariosRecords.stream().filter(item -> item.getGroupId().equals(item1.getId())).map(AssoGroupReason::getReasonId).collect(Collectors.toList()); //获得记录 List compareRecords1 = new ArrayList<>(); if (recordIds != null && recordIds.size() != 0) { compareRecords1 = evidenceReasons.stream().filter(item -> recordIds.contains(item.getId())).collect(Collectors.toList()); } //判断方案是否具有创造性或者新颖性字眼 if (item1.getDescription() != null && (item1.getDescription().contains("创造性") || item1.getDescription().contains("新颖性"))) { //装载对比记录 List> maps = new ArrayList<>(); for (EvidenceReason record : compareRecords1) { Map map = new HashMap<>(); PictureRenderData pictureData = this.guidToStream(record.getFileGuid()); map.put("figure", pictureData); AssoReasonLiterature assoReasonLiterature = assoReasonLiteratures.stream().filter(t -> t.getReasonId().equals(record.getId())).findFirst().orElse(null); String patentNo = ""; if (assoReasonLiterature != null) { if (assoReasonLiterature.getFieldName() == null && assoReasonLiterature.getPosition() == null) { map.put("position", ""); } else { map.put("position", "\r" + "(" + assoReasonLiterature.getFieldName() + "[" + assoReasonLiterature.getPosition() + "]" + ")"); } CompareLiteratureVO compareLiterature = compareLiteratures.stream().filter(t -> t.getId().equals(assoReasonLiterature.getLiteratureId())).findFirst().orElse(null); patentNo = compareLiterature.getLiteratureNo() != null ? compareLiterature.getLiteratureNo() : ""; if (OtherName.containsKey(patentNo)) { patentNo = "D" + OtherName.get(patentNo).toString() + ":"; } else if (!patentNo.equals("")) { patentNo += ":"; } } String compareContent = ""; //获取对比内容 String content = record.getEvidenceText() != null ? record.getEvidenceText() : ""; //获得对比专利号 //获得解析过程 String paresingProcess = record.getDescription() != null ? "(" + record.getDescription() + ")" : ""; compareContent = patentNo + content + paresingProcess; map.put("compareContent", compareContent); maps.add(map); } if (item1.getDescription().contains("创造性")) { creativeIds.add(Integer.parseInt(right.get("sort").toString()) + 1); right.put("records", maps); right.put("text", "第3款的创造性的规定。\n" + text + right.get("rightNameLong") + "的附加技术特征为:"); rightMaps.add(right); } else if (item1.getDescription().contains("新颖性")) { noveltyIds.add(Integer.parseInt(right.get("sort").toString()) + 1); right.put("text", "第2款的新颖性的规定。\n" + text + right.get("rightNameLong") + "保护的主体,具体:"); right.put("records", compareRecords1); rightMaps.add(right); } } } } } String noveltyIdStr = StringUtils.join(noveltyIds, ","); String creativeIdStr = StringUtils.join(creativeIds, ","); Map map = new HashMap<>(); String date = DateUtils.formatDate(new Date(), DateUtils.YYYY_MM_DD); String[] ds = date.split("-"); map.put("sys", new SystemMO(ds[0], ds[1], ds[2], "", "reportName")); map.put("signPatent", signPatent); map.put("pantentNo", report.getSignPatentNo()); map.put("rights", rightMaps); map.put("noveltyIdStr", noveltyIdStr); map.put("creativeIdStr", creativeIdStr); map.put("patentList", patentListMaps); // 为表格的显示绑定行循环 LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy(); HtmlRenderPolicy htmlRenderPolicy = new HtmlRenderPolicy(); // 将bz设置为行循环绑定的数据源的key,即key是bz的value会在模板中的{{bz}}处进行解析 Configure configure = Configure.builder() .bind("patentList", policy) .bind("fileDetails", policy) .bind("allResults", policy) .bind("signPatent.rights", policy) .bind("remark", htmlRenderPolicy) .build(); // 读取模板、数据并渲染 XWPFTemplate template = XWPFTemplate.compile(filePath, configure).render(map); return template; } }