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 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 scanningFileList) { if(!CollectionUtils.isEmpty(scanningFileList)) { //处理ScanningFile\ for (int i = 0;i < scanningFileList.size();i++) { queue.add(scanningFileList.get(i)); } } } /* public void handleScanningFile(List 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 scanningFiles = scanningFileRepository.findScanningFileDetailList(scanningFile.getInpNo(), scanningFile.getVisitId()); //处理ScanningFile String remark = ""; //定义分组的文件明细map Map fileMap = new HashMap<>(); //定义文件明细id集合 List ids = new ArrayList<>(); for (ScanningFile obj : scanningFiles) { ids.add(obj.getId()); if (StringUtils.isBlank(remark)) { //获取文件名称 String realFileName = obj.getRealFileName(); List 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 insertBatchList = new ArrayList<>(); if (!CollectionUtils.isEmpty(fileMap)) { try { long start = System.currentTimeMillis(); try { for (Map.Entry 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