Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/sterilizationmanager/sterilizerrecord/SteriVac3MSterilizerRecord.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/sterilizationmanager/sterilizerrecord/SteriVac3MSterilizerRecord.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/sterilizationmanager/sterilizerrecord/SteriVac3MSterilizerRecord.java (revision 36905) @@ -0,0 +1,105 @@ +package com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord; + +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; + +/** + * 3M GS8 灭菌器记录表 + * @author zc.li + * @date 2023-10-12 + */ +@Entity +@DynamicInsert(false) +@DynamicUpdate(true) +@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) +public class SteriVac3MSterilizerRecord { + private Long id; + /** + * 机器号 + */ + private String machineNumber; + /** + * 启动时间 + */ + private Date startDate; + /** + * 结束时间 + */ + private Date endDate; + /** + * 运行次数 + */ + private Long cycles; + + /** + * 对应的灭菌记录id + */ + private Long sterilizationRecordId; + /** + * png文件名 + */ + private String pngFileName; + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + + public Date getStartDate() { + return startDate; + } + + public void setStartDate(Date startDate) { + this.startDate = startDate; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public Long getCycles() { + return cycles; + } + + public void setCycles(Long cycles) { + this.cycles = cycles; + } + + public String getMachineNumber() { + return machineNumber; + } + + public void setMachineNumber(String machineNumber) { + this.machineNumber = machineNumber; + } + + public Long getSterilizationRecordId() { + return sterilizationRecordId; + } + + public void setSterilizationRecordId(Long sterilizationRecordId) { + this.sterilizationRecordId = sterilizationRecordId; + } + public String getPngFileName() { + return pngFileName; + } + public void setPngFileName(String pngFileName) { + this.pngFileName = pngFileName; + } +} Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/deviceinterface/DeviceInterface.java =================================================================== diff -u -r36848 -r36905 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/deviceinterface/DeviceInterface.java (.../DeviceInterface.java) (revision 36848) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/deviceinterface/DeviceInterface.java (.../DeviceInterface.java) (revision 36905) @@ -76,6 +76,10 @@ */ public static final String MATACHANA = "MATACHANA"; /** + * 3M Steri-Vac + */ + public static final String STERIVAC3M = "STERIVAC3M"; + /** * 西班牙美达的一种型号130LF */ public static final String MATACHANA_130LF = "130LF"; Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/imagefilemanager/action/ShowImageAction.java =================================================================== diff -u -r36815 -r36905 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/imagefilemanager/action/ShowImageAction.java (.../ShowImageAction.java) (revision 36815) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/imagefilemanager/action/ShowImageAction.java (.../ShowImageAction.java) (revision 36905) @@ -2,9 +2,13 @@ import java.awt.image.BufferedImage; import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; import java.net.URLDecoder; +import java.nio.ByteBuffer; +import java.nio.channels.FileChannel; +import java.sql.ResultSet; import java.util.List; import java.util.Map; @@ -31,6 +35,7 @@ import com.forgon.disinfectsystem.entity.qualitymonitoringmanager.qualitymonitoring.QualityMonitoringInstance; import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizationrecord.SterilizationRecord; import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizationrecord.SterilizationRecordPic; +import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.SteriVac3MSterilizerRecord; import com.forgon.disinfectsystem.entity.washanddisinfectmanager.washanddisinfectrecord.WashAndDisinfectPic; import com.forgon.disinfectsystem.entity.washanddisinfectmanager.washanddisinfectrecord.WashAndDisinfectRecord; import com.forgon.disinfectsystem.expensiveGoods.service.ExpensiveGoodsBillManager; @@ -46,6 +51,7 @@ import com.forgon.tools.json.JSONUtil; import com.forgon.tools.string.StringTools; import com.forgon.tools.util.FileUtils; +import com.forgon.tools.util.PathUtils; /** * 显示图片的action @@ -152,8 +158,63 @@ } outputImage(img, imageId); } - /** + * 获取灭菌炉参数图片 + */ + public void getSterilizerRecordPic(){ + ResultSet rs = null; + byte[] img = null; + FileChannel channel = null; + FileInputStream fis = null; + try { + String pngFileName = null; + String sterilizationRecordId = StrutsParamUtils.getPraramValue("sterilizationRecordId", ""); + sterilizationRecordId = "39917"; + if(!DatabaseUtil.isPoIdValid(sterilizationRecordId)){ + throw new RuntimeException("sterilizationRecordId参数异常"); + } + StringBuffer sql = new StringBuffer(); + sql.append("select max(s.pngFileName) from "); + sql.append(SteriVac3MSterilizerRecord.class.getSimpleName()); + sql.append(" s where s.sterilizationRecordId="); + sql.append(sterilizationRecordId); + rs = objectDao.executeSql(sql.toString()); + + while(rs.next()){ + pngFileName = rs.getString(1); + break; + } + if(StringUtils.isNotBlank(pngFileName)){ + File file = new File(PathUtils.getWebAppRootPath() + "/UserUpLoadFiles/GS83MPNG/" + pngFileName); + fis = new FileInputStream(file); + channel = fis.getChannel(); + long size = channel.size(); + ByteBuffer buffer = ByteBuffer.allocate((int) size); + channel.read(buffer); + buffer.flip(); + img = new byte[buffer.remaining()]; + buffer.get(img); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + DatabaseUtil.closeResultSetAndStatement(rs); + if(channel != null){ + try { + channel.close(); + } catch (Exception e2) { + } + } + if(fis != null){ + try { + fis.close(); + } catch (Exception e2) { + } + } + } + outputImage(img, 0); + } + /** * 加载高值耗材发票图片 */ public void getExpensiveBillImage() { Index: ssts-maintain/src/main/java/com/forgon/disinfectsystem/maintain/device/service/SteriVac3MManagerImpl.java =================================================================== diff -u --- ssts-maintain/src/main/java/com/forgon/disinfectsystem/maintain/device/service/SteriVac3MManagerImpl.java (revision 0) +++ ssts-maintain/src/main/java/com/forgon/disinfectsystem/maintain/device/service/SteriVac3MManagerImpl.java (revision 36905) @@ -0,0 +1,317 @@ +package com.forgon.disinfectsystem.maintain.device.service; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.file.Files; +import java.util.Calendar; +import java.util.Date; + +import jcifs.smb.SmbFile; + +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.springframework.beans.factory.annotation.Autowired; +import org.springframework.integration.smb.session.SmbSession; +import org.springframework.integration.smb.session.SmbShare; +import org.springframework.stereotype.Component; + +import com.forgon.directory.vo.LoginUserData; +import com.forgon.disinfectsystem.entity.basedatamanager.deviceinterface.DeviceInterface; +import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizationrecord.SterilizationRecord; +import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.SteriVac3MSterilizerRecord; +import com.forgon.disinfectsystem.filemanager.CommonFileManager; +import com.forgon.disinfectsystem.filemanager.FtpFileManager; +import com.forgon.disinfectsystem.sterilizationmanager.sterilizationrecord.service.SterilizationRecordManager; +import com.forgon.log.model.Log; +import com.forgon.log.service.LogManager; +import com.forgon.tools.FileSystemHelper; +import com.forgon.tools.date.DateTools; +import com.forgon.tools.db.DatabaseUtil; +import com.forgon.tools.hibernate.ObjectDao; +import com.forgon.tools.util.ForgonDateUtils; +import com.forgon.tools.util.PathUtils; +@Component +public class SteriVac3MManagerImpl implements DeviceDataManager{ + private static final Logger logger = Logger.getLogger(MaTaDataManagerImpl.class); + @Autowired + private ObjectDao objectDao; + @Autowired + private FtpFileManager ftpFileManager; + @Autowired + private CommonFileManager commonFileManager; + @Autowired + private LogManager appLogManager; + @Autowired + private SterilizationRecordManager sterilizationRecordManager; + @Override + public void readAndSaveRecord(DeviceInterface devInterface, + String machineNo, String brand, String isAutoCompleteSterilization, + boolean enableDetailedDeviceInformation, LoginUserData loginUserData) { + if (devInterface == null || StringUtils.isBlank(machineNo)) { + return; + } + SmbSession session = null; + String ip = devInterface.getIP(); + String directory = devInterface.getFolderPath(); + if(!directory.startsWith("/")){ + directory = "/" + directory; + } + String userName = devInterface.getDecryptUserName(); + String pwd = devInterface.getDecryptPassword(); + String remoteType = devInterface.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, devInterface.getPort(), userName, pwd, enableDetailedDeviceInformation, loginUserData); + 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("check.xml")){ + return true; + } + logger.debug("只处理***check.xml文件"); + 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"; + commonFileManager.makeDirectory(remoteType, ftp, backUpPath, session, enableDetailedDeviceInformation, loginUserData); + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.HOUR_OF_DAY, -72); + 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("check.xml"))){ + continue; + } + smbForm = session.createSmbFileObject(rootPath + File.separator + name); + if(smbForm == null || smbForm.isDirectory()){ + continue; + } + } + SteriVac3MSterilizerRecord record = sterilizerDataReadAndSave(smbForm,devInterface, remoteType, ftp, ftpFile, enableDetailedDeviceInformation, loginUserData); + if(DatabaseUtil.isPoIdValid(record.getSterilizationRecordId())){ + String xmlName = name.replace(".xml", ".png"); + FTPFile ftpFileXml = null; + SmbFile smbFormXml = null; + if(DeviceInterface.INTERFACETYPE_FTP.equals(remoteType)){ + ftpFileXml = ftpFileManager.getFileByFileName(xmlName, ftpFileManager.getCurrentPath(ftp), ftp); + if(ftpFileXml == null){ + continue; + } + }else{ + smbFormXml = session.createSmbFileObject(rootPath + File.separator + xmlName); + if(smbFormXml == null){ + continue; + } + } + readedFileAmount++; + copyPng(smbFormXml, devInterface, remoteType, ftp, ftpFileXml, enableDetailedDeviceInformation, loginUserData); + objectDao.save(record); + objectDao.excuteSQL(" update " + SterilizationRecord.class.getSimpleName() + " set sterilizationParaType=" + SterilizationRecord.STERILIZATIONPARATYPE_STERIVAC3M_GS8_1D + " where id="+record.getSterilizationRecordId()); + commonFileManager.moveFile(remoteType, xmlName, ftp, ftpFileManager.getCurrentPath(ftp), backUpPath, session, smbFormXml); + commonFileManager.moveFile(remoteType, name, ftp, ftpFileManager.getCurrentPath(ftp), backUpPath, session, smbForm); + } + } + } catch (Exception e) { + logger.warn(e.getMessage()); + if(enableDetailedDeviceInformation){ + appLogManager.saveLog(loginUserData, + Log.MODEL_DEVICE_INTERFACE, Log.TYPE_ADD, + devInterface.getName() + "设备接口连接异常," + e.getMessage()); + } + throw new RuntimeException(e.getMessage()); + } finally { + ftpFileManager.closeFTP(ftp); + if(session != null){ + session.close(); + } + } + + } + /** + * 灭菌炉数据处理 + * @param remoteFile + * @param devInterface + * @param remoteType + * @param ftp + * @param ftpFile + * @param enableDetailedDeviceInformation + * @param loginUserData + * @return + */ + public SteriVac3MSterilizerRecord sterilizerDataReadAndSave(SmbFile remoteFile, + DeviceInterface devInterface, String remoteType, FTPClient ftp, FTPFile ftpFile, boolean enableDetailedDeviceInformation, LoginUserData loginUserData) { + InputStream inputStream = null; + ByteArrayOutputStream out = null; + InputStreamReader isr = null; + BufferedReader br = null; + String fileName = null; + Long sterilizationRecordId = null; + SteriVac3MSterilizerRecord record = new SteriVac3MSterilizerRecord(); + 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); + isr = new InputStreamReader(inputStream,"GBK"); + br = new BufferedReader(isr); + String line = ""; + String serialNumber = null; + Date startTime = null; + String startTimeStr = null; + while ((line = br.readLine()) != null) { + if(StringUtils.isBlank(line)){ + continue; + } + if(line.contains("SerialNumber")){ + serialNumber = commonFileManager.getValueByKey(line, "SerialNumber"); + record.setMachineNumber(serialNumber); + }else if(line.contains("StartTime")){ + startTimeStr = commonFileManager.getValueByKey(line, "StartTime"); + if(StringUtils.isNotBlank(startTimeStr)){ + startTime = DateTools.YMDHMSFORMAT.get().parse(startTimeStr.replace("T", " ").substring(0,19)); + record.setStartDate(startTime); + } + }else if(line.contains("CycleRanId")){ + String cycleRanId = commonFileManager.getValueByKey(line, "CycleRanId"); + if(StringUtils.isNotBlank(cycleRanId)){ + record.setCycles(Long.parseLong(cycleRanId)); + } + }else if(line.contains("EndTime")){ + String endTimeStr = commonFileManager.getValueByKey(line, "EndTime"); + if(StringUtils.isNotBlank(endTimeStr)){ + record.setEndDate(DateTools.YMDHMSFORMAT.get().parse(endTimeStr.replace("T", " ").substring(0,19))); + } + break; + } + } + if(StringUtils.isNotBlank(serialNumber) && record.getEndDate() != null && record.getStartDate() != null){ + 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,""); + sterilizationRecordId = sterilizationRecordManager.findMatchingSterilizationRecordId(beginStartTimeStr, endStartTimeStr, devInterface.getId(), "", serialNumber); + if(enableDetailedDeviceInformation && DatabaseUtil.isPoIdValid(sterilizationRecordId)){ + appLogManager.saveLog(loginUserData, Log.MODEL_DEVICE_INTERFACE, Log.TYPE_QUERY, String.format("机器号[%s],开始时间 [%s],需要更新温度压力数据的灭菌记录id[%s]",serialNumber,startTimeStr,sterilizationRecordId)); + } + if(DatabaseUtil.isPoIdValid(sterilizationRecordId) && objectDao.countBySql("select count(*) from " + + SteriVac3MSterilizerRecord.class.getSimpleName() + " where sterilizationRecordId="+sterilizationRecordId) == 0){ + record.setPngFileName(fileName.replace(".xml", ".png")); + record.setSterilizationRecordId(sterilizationRecordId); + } + } + } 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, br, isr, out); + } + return record; + } + /** + * 复制png到服务器 + * @param remoteFile 共享文件 + * @param devInterface 设备接口 + * @param remoteType 远程类型 + * @param ftp FTPClient + * @param ftpFile + * @param enableDetailedDeviceInformation 是否开启日志 + * @param loginUserData + */ + public void copyPng(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(); + } + fileName = fileName.replace(".xml", ".png"); + inputStream = commonFileManager.getInputStream(remoteType, ftp, fileName, remoteFile, out); + String propFilePath = PathUtils.getWebAppRootPath() + "/UserUpLoadFiles/GS83MPNG/" + 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); + } + } + @Override + public void end() { + // TODO Auto-generated method stub + + } + +} Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/sterilizationmanager/sterilizationrecord/SterilizationRecord.java =================================================================== diff -u -r36319 -r36905 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/sterilizationmanager/sterilizationrecord/SterilizationRecord.java (.../SterilizationRecord.java) (revision 36319) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/sterilizationmanager/sterilizationrecord/SterilizationRecord.java (.../SterilizationRecord.java) (revision 36905) @@ -370,6 +370,7 @@ public static final Integer STERILIZATIONPARATYPE_TYPE_GETINGE_COMMON = 9;//洁定通用型 public static final Integer STERILIZATIONPARATYPE_BELIMED = 10;//倍力曼 public static final Integer STERILIZATIONPARATYPE_MATACHANA_130LF = 11;//西班牙美达(型号130LF) + public static final Integer STERILIZATIONPARATYPE_STERIVAC3M_GS8_1D = 12;//3m GS8-1D /** * 灭菌参数获取类型(不同类型获取的数据不一样,处理方式不一样) */ Index: ssts-maintain/src/main/java/com/forgon/disinfectsystem/maintain/device/service/DeviceInterfaceDataProcessImpl.java =================================================================== diff -u -r36848 -r36905 --- ssts-maintain/src/main/java/com/forgon/disinfectsystem/maintain/device/service/DeviceInterfaceDataProcessImpl.java (.../DeviceInterfaceDataProcessImpl.java) (revision 36848) +++ ssts-maintain/src/main/java/com/forgon/disinfectsystem/maintain/device/service/DeviceInterfaceDataProcessImpl.java (.../DeviceInterfaceDataProcessImpl.java) (revision 36905) @@ -34,7 +34,8 @@ private Logger logger = Logger.getLogger(getClass()); @Autowired private MaTaDataManagerImpl maTaDataManagerImpl; - + @Autowired + private SteriVac3MManagerImpl steriVac3MManagerImpl; /** * 日志管理 */ @@ -82,6 +83,9 @@ case DeviceInterface.MATACHANA: maTaDataManagerImpl.readAndSaveRecord(devInterface,st.getMachineNumber(),DeviceInterface.BELIMED,st.getIsAutoCompleteSterilization(),enableDetailedDeviceInformation,loginUserData); break; + case DeviceInterface.STERIVAC3M: + steriVac3MManagerImpl.readAndSaveRecord(devInterface,st.getMachineNumber(),DeviceInterface.BELIMED,st.getIsAutoCompleteSterilization(),enableDetailedDeviceInformation,loginUserData); + break; case DeviceInterface.BELIMED: Object belimedBean = SpringBeanManger.getBean("belimedDataManager"); dm = (DeviceDataManager) belimedBean;