批量导出国家病历

master
linjj 2 years ago
parent 3d2d880d1d
commit a02feee98c

@ -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);
}
}

@ -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<ExportTaskDetailsVo> selectAllByTaskId(int taskId);
List<ExportDetailsVo> getfilePath(@Param("inpNo") String inpNo, @Param("dischargeDateTime") String dischargeDateTime);
int upStatc(@Param("state") int state,@Param("id") int id);
}

@ -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;
}

@ -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<ExportTaskDetailsVo> taskList = exportTaskDetailsMapper.selectAllByTaskId(taskId);
if (taskList == null) {
return "没有任务";
}
for (ExportTaskDetailsVo list : taskList) {
//根据住院号出院日期查询需要导出病历路径
List<ExportDetailsVo> 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<ExportDetailsVo> 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<ExportDetailsVo> 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;
}
}

@ -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);
}
}
}

@ -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;
}

@ -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;
}

@ -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

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.emr.dao.ExportTaskDetailsMapper">
<update id="upStatc">
update Export_Task_Details set state=#{state} where id=#{id}
</update>
<select id="selectAllByTaskId" resultType="com.emr.vo.ExportTaskDetailsVo">
SELECT id,
taskId,
inpNo,
CONVERT(VARCHAR (100), dischargeDateTime, 23) as dischargeDateTime
FROM Export_Task_Details
WHERE taskId = #{taskId}
AND state = 0
</select>
<select id="getfilePath" resultType="com.emr.vo.ExportDetailsVo">
SELECT
c.file_path+'\'+t.scan_page as filePath,
t.assort_id as assortId,
e.gj_assort_name as assortName
FROM
commomtable c
LEFT JOIN t_scan_assort t ON t.patient_id= c.patient_id
LEFT JOIN export_zd_assort e on e.assort_id=t.assort_id
WHERE
c.inpatient_no= #{inpNo}
AND CONVERT ( VARCHAR ( 100 ), c.dis_date, 23 ) = #{dischargeDateTime}
AND e.export_flag=1
AND t.is_del=0
ORDER BY e.assort_sort,t.scan_page
</select>
</mapper>
Loading…
Cancel
Save