ltkj-admin/src/main/java/com/ltkj/web/controller/system/TjReportController.java
@@ -650,12 +650,8 @@ //pdfWriter.setPageEvent(new MyHeaderFooter());// 页眉页脚 document.open(); document.add(new Header("健康体检结果", "健康体检结果")); long addTableStartTime = System.currentTimeMillis(); Map<TjOrderRemark, List<TjPdfVO>> tjOrderRemarkObjectMap = addTable(tjNumber); System.out.println("addTable方法耗时:" + (System.currentTimeMillis() - addTableStartTime) + "ms"); addTableStartTime = System.currentTimeMillis(); Map<TjOrderRemark, List<TjPdfVO>> tjOrderRemarkListMap = addHuaYanTable(tjNumber); System.out.println("addHuaYanTable方法耗时:" + (System.currentTimeMillis() - addTableStartTime) + "ms"); tjOrderRemarkObjectMap.putAll(tjOrderRemarkListMap); for (Map.Entry<TjOrderRemark, List<TjPdfVO>> entry : tjOrderRemarkObjectMap.entrySet()) { List<TjPdfVO> value = entry.getValue(); @@ -1315,9 +1311,7 @@ printReport.put(tjOrderRemark, null); } // extracted(printReport, one, customer); long start = System.currentTimeMillis(); extractedNew(printReport, one, customer); System.out.println("extractedNew方法耗时:"+(System.currentTimeMillis() - start)); return printReport; } @@ -1356,7 +1350,6 @@ // wqq.eq(TjOrderRemark::getDeptId,"241"); // List<TjOrderRemark> tjOrderRemarks = tjOrderRemarkService.list(wqq); List<TjOrderRemark> tjOrderRemarks = tjOrderRemarkService.addHuaYanTable(tjNumber); for (TjOrderRemark tjOrderRemark : tjOrderRemarks) { printReport.put(tjOrderRemark, null); } @@ -1655,9 +1648,241 @@ @PostMapping("/preview/batch") @ApiOperation(value = "批量体检报告") @Transactional public AjaxResult preview(@RequestBody String data){ String is_batch_report_use_sql = configService.selectConfigByKey("is_batch_report_use_sql"); List<String> tjNumbers = Arrays.stream(data.split(",")).collect(Collectors.toList()); return tjReportService.makeBatchReport(tjNumbers); if ("true".equals(is_batch_report_use_sql)) { return tjReportService.makeBatchReport(tjNumbers); }else { return makeReport(tjNumbers); } } /** * 通过sql 重整数据模板 全部重新生成 * @param tjNumbers * @return */ private AjaxResult makeReport(List<String > tjNumbers) { ArrayList<String> base64Pdfs = new ArrayList<>(); for (String tjNumber : tjNumbers) { LambdaQueryWrapper<TjOrder> wq = new LambdaQueryWrapper<>(); wq.eq(TjOrder::getTjNumber, tjNumber); TjOrder tjOrder = tjOrderService.getOne(wq); if (null != tjOrder) { LambdaQueryWrapper<TjReportTemplate> tjReportTemplateLambdaQueryWrapper = new LambdaQueryWrapper<>(); TjReportTemplate reportTemplate = null; if (tjOrder.getTjCategory() != null) { //查询字典 LambdaQueryWrapper<SysDictData> wqq = new LambdaQueryWrapper<>(); wqq.eq(SysDictData::getDictType, "dict_tjtype"); wqq.eq(SysDictData::getDictValue, tjOrder.getTjCategory()); SysDictData one = dictDataService.getOne(wqq); if (one != null) { //查询字典 LambdaQueryWrapper<SysDictData> wqq1 = new LambdaQueryWrapper<>(); wqq1.eq(SysDictData::getDictType, "report_template_type"); wqq1.eq(SysDictData::getDictLabel, one.getDictLabel()); SysDictData one1 = dictDataService.getOne(wqq1); if (one1 != null) { tjReportTemplateLambdaQueryWrapper.eq(TjReportTemplate::getFlag, one1.getDictValue()); } else { tjReportTemplateLambdaQueryWrapper.eq(TjReportTemplate::getFlag, 1); } } else { tjReportTemplateLambdaQueryWrapper.eq(TjReportTemplate::getFlag, 1); } tjReportTemplateLambdaQueryWrapper.eq(TjReportTemplate::getOpen, 0); reportTemplate = reportTemplateService.getOne(tjReportTemplateLambdaQueryWrapper); } else { tjReportTemplateLambdaQueryWrapper.eq(TjReportTemplate::getOpen, 0); reportTemplate = reportTemplateService.list(tjReportTemplateLambdaQueryWrapper).get(2); } String template = reportTemplate.getTemplate(); String userId = null; if (template == null) { // 没有该模板 continue; } // --------以上------- 根据数据库中的模板二进制文件 转pdf 创建文件夹 将pdf放进本地文件夹 LambdaQueryWrapper<TjCustomer> wq1 = new LambdaQueryWrapper<>(); wq1.eq(TjCustomer::getCusId, tjOrder.getUserId()); TjCustomer tjCustomer = tjCustomerService.getOne(wq1); LambdaQueryWrapper<DictComp> wq111 = new LambdaQueryWrapper<>(); wq111.eq(DictComp::getDrugManufacturerId, tjOrder.getFirmId()); DictComp dictComp = dictCompService.getOne(wq111); LambdaQueryWrapper<TjOrderDetail> wq2 = new LambdaQueryWrapper<>(); wq2.eq(TjOrderDetail::getOrderId, tjOrder.getOrderId()); wq2.isNotNull(TjOrderDetail::getFlowingWaterId); List<TjOrderDetail> list = tjOrderDetailService.list(wq2); for (TjOrderDetail tjOrderDetail : list) { TjProject tjProject = projectService.selectTjProjectByProId(tjOrderDetail.getProId()); tjOrderDetail.setProject(tjProject); } ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); PdfStamper ps = null; PdfReader reader = null; try { // 读入pdf表单 reader = new PdfReader(new ByteArrayInputStream(Base64.getDecoder().decode(template))); // 根据表单生成一个新的pdf ps = new PdfStamper(reader, byteArrayOutputStream); // 获取pdf表单 AcroFields form = ps.getAcroFields(); //该字体造成类型不均匀,但是pdf转图片不乱码 BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); form.addSubstitutionFont(bf); // 填充数据给表格 Map<String, Object> data = new HashMap<>(); // 设置用户信息 setUserInfo(tjNumber, tjOrder, tjCustomer, dictComp, list, data); //封面页下面的总检建议显示 if (tjOrder.getCheckAdvice() == null) { data.put("remark", "无"); } else { data.put("remark", tjOrder.getCheckAdvice()); } //封面页下面的总检建议显示 if (tjOrder.getCheckDoctor() == null) { data.put("docname", "无"); } else { data.put("docname", tjOrder.getCheckDoctor()); } //异常项目 //拼接重大阳性结果 StringBuffer str = new StringBuffer(); str.append("【重大阳性项目】\n"); LambdaQueryWrapper<TjBigPositive> bigPositiveLambdaQueryWrapper = new LambdaQueryWrapper<>(); bigPositiveLambdaQueryWrapper.eq(TjBigPositive::getTjNumber, tjNumber); final List<TjBigPositive> list1 = tjBigPositiveService.list(bigPositiveLambdaQueryWrapper); if (list1 != null && list1.size() > 0) { for (int i = 0; i < list1.size(); i++) { str.append(i + 1).append("、").append(list1.get(i).getProName()).append(";\n"); } } else { str.append(" 无;\n"); } //拼接异常项目 str.append("【异常情况项目】\n"); if (list.size() > 0) { int[] index = {0}; List<TjOrderDetail> collect = list.stream() .filter(item -> item.getExceptionDesc() == 1).collect(Collectors.toList()); if (collect.isEmpty()) { str.append(" 无;\n"); } else { collect.forEach(item -> str.append(index[0]++ + 1).append("、").append(projectService.getById(item.getProId()).getProName()).append(";\n")); } } else { str.append(" 无;\n"); } //异常项目 data.put("yichang", str.toString()); // 遍历data 给pdf表单表格赋值 for (String key : data.keySet()) { form.setField(key, data.get(key).toString()); } //设置为无法编辑 ps.setFormFlattening(true); ps.close(); reader.close(); // 将修改后的PDF内容写入 byte[] bytes = byteArrayOutputStream.toByteArray(); // 创建新的PDF文档 Document document = new Document(PageSize.A4); ByteArrayOutputStream finalOutPut = new ByteArrayOutputStream(); PdfCopy copy = new PdfCopy(document, finalOutPut); document.open(); reader = new PdfReader(bytes); int numberOfPages = reader.getNumberOfPages(); for (int i = 1; i <= numberOfPages; i++) { PdfImportedPage page = copy.getImportedPage(reader, i); copy.addPage(page); } // 添加详情页 document.newPage(); reader.close(); ByteArrayOutputStream infoByteArrayOutputStream = setInfoPage(userId, tjNumber); reader = new PdfReader(infoByteArrayOutputStream.toByteArray()); int numberOfPages1 = reader.getNumberOfPages(); for (int i = 1; i <= numberOfPages1; i++) { PdfImportedPage page = copy.getImportedPage(reader, i); copy.addPage(page); } infoByteArrayOutputStream.close(); // 心电图以及附件 // 因数据库表存放base64导致查询缓慢 这里执行缓慢 // 在这里增加一条查询count 对于没有追加附件的 提升速度 LambdaQueryWrapper<TjReport> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(TjReport::getTjNumber, tjNumber) .and(item -> item.eq(TjReport::getType, "附件").or().eq(TjReport::getType, "心电图")); Integer selectCount = tjReportService.getSelectCount(queryWrapper); if (selectCount > 0) { String base64XinDianTu = null; String base64FuJian = null; List<TjReport> reportList = tjReportService.list(queryWrapper); TjReport xinDianTu = null; TjReport fuJian = null; if (!reportList.isEmpty()) { for (TjReport tjReport : reportList) { if ("附件".equals(tjReport.getType())) { fuJian = tjReport; base64FuJian = fuJian.getReport(); } else { xinDianTu = tjReport; base64XinDianTu = xinDianTu.getReport(); } } } if (xinDianTu != null) { if (fuJian != null) { addPageByPDFBase64(copy, base64FuJian); document.newPage(); addPageByPDFBase64(copy, base64XinDianTu); } else { addPageByPDFBase64(copy, base64XinDianTu); } } else { if (fuJian != null) { addPageByPDFBase64(copy, base64FuJian); } } } copy.close(); base64Pdfs.add(Base64.getEncoder().encodeToString(finalOutPut.toByteArray())); document.close(); finalOutPut.close(); reader.close(); //修改order表中的打印报告时间为当前时间 LambdaUpdateWrapper<TjOrder> updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper.eq(TjOrder::getTjNumber, tjNumber); updateWrapper.set(TjOrder::getReportTime, new Date()); updateWrapper.set(TjOrder::getPrintLastTime, new Date()); updateWrapper.set(TjOrder::getDownloadLastTime, new Date()); updateWrapper.set(TjOrder::getStatus, TjConstants.TJ_END); tjOrderService.update(updateWrapper); } catch (Exception e) { TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); e.printStackTrace(); } } } try { byte[] mergePDFs = PDFDocumentUtil.mergePDFs(base64Pdfs); // 本地生成测试 // String PDF_FILE = "d:\\Users\\w\\Desktop\\test.pdf"; // BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(PDF_FILE)); // outputStream.write(mergePDFs); // outputStream.flush(); // outputStream.close(); String s = Base64.getEncoder().encodeToString(mergePDFs); return AjaxResult.success().put("file",s); } catch (DocumentException | IOException e) { e.printStackTrace(); return AjaxResult.error("批量生成失败"); } } @GetMapping("/revocationReport/{TjNumber}") @@ -1665,6 +1890,7 @@ public AjaxResult revocationReport(@PathVariable("TjNumber") String tjNumber) { //逻辑删除数据库里的报告 QueryWrapper<TjReport> wq1 = new QueryWrapper<>(); wq1.select("re_id"); wq1.eq("tj_number", tjNumber); wq1.eq("type", "体检报告"); TjReport tjReport = tjReportService.getOne(wq1); ltkj-hosp/src/main/java/com/ltkj/hosp/service/impl/TjReportServiceImpl.java
@@ -517,9 +517,9 @@ @Override @Transactional public AjaxResult makeBatchReport(List<String> tjNumbers) { return sqlGetReportToMake(tjNumbers); } /** @@ -564,245 +564,4 @@ return AjaxResult.error("批量生成失败"); } } /** * 通过sql 重整数据模板 全部重新生成 * @param tjNumbers * @return */ // private AjaxResult makeReport(List<String > tjNumbers) { // ArrayList<String> base64Pdfs = new ArrayList<>(); // for (String tjNumber : tjNumbers) { // LambdaQueryWrapper<TjOrder> wq = new LambdaQueryWrapper<>(); // wq.eq(TjOrder::getTjNumber, tjNumber); // TjOrder tjOrder = tjOrderService.getOne(wq); // if (null != tjOrder) { // LambdaQueryWrapper<TjReportTemplate> tjReportTemplateLambdaQueryWrapper = new LambdaQueryWrapper<>(); // TjReportTemplate reportTemplate = null; // if (tjOrder.getTjCategory() != null) { // //查询字典 // LambdaQueryWrapper<SysDictData> wqq = new LambdaQueryWrapper<>(); // wqq.eq(SysDictData::getDictType, "dict_tjtype"); // wqq.eq(SysDictData::getDictValue, tjOrder.getTjCategory()); // SysDictData one = dictDataService.getOne(wqq); // if (one != null) { // //查询字典 // LambdaQueryWrapper<SysDictData> wqq1 = new LambdaQueryWrapper<>(); // wqq1.eq(SysDictData::getDictType, "report_template_type"); // wqq1.eq(SysDictData::getDictLabel, one.getDictLabel()); // SysDictData one1 = dictDataService.getOne(wqq1); // if (one1 != null) { // tjReportTemplateLambdaQueryWrapper.eq(TjReportTemplate::getFlag, one1.getDictValue()); // } else { // tjReportTemplateLambdaQueryWrapper.eq(TjReportTemplate::getFlag, 1); // } // } else { // tjReportTemplateLambdaQueryWrapper.eq(TjReportTemplate::getFlag, 1); // } // tjReportTemplateLambdaQueryWrapper.eq(TjReportTemplate::getOpen, 0); // reportTemplate = reportTemplateService.getOne(tjReportTemplateLambdaQueryWrapper); // } else { // tjReportTemplateLambdaQueryWrapper.eq(TjReportTemplate::getOpen, 0); // reportTemplate = reportTemplateService.list(tjReportTemplateLambdaQueryWrapper).get(2); // } // // String template = reportTemplate.getTemplate(); // String userId = null; // if (template == null) { // // 没有该模板 // continue; // } // // --------以上------- 根据数据库中的模板二进制文件 转pdf 创建文件夹 将pdf放进本地文件夹 // LambdaQueryWrapper<TjCustomer> wq1 = new LambdaQueryWrapper<>(); // wq1.eq(TjCustomer::getCusId, tjOrder.getUserId()); // TjCustomer tjCustomer = tjCustomerService.getOne(wq1); // LambdaQueryWrapper<DictComp> wq111 = new LambdaQueryWrapper<>(); // wq111.eq(DictComp::getDrugManufacturerId, tjOrder.getFirmId()); // DictComp dictComp = dictCompService.getOne(wq111); // LambdaQueryWrapper<TjOrderDetail> wq2 = new LambdaQueryWrapper<>(); // wq2.eq(TjOrderDetail::getOrderId, tjOrder.getOrderId()); // wq2.isNotNull(TjOrderDetail::getFlowingWaterId); // List<TjOrderDetail> list = tjOrderDetailService.list(wq2); // for (TjOrderDetail tjOrderDetail : list) { // TjProject tjProject = projectService.selectTjProjectByProId(tjOrderDetail.getProId()); // tjOrderDetail.setProject(tjProject); // } // // 共计耗时5695毫秒 以下代码耗时3528 // // TODO PDF创建优化 // long pdfMkStart = System.currentTimeMillis(); // ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); // PdfStamper ps = null; // PdfReader reader = null; // try { // // 读入pdf表单 // reader = new PdfReader(new ByteArrayInputStream(Base64.getDecoder().decode(template))); // // 根据表单生成一个新的pdf // ps = new PdfStamper(reader, byteArrayOutputStream); // // 获取pdf表单 // AcroFields form = ps.getAcroFields(); // //该字体造成类型不均匀,但是pdf转图片不乱码 // BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); // form.addSubstitutionFont(bf); // // 填充数据给表格 // Map<String, Object> data = new HashMap<>(); // // 设置用户信息 // setUserInfo(tjNumber, tjOrder, tjCustomer, dictComp, list, data); // //封面页下面的总检建议显示 // if (tjOrder.getCheckAdvice() == null) { // data.put("remark", "无"); // } else { // data.put("remark", tjOrder.getCheckAdvice()); // } // //封面页下面的总检建议显示 // if (tjOrder.getCheckDoctor() == null) { // data.put("docname", "无"); // } else { // data.put("docname", tjOrder.getCheckDoctor()); // } // //异常项目 //// data.put("yichang", "【1】屈光不正\n" + //// "【2】扁桃体肥⼤\n" + //// "【3】体重指数增⾼\n" + //// "【4】⾎脂异常(总胆固醇增⾼;⽢油三酯增⾼)\n" + //// "【5】γ-⾕氨酰转移酶增⾼;天⻔冬氨酸氨基转移酶增⾼;丙氨酸氨基转移酶增⾼\n" + //// "【6】轻⾄中度脂肪肝"); // // //拼接重大阳性结果 // StringBuffer str = new StringBuffer(); // str.append("【重大阳性项目】\n"); // LambdaQueryWrapper<TjBigPositive> bigPositiveLambdaQueryWrapper = new LambdaQueryWrapper<>(); // bigPositiveLambdaQueryWrapper.eq(TjBigPositive::getTjNumber, tjNumber); // final List<TjBigPositive> list1 = tjBigPositiveService.list(bigPositiveLambdaQueryWrapper); // if (list1 != null && list1.size() > 0) { // for (int i = 0; i < list1.size(); i++) { // str.append(i + 1).append("、").append(list1.get(i).getProName()).append(";\n"); // } // } else { // str.append(" 无;\n"); // } // //拼接异常项目 // str.append("【异常情况项目】\n"); // if (list.size() > 0) { //// for (int i = 0; i < list.size(); i++) { //// if (list.get(i).getExceptionDesc() == 1) { //// str.append(i + 1).append("、").append(projectService.getById(list.get(i).getProId()).getProName()).append(";\n"); //// } //// } // int[] index = {0}; // List<TjOrderDetail> collect = list.stream() // .filter(item -> item.getExceptionDesc() == 1).collect(Collectors.toList()); // if (collect.isEmpty()) { // str.append(" 无;\n"); // } else { // collect.forEach(item -> str.append(index[0]++ + 1).append("、").append(projectService.getById(item.getProId()).getProName()).append(";\n")); // } // } else { // str.append(" 无;\n"); // } // //异常项目 // data.put("yichang", str.toString()); // // 遍历data 给pdf表单表格赋值 // for (String key : data.keySet()) { // form.setField(key, data.get(key).toString()); // } // //设置为无法编辑 // ps.setFormFlattening(true); // ps.close(); // reader.close(); // // 将修改后的PDF内容写入 // byte[] bytes = byteArrayOutputStream.toByteArray(); // // 创建新的PDF文档 // Document document = new Document(PageSize.A4); // ByteArrayOutputStream finalOutPut = new ByteArrayOutputStream(); // PdfCopy copy = new PdfCopy(document, finalOutPut); // document.open(); // reader = new PdfReader(bytes); // int numberOfPages = reader.getNumberOfPages(); // for (int i = 1; i <= numberOfPages; i++) { // PdfImportedPage page = copy.getImportedPage(reader, i); // copy.addPage(page); // } // // 添加详情页 // document.newPage(); // reader.close(); // ByteArrayOutputStream infoByteArrayOutputStream = setInfoPage(userId, tjNumber); // reader = new PdfReader(infoByteArrayOutputStream.toByteArray()); // int numberOfPages1 = reader.getNumberOfPages(); // for (int i = 1; i <= numberOfPages1; i++) { // PdfImportedPage page = copy.getImportedPage(reader, i); // copy.addPage(page); // } // infoByteArrayOutputStream.close(); // // 心电图以及附件 // // 因数据库表存放base64导致查询缓慢 这里执行缓慢 // // 在这里增加一条查询count 对于没有追加附件的 提升速度 // long fujianStart = System.currentTimeMillis(); // LambdaQueryWrapper<TjReport> queryWrapper = new LambdaQueryWrapper<>(); // queryWrapper.eq(TjReport::getTjNumber, tjNumber) // .and(item -> item.eq(TjReport::getType, "附件").or().eq(TjReport::getType, "心电图")); // Integer selectCount = tjReportService.getSelectCount(queryWrapper); // if (selectCount > 0) { // String base64XinDianTu = null; // String base64FuJian = null; // List<TjReport> reportList = tjReportService.list(queryWrapper); // TjReport xinDianTu = null; // TjReport fuJian = null; // if (!reportList.isEmpty()) { // for (TjReport tjReport : reportList) { // if ("附件".equals(tjReport.getType())) { // fuJian = tjReport; // base64FuJian = fuJian.getReport(); // } else { // xinDianTu = tjReport; // base64XinDianTu = xinDianTu.getReport(); // } // } // } // if (xinDianTu != null) { // if (fuJian != null) { // addPageByPDFBase64(copy, base64FuJian); // document.newPage(); // addPageByPDFBase64(copy, base64XinDianTu); // } else { // addPageByPDFBase64(copy, base64XinDianTu); // } // } else { // if (fuJian != null) { // addPageByPDFBase64(copy, base64FuJian); // } // } // } // copy.close(); // base64Pdfs.add(Base64.getEncoder().encodeToString(finalOutPut.toByteArray())); // document.close(); // finalOutPut.close(); // reader.close(); // //修改order表中的打印报告时间为当前时间 // LambdaUpdateWrapper<TjOrder> updateWrapper = new LambdaUpdateWrapper<>(); // updateWrapper.eq(TjOrder::getTjNumber, tjNumber); // updateWrapper.set(TjOrder::getReportTime, new Date()); // updateWrapper.set(TjOrder::getPrintLastTime, new Date()); // updateWrapper.set(TjOrder::getDownloadLastTime, new Date()); // updateWrapper.set(TjOrder::getStatus, TjConstants.TJ_END); // tjOrderService.update(updateWrapper); // } catch (Exception e) { // TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); // e.printStackTrace(); // } // } // } // try { // byte[] mergePDFs = PDFDocumentUtil.mergePDFs(base64Pdfs); // // 本地生成测试 // String PDF_FILE = "d:\\Users\\w\\Desktop\\test.pdf"; // BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(PDF_FILE)); // outputStream.write(mergePDFs); // outputStream.flush(); // outputStream.close(); // } catch (DocumentException | IOException e) { // e.printStackTrace(); // return AjaxResult.error("批量生成失败"); // } // return AjaxResult.success(); // } }