Index: ssts-maintain/src/main/java/com/forgon/disinfectsystem/maintain/device/service/DeviceInterfaceDataProcessImpl.java =================================================================== diff -u -r40583 -r40891 --- ssts-maintain/src/main/java/com/forgon/disinfectsystem/maintain/device/service/DeviceInterfaceDataProcessImpl.java (.../DeviceInterfaceDataProcessImpl.java) (revision 40583) +++ ssts-maintain/src/main/java/com/forgon/disinfectsystem/maintain/device/service/DeviceInterfaceDataProcessImpl.java (.../DeviceInterfaceDataProcessImpl.java) (revision 40891) @@ -190,7 +190,7 @@ Object xinHua_ChangLongBean = SpringBeanManger.getBean("xinHua_ChangLongDataManager"); dm = (DeviceDataManager) xinHua_ChangLongBean; dm.readAndSaveRecord(devInterface,rs.getMachineNumber(),DeviceInterface.XINHUA,null,enableDetailedDeviceInformation,loginUserData); - }else if(DeviceInterface.XINHUATYPE_S7_300.equals(devInterface.getDeviceModel()) || DeviceInterface.XINHUA_PC_L.equals(devInterface.getDeviceModel()) + }else if(DeviceInterface.XINHUA_PDF_SUPER6000.equals(devInterface.getDeviceModel()) || DeviceInterface.XINHUATYPE_S7_300.equals(devInterface.getDeviceModel()) || DeviceInterface.XINHUA_PC_L.equals(devInterface.getDeviceModel()) || DeviceInterface.XINHUA_SUPER6000.equals(devInterface.getDeviceModel()) || DeviceInterface.XINHUA_Repaid_A_520.equals(devInterface.getDeviceModel()) || DeviceInterface.XINHUA_WAICHE.equals(devInterface.getDeviceModel())){ Index: ssts-wash/src/main/java/com/forgon/disinfectsystem/washanddisinfectmanager/washanddisinfectrecord/action/WashDataLineChartAction.java =================================================================== diff -u -r40583 -r40891 --- ssts-wash/src/main/java/com/forgon/disinfectsystem/washanddisinfectmanager/washanddisinfectrecord/action/WashDataLineChartAction.java (.../WashDataLineChartAction.java) (revision 40583) +++ ssts-wash/src/main/java/com/forgon/disinfectsystem/washanddisinfectmanager/washanddisinfectrecord/action/WashDataLineChartAction.java (.../WashDataLineChartAction.java) (revision 40891) @@ -278,7 +278,6 @@ * 根据清洗记录获取清洗参数 */ public void getRinserWashDataFile(){ - ResultSet rs = null; String washAndDisinfectRecordId = StrutsParamUtils.getPraramValue("washAndDisinfectRecordId", null); Long washDataRecordId = StrutsParamUtils.getPraramLongValue("washDataRecordId", 0L); JSONObject result = washAndDisinfectRecordManager.getRinserWashDataFile(Long.parseLong(washAndDisinfectRecordId), washDataRecordId); @@ -291,4 +290,22 @@ logger.error(e); } } + /** + * 获取新华pdf + */ + public void getXinHuaDataPDFFile(){ + Long washAndDisinfectRecordId = StrutsParamUtils.getPraramLongValue("recordId", 0L); + Long xinHuaDataPDFId = StrutsParamUtils.getPraramLongValue("xinHuaDataPDFId", 0L); + String type = StrutsParamUtils.getPraramValue("type", "rinser"); + JSONObject result = washAndDisinfectRecordManager.getXinHuaDataPDF(washAndDisinfectRecordId,type, xinHuaDataPDFId); + HttpServletResponse httpServletResponse = StrutsParamUtils + .getResponse(); + httpServletResponse.setCharacterEncoding("UTF-8"); + try { + httpServletResponse.getWriter().print(result.toString()); + } catch (IOException e) { + logger.error(e); + } + } + } Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/washanddisinfectmanager/washData/XinHuaDataPDF.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/washanddisinfectmanager/washData/XinHuaDataPDF.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/washanddisinfectmanager/washData/XinHuaDataPDF.java (revision 40891) @@ -0,0 +1,111 @@ +package com.forgon.disinfectsystem.entity.washanddisinfectmanager.washData; + +import java.util.Date; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; + +/** + * 新华pdf参数 + * pdf文件记录表 FSEYEQ-26 + */ +@Entity +@DynamicInsert(false) +@DynamicUpdate(true) +@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) +public class XinHuaDataPDF { + + /** + * 清洗机清洗参数id + */ + private Long id; + /** + * 设备接口ID + */ + private Long deviceInterfaceID; + /** + * 机器号 + */ + private String machineNumber; + /** + * 启动时间 + */ + private Date startDate; + /** + * 运行次数 + */ + private Long cycleCounter; + /** + * 文件名 + */ + private String fileName; + /** + * 清洗或者灭菌记录id + */ + private Long recordId; + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeviceInterfaceID() { + return deviceInterfaceID; + } + + public void setDeviceInterfaceID(Long deviceInterfaceID) { + this.deviceInterfaceID = deviceInterfaceID; + } + + public String getMachineNumber() { + return machineNumber; + } + + public void setMachineNumber(String machineNumber) { + this.machineNumber = machineNumber; + } + + public Date getStartDate() { + return startDate; + } + + public void setStartDate(Date startDate) { + this.startDate = startDate; + } + + public Long getCycleCounter() { + return cycleCounter; + } + + public void setCycleCounter(Long cycleCounter) { + this.cycleCounter = cycleCounter; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public Long getRecordId() { + return recordId; + } + + public void setRecordId(Long recordId) { + this.recordId = recordId; + } +} Index: ssts-wash/src/main/java/com/forgon/disinfectsystem/washanddisinfectmanager/washanddisinfectrecord/service/WashAndDisinfectRecordManagerImpl.java =================================================================== diff -u -r40860 -r40891 --- ssts-wash/src/main/java/com/forgon/disinfectsystem/washanddisinfectmanager/washanddisinfectrecord/service/WashAndDisinfectRecordManagerImpl.java (.../WashAndDisinfectRecordManagerImpl.java) (revision 40860) +++ ssts-wash/src/main/java/com/forgon/disinfectsystem/washanddisinfectmanager/washanddisinfectrecord/service/WashAndDisinfectRecordManagerImpl.java (.../WashAndDisinfectRecordManagerImpl.java) (revision 40891) @@ -83,6 +83,7 @@ import com.forgon.disinfectsystem.entity.basedatamanager.reportoption.GoodsOption; import com.forgon.disinfectsystem.entity.basedatamanager.rinser.Rinser; import com.forgon.disinfectsystem.entity.basedatamanager.rinser.RinserDepartment; +import com.forgon.disinfectsystem.entity.basedatamanager.sterilizer.Sterilizer; import com.forgon.disinfectsystem.entity.basedatamanager.supplyroomconfig.SupplyRoomConfig; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.ClassifyBasket_TousseInstance; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; @@ -100,6 +101,7 @@ import com.forgon.disinfectsystem.entity.qualitymonitoringmanager.qualitymonitoring.QualityMonitoringInstance; import com.forgon.disinfectsystem.entity.recyclingrecord.RecyclingItem; import com.forgon.disinfectsystem.entity.recyclingrecord.RecyclingRecord; +import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizationrecord.SterilizationRecord; import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.GtWD500Details; import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.GtWD500Record; import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.JKNQX1500Record; @@ -7150,6 +7152,103 @@ return washAndDisinfectRecordId; } @Override + public JSONObject getXinHuaDataPDF(Long recordId, String type, + Long xinHuaDataPDFId) { + ResultSet rs = null; + JSONObject result = new JSONObject(); + String base64PdfContent = null; + boolean success = false; + try { + String fileName = null; + XinHuaDataPDF pdf = null; + if (DatabaseUtil.isPoIdValid(xinHuaDataPDFId)) { + pdf = (XinHuaDataPDF) objectDao.getBySql(XinHuaDataPDF.class.getSimpleName() + , " where po.id=" + xinHuaDataPDFId); + if (pdf == null) { + throw new RuntimeException("找不到" + xinHuaDataPDFId + "对应的数据"); + } + } else { + if (!DatabaseUtil.isPoIdValid(recordId)) { + throw new RuntimeException("recordId参数异常"); + } + pdf = (XinHuaDataPDF) objectDao.getBySql(XinHuaDataPDF.class.getSimpleName() + , " where po.recordId=" + recordId); + if(pdf == null){ + String machineNo = null; + DeviceInterface deviceInterface = null; + Date startTime = null; + if("rinser".equals(type)){ + SterilizationRecord sterilizationRecord = (SterilizationRecord)objectDao.getById(SterilizationRecord.class.getSimpleName(), recordId); + if (sterilizationRecord == null) { + throw new RuntimeException("recordId参数异常"); + } + startTime = sterilizationRecord.getStartDate(); + //清洗机定义 + Sterilizer sterilizer = sterilizationRecord.getSterilizer(); + if (sterilizer == null) { + throw new RuntimeException("数据异常,灭菌记录关联的灭菌炉不存在!"); + } + machineNo = sterilizer.getMachineNumber(); + deviceInterface = sterilizer.getDeviceInterface(); + }else{ + WashAndDisinfectRecord wdr = get(recordId); + if (wdr == null) { + throw new RuntimeException("recordId参数异常"); + } + startTime = wdr.getStartDate(); + //清洗机定义 + Rinser rinser = (Rinser) objectDao.getByProperty(Rinser.class.getSimpleName(), "id", wdr.getRinserId()); + if (rinser == null) { + throw new RuntimeException("数据异常,清洗记录关联的清洗机不存在!"); + } + machineNo = rinser.getMachineNumber(); + deviceInterface = rinser.getDeviceInterface(); + } + if (deviceInterface == null) { + throw new RuntimeException("数据异常,设备关联的设备接口不存在!"); + } + Date beginStartTime = new Date(startTime.getTime() - 10 * 60 * 1000); + Date endStartTime = new Date(startTime.getTime() + 10 * 60 * 1000); + String beginStartTimeStr = ForgonDateUtils.safelyFormatDate(beginStartTime, ForgonDateUtils.SIMPLEDATEFORMAT_YYYYMMDDHHMMSS, ""); + String endStartTimeStr = ForgonDateUtils.safelyFormatDate(endStartTime, ForgonDateUtils.SIMPLEDATEFORMAT_YYYYMMDDHHMMSS, ""); + + StringBuffer sql = new StringBuffer(); + sql.append("select po.fileName from ") + .append(XinHuaDataPDF.class.getSimpleName()) + .append(" po where po.deviceInterfaceID = ") + .append(deviceInterface.getId()) + .append(" and po.machineNumber = '") + .append(machineNo) + .append("' and ") + .append(dateQueryAdapter.dateAreaSql("po.startDate", beginStartTimeStr, endStartTimeStr)); + rs = objectDao.executeSql(sql.toString()); + while (rs.next()) { + fileName = rs.getString(1); + break; + } + } + + } + if (pdf != null) { + fileName = pdf.getFileName(); + } + if (StringUtils.isNotBlank(fileName)) { + String fileUrl = PathUtils.getWebAppRootPath() + "/UserUpLoadFiles/XINHUAPDF/"; + File file = new File(fileUrl + fileName); + byte[] pdfContent = Files.readAllBytes(file.toPath()); + base64PdfContent = Base64.getEncoder().encodeToString(pdfContent); + success = true; + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + DatabaseUtil.closeResultSetAndStatement(rs); + } + result.put("success", success); + result.put("data", base64PdfContent); + return result; + } + @Override public JSONObject getRinserWashDataFile(Long washAndDisinfectRecordId, Long belimedV2WashDataPDFId) { ResultSet rs = null; JSONObject result = new JSONObject(); Index: ssts-maintain/src/main/java/com/forgon/disinfectsystem/maintain/device/service/XinHuaDataManagerImpl.java =================================================================== diff -u -r40611 -r40891 --- ssts-maintain/src/main/java/com/forgon/disinfectsystem/maintain/device/service/XinHuaDataManagerImpl.java (.../XinHuaDataManagerImpl.java) (revision 40611) +++ ssts-maintain/src/main/java/com/forgon/disinfectsystem/maintain/device/service/XinHuaDataManagerImpl.java (.../XinHuaDataManagerImpl.java) (revision 40891) @@ -8,6 +8,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.nio.file.Files; import java.text.DateFormat; import java.text.DecimalFormat; import java.text.ParseException; @@ -20,17 +21,22 @@ import java.util.List; import java.util.Set; import java.util.UUID; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import jcifs.smb.SmbFile; import net.sf.json.JSONObject; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.io.output.ByteArrayOutputStream; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; import org.apache.commons.net.ftp.FTPFileFilter; import org.apache.log4j.Logger; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.text.PDFTextStripper; import org.hibernate.Query; import org.hibernate.Session; import org.springframework.integration.smb.session.SmbSession; @@ -50,7 +56,9 @@ import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.Ps100gxpSterilizerRecord; import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.CommonStageDetails; import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.CommonSterilizerRecord; +import com.forgon.disinfectsystem.entity.washanddisinfectmanager.washData.BelimedV2WashDataPDF; import com.forgon.disinfectsystem.entity.washanddisinfectmanager.washData.WashData; +import com.forgon.disinfectsystem.entity.washanddisinfectmanager.washData.XinHuaDataPDF; import com.forgon.disinfectsystem.entity.washanddisinfectmanager.washanddisinfectrecord.WashAndDisinfectRecord; import com.forgon.disinfectsystem.filemanager.CommonFileManager; import com.forgon.disinfectsystem.filemanager.FtpFileManager; @@ -68,6 +76,7 @@ import com.forgon.tools.hibernate.ObjectDao; import com.forgon.tools.string.StringTools; import com.forgon.tools.util.ForgonDateUtils; +import com.forgon.tools.util.PathUtils; /** * 新华灭菌炉、清洗机数据处理 * @author shuyongfu @@ -130,6 +139,8 @@ } if(DeviceInterface.XINHUATYPE_PS_100GXP.equals(devInterface.getDeviceModel())){ readAndSaveRecordXinhuatype_ps_100gxp(devInterface, machineNo, brand, isAutoCompleteSterilization, enableDetailedDeviceInformation, loginUserData); + } else if(DeviceInterface.XINHUA_PDF_SUPER6000.equals(devInterface.getDeviceModel()) || DeviceInterface.XINHUA_PDF_CLEAN_H101513.equals(devInterface.getDeviceModel())){ + readAndSaveRecordForPDFData(devInterface, machineNo, brand, isAutoCompleteSterilization, enableDetailedDeviceInformation, loginUserData); }else{ if(DeviceInterface.INTERFACETYPE_FTP.equals(devInterface.getInterfaceType())){//ftp方式 readAndSaveRecordByFtp(devInterface, machineNo, brand, isAutoCompleteSterilization, enableDetailedDeviceInformation, loginUserData); @@ -139,7 +150,363 @@ } } + private void readAndSaveRecordForPDFData(DeviceInterface deviceInterface, + String machineNo, String brand, String isAutoCompleteSterilization, + boolean enableDetailedDeviceInformation, LoginUserData loginUserData) { + if (deviceInterface == null || StringUtils.isBlank(machineNo)) { + return; + } + SmbSession session = null; + String ip = deviceInterface.getIP(); + String directory = deviceInterface.getFolderPath(); + if(!directory.startsWith("/")){ + directory = "/" + directory; + } + String userName = deviceInterface.getDecryptUserName(); + String pwd = deviceInterface.getDecryptPassword(); + String remoteType = deviceInterface.getInterfaceType(); + FTPClient ftp = null; + try { + String rootPath = null; + FTPFile[] files = null; + String[] shareList = null; + Integer length = 0; + if(DeviceInterface.INTERFACETYPE_FTP.equals(remoteType)){ + ftp = ftpFileManager.getFTPClient(ip, deviceInterface.getPort(), userName, pwd, enableDetailedDeviceInformation, loginUserData,"GBK"); + ftp.setFileType(FTP.BINARY_FILE_TYPE); + rootPath = ftpFileManager.getCurrentPath(ftp) + directory;//根目录 + ftpFileManager.changeWorkingDirectory(ftp, rootPath); + FTPFileFilter filterXML = new FTPFileFilter() { + @Override + public boolean accept(FTPFile file) { + if(file.isDirectory()){ + return false; + }else if(file.getName().endsWith(".pdf") && (DeviceInterface.XINHUA_PDF_CLEAN_H101513.equals(deviceInterface.getDeviceModel()) && file.getName().contains("ST") || DeviceInterface.XINHUA_PDF_SUPER6000.equals(deviceInterface.getDeviceModel()) && file.getName().contains("WS"))){ + return true; + } + logger.debug("只处理**ST*.pdf文件或者**WS*.pdf文件"); + return false; + } + }; + files = ftpFileManager.getListFiles(ftp, "", filterXML, enableDetailedDeviceInformation, loginUserData); + length = files.length; + }else{ + rootPath = "//"+ ip + directory; + String smbPath = String.format("smb://%s:%s@%s/%s/", userName, pwd, ip, directory); + SmbShare share = new SmbShare(smbPath); + if(enableDetailedDeviceInformation){ + appLogManager.saveLog(loginUserData, Log.MODEL_DEVICE_INTERFACE, Log.TYPE_QUERY, "共享文件夹目录位置:"+smbPath); + } + session = new SmbSession(share); + shareList = share.list(); + length = shareList.length; + } + String backUpPath = rootPath + "/backUp/"+DateTools.getYearAndMonth(); + commonFileManager.makeDirectory(remoteType, ftp, backUpPath, session, enableDetailedDeviceInformation, loginUserData); + int readedFileAmount = 0; + for (int i = 0; i < length && readedFileAmount < 20; i++) { + FTPFile ftpFile = null; + SmbFile smbForm = null; + String name = null; + if(DeviceInterface.INTERFACETYPE_FTP.equals(remoteType)){ + ftpFile = files[i]; + name = ftpFile.getName(); + }else{ + name = shareList[i]; + if(!(name.endsWith(".pdf") && (DeviceInterface.XINHUA_PDF_CLEAN_H101513.equals(deviceInterface.getDeviceModel()) && name.contains("ST") || DeviceInterface.XINHUA_PDF_SUPER6000.equals(deviceInterface.getDeviceModel()) && name.contains("WS")))){ + continue; + } + smbForm = session.createSmbFileObject(rootPath + File.separator + name); + if(smbForm == null || smbForm.isDirectory()){ + continue; + } + } + String cycles = name.split("-")[2].replace(".pdf", ""); + // 从PDF文档中提取文本 + int index = 0; + if(name.contains("WS")){ + index = name.indexOf("WS"); + }else{ + index = name.indexOf("ST"); + } + String machineNumber = name.substring(0, index); + String ymd = "20" + name.substring(index + 2 , index + 8); + XinHuaDataPDF xinHuaDataPDF = dataRead(smbForm,deviceInterface, remoteType, ftp, ftpFile, enableDetailedDeviceInformation, loginUserData, ymd); + if(xinHuaDataPDF != null){ + xinHuaDataPDF.setMachineNumber(machineNumber); + } + //判断pdf文件是否有效 + if(validateWashDataPDF(xinHuaDataPDF)){ + boolean isParsedFile = isParsedFile(xinHuaDataPDF); + if(isParsedFile){ + logger.debug(name+"该文件已经解析过"); + }else{ + if(name.contains("WS")){ + //更新清洗机的温度压力数据 + Long wdId = washAndDisinfectRecordManager.refreshWashRecordAmounts(deviceInterface, Long.parseLong(cycles), machineNo, xinHuaDataPDF.getStartDate(), 1L, WashAndDisinfectRecord.WASHDATATYPE_XINHUA_WSPDF); + if(DatabaseUtil.isPoIdValid(wdId)){ + xinHuaDataPDF.setRecordId(wdId); + } + }else{ + String beginStartTimeStr = null; + String endStartTimeStr = null; + if(!DeviceInterface.PARAMATCHINGMETHOD_CYCLECOUNTER.equals(deviceInterface.getParaMatchingMethod())){ + Date beginStartTime = new Date(xinHuaDataPDF.getStartDate().getTime() - 10*60*1000); + Date endStartTime = new Date(xinHuaDataPDF.getStartDate().getTime() + 10*60*1000); + beginStartTimeStr = ForgonDateUtils.safelyFormatDate(beginStartTime,ForgonDateUtils.SIMPLEDATEFORMAT_YYYYMMDDHHMMSS,""); + endStartTimeStr = ForgonDateUtils.safelyFormatDate(endStartTime,ForgonDateUtils.SIMPLEDATEFORMAT_YYYYMMDDHHMMSS,""); + } + Long sterilizationRecordId = sterilizationRecordManager.findMatchingSterilizationRecordId(beginStartTimeStr, endStartTimeStr, deviceInterface.getId(), cycles, machineNumber); + if(enableDetailedDeviceInformation){ + appLogManager.saveLog(loginUserData, Log.MODEL_DEVICE_INTERFACE, Log.TYPE_QUERY, String.format("机器号[%s],文件中的循环次数 [%s],需要更新温度压力数据的灭菌记录id[%s]",machineNumber,cycles,sterilizationRecordId)); + } + if(DatabaseUtil.isPoIdValid(sterilizationRecordId)){ + xinHuaDataPDF.setRecordId(sterilizationRecordId); + objectDao.excuteSQL("update "+SterilizationRecord.class.getSimpleName() + " set sterilizationParaType="+SterilizationRecord.STERILIZATIONPARATYPE_XINHUA_PDF + + " where id="+sterilizationRecordId); + } + } + //复制PDF到服务器 + copyFile(smbForm, deviceInterface, remoteType, ftp, ftpFile, enableDetailedDeviceInformation, loginUserData); + } + commonFileManager.moveFile(remoteType, name, ftp, ftpFileManager.getCurrentPath(ftp), backUpPath, session, smbForm,false); + }else{ + logger.debug(name + ",该文件为无效文件"); + } + } + } catch (Exception e) { + logger.warn(e.getMessage()); + if(enableDetailedDeviceInformation){ + appLogManager.saveLog(loginUserData, + Log.MODEL_DEVICE_INTERFACE, Log.TYPE_ADD, + deviceInterface.getName() + "设备接口连接异常," + e.getMessage()); + } + throw new RuntimeException(e.getMessage()); + } finally { + ftpFileManager.closeFTP(ftp); + if(session != null){ + session.close(); + } + } + + } + public void copyFile(SmbFile remoteFile, + DeviceInterface devInterface, String remoteType, FTPClient ftp, FTPFile ftpFile, boolean enableDetailedDeviceInformation, LoginUserData loginUserData) { + InputStream inputStream = null; + ByteArrayOutputStream out = null; + String fileName = null; + try { + if(DeviceInterface.INTERFACETYPE_FTP.equals(remoteType)){ + fileName = ftpFile.getName(); + }else{ + fileName = remoteFile.getName(); + } + inputStream = commonFileManager.getInputStream(remoteType, ftp, fileName, remoteFile, out, false); + String propFilePath = PathUtils.getWebAppRootPath() + "/UserUpLoadFiles/XINHUAPDF/" + fileName; + File file = new File(propFilePath); + Files.copy(inputStream, file.toPath()); + inputStream.close(); + } catch (FileNotFoundException e) { + logger.warn(e.getMessage()); + e.printStackTrace(); + } catch (IOException e) { + logger.warn(e.getMessage()); + e.printStackTrace(); + if(enableDetailedDeviceInformation){ + appLogManager.saveLog(loginUserData, + Log.MODEL_DEVICE_INTERFACE, Log.TYPE_ADD, + devInterface.getName() + "设备接口连接异常," + e.getMessage()); + } + } catch(Exception e){ + logger.warn(e.getMessage()); + e.printStackTrace(); + }finally{ + FileSystemHelper.closeInputStream(inputStream, null, null, out); + } + } + public void refreshWashRecordAmounts(DeviceInterface devInterface, XinHuaDataPDF record) { + + if(record == null){ + return; + } + + String machineNo = record.getMachineNumber(); + Date startTime = record.getStartDate(); + Long cycleCounter = record.getCycleCounter(); + + if(StringUtils.isBlank(machineNo)){ + throw new RuntimeException("清洗参数pdf文件记录表机器号不能为空!"); + } + if(cycleCounter == null){ + throw new RuntimeException("清洗参数pdf文件记录表循环次数不能为空!"); + } + if(startTime == null){ + throw new RuntimeException("清洗参数pdf文件记录表开始运行时间不能为空!"); + } + + // 根据接口和机器号找到清洗机 + Session session = objectDao.getHibernateSession(); + String queryString = "select r from Rinser r" + + " where r.deviceInterface.id = :deviceInterfaceId" + + " and r.machineNumber = :machineNo"; + Query query = session.createQuery(queryString); + query.setParameter("deviceInterfaceId", devInterface.getId()); + query.setParameter("machineNo", machineNo); + List rinsers = query.list(); + + //Date startTime = DateTools.coverStrToDate(startTimeStr, "yyyy/MM/dd HH:mm:ss"); + Date beginStartTime = new Date(startTime.getTime() - 10*60*1000); + Date endStartTime = new Date(startTime.getTime() + 10*60*1000); + String beginStartTimeStr = ForgonDateUtils.safelyFormatDate(beginStartTime,ForgonDateUtils.SIMPLEDATEFORMAT_YYYYMMDDHHMMSS,""); + String endStartTimeStr = ForgonDateUtils.safelyFormatDate(endStartTime,ForgonDateUtils.SIMPLEDATEFORMAT_YYYYMMDDHHMMSS,""); + WashAndDisinfectRecord wd = null; + for (Rinser rs : rinsers) { + String hql = String.format(" where po.rinserId = %s ", rs.getId().toString()); + if(StringUtils.equals(DeviceInterface.PARAMATCHINGMETHOD_STARTDATE, devInterface.getParaMatchingMethod())){ + hql += " and " + dateQueryAdapter.dateAreaSql("po.startDate", beginStartTimeStr, endStartTimeStr, false); + }else { + hql += String.format(" and po.cycleCounter = %s ", cycleCounter); + } + wd = (WashAndDisinfectRecord) objectDao.getBySql(WashAndDisinfectRecord.class.getSimpleName(), hql); + if(wd != null) { + Long amounts = wd.getWashDataAmount(); + amounts = amounts == null ? 0L : amounts; + wd.setWashDataAmount(1L); + wd.setWashDataType(WashAndDisinfectRecord.WASHDATATYPE_XINHUA_WSPDF); + } + } + record.setRecordId(wd != null?wd.getId():null); + objectDao.save(record); + } /** + * 判断倍力曼清洗机参数pdf文件是否已经解析过 + * @param belimedV2WashDataPDF + * @return + */ + private boolean isParsedFile(XinHuaDataPDF belimedV2WashDataPDF) { + //判断是否已经读取过文件 + String sql = String.format("select count(1) from %s po " + + "where po.deviceInterfaceID = %s " + + "and po.machineNumber = '%s' " + + "and po.startDate = %s", + BelimedV2WashDataPDF.class.getSimpleName(), + belimedV2WashDataPDF.getDeviceInterfaceID(), + belimedV2WashDataPDF.getMachineNumber(), + dateQueryAdapter.dateAdapter(belimedV2WashDataPDF.getStartDate())); + if(objectDao.countBySql(sql) > 0){ + return true; + } + return false; + } + + /** + * 检查清洗参数pdf文件记录是否合法 + * @param belimedV2WashDataPDF + * @return + */ + private boolean validateWashDataPDF(XinHuaDataPDF belimedV2WashDataPDF) { + if(belimedV2WashDataPDF == null){ + return false; + } + if(!DatabaseUtil.isPoIdValid(belimedV2WashDataPDF.getDeviceInterfaceID())){ + return false; + } + if(StringUtils.isBlank(belimedV2WashDataPDF.getMachineNumber())){ + return false; + } + if(belimedV2WashDataPDF.getStartDate() == null){ + return false; + } + if(belimedV2WashDataPDF.getCycleCounter() == null){ + return false; + } + if(StringUtils.isBlank(belimedV2WashDataPDF.getFileName())){ + return false; + } + return true; + } +private XinHuaDataPDF dataRead(SmbFile remoteFile, + DeviceInterface deviceInterface, String remoteType, FTPClient ftp, + FTPFile ftpFile, boolean enableDetailedDeviceInformation, + LoginUserData loginUserData, String ymd) { + + InputStream inputStream = null; + ByteArrayOutputStream out = null; + InputStreamReader isr = null; + String fileName = null; + XinHuaDataPDF xinHuaDataPDF = new XinHuaDataPDF(); + PDDocument document = null; + try { + Date da = null; + if(DeviceInterface.INTERFACETYPE_FTP.equals(remoteType)){ + da = ftpFile.getTimestamp().getTime(); + fileName = ftpFile.getName(); + }else{ + da = new Date(); + da.setTime(remoteFile.getDate()); + fileName = remoteFile.getName(); + } + inputStream = commonFileManager.getInputStream(remoteType, ftp, fileName, remoteFile, out,false); + isr = new InputStreamReader(inputStream,"GBK"); + document = PDDocument.load(inputStream); + String cycles = fileName.split("-")[2].replace(".pdf", ""); + // 创建PDFTextStripper对象 + PDFTextStripper pdfStripper = new PDFTextStripper(); + // 从PDF文档中提取文本 + String text = pdfStripper.getText(document); + String regex = "\\d{2}:\\d{2}:\\d{2}"; + String startDateStr = getDateStr(text, regex); + if(StringUtils.isNotBlank(startDateStr)){ + startDateStr = ymd + " "+ startDateStr; + DateFormat sdf = new SimpleDateFormat("yyyyMMdd HH:mm:ss"); + Date startTime = sdf.parse(startDateStr); + if(startTime != null){ + xinHuaDataPDF.setFileName(fileName); + xinHuaDataPDF.setDeviceInterfaceID(deviceInterface.getId()); + xinHuaDataPDF.setCycleCounter(Long.parseLong(cycles)); + xinHuaDataPDF.setStartDate(startTime); + } + } + } catch (FileNotFoundException e) { + logger.warn(e.getMessage()); + e.printStackTrace(); + } catch (IOException e) { + logger.warn(e.getMessage()); + e.printStackTrace(); + if(enableDetailedDeviceInformation){ + appLogManager.saveLog(loginUserData, + Log.MODEL_DEVICE_INTERFACE, Log.TYPE_ADD, + deviceInterface.getName() + "设备接口连接异常," + e.getMessage()); + } + } catch(Exception e){ + logger.warn(e.getMessage()); + e.printStackTrace(); + }finally{ + FileSystemHelper.closeInputStream(inputStream, null, isr, out); + if(document != null){ + try { + document.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return xinHuaDataPDF; +} +private String getDateStr(String text, String regex){ + if(StringUtils.isBlank(text)){ + return null; + } + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(text); + String a = null; + while (matcher.find()) { + a = matcher.group(); + break; + } + return a; +} + /** * 读取保存新华 PS-100GXP数据 * @param devInterface 设备接口 * @param machineNo 机器号 @@ -1560,13 +1927,12 @@ wd.setWashDataAmount(amounts + Long.valueOf(recordAmount)); } }else{ - queryString = "select wd from WashAndDisinfectRecord wd" - + " where wd.disinfectIdentification = :rinserName" - + " and wd.cycleCounter = :cycleCounter"; - query = session.createQuery(queryString); - query.setParameter("rinserName", rs.getName()); - query.setParameter("cycleCounter", cycleCounter); - WashAndDisinfectRecord wd = (WashAndDisinfectRecord)query.uniqueResult(); + queryString = "select wd from "+ WashAndDisinfectRecord.class.getSimpleName() + +" wd where wd.rinserId = " + rs.getId() + + " and wd.cycleCounter = " + cycleCounter; + queryString += " order by wd.id desc "; + List wds = objectDao.findByHql(queryString, 0, 1); + WashAndDisinfectRecord wd = CollectionUtils.isEmpty(wds)?null:wds.get(0); if(wd != null) { int amounts = washAndDisinfectRecordManager.getWashAndDisinfectRecordsCount(devInterface.getId().toString(),machineNo,wd); Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/washanddisinfectmanager/washanddisinfectrecord/WashAndDisinfectRecord.java =================================================================== diff -u -r40583 -r40891 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/washanddisinfectmanager/washanddisinfectrecord/WashAndDisinfectRecord.java (.../WashAndDisinfectRecord.java) (revision 40583) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/washanddisinfectmanager/washanddisinfectrecord/WashAndDisinfectRecord.java (.../WashAndDisinfectRecord.java) (revision 40891) @@ -188,6 +188,10 @@ * STERIS_CHANGLONG */ public static final Integer WASHDATATYPE_STERIS_CHANGLONG = 6; + /** + * xinhua ws pdf + */ + public static final Integer WASHDATATYPE_XINHUA_WSPDF = 7; @Id @GeneratedValue(strategy=GenerationType.AUTO) public Long getId() { Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/deviceinterface/DeviceInterface.java =================================================================== diff -u -r40583 -r40891 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/deviceinterface/DeviceInterface.java (.../DeviceInterface.java) (revision 40583) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/deviceinterface/DeviceInterface.java (.../DeviceInterface.java) (revision 40891) @@ -157,7 +157,17 @@ * 新华单舱清洗机(super6000)(张家界市人民医院ZJJSRM-6) */ public static final String XINHUA_SUPER6000 = "单舱清洗机(super6000)"; + /** + * 新华清洗机(super6000) 文件是PDF + */ + public static final String XINHUA_PDF_SUPER6000 = "super6000"; + + /** + * 新华的一种灭菌器Clean H101513 文件是PDF + */ + public static final String XINHUA_PDF_CLEAN_H101513 = "Clean H101513"; + /** * 新华外车清洗机 * 产品编号 E20220119 * SZSLHQZXYY-24 Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/sterilizationmanager/sterilizationrecord/SterilizationRecord.java =================================================================== diff -u -r40302 -r40891 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/sterilizationmanager/sterilizationrecord/SterilizationRecord.java (.../SterilizationRecord.java) (revision 40302) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/sterilizationmanager/sterilizationrecord/SterilizationRecord.java (.../SterilizationRecord.java) (revision 40891) @@ -361,6 +361,10 @@ */ public static final Integer STERILIZATIONPARATYPE_AMSCO_V_PRO_MAX = 17; /** + * xinhua pdf + */ + public static final Integer STERILIZATIONPARATYPE_XINHUA_PDF = 18; + /** * 灭菌参数类型 * 不同类型获取的数据不一样,处理方式不一样 */ Index: ssts-wash/src/main/java/com/forgon/disinfectsystem/washanddisinfectmanager/washanddisinfectrecord/service/WashAndDisinfectRecordManager.java =================================================================== diff -u -r40583 -r40891 --- ssts-wash/src/main/java/com/forgon/disinfectsystem/washanddisinfectmanager/washanddisinfectrecord/service/WashAndDisinfectRecordManager.java (.../WashAndDisinfectRecordManager.java) (revision 40583) +++ ssts-wash/src/main/java/com/forgon/disinfectsystem/washanddisinfectmanager/washanddisinfectrecord/service/WashAndDisinfectRecordManager.java (.../WashAndDisinfectRecordManager.java) (revision 40891) @@ -522,6 +522,12 @@ * @param belimedV2WashDataPDFId 参数记录id */ public JSONObject getRinserWashDataFile(Long washAndDisinfectRecordId, Long belimedV2WashDataPDFId); + /** + * 获取清洗参数文件 + * @param washAndDisinfectRecordId 清洗记录id + * @param belimedV2WashDataPDFId 参数记录id + */ + public JSONObject getXinHuaDataPDF(Long washAndDisinfectRecordId, String type, Long belimedV2WashDataPDFId); /** * 获取温度和阶段表格NYSY-45参数界面增加清洗记录运行内容的数据表格显示