You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

463 lines
31 KiB
Java

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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<MessageSubordinate> 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改为55为没人使用的自定义数字同时修改修改完整性接口的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<MessageSubordinate> all) throws Exception {
if (all.size() > 0) {
for (MessageSubordinate messageSubordinate : all) {
messageSubordinate.setStatus(0);
messageSubordinateService.save(messageSubordinate);
}
}
}
public void doSomethingByHIS() {
try {
//循环开始处理 所有未处理的
List<InterfaceHisCache> 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();
}
}