diff --git a/pom.xml b/pom.xml index ca455d6..9f3d811 100644 --- a/pom.xml +++ b/pom.xml @@ -75,6 +75,12 @@ commons-collections4 4.4 + + + com.itextpdf + kernel + 7.1.11 + diff --git a/src/main/java/com/emr/controller/FontController.java b/src/main/java/com/emr/controller/FontController.java index 63f5245..4abfc8c 100644 --- a/src/main/java/com/emr/controller/FontController.java +++ b/src/main/java/com/emr/controller/FontController.java @@ -5,6 +5,7 @@ import com.emr.dao.Emr_DictionaryMapper; import com.emr.entity.*; import com.emr.service.Archive_DetailService; import com.emr.service.Archive_MasterService; +import com.emr.service.BatchExportService; import com.emr.service.ipml.TPrintinfoService; import com.emr.service.ipml.ZdAssortService; import com.emr.util.ExceptionPrintUtil; @@ -45,6 +46,8 @@ public class FontController { private ZdAssortService assortService; @Autowired private Archive_DetailService archiveDetailService; + @Autowired + private BatchExportService batchExportService; @RequestMapping("selectIsPrintByPatienId") @ResponseBody public Msg selectIsPrintByPatienId(String patientId){ @@ -428,4 +431,15 @@ public class FontController { ExceptionPrintUtil.printException(e); } } + + /** + * @description: 导出国标病历接口 + * @author linjj + * @date: 2024/4/29 15:27 + */ + @ResponseBody + @RequestMapping(value = "BatchExportPdf") + public String batchExportPdf(int taskId) throws Exception { + return batchExportService.batchExportPdf(taskId); + } } diff --git a/src/main/java/com/emr/dao/BatchExportMapper.java b/src/main/java/com/emr/dao/BatchExportMapper.java new file mode 100644 index 0000000..4576dff --- /dev/null +++ b/src/main/java/com/emr/dao/BatchExportMapper.java @@ -0,0 +1,18 @@ +package com.emr.dao; + +import com.emr.vo.ExportTaskVo; + +import java.util.List; + +/** + * @InterfaceName BatchExportMapper + * @Description 国家病历批量导出接口 + * @Author linjj + * @Date 2024/4/12 11:44 + * @Version 1.0 + */ +public interface BatchExportMapper { + + //查询所有任务 + List selectAll(int taskState); +} 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..e714741 --- /dev/null +++ b/src/main/java/com/emr/dao/ExportTaskDetailsMapper.java @@ -0,0 +1,22 @@ +package com.emr.dao; + +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 getMasterId(@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/dao/ExportZdAssortMapper.java b/src/main/java/com/emr/dao/ExportZdAssortMapper.java new file mode 100644 index 0000000..4678703 --- /dev/null +++ b/src/main/java/com/emr/dao/ExportZdAssortMapper.java @@ -0,0 +1,14 @@ +package com.emr.dao; + +import com.emr.vo.ExportPdfVo; +import com.emr.vo.ExportZdAssortVo; + +import java.util.List; + +public interface ExportZdAssortMapper { + + ListgetPdfPath(String masterId); + + ListselectAll(); + +} \ No newline at end of file diff --git a/src/main/java/com/emr/service/BatchExportService.java b/src/main/java/com/emr/service/BatchExportService.java new file mode 100644 index 0000000..8bbd2f1 --- /dev/null +++ b/src/main/java/com/emr/service/BatchExportService.java @@ -0,0 +1,20 @@ +package com.emr.service; + +import com.emr.vo.ExportTaskVo; + +import java.util.List; + +/** + * @InterfaceName BatchExportService + * @Description 国家病历批量导出接口 + * @Author linjj + * @Date 2024/4/12 11:40 + * @Version 1.0 + */ +public interface BatchExportService { + //查询所有任务 + List selectAll(int taskState); + + //批量导出 + String batchExportPdf(int taskid)throws Exception; +} diff --git a/src/main/java/com/emr/service/ipml/BatchExportServiceImpl.java b/src/main/java/com/emr/service/ipml/BatchExportServiceImpl.java new file mode 100644 index 0000000..61ad326 --- /dev/null +++ b/src/main/java/com/emr/service/ipml/BatchExportServiceImpl.java @@ -0,0 +1,201 @@ +package com.emr.service.ipml; + +import com.emr.dao.BatchExportMapper; +import com.emr.dao.ExportTaskDetailsMapper; +import com.emr.dao.ExportZdAssortMapper; +import com.emr.service.BatchExportService; +import com.emr.util.Logger; +import com.emr.vo.ExportPdfVo; +import com.emr.vo.ExportTaskDetailsVo; +import com.emr.vo.ExportTaskVo; +import com.itextpdf.kernel.pdf.PdfDocument; +import com.itextpdf.text.Document; +import com.itextpdf.text.pdf.*; +import org.apache.commons.collections4.CollectionUtils; +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; + +/** + * @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 + BatchExportMapper batchExportMapper; + @Autowired + ExportTaskDetailsMapper exportTaskDetailsMapper; + @Autowired + private ExportZdAssortMapper exportZdAssortMapper; + @Value("${export_pdf_hospital_info}") + private String flieName; + + + @Override + public List selectAll(int taskState) { + return batchExportMapper.selectAll(taskState); + } + + @Override + public String batchExportPdf(int taskid) throws Exception { + //导出文件名 + String fileName=null; + //根据taskid查询所有需要导出病历的住院号出院日期 + List taskList = exportTaskDetailsMapper.selectAllByTaskId(taskid); + if (CollectionUtils.isEmpty(taskList)) { + return "没有任务"; + } + for (ExportTaskDetailsVo list : taskList) { + //根据住院号出院日期查询需要导出病历路径 + List masterIds = exportTaskDetailsMapper.getMasterId(list.getInpNo(), list.getDischargeDateTime()); + if (CollectionUtils.isEmpty(masterIds)) { + logger.log("病案号为:" + list.getInpNo() + "出院时间为:" + list.getDischargeDateTime() + "的病历找不到。"); + continue; + } + for (String masterId : masterIds) { + List pdfPathList = exportZdAssortMapper.getPdfPath(masterId); + if (CollectionUtils.isEmpty(pdfPathList)){ + logger.log("病案号为:" + list.getInpNo() + "出院时间为:" + list.getDischargeDateTime() + "的病历查询不到影像"); + continue; + } + try { + //组织导出文件名 + fileName = exportFlieName(list); + } catch (ParseException e) { + throw new RuntimeException(e); + } +// downPdfResponse(fileName,response); + Boolean aBoolean = exportPdf(pdfPathList,fileName); + //为true时修改任务状态1完成2失败 + if (aBoolean){ + exportTaskDetailsMapper.upStatc(1,list.getId()); + }else { + exportTaskDetailsMapper.upStatc(2,list.getId()); + } + } + } + return "下载完成"; + } + + + private void downPdfResponse(String pdfName, HttpServletResponse response) { + try { + pdfName = java.net.URLEncoder.encode(pdfName, "UTF-8"); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + response.reset(); + response.setContentType("application/pdf"); + response.setHeader("content-disposition", "attachment; filename=" + pdfName + ".pdf"); + } + + + + private static Boolean exportPdf(List pdfPathList,String fileName) { + //上一个目录名称 + String lastOutline = null; + //是否增加标签 + boolean outFlag = true; + //标签顺序 + Integer outNum = 1; + Integer pageNum=1; + Document document = new Document(); + PdfCopy writer = null; + try { + FileOutputStream fileOutputStream = new FileOutputStream("D://export//"+fileName+".pdf"); + writer = new PdfCopy(document,fileOutputStream); + 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(); + for (int i = 0; i < pdfPathList.size(); i++) { + try { + String assortName = pdfPathList.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; + } + PdfReader reader = new PdfReader(pdfPathList.get(i).getPdfPath()); + int n = reader.getNumberOfPages(); + for (int s = 1; s <= n; s++) { + PdfImportedPage page = writer.getImportedPage(reader, s); + writer.addPage(page); + } + if (outFlag) { + //目录跳转页面内容设置。 + PdfAction action = PdfAction.gotoLocalPage(pageNum, new PdfDestination(PdfDestination.FIT), writer); + //标题目录 + String title = outNum+"."+pdfPathList.get(i).getAssortName(); + new PdfOutline(root, action, title, false); + outNum++; + } + pageNum =pageNum+getPageNum(pdfPathList.get(i)); + } catch (Exception e) { + return false; + } + } + return true; + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (document != null) { + document.close(); + } + } + return true; + } + + + //获取pdf页码 + private static int getPageNum(ExportPdfVo obj) { + FileInputStream is; + com.itextpdf.kernel.pdf.PdfReader pdfReader = null; + int pages = 0; + //创建File类 + File file = new File(obj.getPdfPath()); + //判断文件是否存在 + if (file.exists()) { + try { + is = new FileInputStream(file); + pdfReader = new com.itextpdf.kernel.pdf.PdfReader(is); + com.itextpdf.kernel.pdf.PdfDocument redDocument = new com.itextpdf.kernel.pdf.PdfDocument(pdfReader); + pages = redDocument.getNumberOfPages(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + return pages; + } + //生成文件名 + 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..de5a32c --- /dev/null +++ b/src/main/java/com/emr/util/Logger.java @@ -0,0 +1,38 @@ +package com.emr.util; + +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 { + public void log(String info) { + SimpleDateFormat dateFormat = new SimpleDateFormat ("yyyy-MM-dd"); + String format = dateFormat.format (new Date()); + File file = new File ("D:\\export\\logs\\"+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/ExportPdfVo.java b/src/main/java/com/emr/vo/ExportPdfVo.java new file mode 100644 index 0000000..d41c49f --- /dev/null +++ b/src/main/java/com/emr/vo/ExportPdfVo.java @@ -0,0 +1,19 @@ +package com.emr.vo; + +import lombok.Data; + +/** + * @ClassName ExportPdfVo + * @Description 导出pdf返回 + * @Author linjj + * @Date 2024/4/11 8:47 + * @Version 1.0 + */ +@Data +public class ExportPdfVo { + + private String pdfPath; + private String assortID; + private String assortSort; + 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/java/com/emr/vo/ExportTaskVo.java b/src/main/java/com/emr/vo/ExportTaskVo.java new file mode 100644 index 0000000..a08456f --- /dev/null +++ b/src/main/java/com/emr/vo/ExportTaskVo.java @@ -0,0 +1,26 @@ +package com.emr.vo; + +import lombok.Data; + +/** + * @ClassName ExportTaskVo + * @Description 导出任务主表 + * @Author linjj + * @Date 2024/4/12 11:37 + * @Version 1.0 + */ +@Data +public class ExportTaskVo { + //批次id + private int id; + //开始时间 + private String startTime; + //结束时间 + private String endTime; + //0未开始1正在下载2下载完成 + private int taskState; + //完成数量 + private int completeNum; + //需求数量 + private int needNum; +} diff --git a/src/main/java/com/emr/vo/ExportZdAssortVo.java b/src/main/java/com/emr/vo/ExportZdAssortVo.java new file mode 100644 index 0000000..22942c8 --- /dev/null +++ b/src/main/java/com/emr/vo/ExportZdAssortVo.java @@ -0,0 +1,19 @@ +package com.emr.vo; + +import lombok.Data; + +/** + * @ClassName ExportZdAssortVo + * @Description 导出分段详情 + * @Author linjj + * @Date 2024/4/10 16:52 + * @Version 1.0 + */ +@Data +public class ExportZdAssortVo { + + private String assortId; + private String assortName; + private String assortSort; + private String exportFlag; +} diff --git a/src/main/resources/config/jdbc.properties b/src/main/resources/config/jdbc.properties index 524e625..3dc3b60 100644 --- a/src/main/resources/config/jdbc.properties +++ b/src/main/resources/config/jdbc.properties @@ -53,6 +53,8 @@ POWER_JSP=http://localhost:8084/power recallReason=\u533B\u9662\u9700\u8981\u8FD9\u4EFD\u6587\u6863 HomepageDictionary=http://localhost:8080/WholeCheckInterface/services/HomepageDictionary?wsdl HomepageMethod=CheckData +#\u5bfc\u51fa\u4fe1\u606f\u683c\u5f0f\u9700\u8981\u4e3aunicode\u683c\u5f0f\u4e0d\u7136\u4f1a\u4e71\u7801 +export_pdf_hospital_info = \u5e7f\u4e1c\u7701_\u5e7f\u4e1c\u533b\u79d1\u5927\u5b66\u9644\u5c5e\u533b\u9662 # # # @@ -62,13 +64,6 @@ HomepageMethod=CheckData ##\u6570\u636E\u5E93IP #dataBaseIp=localhost ###\u6570\u636E\u5E93\u540D\u79F0 -##dataBaseName=yd_record -###\u6570\u636E\u5E93\u5BC6\u7801 -##dataBasePassword=docus702 -# -##\u6570\u636E\u5E93IP -##dataBaseIp=10.36.116.108 -###\u6570\u636E\u5E93\u540D\u79F0 #dataBaseName=emr_record ##\u6570\u636E\u5E93\u5BC6\u7801 #dataBasePassword=xjgs+docus911 @@ -114,7 +109,7 @@ HomepageMethod=CheckData #recallReason=\u533B\u9662\u9700\u8981\u8FD9\u4EFD\u6587\u6863 #HomepageDictionary=http://10.36.116.108:8080/WholeCheckInterface/services/HomepageDictionary?wsdl #HomepageMethod=CheckData -# +## # # # diff --git a/src/main/resources/mapper/BatchExpoerMapper.xml b/src/main/resources/mapper/BatchExpoerMapper.xml new file mode 100644 index 0000000..3e447b0 --- /dev/null +++ b/src/main/resources/mapper/BatchExpoerMapper.xml @@ -0,0 +1,14 @@ + + + + + + + \ No newline at end of file diff --git a/src/main/resources/mapper/ExportTaskDetailsMapper.xml b/src/main/resources/mapper/ExportTaskDetailsMapper.xml new file mode 100644 index 0000000..f693122 --- /dev/null +++ b/src/main/resources/mapper/ExportTaskDetailsMapper.xml @@ -0,0 +1,21 @@ + + + + + update Export_Task_Details set state=#{state} where id=#{id} + + + + + + \ No newline at end of file diff --git a/src/main/resources/mapper/ExportZdAssortMapper.xml b/src/main/resources/mapper/ExportZdAssortMapper.xml new file mode 100644 index 0000000..c2b1a7f --- /dev/null +++ b/src/main/resources/mapper/ExportZdAssortMapper.xml @@ -0,0 +1,22 @@ + + + + + + + \ No newline at end of file