1、新增长期医嘱、临时医嘱、其他报告类型

2、新增长期医嘱、临时医嘱、其他报告下载方式
3、新增下载成功医嘱,删除FTP医嘱并将删除的FTP文件写入日志
4、将所有地址写入Z盘
master
leijx 5 years ago
parent 95c46d1673
commit bace7fcf7f

@ -41,9 +41,6 @@ public class AliasName {
// ICU报告
public static final String ICU_REPORT = "121";
// 其他类型 目前来说 是手麻系统的其他三个
public static final String OTHER = "110";
// 检查申请单
public static final String PARAMETER_EXAMAPPLY = "119";
@ -74,5 +71,15 @@ public class AliasName {
// 扫描文件
public static final String SCANNING_FILE = "30";
// 20200701 长期医嘱
public static final String PRN = "122";
// 20200701 临时医嘱
public static final String SOS = "123";
// 20200703 新增其他报告
public static final String OTHER_REPORT = "110";
}

@ -0,0 +1,47 @@
package com.ann.entity.interfaceEntity;
import lombok.Data;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;
/**
* @Description
* @Date 2020/7/1 9:00
* @Created by ljx
*/
@Table
@Entity
@Data
public class InterfaceHisCache {
@Id
private String id;
private String inpNo;
private String visitId;
// 医嘱类型 0代表临时医嘱 1代表长期医嘱
private String type;
private String pdfPath;
private String remark;
// 0代表未处理 1代表已处理 2代表处理异常
private String state;
//2020-7-6 新增修改时间
private Date updateTime ;
public void setValue(String state, String remark, Date updateTime) {
this.state = state;
this.remark = remark;
this.updateTime = updateTime;
}
}

@ -0,0 +1,46 @@
package com.ann.job;
import com.ann.service.ArchiveMasterService;
import com.ann.service.impl.GenerateService;
import com.ann.service.impl.QueueService;
import com.ann.utils.QuartzUtils;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.Scheduler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
/**
* 6
*
* @Author: LeiJiaXin
* @Date: 2019/8/16 10:12
*/
public class ScheduledJob4 implements Job {
static final Logger logger = LoggerFactory.getLogger(ScheduledJob4.class);
@Autowired
Scheduler scheduler;
@Autowired
ArchiveMasterService archiveMasterService;
@Autowired
QueueService queueService;
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
try {
//System.out.println("动态的定时任务4执行时间" + LocalTime.now());
QuartzUtils.pauseScheduleJob(scheduler, "group1", "job4");
queueService.doSomethingByHIS();
} catch (Exception e) {
// 如果报错-- 捕捉异常 继续执行
logger.error("出错咯!错误信息为{},以及错误行数为:{}" ,e,e.getStackTrace()[0]);
}
QuartzUtils.resumeScheduleJob(scheduler, "group1", "job4");
}
}

@ -25,12 +25,10 @@ public class SchedulerAllJob {
*/
public void scheduleJobs() throws SchedulerException {
Scheduler scheduler = schedulerFactoryBean.getScheduler();
/**
*
*/
scheduleJob1(scheduler);
scheduleJob2(scheduler);
scheduleJob3(scheduler);
// scheduleJob1(scheduler);
// scheduleJob2(scheduler);
// scheduleJob3(scheduler);
scheduleJob4(scheduler);
}
/**
@ -82,4 +80,19 @@ public class SchedulerAllJob {
CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("job3", "group1").withSchedule(scheduleBuilder).build();
scheduler.scheduleJob(jobDetail, cronTrigger);
}
/**
* Job4
*
* @param scheduler
* @throws SchedulerException
*/
private void scheduleJob4(Scheduler scheduler) throws SchedulerException {
JobDetail jobDetail = JobBuilder.newJob(ScheduledJob4.class).withIdentity("job4", "group1").build();
// 0 1-2 * * * ?
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0/15 * * * * ?");
// 每1分钟执行一次
CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("job4", "group1").withSchedule(scheduleBuilder).build();
scheduler.scheduleJob(jobDetail, cronTrigger);
}
}

@ -0,0 +1,19 @@
package com.ann.repository;
import com.ann.entity.interfaceEntity.InterfaceHisCache;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
public interface InterfaceHisCacheRepository extends JpaRepository<InterfaceHisCache,String> {
public List<InterfaceHisCache> findAllByStateAndPdfPathIsNotNull(String state);
// @Transactional
// @Modifying
// @Query(value = "update InterfaceHisCache o set o.state = ?1 where o.id = ?2 and o.state = 0 and o.type = ?3 ")
// public Integer updateStateById(Integer state, String id, Integer type);
}

@ -0,0 +1,17 @@
package com.ann.service;
import com.ann.entity.interfaceEntity.InterfaceHisCache;
import java.util.List;
public interface InterfaceHisCacheService {
//查询所有未处理的状态
public List<InterfaceHisCache> findInterfaceHisCacheByState();
//修改状态
public boolean updateState(Integer state, String id, Integer type);
void save(InterfaceHisCache interfaceHisCache);
}

@ -0,0 +1,34 @@
package com.ann.service.impl;
import com.ann.entity.interfaceEntity.InterfaceHisCache;
import com.ann.repository.InterfaceHisCacheRepository;
import com.ann.service.InterfaceHisCacheService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class InterfaceHisCacheServiceImpl implements InterfaceHisCacheService {
@Autowired
private InterfaceHisCacheRepository interfaceHisCacheRepository;
@Override
public List<InterfaceHisCache> findInterfaceHisCacheByState() {
return interfaceHisCacheRepository.findAllByStateAndPdfPathIsNotNull("0");
}
@Override
public boolean updateState(Integer state,String id,Integer type ) {
// if(interfaceHisCacheRepository.updateStateById(state,id,type) > 0)
// return true;
return false;
}
@Override
public void save(InterfaceHisCache interfaceHisCache) {
interfaceHisCacheRepository.save(interfaceHisCache);
}
}

@ -7,13 +7,13 @@ 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.entity.interfaceEntity.ScanningFile;
import com.ann.service.ArchiveDetailService;
import com.ann.service.ArchiveMasterService;
import com.ann.service.MessageService;
import com.ann.service.MessageSubordinateService;
import com.ann.service.*;
import com.ann.utils.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -29,6 +29,11 @@ import java.util.Objects;
@Service
public class QueueService {
private static final Logger logger = LoggerFactory.getLogger(QueueService.class);
@Autowired
InterfaceHisCacheService interfaceHisCacheService;
@Autowired
MessageSubordinateService messageSubordinateService;
@Autowired
@ -58,9 +63,7 @@ public class QueueService {
ArchiveMaster archiveMaster = archiveMasterService.findByInpNoAndVisitIdAndIsValid(messageDto.getInpNo(), messageDto.getVisitId());
if (archiveMaster != null) {
if(!Objects.equals(messageDto.getType(),AliasName.PATHOLOGY_REPORT)){
if(archiveMaster.getArchiveState().equals("初审") || archiveMaster.getArchiveState().equals("已归档")
|| archiveMaster.getArchiveState().equals("复审退回")
|| archiveMaster.getArchiveState().equals("病案召回") ){
if(archiveMaster.getArchiveState().equals("初审") || archiveMaster.getArchiveState().equals("已归档")){
messageSubordinate.setStatus(3);
messageSubordinateService.save(messageSubordinate);
continue;
@ -68,19 +71,24 @@ public class QueueService {
}
String address = messageDto.getReportAddress();
Date date = new Date();
if (address != null && (!address.equals(""))) {
// 如果是老数据
if(Objects.equals(messageDto.getIsOld(),"0")){
archiveDetail = new ArchiveDetail(archiveMaster.getId(), new Date(), messageDto.getType(), messageDto.getSource(), messageDto.getApplyId(),messageDto.getDetailType(),1);
archiveDetail = new ArchiveDetail(archiveMaster.getId(), date, messageDto.getType(), messageDto.getSource(), messageDto.getApplyId(),messageDto.getDetailType(),1);
archiveDetailService.save(archiveDetail);
}else{
// 查询库中是否存在 如果存在就更新
archiveDetail = archiveDetailService.isExit(archiveMaster.getId(), messageDto.getType(), messageDto.getSource(), messageDto.getApplyId());
if (archiveDetail == null) {
archiveDetail = new ArchiveDetail(archiveMaster.getId(), new Date(), messageDto.getType(), messageDto.getSource(), messageDto.getApplyId(),
archiveDetail = new ArchiveDetail(archiveMaster.getId(), date, messageDto.getType(), messageDto.getSource(), messageDto.getApplyId(),
messageDto.getDetailType(),1);
archiveDetailService.save(archiveDetail);
}else{
//更新时间
archiveDetail.setUpLoadDateTime(date);
}
}
String pdfPath = null;
String emrPath = "";
@ -109,6 +117,7 @@ public class QueueService {
}else{
// 20200518 给重症系统的文件排序
if(messageDto.getType().equals(AliasName.ICU_REPORT)){
//重症如果是pdf
emrPath = messageDto.getDetailType() + "~" + messageDto.getCaptionDateTime() + "~";
}
}
@ -122,10 +131,26 @@ public class QueueService {
}
} 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
File imageFile = FileUtils.createDir("images", messageDto.getInpNo(), messageDto.getVisitId());
String imageFiles = DownloadUtils.downloadImageFiles(address, imageFile.getParent());
pdfPath = PdfUtils.imageDirToPdf(imageFiles, pdfFile);
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 {
// 一张图片转成pdf
File imageFile = FileUtils.createFile("images", messageDto.getInpNo(), messageDto.getVisitId(), archiveDetail.getId(), emrPath);
@ -144,7 +169,7 @@ public class QueueService {
//更新messageLog的最后执行时间
Date xmlCreateTime = messageLog.getXmlCreateTime();
long beginTime = xmlCreateTime.getTime();
long endTime = new Date().getTime();
long endTime = date.getTime();
messageLog.setXmlExecutionTime(endTime - beginTime);
messageService.save(messageLog);
@ -166,7 +191,7 @@ public class QueueService {
//更新messageLog的最后执行时间
Date xmlCreateTime = messageLog.getXmlCreateTime();
long beginTime = xmlCreateTime.getTime();
long endTime = new Date().getTime();
long endTime = date.getTime();
messageLog.setXmlExecutionTime(endTime - beginTime);
messageService.save(messageLog);
@ -216,7 +241,6 @@ public class QueueService {
}
}
public String handlePdfFile(MessageDto messageDto,String masterId) throws Exception {
try {
ScanningFile scanningFile = JSON.parseObject(messageDto.getObject().toString(), ScanningFile.class);
@ -251,11 +275,88 @@ public class QueueService {
archiveDetail = new ArchiveDetail(masterId, new Date(), messageDto.getType(), messageDto.getSource(), messageDto.getApplyId() + "~" + (scanningFile.getNumber() != null ? scanningFile.getNumber() : ""), pdfPath);
archiveDetailService.save(archiveDetail);
}
} catch (Exception e) {
return e + "";
}
return null;
}
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(), interfaceHisCache.getType(), "HIS系统", "");
Date date = new Date();
if (archiveDetail == null) {
archiveDetail = new ArchiveDetail(archiveMaster.getId(), date, type, "HIS系统", "",
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]);
}
}
}

@ -179,8 +179,7 @@ public class DownloadUtils {
public static String downLoadPdfFile(File pdfFile, String address, String type) throws Exception {
if (address.indexOf("http") != -1) {
// http://10.6.0.144/PDF/b74abb84-3524-442e-b0af-0d3966c9b979.pdf
// 放射
// 放射 http://10.6.0.144/PDF/b74abb84-3524-442e-b0af-0d3966c9b979.pdf
if (DownloadUtils.downLoadByUrl(address, pdfFile.getName(), pdfFile.getParent())) {
return pdfFile.getAbsolutePath();
}
@ -219,6 +218,18 @@ public class DownloadUtils {
// 输血 ftp://10.6.1.128/tmis/10_000526962900_9_LCFXD191021010_临床发血单.PDF
userName = "common";
password = "common";
} else if (Objects.equals(type, AliasName.ICU_REPORT)) {
// icu ftp://10.6.0.241/fallSheets/徐晓峰-988874-2020-02-25 - 2020-03-21.pdf;
userName = "zingicu";
password = "zingicu123";
} else if(Objects.equals(type, AliasName.PRN) || Objects.equals(type, AliasName.SOS)) {
// 长期医嘱/临时医嘱 ftp://10.6.1.16:21/1147_1_long.pdf
userName = "his";
password = "his_docus";
}else if(Objects.equals(type, AliasName.OTHER_REPORT)) {
//其他报告 根据IP区分报告类型 考虑IP单独做配置
userName = "";
password = "";
}else {
// 电子病历
// ftp://10.6.0.155/2020-01-25/000593857900_1_000593857900_0_4_EMR06.02.04_3_5_0.pdf
@ -231,7 +242,6 @@ public class DownloadUtils {
return pdfFile.getAbsolutePath();
}
}
return null;
}
@ -263,6 +273,7 @@ public class DownloadUtils {
return imagesPath;
}
public static void main(String[] args) throws IOException {
//10.6.0.217/images/201909_Z/ReportBB818E8E-E93A-46E8-A8B1-F789677BC0D8.1.jpg
//10.6.0.74/Images/201909_U/Report617970_1.jpg

@ -97,7 +97,7 @@ public class FTPUtil {
boolean result = false;
try {
is = ftp.retrieveFileStream(path);
if(is != null){
byte[] bytes = new byte[1024];
int i;
fos = new FileOutputStream(file);
@ -105,6 +105,7 @@ public class FTPUtil {
fos.write(bytes, 0, i);
}
closeFTPConnect(ftp);
}
if(file.length() == 0){
FileUtils.deleteImageFile(file);
}else{
@ -129,6 +130,42 @@ public class FTPUtil {
return result;
}
public static boolean deleteFile(String address) throws Exception {
boolean flag = false;
FTPClient ftpClient = null;
try {
String url = "";
String path = "";
Integer port = 21;
// 处理 “/”
if (address.indexOf("/") == -1) {
address = address.replace("\\", "/");
}
address = address.substring(address.indexOf("/") + 2, address.length());
path = address.substring(address.indexOf("/"), address.length());
url = address.substring(0, address.indexOf("/"));
ftpClient = connectFtpServer(url, port, "his", "his_docus");
// 切换FTP目录
ftpClient.changeWorkingDirectory("/");
int dele = ftpClient.dele(path);
System.out.println(dele);
logger.error("删除FTP文件为{}",address);
flag = true;
} catch (Exception e) {
throw e;
} finally {
if (ftpClient != null && ftpClient.isConnected()) {
try {
ftpClient.disconnect();// 断开连接如果想连续删除就得把finally块注掉
} catch (IOException e) {
e.printStackTrace();
}
}
}
return flag;
}
public static void main(String[] args) throws Exception {
/* String address = "ftp://10.6.0.241/02019-08-29.png;ftp://10.6.0.241/12019-08-29.png";

@ -35,7 +35,7 @@ public class FileUtils {
LocalDate date = LocalDate.now();
String fileDirName = null;
if (Objects.equals(fileType, "images")) {
fileDirName = "D:/images/" + date.getYear() + "/" + date.getMonthValue() + "/" + inpNo + "_" + visitId;
fileDirName = "Z:/images/" + date.getYear() + "/" + date.getMonthValue() + "/" + inpNo + "_" + visitId;
} else if (Objects.equals(fileType, "pdfs")) {
fileDirName = pdfPath + "/" + date.getYear() + "/" + date.getMonthValue() + "/" + inpNo + "_" + visitId;
}
@ -81,7 +81,7 @@ public class FileUtils {
LocalDate date = LocalDate.now();
String fileDirName = null;
if (Objects.equals(fileType, "images")) {
fileDirName = "D:/images/" + date.getYear() + "/" + date.getMonthValue() + "/" + inpNo + "_" + visitId;
fileDirName = "Z:/images/" + date.getYear() + "/" + date.getMonthValue() + "/" + inpNo + "_" + visitId;
} else if (Objects.equals(fileType, "pdfs")) {
fileDirName = pdfPath + "/" + date.getYear() + "/" + date.getMonthValue() + "/" + inpNo + "_" + visitId;
}
@ -116,7 +116,7 @@ public class FileUtils {
LocalDate date = LocalDate.now();
String fileDirName = null;
if (Objects.equals(fileType, "images")) {
fileDirName = "D:/images/" + date.getYear() + "/" + date.getMonthValue() + "/" + inpNo + "_" + visitId;
fileDirName = "Z:/images/" + date.getYear() + "/" + date.getMonthValue() + "/" + inpNo + "_" + visitId;
} else if (Objects.equals(fileType, "pdfs")) {
fileDirName = pdfPath + "/" + date.getYear() + "/" + date.getMonthValue() + "/" + inpNo + "_" + visitId;
}

@ -161,7 +161,7 @@ public class JSchUtils {
// 1.连接到指定的服务器
connect("zingicu", "zingicu123", "10.6.0.241", 22);
// 2.下载文件
download("02019-08-29.png", "D:\\pdfs");
download("fallSheets/徐晓峰-988874-2020-02-25 - 2020-03-21.pdf", "D:\\pdfs");
// 4.关闭连接
close();
} catch (Exception e) {

@ -1,26 +1,25 @@
spring:
datasource:
url: jdbc:mysql://localhost:3306/test
# url: jdbc:mysql://10.6.1.127:3306/test
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
jpa:
database: mysql
show-sql: false
hibernate:
ddl-auto: update
# url: jdbc:sqlserver://10.6.1.127:1433;DatabaseName=DB_PrivilegeManagement_GYFY
# #url: jdbc:sqlserver://120.27.212.36:1433;DatabaseName=emr_record
# username: sa
# password: docus@702
# driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
# url: jdbc:mysql://localhost:3306/test
# # url: jdbc:mysql://10.6.1.127:3306/test
# username: root
# password: 123456
# driver-class-name: com.mysql.jdbc.Driver
# jpa:
# database: sql_server
# database: mysql
# show-sql: false
# hibernate:
# dialect: org.hibernate.dialect.SQLServer2008Dialect
# ddl-auto: update
url: jdbc:sqlserver://10.6.1.127:1433;DatabaseName=DB_PrivilegeManagement_GYFY
# url: jdbc:sqlserver://120.27.212.36:1433;DatabaseName=emr_record
username: sa
password: docus@702
driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
jpa:
database: sql_server
show-sql: false
hibernate:
dialect: org.hibernate.dialect.SQLServer2008Dialect
thymeleaf:
prefix: classpath:/templates/
@ -52,9 +51,6 @@ file:
transferRecordPath: D:\\1\transferRecord.properties
admissionRecordPath: D:\\1\admissionRecord.properties
pdfPath: D:/project_js
logging:
path: D:/logs/
file: AcquisitionServer.log
signContent: <REQUEST>
<patient_statu>0</patient_statu>

Loading…
Cancel
Save