package com.ann.service.impl; import com.alibaba.fastjson.JSON; import com.ann.entity.constant.AliasName; import com.ann.entity.constant.InterfaceName; import com.ann.entity.filing.ArchiveDetail; import com.ann.entity.filing.MessageSubordinate; import com.ann.entity.filing.dto.MessageDto; import com.ann.entity.interfaceEntity.ArchiveMaster; import com.ann.entity.interfaceEntity.InterfaceHisCache; import com.ann.entity.interfaceEntity.MessageLog; import com.ann.service.*; import com.ann.utils.*; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.io.File; import java.util.Date; import java.util.List; import java.util.Objects; import java.util.regex.Pattern; /** * @Author: LeiJiaXin * @Date: 2019/7/11 22:00 */ @Service public class QueueService { private static final Logger logger = LoggerFactory.getLogger(QueueService.class); @Autowired InterfaceHisCacheService interfaceHisCacheService; @Autowired MessageSubordinateService messageSubordinateService; @Autowired ArchiveMasterService archiveMasterService; @Autowired ArchiveDetailService archiveDetailService; @Autowired MessageService messageService; //---------------------定时器 public void doSomething(List all) throws Exception { if (all.size() > 0) { for (MessageSubordinate messageSubordinate : all) { //获取消息id String messageId = messageSubordinate.getMessageId(); logger.error("下载消息id:" + messageId); Integer status = 2; ArchiveDetail archiveDetail = null; try { // 解析内容 MessageLog messageLog = JSON.parseObject(messageSubordinate.getContentJson(), MessageLog.class); if (messageLog != null) { String outJson = messageLog.getOutJson(); if (outJson != null) { MessageDto messageDto = JSON.parseObject(outJson, MessageDto.class); if (messageDto.getSource().equals(InterfaceName.NURSE_DATA) && (messageDto.getReportAddress().endsWith(".jpg") || messageDto.getReportAddress().endsWith(".JPG") )){ messageSubordinate.setRemark("住院号:" + messageDto.getInpNo() + "pdf路径为空(可能出现下载问题)。。。"); } else { ArchiveMaster archiveMaster = archiveMasterService.findByInpNoAndVisitIdAndIsValid(messageDto.getInpNo(), messageDto.getVisitId()); Date date = new Date(); if (archiveMaster != null) { /**2021-1-26 等lis程序升级 去掉*/ if (Objects.equals(messageDto.getType(), AliasName.INSPECTION_REPORT) && archiveMaster.getArchiveState().equals("已归档")){ messageSubordinate.setStatus(3); messageSubordinateService.save(messageSubordinate); continue; } /**2021-1-26 等lis程序升级 去掉*/ /**2021-4-25 等超声补传完 去掉*/ if (Objects.equals(messageDto.getType(), AliasName.ULTRASONIC_REPORT) && archiveMaster.getArchiveState().equals("已归档")){ messageSubordinate.setStatus(3); messageSubordinateService.save(messageSubordinate); continue; } /**2021-4-25 等超声补传完 去掉*/ /**2021-4-25 等心电图补传完 去掉*/ if (Objects.equals(messageDto.getType(), AliasName.EKG_REPORT) && archiveMaster.getArchiveState().equals("已归档")){ messageSubordinate.setStatus(3); messageSubordinateService.save(messageSubordinate); continue; } /**2021-4-25 等心电图补传完 去掉*/ if ( !Objects.equals(messageDto.getType(), AliasName.PATHOLOGY_REPORT) /**2021-1-26 等lis程序升级 去掉*/ && !Objects.equals(messageDto.getType(), AliasName.INSPECTION_REPORT) /**2021-1-26 等lis程序升级 去掉*/ /**2021-4-25 等超声补传完 去掉*/ && !Objects.equals(messageDto.getType(), AliasName.ULTRASONIC_REPORT) /**2021-4-25 等超声补传完 去掉*/ /**2021-4-25 等心电图补传完 去掉*/ && !Objects.equals(messageDto.getType(), AliasName.EKG_REPORT) /**2021-4-25 等心电图补传完 去掉*/ && (archiveMaster.getArchiveState().equals("初审") || archiveMaster.getArchiveState().equals("已归档")) ){ messageSubordinate.setStatus(3); messageSubordinateService.save(messageSubordinate); continue; } String address = messageDto.getReportAddress(); if (address != null && (!address.equals(""))) { long start1 = System.currentTimeMillis(); // 如果是老数据 if (Objects.equals(messageDto.getIsOld(), "0")) { archiveDetail = new ArchiveDetail(archiveMaster.getId(), date, messageDto.getType(), messageDto.getSource(), messageDto.getApplyId(), messageDto.getDetailType(), 1); archiveDetailService.save(archiveDetail); } else { //如果是检验报告 单独处理 if(Objects.equals(messageDto.getType(),AliasName.INSPECTION_REPORT)){ // 查询库中是否存在 如果存在就更新 archiveDetail = archiveDetailService.isExitCheckReportId(archiveMaster.getId(), messageDto.getType(), messageDto.getSource(), messageDto.getCheckReportId()); if (archiveDetail == null) { archiveDetail = new ArchiveDetail(archiveMaster.getId(), date, messageDto.getType(), messageDto.getSource(),messageDto.getApplyId(), messageDto.getCheckReportId(), messageDto.getDetailType()); archiveDetailService.save(archiveDetail); } else { //更新时间 archiveDetail.setUpLoadDateTime(date); } }else{ //获取下载下载 if(Objects.equals(messageDto.getType(),AliasName.RADIATION_REPORT)) { //PACS //获取报告单号|申请单号 DR20210430233|97497407 String checkReportId = messageDto.getCheckReportId(); //定义是否走下载逻辑 第一次推送需要下载,报告单号为空或非第一次推送不需要下载 boolean downFlag = false; if(StringUtils.isNotBlank(checkReportId)){ //获报告单号DR20210430233 String[] checkReportIdArr = checkReportId.split("\\|"); checkReportId = checkReportIdArr[0]; //判断报告单号是否存在 archiveDetail = archiveDetailService.isExitCheckReportId(archiveMaster.getId(), messageDto.getType(), messageDto.getSource(),checkReportId); if (archiveDetail == null) { archiveDetail = new ArchiveDetail(archiveMaster.getId(), date, messageDto.getType(), messageDto.getSource(), messageDto.getApplyId(),checkReportId, messageDto.getDetailType()); archiveDetailService.save(archiveDetail); downFlag = true; } else { //横杠拼接申请单号 String applyId = archiveDetail.getApplyId(); if(!applyId.contains(checkReportIdArr[1])) { archiveDetail.setApplyId(applyId + "-" + checkReportIdArr[1]); //更新时间 archiveDetail.setUpLoadDateTime(date); archiveDetailService.save(archiveDetail); } status = 1; } }else{ messageSubordinate.setRemark("住院号为:" + messageDto.getInpNo() + "的checkReportId为空。。。。"); } if(!downFlag) { messageSubordinate.setStatus(status); messageSubordinateService.save(messageSubordinate); continue; } }else{ //非PACS // 查询库中是否存在 如果存在就更新 archiveDetail = archiveDetailService.isExit(archiveMaster.getId(), messageDto.getType(), messageDto.getSource(), messageDto.getApplyId()); if (archiveDetail == null) { archiveDetail = new ArchiveDetail(archiveMaster.getId(), date, messageDto.getType(), messageDto.getSource(), messageDto.getApplyId(), messageDto.getDetailType(), 1); archiveDetailService.save(archiveDetail); } else { //更新时间 archiveDetail.setUpLoadDateTime(date); } } } } logger.error("保存文件数据耗时:"+(System.currentTimeMillis() - start1)); String pdfPath = null; String tempPath = ""; Integer pageNum = 1; if (messageDto.getSource().equals(InterfaceName.NURSE_DATA)) { // 护理单独做处理 boolean saveFlag = false; if(archiveMaster.getEmrNurseCommitTime() == null ){ archiveMaster.setEmrNurseCommitTime(messageDto.getEmrCommitTime()); saveFlag = true; }else if(messageDto.getEmrCommitTime() != null && archiveMaster.getEmrNurseCommitTime() !=null && !Objects.equals( messageDto.getEmrCommitTime().getTime(),archiveMaster.getEmrNurseCommitTime().getTime())){ archiveMaster.setEmrNurseCommitTime(messageDto.getEmrCommitTime()); saveFlag = true; } if (archiveMaster.getEmrNurseCmt() == null) { archiveMaster.setEmrNurseCmt("提交"); saveFlag = true; } if(saveFlag){ archiveMasterService.save(archiveMaster); } String tempPageNum = ""; // if (messageDto.getApplyId().lastIndexOf("_") != -1 ) { //apply_id 000562390700_1_000562390700_0_1_JHR06.00.02_34_2.pdf // if(archiveMaster.getInpNo().lastIndexOf("_") != -1){ // } // tempPageNum = messageDto.getApplyId().substring(0, messageDto.getApplyId().indexOf(".pdf")); // }else{ // address ftp://10.6.0.155/2020-08-04/000562390700_1_000562390700_0_1_JHR06.00.02_34_2_0.pdf tempPageNum = address.substring(0, address.lastIndexOf("_")); // } tempPageNum = tempPageNum.substring(tempPageNum.lastIndexOf("_") + 1, tempPageNum.length() ); if(isInteger(tempPageNum)){ pageNum = Integer.valueOf(tempPageNum); } tempPath = messageDto.getType() + "~" + pageNum + "~"; } else if (messageDto.getSource().equals(InterfaceName.DOCTOR_DATA)) { // 医生单独做处理 boolean saveFlag = false; if(archiveMaster.getEmrDoctorCommitTime() == null ){ archiveMaster.setEmrDoctorCommitTime(messageDto.getEmrCommitTime()); saveFlag = true; }else if(messageDto.getEmrCommitTime() != null && archiveMaster.getEmrDoctorCommitTime() !=null && !Objects.equals( messageDto.getEmrCommitTime().getTime(),archiveMaster.getEmrDoctorCommitTime().getTime())){ archiveMaster.setEmrDoctorCommitTime(messageDto.getEmrCommitTime()); saveFlag = true; } if (archiveMaster.getEmrDoctorCmt() == null) { archiveMaster.setEmrDoctorCmt("提交"); saveFlag = true; } if(saveFlag){ archiveMasterService.save(archiveMaster); } tempPath = messageDto.getType() + "~" + messageDto.getCaptionDateTime() + "~"; } else { // 20200518 给重症系统的文件排序 if (messageDto.getType().equals(AliasName.ICU_REPORT)) { if(isInteger(messageDto.getCaptionDateTime())){ pageNum = Integer.valueOf(messageDto.getCaptionDateTime()); } //重症如果是pdf tempPath = messageDto.getDetailType() + "~" + messageDto.getCaptionDateTime() + "~"; } } long start3 = System.currentTimeMillis(); File pdfFile = FileUtils.createFile("pdfs", messageDto.getInpNo(), messageDto.getVisitId(), archiveDetail.getId(), tempPath); if (pdfFile != null) { if (address.endsWith(".pdf") || address.endsWith(".PDF")) { String path = DownloadUtils.downLoadPdfFile(pdfFile, address, messageDto.getType()); if (path != null) { pdfPath = path; } } else { if (Objects.equals(messageDto.getType(), AliasName.ICU_REPORT)) { File file = pdfFile; if (address.indexOf(".png") != -1) { file = FileUtils.createDir("images", messageDto.getInpNo(), messageDto.getVisitId()); } String fileNames = DownloadUtils.downloadImageFiles(address, file.getParent()); if (fileNames != null) { if (address.indexOf(".png") != -1) { // 多个图片那么转成pdf pdfPath = PdfUtils.imageDirToPdf(fileNames, pdfFile); } else { if (fileNames.indexOf(";") != -1) { fileNames = fileNames.substring(0, fileNames.length() - 1); file.delete(); } if (new File(fileNames).renameTo(file)) { pdfPath = file.getAbsolutePath(); } } } } else if (address.contains("http")){//新心电以http协议传 String path = HttpUtils.getPdfByHttpUrl(address, pdfFile); if (path != null) { pdfPath = path; } } else { // 一张图片转成pdf File imageFile = FileUtils.createFile("images", messageDto.getInpNo(), messageDto.getVisitId(), archiveDetail.getId(), tempPath); if (DownloadUtils.downloadImageFile(address, messageDto.getType(), imageFile)) { pdfPath = PdfUtils.imagesToPdf(imageFile, pdfFile); } } //金域外送报告解析 2021-05-06 if (Objects.equals(messageDto.getType(), AliasName.INSPECTION_REPORT)){ PdfUtils.base64StringToPDF(address,pdfFile.getAbsolutePath()); pdfPath=pdfFile.getAbsolutePath(); } } } //存入pdf地址 if (pdfPath != null) { // 转成格式 archiveDetail.setPageNumber(pageNum); archiveDetail.setPdfPath(pdfPath); int i=archiveDetailService.countByMasterIDAndAssortIDAndTitleAndFlag(archiveDetail.getMasterID(),archiveDetail.getAssortID(),archiveDetail.getTitle()); //如果detail表有重复的分段数据,则把falg改为5(5为没人使用的自定义数字),同时修改修改完整性接口的sql // if(archiveDetailService.countByMasterIDAndAssortIDAndTitleAndFlag(archiveDetail.getMasterID(),archiveDetail.getAssortID(),archiveDetail.getTitle())>1) // { // archiveDetail.setFlag("5"); //} archiveDetailService.save(archiveDetail); //更新messageLog的最后执行时间 Date xmlCreateTime = messageLog.getXmlCreateTime(); long beginTime = xmlCreateTime.getTime(); long endTime = date.getTime(); messageLog.setXmlExecutionTime(endTime - beginTime); messageService.save(messageLog); // 成功 status = 1; } else { status = 2; messageSubordinate.setRemark("住院号:" + messageDto.getInpNo() + "pdf路径为空(可能出现下载问题)。。。"); if (archiveDetail.getId() != null) { archiveDetailService.delete(archiveDetail.getId()); } } logger.error("文件下载耗时:"+(System.currentTimeMillis() - start3)); } else { messageSubordinate.setRemark("地址为空。。。。"); } } else{ messageSubordinate.setRemark("住院号为:" + messageDto.getInpNo() + "的ArchiveMaster为空。。。。"); } } } } } catch (Exception e) { // 设置参数 messageSubordinate.setRemark(e + ",问题发生时间:"+new Date()); // 报错删掉患者报告详情信息 if (archiveDetail != null) { if (archiveDetail.getId() != null) { archiveDetailService.delete(archiveDetail.getId()); } } logger.error("messageId:"+messageId+"报错了:" ,e); } messageSubordinate.setStatus(status); // 判断次数等于多少 if (messageSubordinate.getRuns() < 6 && messageSubordinate.getStatus() == 2) { Integer runs = messageSubordinate.getRuns(); messageSubordinate.setRuns(runs + 1); } messageSubordinateService.save(messageSubordinate); } } } // 定时器:根据第一次 没有成功的消息 重新尝试 public void doSomethingByError(List all) throws Exception { if (all.size() > 0) { for (MessageSubordinate messageSubordinate : all) { messageSubordinate.setStatus(0); messageSubordinateService.save(messageSubordinate); } } } public void doSomethingByHIS() { try { //循环开始处理 所有未处理的 List interfaceHisCaches = interfaceHisCacheService.findInterfaceHisCacheByState(); for (InterfaceHisCache interfaceHisCache: interfaceHisCaches) { String type = null,remark = null,title = null,pdfPath = null,state = "2"; ArchiveDetail archiveDetail = null; try{ ArchiveMaster archiveMaster = archiveMasterService.findByInpNoAndVisitIdAndIsValid(interfaceHisCache.getInpNo(), interfaceHisCache.getVisitId()); if(archiveMaster != null){ if(interfaceHisCache.getType() != null){ //给type 属性赋值 if(Objects.equals(interfaceHisCache.getType(),"0")){ type = AliasName.SOS; title = "临时医嘱"; }else if(Objects.equals(interfaceHisCache.getType(),"1")){ type = AliasName.PRN; title = "长期医嘱"; } // 查询库中是否存在 如果存在就更新 archiveDetail = archiveDetailService.isExit(archiveMaster.getId(), type, "HIS系统", title); Date date = new Date(); if (archiveDetail == null) { archiveDetail = new ArchiveDetail(archiveMaster.getId(), date, type, "HIS系统", title, title ,1); archiveDetailService.save(archiveDetail); }else{ //更新时间 archiveDetail.setUpLoadDateTime(date); } //开始下载 File pdfFile = FileUtils.createFile("pdfs", interfaceHisCache.getInpNo(), interfaceHisCache.getVisitId(), archiveDetail.getId(), ""); if (pdfFile != null) { if (interfaceHisCache.getPdfPath().endsWith(".pdf") || interfaceHisCache.getPdfPath().endsWith(".PDF")) { pdfPath = DownloadUtils.downLoadPdfFile(pdfFile, interfaceHisCache.getPdfPath(), type); if (pdfPath != null) { // 转成格式 archiveDetail.setPdfPath(pdfPath); archiveDetailService.save(archiveDetail); //删除FTP文件 if(FTPUtil.deleteFile(interfaceHisCache.getPdfPath())){ // 成功 state = "1"; } }else { remark = "下载失败"; } } }else{ remark = "文件创建失败"; } }else{ remark = "类型为空"; } }else{ remark = "没有入院信息"; } }catch (Exception e){ remark = e.getMessage(); } if(remark != null){ // 报错删掉患者报告详情信息 if (archiveDetail != null) { archiveDetailService.delete(archiveDetail.getId()); } } //赋值 interfaceHisCache.setValue(state,remark,new Date()); interfaceHisCacheService.save(interfaceHisCache); } }catch (Exception e){ logger.error("出错咯!错误信息为{},以及错误行数为:{}" ,e,e.getStackTrace()[0]); } } public boolean isInteger(String str) { Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$"); return pattern.matcher(str).matches(); } }