Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/sterilizationmanager/sterilizerrecord/CaspStageDetails.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/sterilizationmanager/sterilizerrecord/CaspStageDetails.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/sterilizationmanager/sterilizerrecord/CaspStageDetails.java (revision 33560) @@ -0,0 +1,103 @@ +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 javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; + +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; +/** + * 凯斯普CASP-120参数的阶段详情表 + * @author zc.li + * @date 2022-04-06 + */ +@Entity +@DynamicInsert(false) +@DynamicUpdate(true) +@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) +public class CaspStageDetails { + private Long id; + /** + * 结束时间 + */ + private Date endTime; + /** + * 结束时温度 + */ + private Double endTemperature; + /** + * 结束时压强 + */ + private Integer endPressure; + /** + * 阶段名称 + */ + private String StageName; + /** + * 所属低温灭菌炉记录 + */ + private CaspSterilizerRecord caspSterilizerRecord; + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + @ManyToOne + @JoinColumn(name = "caspSterilizerRecord_id") + public CaspSterilizerRecord getCaspSterilizerRecord() { + return caspSterilizerRecord; + } + + public void setLowTempSterilizerRecord( + CaspSterilizerRecord caspSterilizerRecord) { + this.caspSterilizerRecord = caspSterilizerRecord; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Double getEndTemperature() { + return endTemperature; + } + + public void setEndTemperature(Double endTemperature) { + this.endTemperature = endTemperature; + } + + public Integer getEndPressure() { + return endPressure; + } + + public void setEndPressure(Integer endPressure) { + this.endPressure = endPressure; + } + + public void setCaspSterilizerRecord(CaspSterilizerRecord caspSterilizerRecord) { + this.caspSterilizerRecord = caspSterilizerRecord; + } + + public String getStageName() { + return StageName; + } + + public void setStageName(String stageName) { + StageName = stageName; + } + +} Index: ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/service/SterilizationRecordManagerImpl.java =================================================================== diff -u -r33297 -r33560 --- ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/service/SterilizationRecordManagerImpl.java (.../SterilizationRecordManagerImpl.java) (revision 33297) +++ ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/service/SterilizationRecordManagerImpl.java (.../SterilizationRecordManagerImpl.java) (revision 33560) @@ -87,6 +87,8 @@ import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizationrecord.SterilizationInterruptRecord; import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizationrecord.SterilizationRecord; import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizationrecord.SterilizationRecordPic; +import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.CaspStageDetails; +import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.CaspSterilizerRecord; import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.HighTempSterilizerRecord; import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.LowTempForJohnsonRecord; import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.LowTempSterilizerRecord; @@ -7048,8 +7050,230 @@ } return result; } - @Override + public JSONObject getCaspSterilizerRecordEChartData( + SterilizationRecord sterilizationRecord) { + JSONObject rueslt = new JSONObject(); + CaspSterilizerRecord caspSterilizerRecord = (CaspSterilizerRecord)objectDao.getBySql(CaspSterilizerRecord.class.getSimpleName() + , " where po.sterilizationRecord.id =" + + sterilizationRecord.getId()); + if(caspSterilizerRecord != null){ + //rueslt.put("sterilizationUser", sterilizationRecord.getSterilizationUser()); + //把数据库数据转为显示的数据 + rueslt.put("machineNumber", caspSterilizerRecord.getMachineNumber()); + //运行次数显示五位数 位数不够就补0 例如 00008 + rueslt.put("cycleCounter", getCycleCounterStr(caspSterilizerRecord.getCycleCounter())); + + //灭菌日期 例如20210909 + SimpleDateFormat sterilizationDateSdf = new SimpleDateFormat("yyyyMMdd"); + rueslt.put("sterilizationDate", sterilizationDateSdf.format(caspSterilizerRecord.getStartDate())); + //运行模式 + rueslt.put("runningMode", getRunningModeStr(caspSterilizerRecord.getRunningMode())); + + rueslt.put("perhydrolConcentration", caspSterilizerRecord.getPerhydrolConcentration()); + rueslt.put("plasmaPowerSupply", caspSterilizerRecord.getPlasmaPowerSupply()); + //注液量 例如4.5毫升*2 + rueslt.put("infusionVolume", getInfusionVolumeStr(caspSterilizerRecord.getInfusionVolume())); + //开始时间和结束时间 例如 12:18:45 + SimpleDateFormat startDateAndEndDateSdf = new SimpleDateFormat("HH:mm:ss"); + rueslt.put("startDate", startDateAndEndDateSdf.format(caspSterilizerRecord.getStartDate())); + rueslt.put("endDate", startDateAndEndDateSdf.format(caspSterilizerRecord.getEndDate())); + //运行时长 + if(StringUtils.isNotBlank(caspSterilizerRecord.getRunTime())){ + int len = caspSterilizerRecord.getRunTime().length(); + if(len == 3){ + rueslt.put("runTime", caspSterilizerRecord.getRunTime().substring(0, 1) + "分" + caspSterilizerRecord.getRunTime().substring(0, 2) + "秒"); + }else if(len == 4){ + rueslt.put("runTime", caspSterilizerRecord.getRunTime().substring(0, 2) + "分" + caspSterilizerRecord.getRunTime().substring(0, 2) + "秒"); + }else if(len == 5){ + rueslt.put("runTime", caspSterilizerRecord.getRunTime().substring(0, 3) + "分" + caspSterilizerRecord.getRunTime().substring(0, 2) + "秒"); + }else{ + rueslt.put("runTime", caspSterilizerRecord.getRunTime()); + } + } + //0:灭菌成功、1:灭菌失败 + if("0".equals(caspSterilizerRecord.getRunStatus())){ + rueslt.put("runStatus", "正常"); + rueslt.put("resultInfo", "灭菌结束,物理监测合格!"); + }else{ + rueslt.put("runStatus", "未知的运行状态" + caspSterilizerRecord.getRunStatus()); + } + + rueslt.put("alarmInformation", getAlarmInformationStr(caspSterilizerRecord.getAlarmInformation())); + List caspStageDetailsListList = caspSterilizerRecord.getCaspStageDetailsList(); + int size = caspStageDetailsListList.size(); + for (int j = 0; j < size; j++) { + CaspStageDetails caspStageDetails = caspStageDetailsListList.get(j); + rueslt.put(getStageName(j, size), "结束时间: " + + startDateAndEndDateSdf.format(caspStageDetails.getEndTime()) + + " 结束时压强: " + + getEndPressureStr(caspStageDetails.getEndPressure()) + + "Pa 结束时温度: " + + caspStageDetails.getEndTemperature() + + "°C"); + } + JSONArray timeArr = new JSONArray(); + JSONArray endPressureArr = new JSONArray(); + JSONArray endTemperatureArr = new JSONArray(); + SimpleDateFormat dateCharSdf = new SimpleDateFormat("HH:mm"); + for (CaspStageDetails record : caspStageDetailsListList) { + endPressureArr.add(record.getEndPressure()); + endTemperatureArr.add(record.getEndTemperature()); + timeArr.add(startDateAndEndDateSdf.format(record.getEndTime())); + } + rueslt.put("endPressureArr", endPressureArr); + rueslt.put("endTemperatureArr", endTemperatureArr); + rueslt.put("timeArr", timeArr); + } + return rueslt; + } + private String getEndPressureStr(Integer endPressure){ + String endPressureStr = endPressure + ""; + if(endPressureStr.length() < 4){ + int len = 4 - endPressureStr.length(); + if(len == 1){ + endPressureStr = "0" + endPressureStr; + }else if(len == 2){ + endPressureStr = "00" + endPressureStr; + }else if(len == 3){ + endPressureStr = "000" + endPressureStr; + } + } + return endPressureStr; + } + private String getStageName(int i, int size){ + if(size == 15){ + i++; + } + if(i == 0){ + return "preheat";//预热 + }else if(i == 1){ + return "vacuumPumping";//抽真空 + }else if(i == 2){ + return "takeLiquid";//取液 + }else if(i == 3){ + return "liquidInjection";//注液 + }else if(i == 4){ + return "spread";//扩散 + }else if(i == 5){ + return "prePlasma";//预等离子 + }else if(i == 6){ + return "plasma";//等离子 + }else if(i == 7){ + return "takeLiquid2";//取液 + }else if(i == 8){ + return "liquidInjection2";//注液 + }else if(i == 9){ + return "spread2";//扩散 + }else if(i == 10){ + return "prePlasma2";//预等离子 + }else if(i == 11){ + return "plasma2";//等离子 + }else if(i == 12){ + return "inflation";//充气 + }else if(i == 13){ + return "vacuumPumping2";//抽真空 + }else if(i == 14){ + return "plasma3";//等离子 + }else if(i == 15){ + return "inflation2";//充气 + } + return "未知的"; + } + /** + * 获取报警信息 + * 0:无报警、1:开门报警、2:关门报警、3:真空泵报警、4:注液阀报警 + * 5:充气阀报警、6:射频源报警、7:设备温度过高、8:灭菌室水份大 + * 9:过氧化氢浓度过低、10:设备温度过低、11:取液报警 + * @param alarmInformation + * @return + */ + private String getAlarmInformationStr(String alarmInformation){ + if(StringUtils.isBlank(alarmInformation)){ + return ""; + }else if("0".equals(alarmInformation)){ + return "无"; + }else if("1".equals(alarmInformation)){ + return "开门报警"; + }else if("2".equals(alarmInformation)){ + return "关门报警"; + }else if("3".equals(alarmInformation)){ + return "真空泵报警"; + }else if("4".equals(alarmInformation)){ + return "注液阀报警"; + }else if("5".equals(alarmInformation)){ + return "充气阀报警"; + }else if("6".equals(alarmInformation)){ + return "射频源报警"; + }else if("7".equals(alarmInformation)){ + return "设备温度过高"; + }else if("8".equals(alarmInformation)){ + return "灭菌室水份大"; + }else if("9".equals(alarmInformation)){ + return "过氧化氢浓度过低"; + }else if("10".equals(alarmInformation)){ + return "设备温度过低"; + }else if("11".equals(alarmInformation)){ + return "取液报警"; + }else{ + return alarmInformation; + } + } + /** + * 获取注液量显示 + * @param infusionVolume 注液量 + * @return + */ + private String getInfusionVolumeStr(String infusionVolume){ + if(StringUtils.isBlank(infusionVolume)){ + return ""; + }else if(infusionVolume.contains("mL")){ + infusionVolume = infusionVolume.replace("mL", "毫升"); + }else if(infusionVolume.contains("L")){ + infusionVolume = infusionVolume.replace("L", "升"); + } + infusionVolume = infusionVolume.replace("x", " x "); + return infusionVolume + "次"; + } + /** + * 获取运行模式值对应的中文意思 + * @param runningMode 运行模式值 + * @return + */ + private String getRunningModeStr(String runningMode){ + if("0".equals(runningMode)){ + return "未选择模式"; + }else if("1".equals(runningMode)){ + return "快速模式"; + }else if("2".equals(runningMode)){ + return "标准模式"; + }else if("3".equals(runningMode)){ + return "加强模式"; + } + return "未知模式"; + } + /** + * 循环次数显示五位数 位数不够就补0 + * @param cycleCounter 循环次数 + * @return + */ + private String getCycleCounterStr(Integer cycleCounter){ + String cycleCounterStr = cycleCounter + ""; + if(cycleCounterStr.length() < 5){ + int len = 5 - cycleCounterStr.length(); + if(len == 1){ + cycleCounterStr = "0" + cycleCounterStr; + }else if(len == 2){ + cycleCounterStr = "00" + cycleCounterStr; + }else if(len == 3){ + cycleCounterStr = "000" + cycleCounterStr; + }else if(len == 4){ + cycleCounterStr = "0000" + cycleCounterStr; + } + } + return cycleCounterStr; + } + @Override public List promptUploadDeviceParameterPicture() { List warningVoList = new ArrayList(); Boolean enablePromptUploadDeviceParameterPicture = ConfigUtils.getSystemSetConfigByNameBool("enablePromptUploadDeviceParameterPicture"); Index: ssts-web/src/main/webapp/disinfectsystem/sterilizationmanager/sterilizerRecord/caspSterilizerRecordLineChart.jsp =================================================================== diff -u --- ssts-web/src/main/webapp/disinfectsystem/sterilizationmanager/sterilizerRecord/caspSterilizerRecordLineChart.jsp (revision 0) +++ ssts-web/src/main/webapp/disinfectsystem/sterilizationmanager/sterilizerRecord/caspSterilizerRecordLineChart.jsp (revision 33560) @@ -0,0 +1,403 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ page import="com.forgon.tools.SpringBeanManger,org.jfree.data.general.DefaultPieDataset,org.jfree.chart.ChartFactory,org.jfree.chart.JFreeChart,org.jfree.chart.servlet.*,com.forgon.disinfectsystem.sterilizationmanager.sterilizerrecord.action.SterilizerRecordLineChartAction" %> +<%@ page import="com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizationrecord.SterilizationRecord"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + + + + + 灭菌炉运行参数 + + + + <%-- --%> + + + + + + + + + + + + + + + + + + + + +

+ + +

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + + + + + +
+ + \ No newline at end of file Index: ssts-web/src/main/webapp/disinfectsystem/sterilizationmanager/sterilizationrecord/sterilizationRecordView.js =================================================================== diff -u -r33363 -r33560 --- ssts-web/src/main/webapp/disinfectsystem/sterilizationmanager/sterilizationrecord/sterilizationRecordView.js (.../sterilizationRecordView.js) (revision 33363) +++ ssts-web/src/main/webapp/disinfectsystem/sterilizationmanager/sterilizationrecord/sterilizationRecordView.js (.../sterilizationRecordView.js) (revision 33560) @@ -1099,6 +1099,9 @@ function openLowTempForJohnsonSterilizerRecordLineChart(id, sterilizerName) { openModalWindowForExt(WWWROOT + '/disinfectsystem/sterilizationmanager/sterilizerRecord/lowTempForJohnsonSterilizerLineChart.jsp?sterilizationRecordId=' + id + '&sterilizerName=' + encodeURI(sterilizerName), '', '灭菌炉运行参数', '1050', '550'); } +function openCaspSterilizerRecordLineChart(id, sterilizerName) { + openModalWindowForExt(WWWROOT + '/disinfectsystem/sterilizationmanager/sterilizerRecord/caspSterilizerRecordLineChart.jsp?sterilizationRecordId=' + id + '&sterilizerName=' + encodeURI(sterilizerName), '', '灭菌炉运行参数', '1050', '550'); +} function openLowSterilizerLineChartSterilizationParaType4(id, sterilizerName){ openModalWindowForExt(WWWROOT + '/disinfectsystem/sterilizationmanager/sterilizerRecord/lowSterilizerLineChartSterilizationParaType4.jsp?sterilizationRecordId=' + id + '&sterilizerName=' + encodeURI(sterilizerName), '', '灭菌炉运行参数', '1050', '550'); } @@ -1204,7 +1207,9 @@ buttonGroup += ""; }else if (record.data.sterilizationParaType == 4) { buttonGroup += ""; - } else { + }else if(record.data.sterilizationParaType == 5){ + buttonGroup += ""; + }else { buttonGroup += ""; } if(record.data.isExist){ Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/sterilizationmanager/sterilizationrecord/SterilizationRecord.java =================================================================== diff -u -r33062 -r33560 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/sterilizationmanager/sterilizationrecord/SterilizationRecord.java (.../SterilizationRecord.java) (revision 33062) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/sterilizationmanager/sterilizationrecord/SterilizationRecord.java (.../SterilizationRecord.java) (revision 33560) @@ -362,6 +362,7 @@ public static final Integer STERILIZATIONPARATYPE_HIGH = 2;//高温 public static final Integer STERILIZATIONPARATYPE_LOWOFJOHNSON = 3;//强生低温 public static final Integer STERILIZATIONPARATYPE_HSONE = 4;//阶段灭菌HS6620 + public static final Integer STERILIZATIONPARATYPE_CASP120 = 5;//casp-120 /** * 灭菌参数获取类型(不同类型获取的数据不一样,处理方式不一样) */ Index: ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/service/SterilizationRecordManager.java =================================================================== diff -u -r33062 -r33560 --- ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/service/SterilizationRecordManager.java (.../SterilizationRecordManager.java) (revision 33062) +++ ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/service/SterilizationRecordManager.java (.../SterilizationRecordManager.java) (revision 33560) @@ -16,6 +16,7 @@ import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizationrecord.SterilizationInterruptRecord; import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizationrecord.SterilizationRecord; import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizationrecord.SterilizationRecordPic; +import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.CaspSterilizerRecord; import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.HighTempSterilizerRecord; import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.LowTempForJohnsonRecord; import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.LowTempSterilizerRecord; @@ -545,8 +546,13 @@ * @return */ public OneOfGetingeSterilizerRecord getOneOfGetingeSterilizerRecordSterilizerRecord(String machineNo, Date startDate); - /** + * 获取casp-120数据 + * @param sterilizationRecord 灭菌记录 + * @return + */ + public JSONObject getCaspSterilizerRecordEChartData(SterilizationRecord sterilizationRecord); + /** * 提示上传设备物理参数图片(SZYK-27) * @return */ Index: ssts-maintain/src/main/java/com/forgon/disinfectsystem/maintain/device/service/CaspDataManagerImpl.java =================================================================== diff -u --- ssts-maintain/src/main/java/com/forgon/disinfectsystem/maintain/device/service/CaspDataManagerImpl.java (revision 0) +++ ssts-maintain/src/main/java/com/forgon/disinfectsystem/maintain/device/service/CaspDataManagerImpl.java (revision 33560) @@ -0,0 +1,432 @@ +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.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; + +import jcifs.smb.SmbFile; +import net.sf.json.JSONArray; + +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.FTPClient; +import org.apache.commons.net.ftp.FTPFile; +import org.apache.commons.net.ftp.FTPFileFilter; +import org.apache.log4j.Logger; +import org.hibernate.Query; +import org.hibernate.Session; +import org.springframework.integration.smb.session.SmbSession; +import org.springframework.integration.smb.session.SmbShare; +import org.springframework.stereotype.Service; + +import com.forgon.databaseadapter.service.DateQueryAdapter; +import com.forgon.directory.vo.LoginUserData; +import com.forgon.disinfectsystem.common.CssdUtils; +import com.forgon.disinfectsystem.entity.basedatamanager.deviceinterface.DeviceInterface; +import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizationrecord.SterilizationRecord; +import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.CaspStageDetails; +import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.CaspSterilizerRecord; +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.db.DatabaseUtil; +import com.forgon.tools.hibernate.ObjectDao; +import com.forgon.tools.util.ForgonDateUtils; + +/** + * 低温灭菌器数据处理 + */ +@Service("caspDataManagerTarget") +public class CaspDataManagerImpl implements DeviceDataManager { + private ObjectDao objectDao; + private LogManager appLogManager; + private SterilizationRecordManager sterilizationRecordManager; + private FtpFileManager ftpFileManager; + private CommonFileManager commonFileManager; + private DateQueryAdapter dateQueryAdapter; + private static final Logger logger = Logger + .getLogger(LowTemperatureManagerImpl.class); + public void setDateQueryAdapter(DateQueryAdapter dateQueryAdapter) { + this.dateQueryAdapter = dateQueryAdapter; + } + public void setFtpFileManager(FtpFileManager ftpFileManager) { + this.ftpFileManager = ftpFileManager; + } + public void setCommonFileManager(CommonFileManager commonFileManager) { + this.commonFileManager = commonFileManager; + } + public void setSterilizationRecordManager( + SterilizationRecordManager sterilizationRecordManager) { + this.sterilizationRecordManager = sterilizationRecordManager; + } + + public void setObjectDao(ObjectDao objectDao) { + this.objectDao = objectDao; + } + + public void setAppLogManager(LogManager appLogManager) { + this.appLogManager = appLogManager; + } + + /** + * 从接口读取数据和存入数据库 + */ + @Override + public void readAndSaveRecord(DeviceInterface devInterface, + String machineNo, String brand, String isAutoCompleteSterilization, boolean enableDetailedDeviceInformation, LoginUserData loginUserData) { + machineNo = "2"; + 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.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); + 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("casp-data")){ + return true; + } + logger.debug("只处理casp-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 readAmount = 0;//每次遍历接口只读5个文件,避免定时器一个循环的时间处理不完 + //限制读取的天数,默认只读当天(默认会把非读取日期的数据移走,避免文件堆积) + 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 && readAmount < 5; 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("casp-data"))){ + continue; + } + smbForm = session.createSmbFileObject(rootPath + File.separator + name); + if(smbForm == null || smbForm.isDirectory()){ + continue; + } + } + if(sdfToday.parse(name.substring(10, 18)).before(sdfToday.parse(sdfToday.format(endStartTime)))){ + try{ + commonFileManager.moveFile(remoteType, name, ftp, ftpFileManager.getCurrentPath(ftp), backUpPath, session, smbForm); + }catch(Exception e){ + e.printStackTrace(); + logger.debug(name+"文件在移动和删除过程中发生错误"); + } + continue; + } + readAmount++; + sterilizerDataReadAndSave(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(); + } + } + + } + + /** + * 灭菌炉数据处理, backUpPath, session, smbForm + */ + public JSONArray 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; + 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,"GBK"); + // 读取直到最后一行 + String line = ""; + List caspSterilizerRecordList = new ArrayList(); + CaspSterilizerRecord caspSterilizerRecord = null; + String runDateStr = null; + Set machineNumberCycle = new HashSet(); + SimpleDateFormat sd = new SimpleDateFormat("yyyyMMdd HHmmss"); + + while ((line = br.readLine()) != null) { + line = line.replaceFirst("[|]", ""); + String[] arr = line.split("[|]"); + int j = 1; + for (int i = 0; i < arr.length; i++) { + if(j == 1){ + System.out.println("设备号" + arr[i]); + caspSterilizerRecord = new CaspSterilizerRecord(); + caspSterilizerRecord.setMachineNumber(arr[i]); + }else if(j == 2){ + System.out.println("运行次数" + arr[i]); + if(machineNumberCycle.contains(caspSterilizerRecord.getMachineNumber() + "_" + arr[i])){ + caspSterilizerRecord = null; + }else{ + machineNumberCycle.add(caspSterilizerRecord.getMachineNumber() + "_" + arr[i]); + caspSterilizerRecord.setCycleCounter(Integer.valueOf(arr[i])); + } + }else if(caspSterilizerRecord != null){ + if(j == 3){ + System.out.println("运行日期" + arr[i]); + runDateStr = arr[i]; + }else if(j == 4){ + System.out.println("运行模式" + arr[i]); + caspSterilizerRecord.setRunningMode(arr[i]); + }else if(j == 5){ + System.out.println("空载时过氧化氢浓度" + arr[i]); + caspSterilizerRecord.setPerhydrolConcentration(arr[i]); + }else if(j == 6){ + System.out.println("等离子体电源功率" + arr[i]); + caspSterilizerRecord.setPlasmaPowerSupply(arr[i]); + }else if(j == 7){ + System.out.println("注液量" + arr[i]); + caspSterilizerRecord.setInfusionVolume(arr[i]); + }else if(j == 8){ + System.out.println("开始时间" + arr[i]); + + caspSterilizerRecord.setStartDate(sd.parse(runDateStr + " " + arr[i])); + }else if(j == 9){ + System.out.println("结束时间" + arr[i]); + caspSterilizerRecord.setEndDate(sd.parse(runDateStr + " " + arr[i])); + }else if(j == 10){ + System.out.println("运行时长" + arr[i]); + caspSterilizerRecord.setRunTime(arr[i]); + }else if(j == 11){ + System.out.println("运行状态" + arr[i]); + caspSterilizerRecord.setRunStatus(arr[i]); + }else if(j == 12){ + System.out.println("报警信息" + arr[i]); + caspSterilizerRecord.setAlarmInformation(arr[i]); + }else if(j == 13){ + System.out.println("详细信息部分" + arr[i]); + String[] array = arr[i].split("(?<=\\G..............)"); + for (int k = 0; k < array.length; k++) { + String kStr = array[k]; + String dateStr = runDateStr + " " + kStr.substring(0,5); + CaspStageDetails caspStageDetails = new CaspStageDetails(); + caspStageDetails.setEndTime(sd.parse(dateStr)); + caspStageDetails.setStageName(getStageName(k, array.length)); + caspStageDetails.setEndTemperature(Double.valueOf(kStr.substring(10, 14))); + caspStageDetails.setEndPressure(Integer.valueOf(kStr.substring(6, 10))); + caspStageDetails.setCaspSterilizerRecord(caspSterilizerRecord); + caspSterilizerRecord.getCaspStageDetailsList().add(caspStageDetails); + } + } + } + if(j == 13){ + j = 1;//重置 + if(caspSterilizerRecord != null){ + caspSterilizerRecordList.add(caspSterilizerRecord); + } + }else{ + j++; + } + } + } + if(CollectionUtils.isNotEmpty(caspSterilizerRecordList)){ + System.out.println(caspSterilizerRecordList.size()); + removeIncompleteData(caspSterilizerRecordList, enableDetailedDeviceInformation, loginUserData); + objectDao.batchSaveOrUpdate(caspSterilizerRecordList); + } + } 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; + } + public String getStageName(Integer i, int length){ + if(length == 15){ + i ++; + } + if(i == 0){ + return "预热"; + }else if(i == 1){ + return "抽真空"; + }else if(i == 2){ + return "取液"; + }else if(i == 3){ + return "注液"; + }else if(i == 4){ + return "扩散"; + }else if(i == 5){ + return "预等离子"; + }else if(i == 6){ + return "等离子"; + }else if(i == 7){ + return "取液"; + }else if(i == 8){ + return "注液"; + }else if(i == 9){ + return "扩散"; + }else if(i == 10){ + return "预等离子"; + }else if(i == 11){ + return "等离子"; + }else if(i == 12){ + return "充气"; + }else if(i == 13){ + return "抽真空"; + }else if(i == 14){ + return "等离子"; + }else if(i == 15){ + return "充气"; + } + return null; + } + /** + * 移除一些数据(现有移除不完整数据;完整数据有灭菌周期) + * @param lowTempSterilizerRecordList + */ + private void removeIncompleteData(List caspSterilizerRecordList, boolean enableDetailedDeviceInformation, LoginUserData loginUserData){ + Iterator it = caspSterilizerRecordList.iterator(); + while(it.hasNext()){ + CaspSterilizerRecord item = it.next(); + if(objectDao.countBySql("select count(*) from " + + CaspSterilizerRecord.class.getSimpleName() + + " where machineNumber='"+ item.getMachineNumber() +"' and cycleCounter=" + item.getCycleCounter()) > 0){ + it.remove(); + }else{//找到对应的灭菌记录 找不到就移除 + boolean result = refreshSterilizaerRecordAmounts(item, enableDetailedDeviceInformation, loginUserData); + if(!result){ + it.remove(); + } + } + } + } + /** + * 更新灭菌记录的温度压力数据获取方式 + */ + public boolean refreshSterilizaerRecordAmounts(CaspSterilizerRecord item, boolean enableDetailedDeviceInformation, LoginUserData loginUserData) { + boolean result = false; + try { + Date startDate = item.getStartDate(); + String machineNo = item.getMachineNumber(); + Date beginStartTime = new Date(startDate.getTime() - 5*60*1000); + Date endStartTime = new Date(startDate.getTime() + 5*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 " + dateQueryAdapter.dateAreaSql("sr.startDate", beginStartTimeStr, endStartTimeStr, false); + Session session = objectDao.getHibernateSession(); + Query query = session.createQuery(queryString); + query.setParameter("machineNumber", machineNo); + Long id = (Long) query.uniqueResult(); + if(enableDetailedDeviceInformation){ + appLogManager.saveLog(loginUserData, Log.MODEL_DEVICE_INTERFACE, Log.TYPE_QUERY, String.format("机器号[%s],需要更新温度压力数据的灭菌记录id[%s]",machineNo,id)); + } + if (DatabaseUtil.isPoIdValid(id)){ + //灭菌记录的的温度压力数据获取方式 + SterilizationRecord sterilizationRecord = sterilizationRecordManager.get(id); + sterilizationRecord.setSterilizationParaType(SterilizationRecord.STERILIZATIONPARATYPE_CASP120); + objectDao.saveOrUpdate(sterilizationRecord); + item.setSterilizationRecord(sterilizationRecord); + result = true; + } + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + /** + * 数据处理结束之后的工作,移动文件夹等等 + */ + @Override + public void end() { + + } +} Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/deviceinterface/DeviceInterface.java =================================================================== diff -u -r32077 -r33560 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/deviceinterface/DeviceInterface.java (.../DeviceInterface.java) (revision 32077) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/deviceinterface/DeviceInterface.java (.../DeviceInterface.java) (revision 33560) @@ -79,6 +79,15 @@ */ public static final String JOHNSON = "Johnson"; /** + * 凯斯普CASP + */ + public static final String KPS_CASP = "凯斯普CASP"; + + /** + * 凯斯普 CASP-120 + */ + public static final String KPS_CASP_120 = "CASP-120"; + /** * 强生 型号STERRAD 100S */ public static final String JOHNSON_MODEL_STERRAD_100S = "STERRAD 100S"; Index: ssts-maintain/src/main/java/com/forgon/disinfectsystem/maintain/device/service/DeviceInterfaceDataProcessImpl.java =================================================================== diff -u -r31518 -r33560 --- ssts-maintain/src/main/java/com/forgon/disinfectsystem/maintain/device/service/DeviceInterfaceDataProcessImpl.java (.../DeviceInterfaceDataProcessImpl.java) (revision 31518) +++ ssts-maintain/src/main/java/com/forgon/disinfectsystem/maintain/device/service/DeviceInterfaceDataProcessImpl.java (.../DeviceInterfaceDataProcessImpl.java) (revision 33560) @@ -116,6 +116,10 @@ appLogManager.saveLog(loginUserData, Log.MODEL_DEVICE_INTERFACE, Log.TYPE_QUERY, "暂不支持的灭菌炉型号:" + devInterface.getDeviceModel()); } break; + case DeviceInterface.KPS_CASP: + dm = (DeviceDataManager) SpringBeanManger.getBean("caspDataManagerImpl"); + dm.readAndSaveRecord(devInterface,st.getMachineNumber(),DeviceInterface.KPS_CASP,st.getIsAutoCompleteSterilization(),enableDetailedDeviceInformation,loginUserData); + break; default: if(enableDetailedDeviceInformation){ appLogManager.saveLog(loginUserData, Log.MODEL_DEVICE_INTERFACE, Log.TYPE_QUERY, "暂不支持的灭菌炉品牌:" + devInterface.getDeviceBrand()); Index: ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizerrecord/action/SterilizerRecordLineChartAction.java =================================================================== diff -u -r30381 -r33560 --- ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizerrecord/action/SterilizerRecordLineChartAction.java (.../SterilizerRecordLineChartAction.java) (revision 30381) +++ ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizerrecord/action/SterilizerRecordLineChartAction.java (.../SterilizerRecordLineChartAction.java) (revision 33560) @@ -16,6 +16,7 @@ import com.forgon.directory.acegi.tools.AcegiHelper; import com.forgon.disinfectsystem.entity.basedatamanager.deviceinterface.DeviceInterface; import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizationrecord.SterilizationRecord; +import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.CaspSterilizerRecord; import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.HighTempStageDetails; import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.HighTempSterilizerRecord; import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.LowTempForJohnsonStageDetails; @@ -337,6 +338,21 @@ e.printStackTrace(); } } + public void getSterilizerRecordEChartData(){ + Long sterilizationRecordId = StrutsParamUtils.getPraramLongValue("sterilizationRecordId", 0L); + String deviceInterfaceType = StrutsParamUtils.getPraramValue("deviceInterfaceType", null); + JSONObject rueslt = null; + try { + SterilizationRecord sterilizationRecord = sterilizationRecordManager.getSterilizationRecordById(sterilizationRecordId); + if(DeviceInterface.KPS_CASP_120.equals(deviceInterfaceType)){ + rueslt = sterilizationRecordManager.getCaspSterilizerRecordEChartData(sterilizationRecord); + } + StrutsResponseUtils.output(true, rueslt); + } catch (Exception e) { + StrutsResponseUtils.output(false ,e.getMessage()); + e.printStackTrace(); + } + } /** * 返回 洁定HS6620 echart曲线数据 */ Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/sterilizationmanager/sterilizerrecord/CaspSterilizerRecord.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/sterilizationmanager/sterilizerrecord/CaspSterilizerRecord.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/sterilizationmanager/sterilizerrecord/CaspSterilizerRecord.java (revision 33560) @@ -0,0 +1,212 @@ +package com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord; + +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +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; +/** + * 凯斯普CASP-120参数记录表 + * @author zc.li + * @date 2022-04-06 + */ +@Entity +@DynamicInsert(false) +@DynamicUpdate(true) +@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) +public class CaspSterilizerRecord { + private Long id; + /** + * 设备编号 + */ + private String machineNumber; + /** + * 开始时间 + */ + private Date startDate; + /** + * 结束时间 + */ + private Date endDate; + /** + * 运行次数 + */ + private Integer cycleCounter; + /** + * 运行模式 0:未选择模式、1:快速模式、2:标准模式、3:加强模式 + */ + private String runningMode; + /** + * 空载时过氧化氢浓度 + */ + private String perhydrolConcentration; + /** + * 等离子体电源功率 + */ + private String plasmaPowerSupply; + /** + * 注液量 + */ + private String infusionVolume; + /** + * 运行时长 + */ + private String runTime; + /** + * 运行状态 0正常 + */ + private String runStatus; + /** + * 报警信息 0:无报警、1:开门报警、2:关门报警、3:真空泵报警、4:注液阀报警 + * 5:充气阀报警、6:射频源报警、7:设备温度过高、8:灭菌室水份大 + * 9:过氧化氢浓度过低、10:设备温度过低、11:取液报警 + */ + private String alarmInformation; + + /** + * 对应的灭菌记录 + */ + private SterilizationRecord sterilizationRecord; + /** + * 阶段详情信息 + */ + private List caspStageDetailsList = new ArrayList(); + + Map stageNameMap = new HashMap(); + @OneToMany(fetch = FetchType.LAZY, mappedBy="caspSterilizerRecord") + @Cascade(value = { org.hibernate.annotations.CascadeType.SAVE_UPDATE }) + @OrderBy("id asc") + public List getCaspStageDetailsList() { + return caspStageDetailsList; + } + + public void setCaspStageDetailsList(List caspStageDetailsList) { + this.caspStageDetailsList = caspStageDetailsList; + } + + @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 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 Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public Integer getCycleCounter() { + return cycleCounter; + } + + public void setCycleCounter(Integer cycleCounter) { + this.cycleCounter = cycleCounter; + } + + public String getRunningMode() { + return runningMode; + } + + public void setRunningMode(String runningMode) { + this.runningMode = runningMode; + } + + public String getPerhydrolConcentration() { + return perhydrolConcentration; + } + + public void setPerhydrolConcentration(String perhydrolConcentration) { + this.perhydrolConcentration = perhydrolConcentration; + } + + public String getPlasmaPowerSupply() { + return plasmaPowerSupply; + } + + public void setPlasmaPowerSupply(String plasmaPowerSupply) { + this.plasmaPowerSupply = plasmaPowerSupply; + } + + public String getInfusionVolume() { + return infusionVolume; + } + + public void setInfusionVolume(String infusionVolume) { + this.infusionVolume = infusionVolume; + } + + public String getRunTime() { + return runTime; + } + + public void setRunTime(String runTime) { + this.runTime = runTime; + } + + public String getRunStatus() { + return runStatus; + } + + public void setRunStatus(String runStatus) { + this.runStatus = runStatus; + } + + public String getAlarmInformation() { + return alarmInformation; + } + + public void setAlarmInformation(String alarmInformation) { + this.alarmInformation = alarmInformation; + } +}