Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/sterilizationmanager/sterilizerrecord/OneOfGetingeSterilizerRecord.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/sterilizationmanager/sterilizerrecord/OneOfGetingeSterilizerRecord.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/sterilizationmanager/sterilizerrecord/OneOfGetingeSterilizerRecord.java (revision 30381) @@ -0,0 +1,216 @@ +package com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.OneToMany; +import javax.persistence.OneToOne; +import javax.persistence.OrderBy; + +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; +import org.hibernate.annotations.Cascade; +import org.hibernate.annotations.CascadeType; +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; + +import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizationrecord.SterilizationRecord; + +/** + * 洁定牌灭菌炉 型号HS6620 灭菌参数表 + * @author zc.li + * @date 2021-01-20 + */ +@Entity +@DynamicInsert(false) +@DynamicUpdate(true) +@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) +public class OneOfGetingeSterilizerRecord { + private Long id; + /** + * 开始时间 + */ + private Date startDate; + /** + * 结束时间 + */ + private Date endDate; + /** + * 机器号 + */ + private String machineNumber; + /** + * 锅次(循环次数) + */ + private Long cycleCounter; + /** + * 灭菌温度 + */ + private Double sterilizingTemp; + /** + * 灭菌用时 例如00:06:00 + */ + private String sterilizingTime; + /** + * 干燥用时 例如00:05:00 + */ + private String dryingTime; + /** + * 干燥(蒸汽脉冲?文档未说明,前台直接显示原文DRYING STEAMPULS) + */ + private String dryingSteampuls; + /** + * 空气脉冲?(文档未说明,前台直接显示原文DRYING AIRPULS) + */ + private String dryingAirpuls; + /** + * 程序原文P1 WRAPP. GOODS 134 + * 原文:译文 + * P1 WRAPP. GOODS 134 : P1134灭菌程序 + */ + private String programName; + /** + * 负脉冲数 + */ + private Integer negPulse; + /** + * 正脉冲数 + */ + private Integer posPulse; + /** + * 阶段信息 + */ + private List oneOfGetingeStageDetailsList = new ArrayList(); + + /** + * 对应的灭菌记录 + */ + private SterilizationRecord sterilizationRecord; + + @OneToOne + @Cascade(value = { CascadeType.SAVE_UPDATE }) + @JoinColumn(name = "SterilizationRecordId", referencedColumnName = "id") + public SterilizationRecord getSterilizationRecord() { + return sterilizationRecord; + } + + public void setSterilizationRecord(SterilizationRecord sterilizationRecord) { + this.sterilizationRecord = sterilizationRecord; + } + @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 String getMachineNumber() { + return machineNumber; + } + + public void setMachineNumber(String machineNumber) { + this.machineNumber = machineNumber; + } + + public Long getCycleCounter() { + return cycleCounter; + } + + public void setCycleCounter(Long cycleCounter) { + this.cycleCounter = cycleCounter; + } + + public Double getSterilizingTemp() { + return sterilizingTemp; + } + + public void setSterilizingTemp(Double sterilizingTemp) { + this.sterilizingTemp = sterilizingTemp; + } + + public String getSterilizingTime() { + return sterilizingTime; + } + + public void setSterilizingTime(String sterilizingTime) { + this.sterilizingTime = sterilizingTime; + } + + public String getDryingTime() { + return dryingTime; + } + + public void setDryingTime(String dryingTime) { + this.dryingTime = dryingTime; + } + + public String getDryingSteampuls() { + return dryingSteampuls; + } + + public void setDryingSteampuls(String dryingSteampuls) { + this.dryingSteampuls = dryingSteampuls; + } + + public String getDryingAirpuls() { + return dryingAirpuls; + } + + public void setDryingAirpuls(String dryingAirpuls) { + this.dryingAirpuls = dryingAirpuls; + } + @OneToMany(fetch = FetchType.LAZY) + @Cascade(value = { CascadeType.ALL }) + @JoinColumn(name = "oneOfGetingeSterilizerId") + @OrderBy(" runningTime asc ") + public List getOneOfGetingeStageDetailsList() { + return oneOfGetingeStageDetailsList; + } + public void setOneOfGetingeStageDetailsList( + List oneOfGetingeStageDetailsList) { + this.oneOfGetingeStageDetailsList = oneOfGetingeStageDetailsList; + } + public String getProgramName() { + return programName; + } + public void setProgramName(String programName) { + this.programName = programName; + } + public Integer getNegPulse() { + return negPulse; + } + public void setNegPulse(Integer negPulse) { + this.negPulse = negPulse; + } + public Integer getPosPulse() { + return posPulse; + } + public void setPosPulse(Integer posPulse) { + this.posPulse = posPulse; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } +} Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/sterilizationmanager/sterilizationrecord/SterilizationRecord.java =================================================================== diff -u -r30209 -r30381 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/sterilizationmanager/sterilizationrecord/SterilizationRecord.java (.../SterilizationRecord.java) (revision 30209) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/sterilizationmanager/sterilizationrecord/SterilizationRecord.java (.../SterilizationRecord.java) (revision 30381) @@ -347,6 +347,7 @@ public static final Integer STERILIZATIONPARATYPE_LOW = 1;//低温 public static final Integer STERILIZATIONPARATYPE_HIGH = 2;//高温 public static final Integer STERILIZATIONPARATYPE_LOWOFJOHNSON = 3;//强生低温 + public static final Integer STERILIZATIONPARATYPE_HSONE = 4;//阶段灭菌HS6620 /** * 灭菌参数获取类型(不同类型获取的数据不一样,处理方式不一样) */ Index: ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizerrecord/action/SterilizerRecordLineChartAction.java =================================================================== diff -u -r29805 -r30381 --- ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizerrecord/action/SterilizerRecordLineChartAction.java (.../SterilizerRecordLineChartAction.java) (revision 29805) +++ ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizerrecord/action/SterilizerRecordLineChartAction.java (.../SterilizerRecordLineChartAction.java) (revision 30381) @@ -22,6 +22,8 @@ import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.LowTempForJohnsonRecord; import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.LowTempStageDetails; import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.LowTempSterilizerRecord; +import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.OneOfGetingeStageDetails; +import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.OneOfGetingeSterilizerRecord; import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.SterilizerRecord; import com.forgon.disinfectsystem.sterilizationmanager.sterilizationrecord.service.SterilizationRecordManager; import com.forgon.tools.StrutsParamUtils; @@ -335,4 +337,66 @@ e.printStackTrace(); } } + /** + * 返回 洁定HS6620 echart曲线数据 + */ + public void creatOneOfGetingeSterilizerRecordEChartData() { + Long sterilizationRecordId = StrutsParamUtils.getPraramLongValue("sterilizationRecordId", 0L); + JSONObject rueslt = new JSONObject(); + try { + SterilizationRecord sterilizationRecord = sterilizationRecordManager.getSterilizationRecordById(sterilizationRecordId); + OneOfGetingeSterilizerRecord oneOfGetingeRecord = sterilizationRecordManager.getOneOfGetingeSterilizerRecordSterilizerRecord(sterilizationRecord.getSterilizer().getMachineNumber(), sterilizationRecord.getStartDate()); + List oneOfGetingeStageDetailsList = null; + SimpleDateFormat sdf = new SimpleDateFormat(Constants.DATEFORMAT_YYYYMMDDHHMMSS); + if(oneOfGetingeRecord != null){ + oneOfGetingeStageDetailsList = oneOfGetingeRecord.getOneOfGetingeStageDetailsList(); + rueslt.put("cycleCounter", oneOfGetingeRecord.getCycleCounter()); + rueslt.put("sterilizationUser", sterilizationRecord.getSterilizationUser()); + rueslt.put("programName", oneOfGetingeRecord.getProgramName()); + rueslt.put("startDate", sdf.format(oneOfGetingeRecord.getStartDate())); + rueslt.put("endDate", sdf.format(oneOfGetingeRecord.getEndDate())); + rueslt.put("dryingAirpuls", oneOfGetingeRecord.getDryingAirpuls()); + rueslt.put("dryingSteampuls", oneOfGetingeRecord.getDryingSteampuls()); + rueslt.put("dryingTime", oneOfGetingeRecord.getDryingTime()); + rueslt.put("negPulse", oneOfGetingeRecord.getNegPulse()); + rueslt.put("posPulse", oneOfGetingeRecord.getPosPulse()); + rueslt.put("machineNumber", oneOfGetingeRecord.getMachineNumber()); + rueslt.put("sterilizingTime", oneOfGetingeRecord.getSterilizingTime()); + rueslt.put("sterilizingTemp", oneOfGetingeRecord.getSterilizingTemp()); + } + if(CollectionUtils.isNotEmpty(oneOfGetingeStageDetailsList)) { + rueslt.put("oneOfGetingeStageDetailsList", oneOfGetingeStageDetailsList); + JSONArray jacketTempArr = new JSONArray(); + JSONArray chamberPressureArr = new JSONArray(); + JSONArray schamberPressArr = new JSONArray(); + JSONArray drainTempArr = new JSONArray(); + JSONArray sdrainTempArr = new JSONArray(); + JSONArray timeArr = new JSONArray(); + for (OneOfGetingeStageDetails record : oneOfGetingeStageDetailsList) { + jacketTempArr.add(record.getJacketTemp()); + chamberPressureArr.add(record.getChamberPressure()); + schamberPressArr.add(record.getSchamberPress()); + drainTempArr.add(record.getDrainTemp()); + sdrainTempArr.add(record.getSdrainTemp()); + timeArr.add(record.getRunningTime()); + if(null != record.getLowestTemp()){ + rueslt.put("lowestTemp", record.getLowestTemp()); + rueslt.put("highestTemp", record.getHighestTemp()); + } + } + rueslt.put("jacketTempArr", jacketTempArr); + rueslt.put("chamberPressureArr", chamberPressureArr); + rueslt.put("schamberPressArr", schamberPressArr); + rueslt.put("drainTempArr", drainTempArr); + rueslt.put("sdrainTempArr", sdrainTempArr); + rueslt.put("timeArr", timeArr); + StrutsResponseUtils.output(true, rueslt); + }else{ + StrutsResponseUtils.output(false, rueslt); + } + }catch (Exception e) { + StrutsResponseUtils.output(false ,e.getMessage()); + e.printStackTrace(); + } + } } \ No newline at end of file Index: ssts-maintain/src/main/java/com/forgon/disinfectsystem/maintain/device/service/GetingeDataManagerImpl.java =================================================================== diff -u -r29962 -r30381 --- ssts-maintain/src/main/java/com/forgon/disinfectsystem/maintain/device/service/GetingeDataManagerImpl.java (.../GetingeDataManagerImpl.java) (revision 29962) +++ ssts-maintain/src/main/java/com/forgon/disinfectsystem/maintain/device/service/GetingeDataManagerImpl.java (.../GetingeDataManagerImpl.java) (revision 30381) @@ -7,8 +7,10 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Calendar; import java.util.Date; +import java.util.Iterator; import java.util.List; import jcifs.smb.SmbFile; @@ -19,6 +21,7 @@ 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; @@ -34,6 +37,8 @@ import com.forgon.disinfectsystem.entity.basedatamanager.deviceinterface.DeviceInterface; import com.forgon.disinfectsystem.entity.basedatamanager.rinser.Rinser; import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizationrecord.SterilizationRecord; +import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.OneOfGetingeStageDetails; +import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.OneOfGetingeSterilizerRecord; import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.SterilizerFileName; import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.SterilizerRecord; import com.forgon.disinfectsystem.entity.washanddisinfectmanager.washData.WashData; @@ -46,6 +51,7 @@ import com.forgon.log.model.Log; import com.forgon.log.service.LogManager; import com.forgon.tools.FileSystemHelper; +import com.forgon.tools.db.DatabaseUtil; import com.forgon.tools.hibernate.ObjectDao; import com.forgon.tools.util.ForgonDateUtils; /** @@ -109,13 +115,11 @@ logger.debug(".......devInterface或机器号是空的"); return ; } - readAndSaveRecordCommon(devInterface, machineNo, brand, isAutoCompleteSterilization, enableDetailedDeviceInformation, loginUserData); - /*if(DeviceInterface.INTERFACETYPE_FTP.equals(devInterface.getInterfaceType())){//ftp方式 - readAndSaveRecordByFtp(devInterface, machineNo, brand, isAutoCompleteSterilization); - }else{//共享文件夹方式 - readAndSaveRecordByShareFolder(devInterface, machineNo, brand, isAutoCompleteSterilization); - }*/ - //readAndSaveRecordByShareFolder(devInterface, machineNo, brand, isAutoCompleteSterilization); + if(DeviceInterface.GETINGETYPE_HS_ONE.equals(devInterface.getDeviceModel())){ + readAndSaveRecordCommonForHsOne(devInterface, machineNo, brand, enableDetailedDeviceInformation, loginUserData); + }else{ + readAndSaveRecordCommon(devInterface, machineNo, brand, isAutoCompleteSterilization, enableDetailedDeviceInformation, loginUserData); + } } /** @@ -309,6 +313,112 @@ session.close(); } } + /** + * 洁定灭菌炉型号:HS6620 + * @param devInterface 设备接口 + * @param machineNo 机器号 + * @param brand 品牌 + * @param enableDetailedDeviceInformation 启用设备接口日志 + * @param loginUserData + */ + public void readAndSaveRecordCommonForHsOne(DeviceInterface devInterface,String machineNo,String brand, boolean enableDetailedDeviceInformation, LoginUserData loginUserData){ + SmbSession session = null; + String ip = devInterface.getIP(); + String directory = devInterface.getFolderPath(); + if(!directory.startsWith("/")){ + directory = "/" + directory; + } + String userName = devInterface.getUserName(); + String pwd = devInterface.getPassword(); + 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("log") && file.getName().startsWith("data")){ + return true; + } + logger.debug("只处理data***.log文件"); + 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); + SimpleDateFormat sdfToday = new SimpleDateFormat("yyyyMMdd"); + //限制读取的天数,默认只读当天(默认会把非读取日期的数据移走,避免文件堆积) + int interfaceReadLimitDays = CssdUtils.getSystemSetConfigByNameInt("interfaceReadLimitDays", 0); + Date endStartTime = null; + if(interfaceReadLimitDays > 1){ + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.DATE, -interfaceReadLimitDays); //得到前一天 + endStartTime = calendar.getTime(); + }else{ + endStartTime = new Date(); + } + for (int i = 0; i < length; 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("log") && name.startsWith("data"))){ + continue; + } + smbForm = session.createSmbFileObject(rootPath + File.separator + name); + if(smbForm == null || smbForm.isDirectory()){ + continue; + } + } + if(sdfToday.parse(name.substring(4, 12)).before(sdfToday.parse(sdfToday.format(endStartTime)))){ + commonFileManager.moveFile(remoteType, name, ftp, ftpFileManager.getCurrentPath(ftp), backUpPath, session, smbForm); + continue; + } + sterilizerDataReadAndSaveForHsOne(smbForm,devInterface, remoteType, ftp, ftpFile, enableDetailedDeviceInformation, loginUserData); + } + } 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(); + } + } + + } public void readAndSaveRecordCommon(DeviceInterface devInterface,String machineNo,String brand,String isAutoCompleteSterilization, boolean enableDetailedDeviceInformation, LoginUserData loginUserData){ FTPClient ftp = null; SmbSession session = null; @@ -973,4 +1083,272 @@ } return date; } + + /** + * 灭菌炉数据处理, backUpPath, session, smbForm + */ + public JSONArray sterilizerDataReadAndSaveForHsOne(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; + JSONArray jsonArray = null; + String fileName = 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); + br = commonFileManager.getBufferedReader(isr, inputStream,"ISO-8859-1"); + // 读取直到最后一行 + String line = ""; + boolean startStageDetails = false; + List oneOfGetingeSterilizerRecordList = new ArrayList(); + OneOfGetingeSterilizerRecord oneOfGetingeSterilizerRecord = null; + SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); + boolean skipCycle = false; + StringBuilder sbd = new StringBuilder(); + OneOfGetingeStageDetails item = null; + StringBuilder message = new StringBuilder(); + int negPulsingNum = 1; + int posPulsingNum = 1; + while ((line = br.readLine()) != null) { + if(StringUtils.isBlank(line)){ + continue; + } + if(line.contains("PASSWORD")){ + continue; + } + if(skipCycle && !line.contains("DATE")){//满足skipCycle=true 且 本行不是工作开始行,则不读取本次运转次数的信息 + continue; + } + if(line.contains("DATE")){//日期 + sbd.append(line.substring(line.indexOf(":") + 1).trim()).append(" "); + }else if(line.contains("PROCESS START")){//时间 + sbd.append(line.substring(line.indexOf(":") + 1).trim()); + oneOfGetingeSterilizerRecord = new OneOfGetingeSterilizerRecord(); + oneOfGetingeSterilizerRecord.setStartDate(sdf.parse(sbd.toString())); + sbd.setLength(0); + }else if(line.contains("MACHINE NAME")){//机器号 + oneOfGetingeSterilizerRecord.setMachineNumber(line.substring(line.indexOf(":") + 1).trim()); + + }else if(line.contains("CYCLE COUNTER")){ + Long cycleCounter = Long.valueOf(line.substring(line.indexOf(":") + 1).trim()); + if(oneOfGetingeSterilizerRecord.getCycleCounter() != null){ + message.setLength(0); + message = message.append(fileName).append("格式错误或缺失,请检查补全:被覆盖,被覆盖运转次数").append(oneOfGetingeSterilizerRecord.getCycleCounter()); + skipCycle = true; + if(enableDetailedDeviceInformation){ + appLogManager.saveLog(loginUserData, + Log.MODEL_DEVICE_INTERFACE, Log.TYPE_ADD, + message.toString()); + } + continue; + } + if(isExistDataForHsOne(oneOfGetingeSterilizerRecord.getMachineNumber(), cycleCounter)){ + skipCycle = true; + oneOfGetingeSterilizerRecord = null; + continue; + } + oneOfGetingeSterilizerRecord.setCycleCounter(cycleCounter); + }else if(line.contains("NEG. PULSE")){//负脉冲次数 + oneOfGetingeSterilizerRecord.setNegPulse(Integer.valueOf(line.substring(line.indexOf("SE") + 3).trim())); + }else if(line.contains("POS. PULSE")){//正脉冲次数 + oneOfGetingeSterilizerRecord.setPosPulse(Integer.valueOf(line.substring(line.indexOf("SE") + 3).trim())); + }else if(line.contains("DRYING TIME")){ + oneOfGetingeSterilizerRecord.setDryingTime(line.substring(line.indexOf("E") + 1).trim()); + }else if(line.contains("DRYING AIRPULS")){ + oneOfGetingeSterilizerRecord.setDryingAirpuls(line.substring(line.indexOf("S") + 1).trim()); + }else if(line.contains("DRYING STEAMPULS")){ + oneOfGetingeSterilizerRecord.setDryingSteampuls(line.substring(line.indexOf("LS") + 2).trim()); + }else if(line.contains("STERILIZING TEMP")){ + line = line.trim(); + oneOfGetingeSterilizerRecord.setSterilizingTemp(Double.valueOf(line.substring(line.indexOf("P") + 1,line.length() - 2).trim())); + }else if(line.contains("STERILIZING TIME")){ + oneOfGetingeSterilizerRecord.setSterilizingTime(line.substring(line.indexOf("ME") + 2).trim()); + }else if(line.contains("PROGRAM")){//程序 + oneOfGetingeSterilizerRecord.setProgramName(line.substring(line.indexOf(":") + 1).trim()); + startStageDetails = true; + }else if(startStageDetails){//阶段详情 + if(line.contains("START")){//程序的下一个START是阶段详情开始 + sbd.append("开始"); + continue; + }else if(line.contains("NEG PULSING")){//负脉冲 + sbd.setLength(0); + sbd.append("负脉冲").append(negPulsingNum); + negPulsingNum++; + continue; + }else if(line.contains("POS PULSING")){//正脉冲 + sbd.setLength(0); + sbd.append("正脉冲").append(posPulsingNum); + posPulsingNum++; + continue; + }else if(line.contains("HEAT UP")){//加热 + sbd.setLength(0); + sbd.append("加热"); + continue; + }else if(line.contains("STERILIZING")){//灭菌 + sbd.setLength(0); + sbd.append("灭菌"); + continue; + }else if(line.contains("POSTTREATMENT")){//脉冲 + sbd.setLength(0); + sbd.append("脉冲"); + continue; + }else if(line.contains("DRYING")){//干燥 + sbd.setLength(0); + sbd.append("干燥"); + continue; + }else if(line.contains("EQUALIZATION")){//气压平衡 + sbd.setLength(0); + sbd.append("气压平衡"); + continue; + }else if(line.contains("PROCESS COMPLETE")){//过程完成 + sbd.setLength(0); + sbd.append("过程完成"); + continue; + }else if(line.contains("PROCESS OK")){//程序结束 + sbd.setLength(0); + startStageDetails = false; + //最后一天计算结算时间 + String timeStr = item.getRunningTime(); + String[] timeArr = timeStr.split(":"); + long time = 0; + long hh = Long.valueOf(timeArr[0]); + if(hh > 0){ + time = hh*60*60*1000; + } + long mm = Long.valueOf(timeArr[1]); + if(mm > 0){ + time += mm*60*1000; + } + long ss = Long.valueOf(timeArr[2]); + if(ss > 0){ + time += ss*1000; + } + Date endDate = new Date(oneOfGetingeSterilizerRecord.getStartDate().getTime() + time); + oneOfGetingeSterilizerRecord.setEndDate(endDate); + oneOfGetingeSterilizerRecordList.add(oneOfGetingeSterilizerRecord); + continue; + }else if(line.contains("LOWEST TEMP")){//脉冲最低温度 + line = line.trim(); + item.setLowestTemp(Double.valueOf(line.substring(line.indexOf("TEMP") + 5, line.length() - 1))); + continue; + }else if(line.contains("HIGHEST TEMP")){//脉冲最高温度 + line = line.trim(); + item.setHighestTemp(Double.valueOf(line.substring(line.indexOf("TEMP") + 5, line.length() - 1))); + continue; + } + if(line.contains("PROGTIME")){ + continue; + } + String[] stageDetails = line.trim().replaceAll(" + ", " ").split(" "); + if(stageDetails.length == 6){ + item = new OneOfGetingeStageDetails(); + item.setStageName(sbd.toString()); + item.setRunningTime(stageDetails[0]); + item.setChamberPressure(Double.valueOf(stageDetails[1])); + item.setSchamberPress(Double.valueOf(stageDetails[2])); + item.setDrainTemp(Double.valueOf(stageDetails[3])); + item.setSdrainTemp(Double.valueOf(stageDetails[4])); + item.setJacketTemp(Double.valueOf(stageDetails[5])); + oneOfGetingeSterilizerRecord.getOneOfGetingeStageDetailsList().add(item); + } + } + } + if(CollectionUtils.isNotEmpty(oneOfGetingeSterilizerRecordList)){ + removeIncompleteData(oneOfGetingeSterilizerRecordList, enableDetailedDeviceInformation, loginUserData); + objectDao.batchSaveOrUpdate(oneOfGetingeSterilizerRecordList); + } + } 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 jsonArray; + } + /** + * 验证此机器号此灭菌锅次的数据是否已经保存过,避免重复保存 + * @param machineNumber + * @param operationTimes 运转次数 + * @return + */ + private boolean isExistDataForHsOne(String machineNumber, Long cycleCounter){ + String sql = String.format("select count(*) from %s where machineNumber='%s' and cycleCounter=%s ", + OneOfGetingeSterilizerRecord.class.getSimpleName(),machineNumber,cycleCounter); + if(objectDao.countBySql(sql) > 0){ + return true; + } + return false; + } + /** + * 移除一些数据(现有移除不完整数据;完整数据有灭菌周期) + * @param lowTempSterilizerRecordList + */ + private void removeIncompleteData(List oneOfGetingeSterilizerRecordList, boolean enableDetailedDeviceInformation, LoginUserData loginUserData){ + Iterator it = oneOfGetingeSterilizerRecordList.iterator(); + while(it.hasNext()){ + refreshSterilizaerRecordAmounts(it.next(),it, enableDetailedDeviceInformation, loginUserData); + } + } + /** + * 更新灭菌记录的温度压力数据获取方式 + */ + public boolean refreshSterilizaerRecordAmounts(OneOfGetingeSterilizerRecord item, Iterator it, boolean enableDetailedDeviceInformation, LoginUserData loginUserData) { + boolean result = false; + try { + Date startDate = item.getStartDate(); + String machineNo = item.getMachineNumber(); + Date beginStartTime = new Date(startDate.getTime() - 10*60*1000); + Date endStartTime = new Date(startDate.getTime() + 10*60*1000); + String beginStartTimeStr = ForgonDateUtils.safelyFormatDate(beginStartTime,ForgonDateUtils.SIMPLEDATEFORMAT_YYYYMMDDHHMMSS,""); + String endStartTimeStr = ForgonDateUtils.safelyFormatDate(endStartTime,ForgonDateUtils.SIMPLEDATEFORMAT_YYYYMMDDHHMMSS,""); + String queryString = "select sr.id from SterilizationRecord sr" + + " where sr.sterilizer.machineNumber = :machineNumber" + + " and sr.status = :status" + + " and " + dateQueryAdapter.dateAreaSql("sr.startDate", beginStartTimeStr, endStartTimeStr, false); + Session session = objectDao.getHibernateSession(); + Query query = session.createQuery(queryString); + query.setParameter("machineNumber", machineNo); + query.setParameter("status",SterilizationRecord.STERILIZATION_STATUS_END); + Long id = (Long) query.uniqueResult(); + if (DatabaseUtil.isPoIdValid(id)){ + if(enableDetailedDeviceInformation){ + appLogManager.saveLog(loginUserData, Log.MODEL_DEVICE_INTERFACE, Log.TYPE_QUERY, String.format("机器号[%s],锅次[%s],需要更新温度压力数据的灭菌记录id[%s]",machineNo,item.getCycleCounter(),id)); + } + //灭菌记录的的温度压力数据获取方式 + SterilizationRecord sterilizationRecord = sterilizationRecordManager.get(id); + sterilizationRecord.setSterilizationParaType(SterilizationRecord.STERILIZATIONPARATYPE_HSONE); + objectDao.saveOrUpdate(sterilizationRecord); + item.setSterilizationRecord(sterilizationRecord); + }else{ + if(enableDetailedDeviceInformation){ + appLogManager.saveLog(loginUserData, Log.MODEL_DEVICE_INTERFACE, Log.TYPE_QUERY, String.format("机器号[%s],锅次[%s],无匹配的灭菌记录",machineNo,item.getCycleCounter())); + } + it.remove(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } } Index: ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/service/SterilizationRecordManagerImpl.java =================================================================== diff -u -r30372 -r30381 --- ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/service/SterilizationRecordManagerImpl.java (.../SterilizationRecordManagerImpl.java) (revision 30372) +++ ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/service/SterilizationRecordManagerImpl.java (.../SterilizationRecordManagerImpl.java) (revision 30381) @@ -82,6 +82,7 @@ import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.HighTempSterilizerRecord; import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.LowTempForJohnsonRecord; import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.LowTempSterilizerRecord; +import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.OneOfGetingeSterilizerRecord; import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.SterilizerRecord; import com.forgon.disinfectsystem.entity.urgent.UrgentLevel; import com.forgon.disinfectsystem.expirationdateinfo.service.ExpirationDateInfoManager; @@ -6611,4 +6612,22 @@ throw new SystemException("图片保存方式设置错误,请到科室供应室设置中进行配置"); } } + @Override + public OneOfGetingeSterilizerRecord getOneOfGetingeSterilizerRecordSterilizerRecord( + String machineNo, Date startDate) { + OneOfGetingeSterilizerRecord result = null; + try { + Date beginStartTime = new Date(startDate.getTime() - 10*60*1000); + Date endStartTime = new Date(startDate.getTime() + 10*60*1000); + String beginStartTimeStr = ForgonDateUtils.safelyFormatDate(beginStartTime,ForgonDateUtils.SIMPLEDATEFORMAT_YYYYMMDDHHMMSS,""); + String endStartTimeStr = ForgonDateUtils.safelyFormatDate(endStartTime,ForgonDateUtils.SIMPLEDATEFORMAT_YYYYMMDDHHMMSS,""); + String queryString = " where po.machineNumber ='" + + machineNo + + "' and " + dateQueryAdapter.dateAreaSql("po.startDate", beginStartTimeStr, endStartTimeStr, false); + result = (OneOfGetingeSterilizerRecord)objectDao.getBySql(OneOfGetingeSterilizerRecord.class.getSimpleName(), queryString); + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } } Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/deviceinterface/DeviceInterface.java =================================================================== diff -u -r30339 -r30381 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/deviceinterface/DeviceInterface.java (.../DeviceInterface.java) (revision 30339) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/deviceinterface/DeviceInterface.java (.../DeviceInterface.java) (revision 30381) @@ -163,6 +163,10 @@ */ public static final String DEVICETYPE_HIGH = "高温"; /** + * 洁定的一种灭菌炉型号 HS6620 + */ + public static final String GETINGETYPE_HS_ONE = "HS6620"; + /** * 读取设备的类型 */ private String deviceType; Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/sterilizationmanager/sterilizerrecord/OneOfGetingeStageDetails.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/sterilizationmanager/sterilizerrecord/OneOfGetingeStageDetails.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/sterilizationmanager/sterilizerrecord/OneOfGetingeStageDetails.java (revision 30381) @@ -0,0 +1,122 @@ +package com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord; + +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; +/** + * 洁定牌灭菌炉 型号HS6620 灭菌参数阶段详情表 + * @author zc.li + * @date 2021-01-20 + */ +@Entity +@DynamicInsert(false) +@DynamicUpdate(true) +@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) +public class OneOfGetingeStageDetails { + private Long id; + /** + * 阶段名称 + */ + private String stageName; + /** + * 最低温度(POSTTREATMENT(脉冲) 脉冲 才有) + */ + private Double lowestTemp; + /** + * 最高温度(POSTTREATMENT(脉冲) 才有) + */ + private Double highestTemp; + /** + * 运行时间 + */ + private String runningTime; + /** + * 腔体压力 + */ + private Double chamberPressure; + /** + * 监测腔体压力 + */ + private Double schamberPress; + /** + * 排放口温度 + */ + private Double drainTemp; + /** + * 监测排放口温度 + */ + private Double sdrainTemp; + /** + * 夹套温度 + */ + private Double jacketTemp; + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + public String getStageName() { + return stageName; + } + public void setStageName(String stageName) { + this.stageName = stageName; + } + public Double getLowestTemp() { + return lowestTemp; + } + public void setLowestTemp(Double lowestTemp) { + this.lowestTemp = lowestTemp; + } + public Double getHighestTemp() { + return highestTemp; + } + public void setHighestTemp(Double highestTemp) { + this.highestTemp = highestTemp; + } + public String getRunningTime() { + return runningTime; + } + public void setRunningTime(String runningTime) { + this.runningTime = runningTime; + } + public Double getChamberPressure() { + return chamberPressure; + } + public void setChamberPressure(Double chamberPressure) { + this.chamberPressure = chamberPressure; + } + public Double getDrainTemp() { + return drainTemp; + } + public void setDrainTemp(Double drainTemp) { + this.drainTemp = drainTemp; + } + public Double getJacketTemp() { + return jacketTemp; + } + public void setJacketTemp(Double jacketTemp) { + this.jacketTemp = jacketTemp; + } + public Double getSchamberPress() { + return schamberPress; + } + public void setSchamberPress(Double schamberPress) { + this.schamberPress = schamberPress; + } + public Double getSdrainTemp() { + return sdrainTemp; + } + public void setSdrainTemp(Double sdrainTemp) { + this.sdrainTemp = sdrainTemp; + } + +} Index: ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/service/SterilizationRecordManager.java =================================================================== diff -u -r30372 -r30381 --- ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/service/SterilizationRecordManager.java (.../SterilizationRecordManager.java) (revision 30372) +++ ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/service/SterilizationRecordManager.java (.../SterilizationRecordManager.java) (revision 30381) @@ -19,6 +19,7 @@ import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.HighTempSterilizerRecord; import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.LowTempForJohnsonRecord; import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.LowTempSterilizerRecord; +import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.OneOfGetingeSterilizerRecord; import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.SterilizerRecord; import com.forgon.disinfectsystem.sterilizationmanager.sterilizationrecord.vo.SterilizationRecordPrintTousseItem; import com.forgon.disinfectsystem.vo.SimpleInfoVo; @@ -540,4 +541,12 @@ */ public int getSterilerRecordsCount(String devInterfaceId, String machineNo, Date startDate); + /** + * 获取机器号相等且灭菌开始时间上下不超过10分钟的低温灭菌炉参数记录 + * @param machineNo 机器号(文件的设备编号=灭菌炉机器号) + * @param startDate 灭菌记录的开始日期 + * @return + */ + public OneOfGetingeSterilizerRecord getOneOfGetingeSterilizerRecordSterilizerRecord(String machineNo, Date startDate); + }