From 7d1314fa7f41b61a0ff0ef237edbd74a8a126f7b Mon Sep 17 00:00:00 2001
From: linjj <850658129@qq.com>
Date: Mon, 20 May 2024 09:38:33 +0800
Subject: [PATCH] =?UTF-8?q?pacs=E8=A1=A5=E5=81=BF=E6=8C=89=E9=92=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 6 +
.../com/emr/controller/FontController.java | 14 ++
.../java/com/emr/dao/BatchExportMapper.java | 18 ++
.../com/emr/dao/ExportTaskDetailsMapper.java | 22 ++
.../com/emr/dao/ExportZdAssortMapper.java | 14 ++
.../com/emr/service/BatchExportService.java | 20 ++
.../service/ipml/BatchExportServiceImpl.java | 201 ++++++++++++++++++
src/main/java/com/emr/util/Logger.java | 38 ++++
src/main/java/com/emr/vo/ExportPdfVo.java | 19 ++
.../java/com/emr/vo/ExportTaskDetailsVo.java | 24 +++
src/main/java/com/emr/vo/ExportTaskVo.java | 26 +++
.../java/com/emr/vo/ExportZdAssortVo.java | 19 ++
src/main/resources/config/jdbc.properties | 11 +-
.../resources/mapper/BatchExpoerMapper.xml | 14 ++
.../mapper/ExportTaskDetailsMapper.xml | 21 ++
.../resources/mapper/ExportZdAssortMapper.xml | 22 ++
16 files changed, 481 insertions(+), 8 deletions(-)
create mode 100644 src/main/java/com/emr/dao/BatchExportMapper.java
create mode 100644 src/main/java/com/emr/dao/ExportTaskDetailsMapper.java
create mode 100644 src/main/java/com/emr/dao/ExportZdAssortMapper.java
create mode 100644 src/main/java/com/emr/service/BatchExportService.java
create mode 100644 src/main/java/com/emr/service/ipml/BatchExportServiceImpl.java
create mode 100644 src/main/java/com/emr/util/Logger.java
create mode 100644 src/main/java/com/emr/vo/ExportPdfVo.java
create mode 100644 src/main/java/com/emr/vo/ExportTaskDetailsVo.java
create mode 100644 src/main/java/com/emr/vo/ExportTaskVo.java
create mode 100644 src/main/java/com/emr/vo/ExportZdAssortVo.java
create mode 100644 src/main/resources/mapper/BatchExpoerMapper.xml
create mode 100644 src/main/resources/mapper/ExportTaskDetailsMapper.xml
create mode 100644 src/main/resources/mapper/ExportZdAssortMapper.xml
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