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.

520 lines
23 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.demo.service;
import com.ann.demo.entity.filing.ArchiveDetail;
import com.ann.demo.entity.filing.dto.MessageDto;
import com.ann.demo.entity.interfaceEntity.ArchiveMaster;
import com.ann.demo.entity.interfaceEntity.CommonTable;
import com.ann.demo.entity.interfaceEntity.CommonTable1;
import com.ann.demo.entity.normalEntity.OutPara;
import com.ann.demo.primaryRepository.ScanningFileRepository;
import com.ann.demo.primaryEntity.ScanningFile;
import com.ann.demo.repository.ArchiveDetailRepository;
import com.ann.demo.repository.CommonTable1Repository;
import com.ann.demo.repository.CommonTableRepository;
import com.ann.demo.utils.*;
import com.itextpdf.text.DocumentException;
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.Component;
import org.springframework.util.CollectionUtils;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.time.LocalDateTime;
import java.util.*;
import java.util.concurrent.LinkedBlockingQueue;
/**
* 解析逻辑
*
* @Author: LeiJiaXin
* @Date: 2019/8/20 16:29
*/
@Component
public class AnalysisService {
final Logger logger = LoggerFactory.getLogger(AnalysisService.class);
public static volatile LinkedBlockingQueue<ScanningFile> queue = new LinkedBlockingQueue<>();// 消息队列
@Autowired
private ScanningFileRepository scanningFileRepository;
@Autowired
private ArchiveDetailService archiveDetailService;
@Autowired
private CommonTableRepository commonTableRepository;
@Autowired
private CommonTable1Repository commonTable1Repository;
@Autowired
private ArchiveMasterService archiveMasterService;
@Autowired
private ArchiveDetailRepository archiveDetailRepository;
public void handleScanningFile(List<ScanningFile> scanningFileList) {
if(!CollectionUtils.isEmpty(scanningFileList)) {
//处理ScanningFile\
for (int i = 0;i < scanningFileList.size();i++) {
queue.add(scanningFileList.get(i));
}
}
}
/*
public void handleScanningFile(List<ScanningFile> scanningFileList) {
LocalDateTime beginTime = LocalDateTime.now();
logger.error("开始时间:"+beginTime);
//处理ScanningFile\
for (ScanningFile scanningFile: scanningFileList) {
String remark = null;
String status = "1";
try{
remark = handlePdfFile(scanningFile);
}catch (Exception e){
remark = e.getMessage();
logger.error("处理扫描文件出错:{}" ,e.getMessage());
}
if(remark != null){
status = "2";
}else{
remark = LocalDateTime.now().toString();
}
scanningFile.setRemark(remark);
scanningFile.setStatus(status);
scanningFileRepository.save(scanningFile);
LocalDateTime handleTime = LocalDateTime.now();
logger.error("每一条处理时间:"+handleTime);
}
LocalDateTime endTime = LocalDateTime.now();
logger.error("结束时间:"+endTime);
}
*/
public void startThread(int i){
try {
ScanningFile scanningFile = queue.take();
handlePdfFile(scanningFile,i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private String savaHomePageData(ScanningFile scanningFile){
String masterId = null;
// 判断病案首页数据是否存在
try {
masterId = scanningFile.getApplyId() != null ? scanningFile.getApplyId() : UUID.randomUUID().toString();;
CommonTable commonTable = commonTableRepository.findByInpNoAndVisitId(scanningFile.getInpNo(), scanningFile.getVisitId());
if(null != commonTable) {
logger.error("commomtable.patientId=" + commonTable.getPatientId());
}
if(commonTable == null){
commonTable = new CommonTable(masterId,scanningFile.getPatientId(),scanningFile.getAge(),scanningFile.getSex(),scanningFile.getVisitId(),scanningFile.getName(),
scanningFile.getAdmissDate(),scanningFile.getDisDate(),scanningFile.getDisDept(),scanningFile.getAttending(),scanningFile.getInpNo(),"扫描系统");
// //保存公共表
commonTableRepository.save(commonTable);
//保存公共表1
commonTable1Repository.save( new CommonTable1(commonTable.getMasterId(),scanningFile.getBirthday(),scanningFile.getIdCard(),scanningFile.getAdmissDept(),scanningFile.getAdmissDoctor()));
}else{
masterId = commonTable.getMasterId();
}
} catch (Exception e) {
logger.error("保存首页数据出错了,FBIHID="+scanningFile.getInpNo() + "&FBINCU="+scanningFile.getVisitId());
e.printStackTrace();
throw new RuntimeException("保存首页数据出错了,FBIHID="+scanningFile.getInpNo() + "&FBINCU="+scanningFile.getVisitId());
}
logger.error("masterId="+masterId);
return masterId;
}
private void handlePdfFile(ScanningFile scanningFile,int i){
//保存首页数据
long start = System.currentTimeMillis();
long start1 = System.currentTimeMillis();
String masterId = savaHomePageData(scanningFile);
long end = System.currentTimeMillis();
logger.error("保存首页数据:FBIHID=" + scanningFile.getInpNo() + "&FBINCU="+scanningFile.getVisitId()+"所用时间:"+(end-start)/1000.00+"s");
//根据住院号和住院次数查询文件集合
//保存图片并更新scanningFile表数据
savePdfDetail(scanningFile,masterId);
long end1 = System.currentTimeMillis();
logger.error("完成同步:FBIHID=" + scanningFile.getInpNo() + "&FBINCU="+scanningFile.getVisitId()+"所用时间:"+(end1-start1)/1000.00+"s");
logger.error("剩余待处理记录数:" + i);
}
public static void main(String[] args) throws Exception{
for(int i = 0;i<100000;i++) {
long start = System.currentTimeMillis();
Object[] objects = WebServiceUtils.connect("123");
long end = System.currentTimeMillis();
System.out.println("("+(100000-i)+")调用webService接口所用时间:" + (end - start) / 1000.00 + "s");
}
}
private void savePdfDetail(ScanningFile scanningFile,String masterId) {
if(StringUtils.isNotBlank(masterId)) {
//根据住院号、住院次数查询文件明细
List<ScanningFile> scanningFiles = scanningFileRepository.findScanningFileDetailList(scanningFile.getInpNo(), scanningFile.getVisitId());
//处理ScanningFile
String remark = "";
//定义分组的文件明细map
Map<String, ScanningFile> fileMap = new HashMap<>();
//定义文件明细id集合
List<Long> ids = new ArrayList<>();
for (ScanningFile obj : scanningFiles) {
ids.add(obj.getId());
if (StringUtils.isBlank(remark)) {
//获取文件名称
String realFileName = obj.getRealFileName();
List<byte[]> byteList = new ArrayList<>();
try {
long start = System.currentTimeMillis();
Object[] objects = WebServiceUtils.connect(obj.getPath() + "\\" + obj.getFileName());
logger.error("objects:" + objects[0] + "&obj:" + obj.getId());
long end = System.currentTimeMillis();
logger.error("调用webService接口返回图片流:FBIHID=" + scanningFile.getInpNo() + "&FBINCU=" + scanningFile.getVisitId() + "所用时间:" + (end - start) / 1000.00 + "s");
if (fileMap.containsKey(realFileName)) {
//获取缓存scanningFile对象
obj = fileMap.get(realFileName);
//获取缓存字节流
byteList = obj.getByteList();
}
byteList.add((byte[]) objects[0]);
obj.setByteList(byteList);
fileMap.put(realFileName, obj);
} catch (Exception e) {
remark = e.getMessage();
e.printStackTrace();
logger.error("调用webService出错了:FBIHID=" + scanningFile.getInpNo() + "&FBINCU=" + scanningFile.getVisitId());
throw new RuntimeException("调用webService出错了:FBIHID=" + scanningFile.getInpNo() + "&FBINCU=" + scanningFile.getVisitId());
}
}
}
logger.error("fileMap:" + fileMap.toString());
//定义批量添加detail集合
List<ArchiveDetail> insertBatchList = new ArrayList<>();
if (!CollectionUtils.isEmpty(fileMap)) {
try {
long start = System.currentTimeMillis();
try {
for (Map.Entry<String, ScanningFile> map : fileMap.entrySet()) {
//获取真实文件名
String fileName = map.getKey();
//获取缓存对象
ScanningFile obj = map.getValue();
String number = getNumber(obj.getNumber());
String applyId = masterId + "~" + (number != null ? number : "");
File pdfFile = FileUtils.createFile("pdfs", obj.getInpNo(), obj.getVisitId(), applyId);
FileUtils.generatePdfFile(obj.getByteList(), pdfFile.getAbsolutePath());
//合成pdf
String pdfPath = pdfFile.getAbsolutePath();
//获取assortId
String assortId = getAssortId(obj.getAssortId());
ArchiveDetail archiveDetail = new ArchiveDetail(masterId, new Date(), assortId, "扫描系统", applyId, pdfPath, Integer.valueOf(number), fileName);
insertBatchList.add(archiveDetail);
}
long end = System.currentTimeMillis();
logger.error("图片合成pdf:FBIHID=" + scanningFile.getInpNo() + "&FBINCU=" + scanningFile.getVisitId() + "所用时间:" + (end - start) / 1000.00 + "s");
if (!CollectionUtils.isEmpty(insertBatchList)) {
//批量添加进detail表
archiveDetailRepository.saveAll(insertBatchList);
}
} catch (Exception e) {
e.printStackTrace();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
e.printStackTrace(new PrintStream(baos));
String exception = baos.toString();
logger.error("合成pdf出错了" + exception);
}
} catch (Exception e) {
e.printStackTrace();
logger.error("合成pdf或插入detail表出错了:FBIHID=" + scanningFile.getInpNo() + "&FBINCU=" + scanningFile.getVisitId());
throw new RuntimeException("合成pdf或插入detail表出错了:FBIHID=" + scanningFile.getInpNo() + "&FBINCU=" + scanningFile.getVisitId());
}
}
if (!CollectionUtils.isEmpty(ids)) {
//批量更新scanningFile表
String status = "1";
if (StringUtils.isNotBlank(remark)) {
status = "2";
} else {
remark = LocalDateTime.now().toString();
}
//更新scanningFile表
scanningFileRepository.updateBatch(remark, status, ids);
}
}
}
/**
* 获取applyId
* @param number
* @return
*/
private String getNumber(String number){
// Integer number = 1;
//37006704-10-47-1.CDP 截成 10-47-1.CDP
number = number.substring(number.indexOf("-")+1,number.length());
//10-47-1.CDP 截成 47-1.CDP
number = number.substring(number.indexOf("-")+1,number.length());
//47-1.CDP 截成47
number = number.substring(0,number.indexOf("-"));
return number;
}
/**
* 获取assortId
* @param thirdAssortId 第三方分段标识
* @return
*/
private String getAssortId(String thirdAssortId) {
String assortId = "1";
switch (thirdAssortId){
case "1": // 病案首页
assortId = "3";
break;
case "2": //出院(或死亡)记录(小结)
assortId = "113";
break;
case "3": //入院记录
assortId = "9";
break;
case "4": //病程记录
assortId = "11";
break;
case "5": //死亡病例讨论
assortId = "14";
break;
case "6": //特殊病情及治疗记录
assortId = "20";
break;
case "7": //会诊记录单
assortId = "15";
break;
case "8": //病重(病危)护理记录
assortId = "121";
break;
case "9": //知情同意书
assortId = "20";
break;
case "10": //辅助检查报告单
assortId = "110";
break;
case "11": //医嘱单
assortId = "25";
break;
case "12": //体温单
assortId = "5";
break;
case "13": //护理记录
assortId = "2";
break;
case "14": //死亡患者门诊病历
assortId = "18";
break;
case "15": //其他资料
assortId = "18";
break;
}
return assortId;
}
/*
public String handlePdfFile(ScanningFile scanningFile) throws Exception{
//处理ScanningFile
// 判断病案首页数据是否存在
LocalDateTime now1 = LocalDateTime.now();//删掉
CommonTable commonTable = commonTableRepository.findByInpNoAndVisitId(scanningFile.getInpNo(), scanningFile.getVisitId());
LocalDateTime end1 = LocalDateTime.now();//删掉
logger.error("判断病案首页数据是否存在耗时:"+Duration.between(now1,end1).toMillis());//删掉
if(commonTable == null){
String masterId = scanningFile.getApplyId() != null ? scanningFile.getApplyId() : UUID.randomUUID().toString();
commonTable = new CommonTable(masterId,scanningFile.getPatientId(),scanningFile.getAge(),scanningFile.getSex(),scanningFile.getVisitId(),scanningFile.getName(),
scanningFile.getAdmissDate(),scanningFile.getDisDate(),scanningFile.getDisDept(),scanningFile.getAttending(),scanningFile.getInpNo(),"扫描系统");
// //保存公共表
LocalDateTime now2 = LocalDateTime.now();//删掉
commonTableRepository.save(commonTable);
LocalDateTime end2 = LocalDateTime.now();//删掉
logger.error("保存公共表耗时:"+Duration.between(now2,end2).toMillis());//删掉
//保存公共表1
LocalDateTime now3 = LocalDateTime.now();//删掉
commonTable1Repository.save( new CommonTable1(commonTable.getMasterId(),scanningFile.getBirthday(),scanningFile.getIdCard(),scanningFile.getAdmissDept(),scanningFile.getAdmissDoctor()));
LocalDateTime end3 = LocalDateTime.now();//删掉
logger.error("保存公共表1耗时:"+Duration.between(now3,end3).toMillis());//删掉
}
LocalDateTime now4 = LocalDateTime.now();//删掉
Object[] objects = WebServiceUtils.connect(scanningFile.getPath() + "\\" + scanningFile.getFileName());
LocalDateTime end4 = LocalDateTime.now();//删掉
logger.error("WebServiceUtils.connect耗时:"+Duration.between(now4,end4).toMillis());//删掉
//Object[] objects = WebServiceUtil.urlConnectionUtil("http://10.6.0.224/cdms/cdmsservice.asmx?wsdl",scanningFile.getPath() + "\\" + scanningFile.getFileName());
//使用HttpURLConnection方式连接
// String s = WebServiceUtil.urlConnectionUtil("http://10.6.0.224/cdms/cdmsservice.asmx?wsdl", scanningFile.getPath() + "\\" + scanningFile.getFileName());
*/
/*if(!"".equals(s)){
int w=9;
}
//s转Object[]
String[] strArr = s.split(",");//注意分隔符是需要转译
Object[] objects = new Object[strArr.length];
for(int i=0;i<strArr.length;i++) {
objects[i] = strArr[i];
}*//*
if (objects == null) {
return "下载图片出错了。。。";
}
String number = scanningFile.getNumber();
// Integer number = 1;
//37006704-10-47-1.CDP 截成 10-47-1.CDP
number = number.substring(number.indexOf("-")+1,number.length());
//10-47-1.CDP 截成 47-1.CDP
number = number.substring(number.indexOf("-")+1,number.length());
//47-1.CDP 截成47
number = number.substring(0,number.indexOf("-"));
// byte[] bytes = (byte[]) objects[0];
String applyId = commonTable.getMasterId() + "~" + (number != null ? number : "");
// 给临时图片填充内容
LocalDateTime now5 = LocalDateTime.now();//删掉
File imageTempFile = FileUtils.createFile("images", scanningFile.getInpNo(), scanningFile.getVisitId(), applyId);
LocalDateTime end5 = LocalDateTime.now();//删掉
logger.error("FileUtils.createFile生成images耗时:"+Duration.between(now5,end5).toMillis());//删掉
LocalDateTime now6 = LocalDateTime.now();//删掉
File imageFile = FileUtils.getImageFileByByteArray(objects, imageTempFile);
LocalDateTime end6 = LocalDateTime.now();//删掉
logger.error("FileUtils.getImageFileByByteArray耗时:"+Duration.between(now6,end6).toMillis());//删掉
if (imageFile == null) {
return "填充临时图片出错了。。。";
}
LocalDateTime now7 = LocalDateTime.now();//删掉
File pdfFile = FileUtils.createFile("pdfs", scanningFile.getInpNo(), scanningFile.getVisitId(), applyId);
LocalDateTime end7 = LocalDateTime.now();//删掉
logger.error("FileUtils.createFile生成pdfs耗时:"+Duration.between(now7,end7).toMillis());//删掉
LocalDateTime now8 = LocalDateTime.now();//删掉
String pdfPath = PdfUtils.imagesToPdf(imageFile, pdfFile);
LocalDateTime end8 = LocalDateTime.now();//删掉
logger.error("图片转pdf耗时:"+Duration.between(now8,end8).toMillis());//删掉
//存入pdf地址
if (pdfPath == null) {
return "image转成pdf出错了。。。";
}
// // 如果存在 那就更新
// ArchiveDetail archiveDetail = archiveDetailService.isExit(commonTable.getMasterId(), "1", "扫描系统", applyId);
// if (archiveDetail == null) {
// archiveDetail = new ArchiveDetail(commonTable.getMasterId(), new Date(), "1", "扫描系统", applyId, pdfPath,Integer.valueOf(number));
// archiveDetailService.save(archiveDetail);
// }
String assortId = "1";
switch (scanningFile.getAssortId()){
case "1": // 病案首页
assortId = "3";
break;
case "2": //出院(或死亡)记录(小结)
assortId = "113";
break;
case "3": //入院记录
assortId = "9";
break;
case "4": //病程记录
assortId = "11";
break;
case "5": //死亡病例讨论
assortId = "14";
break;
case "6": //特殊病情及治疗记录
assortId = "20";
break;
case "7": //会诊记录单
assortId = "15";
break;
case "8": //病重(病危)护理记录
assortId = "121";
break;
case "9": //知情同意书
assortId = "20";
break;
case "10": //辅助检查报告单
assortId = "110";
break;
case "11": //医嘱单
assortId = "25";
break;
case "12": //体温单
assortId = "5";
break;
case "13": //护理记录
assortId = "2";
break;
case "14": //死亡患者门诊病历
assortId = "18";
break;
case "15": //其他资料
assortId = "18";
break;
}
LocalDateTime now9 = LocalDateTime.now();//删掉
archiveDetailService.save(new ArchiveDetail(commonTable.getMasterId(), new Date(), assortId, "扫描系统", applyId, pdfPath,Integer.valueOf(number)));
LocalDateTime end9 = LocalDateTime.now();//删掉
logger.error("保存耗时:"+Duration.between(now9,end9).toMillis());//删掉
return null;
}
*/
public String handlePdfFile1(MessageDto messageDto) throws Exception{
String pdfPath = "";
ArchiveMaster archiveMaster = archiveMasterService.findByInpNoAndVisitIdAndIsValid(messageDto.getInpNo(),messageDto.getVisitId());
if(archiveMaster == null){
return "没有患者信息";
}
File imageFile = FileUtils.createFile("images", messageDto.getInpNo(), messageDto.getVisitId(),"");
if(DownloadUtils.downloadImageFile("","", imageFile) == null){
return "下载图像出错";
}
File pdfFile = FileUtils.createFile("pdfs", messageDto.getInpNo(), messageDto.getVisitId(), messageDto.getApplyId());
//存入pdf地址
pdfPath = PdfUtils.imagesToPdf(imageFile, pdfFile);
if (pdfPath == null) {
return "image转成pdf出错了。。。";
}
ArchiveDetail archiveDetail = new ArchiveDetail(archiveMaster.getId(), new Date(), messageDto.getType(), "扫描系统", messageDto.getApplyId(), pdfPath,Integer.valueOf(messageDto.getPageNum()));
archiveDetail.setTitle(messageDto.getApplyId());
archiveDetailService.save(archiveDetail);
if(archiveDetail.getId() != null){
return null;
}
return "出错了";
}
public static String getReturnResult(boolean resultCode,String remark) throws Exception{
OutPara outPara = new OutPara();
if (resultCode) {
outPara.setRESULT_CODE(true);
outPara.setRESULT_CONTENT("成功");
} else {
outPara.setRESULT_CODE(false);
outPara.setRESULT_CONTENT(remark);
}
return XMLUtils.generateXmlStr(outPara);
}
}