diff --git a/src/main/java/com/emr/controller/FontController.java b/src/main/java/com/emr/controller/FontController.java index 51082597..64207e56 100644 --- a/src/main/java/com/emr/controller/FontController.java +++ b/src/main/java/com/emr/controller/FontController.java @@ -3,10 +3,7 @@ package com.emr.controller; import com.alibaba.fastjson.JSON; 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.OverdueRemindService; -import com.emr.service.Zd_AssortService; +import com.emr.service.*; import com.emr.service.ipml.TBasicBrowseHistoryService; import com.emr.util.ExceptionPrintUtil; import com.emr.util.HttpClientUtils; @@ -59,6 +56,8 @@ public class FontController { @Autowired private OverdueRemindService overdueRemindService; + @Autowired + private BatchExportService batchExportService; /***************************提供第三方按多个分段id和记账号查询病历pdf***********************************/ /** @@ -512,5 +511,17 @@ public class FontController { overdueRemindVO.setDoctorInCharge(s); overdueRemindService.updatetOverdueStatcByDoctorId(overdueRemindVO); } + /** + * @description: 批量导出病历接口 + * @params: taskid + * @return: String + * @author linjj + * @date: 2024/4/12 13:55 + */ + @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 00000000..e7147417 --- /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/service/BatchExportService.java b/src/main/java/com/emr/service/BatchExportService.java index efaf2fc0..6c0927d8 100644 --- a/src/main/java/com/emr/service/BatchExportService.java +++ b/src/main/java/com/emr/service/BatchExportService.java @@ -5,6 +5,7 @@ import com.emr.vo.ExportTaskVo; import com.itextpdf.kernel.pdf.PdfDocument; import com.itextpdf.kernel.pdf.PdfReader; +import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileInputStream; import java.io.IOException; @@ -21,4 +22,6 @@ 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 index ebd3431c..3d958fdd 100644 --- a/src/main/java/com/emr/service/ipml/BatchExportServiceImpl.java +++ b/src/main/java/com/emr/service/ipml/BatchExportServiceImpl.java @@ -1,17 +1,29 @@ package com.emr.service.ipml; import com.emr.dao.BatchExportMapper; +import com.emr.dao.ExportTaskDetailsMapper; +import com.emr.dao.ExportZdAssortMapper; +import com.emr.dto.DownloadPdfBloodDto; 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.kernel.pdf.PdfReader; +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 java.io.File; -import java.io.FileInputStream; -import java.io.IOException; +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Collections; +import java.util.Date; import java.util.List; /** @@ -23,11 +35,169 @@ import java.util.List; */ @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; + } + com.itextpdf.text.pdf.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 00000000..de5a32c5 --- /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/ExportTaskDetailsVo.java b/src/main/java/com/emr/vo/ExportTaskDetailsVo.java new file mode 100644 index 00000000..e2713e73 --- /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/applicationContext-shiro.xml b/src/main/resources/config/applicationContext-shiro.xml index 1cdf370f..e5712b47 100644 --- a/src/main/resources/config/applicationContext-shiro.xml +++ b/src/main/resources/config/applicationContext-shiro.xml @@ -14,6 +14,7 @@ /toLogin=anon /static/**=anon /error=authc + /font=authc /test=anon /login=anon /home=perms[home] diff --git a/src/main/resources/mapper/ExportTaskDetailsMapper.xml b/src/main/resources/mapper/ExportTaskDetailsMapper.xml new file mode 100644 index 00000000..f6931221 --- /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