| | |
| | | package com.ltkj.hosp.service.impl; |
| | | |
| | | import java.io.File; |
| | | import java.io.OutputStream; |
| | | import java.io.*; |
| | | import java.nio.file.Files; |
| | | import java.nio.file.Paths; |
| | | import java.util.*; |
| | | import java.util.List; |
| | | import java.util.stream.Collectors; |
| | | |
| | | import cn.hutool.core.date.DateUtil; |
| | | import cn.hutool.core.io.FileUtil; |
| | |
| | | import com.itextpdf.text.pdf.*; |
| | | import com.itextpdf.text.pdf.draw.LineSeparator; |
| | | import com.ltkj.common.core.domain.AjaxResult; |
| | | import com.ltkj.common.core.domain.entity.SysDictData; |
| | | import com.ltkj.common.utils.DateUtils; |
| | | import com.ltkj.common.utils.PDFDocumentUtil; |
| | | import com.ltkj.common.utils.SecurityUtils; |
| | | import com.ltkj.common.utils.pdfutils.MergePdf; |
| | | import com.ltkj.common.utils.pdfutils.MyHeaderFooter; |
| | |
| | | import com.ltkj.common.utils.pdfutils.PdfUtils; |
| | | import com.ltkj.hosp.domain.*; |
| | | import com.ltkj.hosp.service.*; |
| | | import com.ltkj.mall.mallOrderUtils.TjConstants; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import org.springframework.stereotype.Service; |
| | | import com.ltkj.hosp.mapper.TjReportMapper; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.transaction.interceptor.TransactionAspectSupport; |
| | | |
| | | import javax.annotation.Resource; |
| | | |
| | |
| | | } |
| | | return table; |
| | | } |
| | | |
| | | |
| | | @Override |
| | | @Transactional |
| | | public AjaxResult makeBatchReport(List<String> tjNumbers) { |
| | | return sqlGetReportToMake(tjNumbers); |
| | | } |
| | | |
| | | /** |
| | | * 通过sql 直接查报告base64进行整合返回 |
| | | * 如果sql数据量巨大 查询缓慢 可以试试 makeReport(List<String > tjNumbers)已注释 |
| | | * @param tjNumbers |
| | | * @return |
| | | */ |
| | | private AjaxResult sqlGetReportToMake(List<String> tjNumbers) { |
| | | LambdaQueryWrapper<TjReport> tjReportLambdaQueryWrapper = new LambdaQueryWrapper<>(); |
| | | tjReportLambdaQueryWrapper.in(TjReport::getTjNumber, tjNumbers); |
| | | List<TjReport> list = tjReportService.list(tjReportLambdaQueryWrapper); |
| | | ArrayList<String> base64Pdfs = new ArrayList<>(); |
| | | for (TjReport report : list) { |
| | | if (report == null || report.getReport() == null) { |
| | | // 没有该报告 直接跳过 |
| | | continue; |
| | | } |
| | | base64Pdfs.add(report.getReport()); |
| | | } |
| | | tjNumbers.forEach(tjNumber ->{ |
| | | LambdaUpdateWrapper<TjOrder> updateWrapper = new LambdaUpdateWrapper<>(); |
| | | updateWrapper.eq(TjOrder::getTjNumber, tjNumber); |
| | | updateWrapper.set(TjOrder::getPrintLastTime, new Date()); |
| | | updateWrapper.set(TjOrder::getDownloadLastTime, new Date()); |
| | | updateWrapper.set(TjOrder::getStatus, TjConstants.TJ_END); |
| | | tjOrderService.update(updateWrapper); |
| | | }); |
| | | try { |
| | | byte[] mergePDF = PDFDocumentUtil.mergePDFs(base64Pdfs); |
| | | String s = Base64.getEncoder().encodeToString(mergePDF); |
| | | return AjaxResult.success().put("file",s); |
| | | // 本地生成测试 |
| | | // String PDF_FILE = "d:\\Users\\w\\Desktop\\test.pdf"; |
| | | // BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(PDF_FILE)); |
| | | // outputStream.write(mergePDF); |
| | | // outputStream.flush(); |
| | | // outputStream.close(); |
| | | } catch (DocumentException | IOException e) { |
| | | e.printStackTrace(); |
| | | TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); |
| | | 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(); |
| | | // } |
| | | } |