From a02feee98c170d8ec1c32f59c37f806652ebf7d9 Mon Sep 17 00:00:00 2001 From: linjj <850658129@qq.com> Date: Fri, 19 Apr 2024 08:59:55 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=B9=E9=87=8F=E5=AF=BC=E5=87=BA=E5=9B=BD?= =?UTF-8?q?=E5=AE=B6=E7=97=85=E5=8E=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/emr/controller/FontController.java | 15 ++ .../com/emr/dao/ExportTaskDetailsMapper.java | 23 +++ .../batchExport/BatchExportService.java | 17 ++ .../batchExport/BatchExportServiceImpl.java | 179 ++++++++++++++++++ src/main/java/com/emr/util/Logger.java | 44 +++++ src/main/java/com/emr/vo/ExportDetailsVo.java | 20 ++ .../java/com/emr/vo/ExportTaskDetailsVo.java | 24 +++ src/main/resources/config/config.properties | 2 + .../mapper/ExportTaskDetailsMapper.xml | 35 ++++ 9 files changed, 359 insertions(+) create mode 100644 src/main/java/com/emr/dao/ExportTaskDetailsMapper.java create mode 100644 src/main/java/com/emr/service/batchExport/BatchExportService.java create mode 100644 src/main/java/com/emr/service/batchExport/BatchExportServiceImpl.java create mode 100644 src/main/java/com/emr/util/Logger.java create mode 100644 src/main/java/com/emr/vo/ExportDetailsVo.java create mode 100644 src/main/java/com/emr/vo/ExportTaskDetailsVo.java create mode 100644 src/main/resources/mapper/ExportTaskDetailsMapper.xml diff --git a/src/main/java/com/emr/controller/FontController.java b/src/main/java/com/emr/controller/FontController.java index e00eda3..c3d6880 100644 --- a/src/main/java/com/emr/controller/FontController.java +++ b/src/main/java/com/emr/controller/FontController.java @@ -14,6 +14,7 @@ import com.emr.entity.emrPdfWaterSet.EmrPdfWaterSet; import com.emr.entity.recordType.Emr_Type; import com.emr.service.FontService; import com.emr.service.Zd_AssortServiceImpl; +import com.emr.service.batchExport.BatchExportService; import com.emr.service.pushRcvBasic.PushRcvBasicService; import com.emr.service.recordType.EmrTypeService; import com.emr.service.tScanAssort.T_Scan_AssortService; @@ -91,6 +92,8 @@ public class FontController { private Archive_DetailMapper archiveDetailMapper; @Autowired private EmrPdfWaterSetMapper pdfWaterSetMapper; + @Autowired + private BatchExportService batchExportService; /** * 2.1 @@ -588,4 +591,16 @@ public class FontController { } return Msg.fail(); } + /** + * @description: 批量导出国家病历 + * @params: taskid + * @return: String + * @author linjj + * @date: 2024/4/12 22:43 + */ + @ResponseBody + @RequestMapping(value = "BatchExportPdf") + public String batchExportPdf(int taskId) throws Exception { + return batchExportService.batchExportPdf(taskId); + } } diff --git a/src/main/java/com/emr/dao/ExportTaskDetailsMapper.java b/src/main/java/com/emr/dao/ExportTaskDetailsMapper.java new file mode 100644 index 0000000..1015bfd --- /dev/null +++ b/src/main/java/com/emr/dao/ExportTaskDetailsMapper.java @@ -0,0 +1,23 @@ +package com.emr.dao; + +import com.emr.vo.ExportDetailsVo; +import com.emr.vo.ExportTaskDetailsVo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @InterfaceName ExportTaskDetailsMapper + * @Description 批量导出详情接口 + * @Author linjj + * @Date 2024/4/12 14:03 + * @Version 1.0 + */ +public interface ExportTaskDetailsMapper { + + List selectAllByTaskId(int taskId); + + List getfilePath(@Param("inpNo") String inpNo, @Param("dischargeDateTime") String dischargeDateTime); + + int upStatc(@Param("state") int state,@Param("id") int id); +} diff --git a/src/main/java/com/emr/service/batchExport/BatchExportService.java b/src/main/java/com/emr/service/batchExport/BatchExportService.java new file mode 100644 index 0000000..3cce112 --- /dev/null +++ b/src/main/java/com/emr/service/batchExport/BatchExportService.java @@ -0,0 +1,17 @@ +package com.emr.service.batchExport; + +import java.util.List; + +/** + * @InterfaceName BatchExportService + * @Description 国家病历批量导出接口 + * @Author linjj + * @Date 2024/4/12 11:40 + * @Version 1.0 + */ +public interface BatchExportService { + + + //批量导出 + String batchExportPdf(int taskId)throws Exception; +} diff --git a/src/main/java/com/emr/service/batchExport/BatchExportServiceImpl.java b/src/main/java/com/emr/service/batchExport/BatchExportServiceImpl.java new file mode 100644 index 0000000..1d1cda0 --- /dev/null +++ b/src/main/java/com/emr/service/batchExport/BatchExportServiceImpl.java @@ -0,0 +1,179 @@ +package com.emr.service.batchExport; + +import com.emr.dao.ExportTaskDetailsMapper; +import com.emr.entity.emrPdfWaterSet.EmrPdfWaterSet; +import com.emr.util.ExceptionPrintUtil; +import com.emr.util.Logger; +import com.emr.vo.ExportDetailsVo; +import com.emr.vo.ExportTaskDetailsVo; +import com.emr.vo.commomSearch.ScanPathVo; +import com.itextpdf.kernel.pdf.PdfDocument; +import com.itextpdf.text.Document; +import com.itextpdf.text.Image; +import com.itextpdf.text.PageSize; +import com.itextpdf.text.pdf.*; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +import static com.emr.util.img2PdfUtil.addWaterMark; + +/** + * @ClassName BatchExportServiceImpl + * @Description 国家病历批量导出实现类 + * @Author linjj + * @Date 2024/4/12 11:41 + * @Version 1.0 + */ +@Service +public class BatchExportServiceImpl implements BatchExportService { + private static Logger logger = new Logger(); + + @Autowired + ExportTaskDetailsMapper exportTaskDetailsMapper; + @Value("${export_pdf_hospital_info}") + private String flieName; + + + @Value("${export_pdf_path}") + private String exportPdfPath; + + + @Override + public String batchExportPdf(int taskId) throws Exception { + //是否存在目录不存在创建 + File file = new File (exportPdfPath); + if(!file.isDirectory ()){ + file.mkdirs (); + } + //导出文件名 + String fileName = null; + //根据taskid查询所有需要导出病历的住院号出院日期 + List taskList = exportTaskDetailsMapper.selectAllByTaskId(taskId); + if (taskList == null) { + return "没有任务"; + } + for (ExportTaskDetailsVo list : taskList) { + //根据住院号出院日期查询需要导出病历路径 + List filePathList = exportTaskDetailsMapper.getfilePath(list.getInpNo(), list.getDischargeDateTime()); + if (filePathList == null) { + logger.log("病案号为:" + list.getInpNo() + "出院时间为:" + list.getDischargeDateTime() + "的病历找不到。"); + continue; + } + try { + //组织导出文件名 + fileName = exportFlieName(list); + } catch (ParseException e) { + throw new RuntimeException(e); + } + Boolean aBoolean = imageToPdf(filePathList, fileName,exportPdfPath); + //为true时修改任务状态1完成2失败 + if (aBoolean) { + exportTaskDetailsMapper.upStatc(1, list.getId()); + } else { + exportTaskDetailsMapper.upStatc(2, list.getId()); + logger.log("病案号为:" + list.getInpNo() + "出院时间为:" + list.getDischargeDateTime() + "的病历保存失败。"); + } + + } + return "下载完成"; + } + + + + public static Boolean imageToPdf(List scanPathVos, String fileName,String exportPdfPath) { + Document document = new Document(PageSize.A4, 0, 0, 0, 0); //创建文档容器 + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + PdfWriter writer; + try { + FileOutputStream fileOutputStream = new FileOutputStream(exportPdfPath+fileName+".pdf"); + writer = PdfWriter.getInstance(document,fileOutputStream);//创建编写器(PDF类型) + imgToPdf(document, writer, scanPathVos); + } catch (Exception e) { + ExceptionPrintUtil.printException(e); + e.printStackTrace(); + return false; + } finally { + try { + bos.flush(); + bos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + document.close(); + } + return true; + } + + + + public static void imgToPdf(Document document, PdfWriter writer, List scanPathVos) throws Exception { + //上一个目录名称 + String lastOutline = null; + //是否增加标签 + boolean outFlag = true; + //标签顺序 + Integer outNum = 1; + // 添加目录 + document.open(); //打开容器 + PdfContentByte cb = writer.getDirectContent(); + cb.setFontAndSize(BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED), 12); + cb.beginText(); + cb.showTextAligned(PdfContentByte.ALIGN_CENTER, "目录", 300, 780, 0); + cb.endText(); + // 创建目录 + PdfOutline root = cb.getRootOutline(); + // 添加图片到PDF + for (int i = 0; i < scanPathVos.size(); i++) { + String assortName = scanPathVos.get(i).getAssortName(); + if (StringUtils.isNotBlank(lastOutline) && lastOutline.equals(assortName)) { + outFlag = false; + } + if (StringUtils.isBlank(lastOutline)) { + lastOutline = assortName; + outFlag=true; + } + if (!lastOutline.equals(assortName)){ + lastOutline = assortName; + outFlag=true; + } + String imagePath = scanPathVos.get(i).getFilePath(); + Image image = Image.getInstance(imagePath); + + image.setAlignment(Image.MIDDLE); + image.scaleToFit(PageSize.A4.getWidth(), PageSize.A4.getHeight()); + // 等比例缩放图片以填满PDF页面 + image.scaleAbsolute(document.getPageSize()); + // 创建新页面并添加图片 + //document.newPage(); + document.add(image); + if (outFlag) { + //目录跳转页面内容设置。 + PdfAction action = PdfAction.gotoLocalPage(i+1, new PdfDestination(PdfDestination.FIT), writer); + //标题目录 + String title = outNum + "." + scanPathVos.get(i).getAssortName(); + new PdfOutline(root, action, title, false); + outNum++; + } + } + document.close(); //关闭容器 + } + + + //生成文件名 + private String exportFlieName(ExportTaskDetailsVo dto) throws ParseException { + SimpleDateFormat originalFormat = new SimpleDateFormat("yyyy-MM-dd"); + SimpleDateFormat targetFormat = new SimpleDateFormat("yyyyMMdd"); + Date date = originalFormat.parse(dto.getDischargeDateTime()); + String formattedDate = targetFormat.format(date); + return flieName + "_" + dto.getInpNo() + "_" + formattedDate; + } +} diff --git a/src/main/java/com/emr/util/Logger.java b/src/main/java/com/emr/util/Logger.java new file mode 100644 index 0000000..65c7f07 --- /dev/null +++ b/src/main/java/com/emr/util/Logger.java @@ -0,0 +1,44 @@ +package com.emr.util; + +import org.springframework.beans.factory.annotation.Value; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.text.SimpleDateFormat; +import java.util.Date; + +public class Logger { + + @Value("${export_pdf_path}") + private String exportPdfPath; + + public void log(String info) { + SimpleDateFormat dateFormat = new SimpleDateFormat ("yyyy-MM-dd"); + String format = dateFormat.format (new Date()); + File file = new File (exportPdfPath+format); + if(!file.isDirectory ()){ + file.mkdirs (); + } + OutputStream out = null; + try { + out = getOutputStream(file.getAbsolutePath ()+"\\log.log"); + out.write(info.getBytes("utf-8")); + out.write("\r\n".getBytes()); + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public OutputStream getOutputStream(String localpath) throws IOException { + File file = new File(localpath); + if (!file.exists()) { + file.createNewFile(); + return new FileOutputStream(file); + } else { + return new FileOutputStream(file, true); + } + } +} diff --git a/src/main/java/com/emr/vo/ExportDetailsVo.java b/src/main/java/com/emr/vo/ExportDetailsVo.java new file mode 100644 index 0000000..41cc001 --- /dev/null +++ b/src/main/java/com/emr/vo/ExportDetailsVo.java @@ -0,0 +1,20 @@ +package com.emr.vo; + +import lombok.Data; + +/** + * @ClassName ExportDetailsVo + * @Description 导出文件集合 + * @Author linjj + * @Date 2024/4/12 23:04 + * @Version 1.0 + */ +@Data +public class ExportDetailsVo { + + private String filePath; + + private String assortId; + + private String assortName; +} diff --git a/src/main/java/com/emr/vo/ExportTaskDetailsVo.java b/src/main/java/com/emr/vo/ExportTaskDetailsVo.java new file mode 100644 index 0000000..e2713e7 --- /dev/null +++ b/src/main/java/com/emr/vo/ExportTaskDetailsVo.java @@ -0,0 +1,24 @@ +package com.emr.vo; + +import lombok.Data; + +/** + * @ClassName ExportTaskDetailsVo + * @Description 导出任务详情 + * @Author linjj + * @Date 2024/4/12 14:01 + * @Version 1.0 + */ +@Data +public class ExportTaskDetailsVo { + + private int id; + //任务id + private int taskId; + //住院号 + private String inpNo; + + //出院日期 + private String dischargeDateTime; + +} diff --git a/src/main/resources/config/config.properties b/src/main/resources/config/config.properties index c6c405f..7d2e6e3 100644 --- a/src/main/resources/config/config.properties +++ b/src/main/resources/config/config.properties @@ -47,6 +47,8 @@ export_pdf_hospital_info = \u6e58\u96c5\u533b\u9662 export_pdf_patient_info = inpatientNo,disDate +export_pdf_path=D://export// + #\u67E5\u8BE2\u5168\u6587\u68C0\u7D22\u7684\u5730\u5740 fullTextSearchUrl = http://172.16.11.90:57777/AppEngine3?wsdl diff --git a/src/main/resources/mapper/ExportTaskDetailsMapper.xml b/src/main/resources/mapper/ExportTaskDetailsMapper.xml new file mode 100644 index 0000000..c01a956 --- /dev/null +++ b/src/main/resources/mapper/ExportTaskDetailsMapper.xml @@ -0,0 +1,35 @@ + + + + + update Export_Task_Details set state=#{state} where id=#{id} + + + + + + + \ No newline at end of file