Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/sterilizationmanager/sterilizerrecord/SenohStageDetails.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/sterilizationmanager/sterilizerrecord/SenohStageDetails.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/sterilizationmanager/sterilizerrecord/SenohStageDetails.java (revision 33731) @@ -0,0 +1,119 @@ +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; +/** + * 千樱灭菌炉SCM-D/JSB(1.5)参数记录表 + * @author 周培勉 + * @date 2022-05-06 + */ +@Entity +@DynamicInsert(false) +@DynamicUpdate(true) +@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) +public class SenohStageDetails { + + private Long id; + + /** + * 数据产生时间 + */ + private Date time; + + /** + * 阶段名称 + */ + private String stageName; + + /** + * 压力 + */ + private Double press; + + /** + * 温度1 + */ + private Double t1Temp; + + /** + * 温度2 + */ + private Double t2Temp; + + /** + * 灭菌炉数据 + */ + private SenohSterilizerRecord senohSterilizerRecord; + + @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 Date getTime() { + return time; + } + + public void setTime(Date time) { + this.time = time; + } + + public Double getPress() { + return press; + } + + public void setPress(Double press) { + this.press = press; + } + + public Double getT1Temp() { + return t1Temp; + } + + public void setT1Temp(Double t1Temp) { + this.t1Temp = t1Temp; + } + + public Double getT2Temp() { + return t2Temp; + } + + public void setT2Temp(Double t2Temp) { + this.t2Temp = t2Temp; + } + + @ManyToOne + @JoinColumn(name = "senohSterilizerRecord_id") + public SenohSterilizerRecord getSenohSterilizerRecord() { + return senohSterilizerRecord; + } + + public void setSenohSterilizerRecord(SenohSterilizerRecord senohSterilizerRecord) { + this.senohSterilizerRecord = senohSterilizerRecord; + } + +} Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/sterilizationmanager/sterilizerrecord/SenohSterilizerRecord.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/sterilizationmanager/sterilizerrecord/SenohSterilizerRecord.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/sterilizationmanager/sterilizerrecord/SenohSterilizerRecord.java (revision 33731) @@ -0,0 +1,132 @@ +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; + +/** + * 千樱灭菌炉SCM-D/JSB(1.5)参数记录表 + * @author 周培勉 + * @date 2022-05-06 + */ +@Entity +@DynamicInsert(false) +@DynamicUpdate(true) +@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) +public class SenohSterilizerRecord { + + private Long id; + + /** + * 设备编号 + */ + private String machineNumber; + + /** + * 启动时间 + */ + private Date startDate; + + /** + * 结束时间 + */ + private Date endDate; + /** + * 流水号 + */ + private String serialNumber; + /** + * 运行程序 + */ + private String runProgram; + /** + * 各个时间点对应的压力及温度明细 + */ + private List senohStageDetails = new ArrayList(); + + /** + * 对应的灭菌记录 + */ + private 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; + } + + @OneToMany(fetch = FetchType.LAZY, mappedBy="senohSterilizerRecord") + @Cascade(value = { org.hibernate.annotations.CascadeType.SAVE_UPDATE }) + @OrderBy("id asc") + public List getSenohStageDetails() { + return senohStageDetails; + } + + public void setSenohStageDetails(List senohStageDetails) { + this.senohStageDetails = senohStageDetails; + } + + @OneToOne + @Cascade(value = { CascadeType.SAVE_UPDATE, CascadeType.DELETE }) + @JoinColumn(name = "SterilizationRecordId", referencedColumnName = "id") + public SterilizationRecord getSterilizationRecord() { + return sterilizationRecord; + } + + public void setSterilizationRecord(SterilizationRecord sterilizationRecord) { + this.sterilizationRecord = sterilizationRecord; + } + public String getSerialNumber() { + return serialNumber; + } + public void setSerialNumber(String serialNumber) { + this.serialNumber = serialNumber; + } + public String getRunProgram() { + return runProgram; + } + public void setRunProgram(String runProgram) { + this.runProgram = runProgram; + } + +} Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/deviceinterface/DeviceInterface.java =================================================================== diff -u -r33560 -r33731 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/deviceinterface/DeviceInterface.java (.../DeviceInterface.java) (revision 33560) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/deviceinterface/DeviceInterface.java (.../DeviceInterface.java) (revision 33731) @@ -61,6 +61,14 @@ public static final String MARGE = "Marge"; /** + * 千樱 + */ + public static final String SENOH = "千樱"; + /** + * 千樱的一种设备型号 + */ + public static final String GETINGETYPE_SENOH_SCM_D_JSB15 = "SCM-D/JSB(1.5)"; + /** * 美雅洁,设备型号:120 */ public static final String MARGE_MODEL_120 = "120"; Index: build.gradle =================================================================== diff -u -r33708 -r33731 --- build.gradle (.../build.gradle) (revision 33708) +++ build.gradle (.../build.gradle) (revision 33731) @@ -593,7 +593,11 @@ compile group: 'ws.schild', name: 'jave-nativebin-win64', version:'2.7.1' compile group: 'ws.schild', name: 'jave-nativebin-linux64', version:'2.7.1' compile group: 'ws.schild', name: 'jave-nativebin-osx64', version:'2.7.1' - + + //与西门子PLC S7-1200通讯的程序 + compile group: 'com.github.s7connector', name: 's7connector', version: '2.1' + compile group: 'si.trina', name: 'moka7-live', version: '0.0.13' + } // 文件夹的名字必须用斜线结果,否则创建该文件夹不成功 Index: ssts-web/src/main/webapp/disinfectsystem/config/xjjqzyy/spring/applicationContext-PLC-S7-1200.xml =================================================================== diff -u --- ssts-web/src/main/webapp/disinfectsystem/config/xjjqzyy/spring/applicationContext-PLC-S7-1200.xml (revision 0) +++ ssts-web/src/main/webapp/disinfectsystem/config/xjjqzyy/spring/applicationContext-PLC-S7-1200.xml (revision 33731) @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/sterilizationmanager/sterilizationrecord/SterilizationRecord.java =================================================================== diff -u -r33560 -r33731 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/sterilizationmanager/sterilizationrecord/SterilizationRecord.java (.../SterilizationRecord.java) (revision 33560) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/sterilizationmanager/sterilizationrecord/SterilizationRecord.java (.../SterilizationRecord.java) (revision 33731) @@ -363,6 +363,7 @@ public static final Integer STERILIZATIONPARATYPE_LOWOFJOHNSON = 3;//强生低温 public static final Integer STERILIZATIONPARATYPE_HSONE = 4;//阶段灭菌HS6620 public static final Integer STERILIZATIONPARATYPE_CASP120 = 5;//casp-120 + public static final Integer STERILIZATIONPARATYPE_SENOH = 6;//千樱脉动真空灭菌器(PLC型号S7-1200) /** * 灭菌参数获取类型(不同类型获取的数据不一样,处理方式不一样) */ Index: ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizerrecord/service/SenohSterilizerRecordManagerImpl.java =================================================================== diff -u --- ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizerrecord/service/SenohSterilizerRecordManagerImpl.java (revision 0) +++ ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizerrecord/service/SenohSterilizerRecordManagerImpl.java (revision 33731) @@ -0,0 +1,262 @@ +package com.forgon.disinfectsystem.sterilizationmanager.sterilizerrecord.service; + +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.lang.StringUtils; + +import com.forgon.disinfectsystem.entity.basedatamanager.deviceinterface.DeviceInterface; +import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.SenohStageDetails; +import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.SenohSterilizerRecord; +import com.forgon.tools.hibernate.BasePoManagerImpl; +import com.github.s7connector.api.DaveArea; +import com.github.s7connector.api.S7Connector; +import com.github.s7connector.api.factory.S7ConnectorFactory; +import com.sourceforge.snap7.moka7.S7; + +/** + * 读取千樱灭菌炉运行参数的接口 + * @author ZhouPeiMian + * @since 2022-05-10 + */ +public class SenohSterilizerRecordManagerImpl extends BasePoManagerImpl implements SenohSterilizerRecordManager { + + @Override + public List readAndSaveSenohStageDetails(DeviceInterface deviceInterface, + SenohSterilizerRecord senohSterilizerRecord) { + String ip = StringUtils.defaultIfEmpty(deviceInterface.getIP(), ""); + Integer port = deviceInterface.getPort(); + if (port == null) { + port = 102; + } + String portStr = port.toString(); + String ipPort = ip + ":" + portStr; + String msg = String + .format("readWashDataFromDeviceInterface,name=%s,ip:port=%s,deviceId=%s", + deviceInterface.getName(), ipPort, + deviceInterface.getId()); + logger.info(msg); + + //灭菌程序类型的map,key=M20.0:表示地址为M20的寄存器,值为0时,灭菌程序为"真空测试程序" + Map sterilizerProgramMap = new HashMap(); + sterilizerProgramMap.put("M20.0", "真空测试程序"); + sterilizerProgramMap.put("M20.1", "热敏负载程序"); + sterilizerProgramMap.put("M20.2", "干燥程序"); + sterilizerProgramMap.put("M20.3", "阮病毒程序"); + sterilizerProgramMap.put("M20.4", "设定2程序"); + sterilizerProgramMap.put("M20.5", "官腔负载程序"); + sterilizerProgramMap.put("M20.6", "正压脉动程序"); + + sterilizerProgramMap.put("M21.0", "辅料程序"); + sterilizerProgramMap.put("M21.1", "常规器械程序"); + sterilizerProgramMap.put("M21.2", "BD程序"); + sterilizerProgramMap.put("M21.3", "PCD程序"); + sterilizerProgramMap.put("M21.4", "设定1程序"); + sterilizerProgramMap.put("M21.5", "重型负载程序"); + sterilizerProgramMap.put("M21.6", "下排程序"); + sterilizerProgramMap.put("M21.7", "液体程序"); + + //行程map + Map stageNameMap = new HashMap(); + stageNameMap.put("M10.0", "真空类准备行程"); + stageNameMap.put("M10.1", "真空类真空行程"); + stageNameMap.put("M10.2", "真空类升温行程"); + stageNameMap.put("M10.3", "真空类灭菌行程"); + stageNameMap.put("M10.4", "真空类排气行程"); + stageNameMap.put("M10.5", "真空类干燥行程"); + stageNameMap.put("M10.6", "真空类结束行程"); + + stageNameMap.put("M11.0", "置换类准备行程"); + stageNameMap.put("M11.1", "置换类置换行程"); + stageNameMap.put("M11.2", "置换类升温行程"); + stageNameMap.put("M11.3", "置换类灭菌行程"); + stageNameMap.put("M11.4", "置换类排气行程"); + stageNameMap.put("M11.5", "置换类结束行程"); + + stageNameMap.put("M12.0", "真空测试准备行程"); + stageNameMap.put("M12.1", "真空测试真空行程"); + stageNameMap.put("M12.2", "真空测试保压行程"); + stageNameMap.put("M12.3", "真空测试回气行程"); + stageNameMap.put("M12.4", "真空测试结束行程"); + stageNameMap.put("M12.5", "真空测试平衡行程"); + + stageNameMap.put("M14.0", "干燥准备行程"); + stageNameMap.put("M14.1", "干燥干燥行程"); + stageNameMap.put("M14.2", "干燥结束行程"); + stageNameMap.put("M14.3", "干燥预干行程"); + + stageNameMap.put("M24.0", "预热标志"); + + try { + SenohStageDetails senohStageDetails = new SenohStageDetails(); + senohStageDetails.setTime(new Date()); + senohStageDetails.setSenohSterilizerRecord(senohSterilizerRecord); + + + /*senohStageDetails.setT1Temp(Double.valueOf(123.4)); + senohStageDetails.setT2Temp(Double.valueOf(567.8)); + senohStageDetails.setPress(Double.valueOf(901.2)); + if(StringUtils.isBlank(senohSterilizerRecord.getRunProgram())){ + senohSterilizerRecord.setRunProgram("正压脉动程序"); + } + senohStageDetails.setStageName("真空类升温行程");*/ + + //Create connection + S7Connector connector = + S7ConnectorFactory + .buildTCPConnector() + .withPort(port) + .withHost(ip) + .withRack(0) //optional + .withSlot(1) //optional + .build(); + + //区块编号 + int areaNumber = 1; + + //内室温度PT1(DB1,0,4) + byte[] bs = null; + try { + bs = connector.read(DaveArea.DB, areaNumber, 24, 0); + } catch (Exception e) { + logger.debug("读取DB1异常:" + e.getMessage()); + } + if(bs == null || bs.length == 0){ + return null; + } + byte[] tempBs = new byte[4]; + System.arraycopy(bs, 0, tempBs, 0, 4); + float t1Temp = S7.GetFloatAt(tempBs, 0); + senohStageDetails.setT1Temp(Double.valueOf(t1Temp + "")); + logger.debug("内室温度PT1(DB1,0,4):" + t1Temp + "," + printByteArray(tempBs)); + + //内室温度PT2(DB1,4,4) + System.arraycopy(bs, 4, tempBs, 0, 4); + float t2Temp = S7.GetFloatAt(tempBs, 0); + senohStageDetails.setT2Temp(Double.valueOf(t2Temp + "")); + logger.debug("内室温度PT2(DB1,4,4):" + t2Temp + "," + printByteArray(tempBs)); + + //内室压力(DB1,20,4) + System.arraycopy(bs, 20, tempBs, 0, 4); + float press = S7.GetFloatAt(tempBs, 0); + senohStageDetails.setPress(Double.valueOf(press + "")); + logger.debug("内室压力(DB1,20,4):" + press + "," + printByteArray(tempBs)); + + + bs = null; + try { + bs = connector.read(DaveArea.FLAGS, 0, 30, 0); + } catch (Exception e) { + logger.info("读取M区数据异常:" + e.getMessage()); + } + + if(bs != null && bs.length > 0){ + //运行程序 + String runProgram = ""; + + //M20.0~M20.6 + for(int i=0;i<7;i++){ + if(S7.GetBitAt(bs, 20, i)){ + runProgram = sterilizerProgramMap.get("M20." + i); + break; + } + } + + //M21.0~M21.7 + for(int i=0;i<8;i++){ + if(S7.GetBitAt(bs, 21, i)){ + runProgram = sterilizerProgramMap.get("M21." + i); + break; + } + } + logger.debug("程序类型:" + runProgram + ", M20 = 【" + bs[20] + "】, M21 = 【" + bs[21] + "】"); + if(StringUtils.isBlank(senohSterilizerRecord.getRunProgram())){ + senohSterilizerRecord.setRunProgram(runProgram); + } + + //行程 + String stageName = ""; + + //M10.0~M10.6 + for(int i=6;i>=0;i--){ + if(S7.GetBitAt(bs, 10, i)){ + stageName = stageNameMap.get("M10." + i); + break; + } + } + + //M11.0~M11.5 + for(int i=5;i>=0;i--){ + if(S7.GetBitAt(bs, 11, i)){ + stageName = stageNameMap.get("M11." + i); + break; + } + } + + //M12.0~M12.5 + for(int i=5;i>=0;i--){ + if(S7.GetBitAt(bs, 12, i)){ + stageName = stageNameMap.get("M12." + i); + break; + } + } + + //M13.0~M13.3 + for(int i=3;i>=0;i--){ + if(S7.GetBitAt(bs, 13, i)){ + stageName = stageNameMap.get("M14." + i); + break; + } + } + + //M24.0 + if((bs[24] & 1) != 0){ + stageName = stageNameMap.get("M24.0"); + } + senohStageDetails.setStageName(stageName); + logger.info("行程:" + stageName + ", M10 = 【" + bs[10] + "】, M11 = 【" + bs[11] + "】, M12 = 【" + bs[12] + "】, M14 = 【" + bs[14] + "】, M24 = 【" + bs[24] + "】"); + } + + objectDao.saveOrUpdate(senohStageDetails); + + List senohStageDetailsList = senohSterilizerRecord.getSenohStageDetails(); + if(senohStageDetailsList != null){ + senohStageDetailsList = new ArrayList(); + } + senohStageDetailsList.add(senohStageDetails); + senohSterilizerRecord.setSenohStageDetails(senohStageDetailsList); + senohSterilizerRecord.setEndDate(senohStageDetails.getTime()); + objectDao.saveOrUpdate(senohSterilizerRecord); + return senohStageDetailsList; + } catch (Exception e) { + e.printStackTrace(); + logger.info("readAndSaveRecord异常:" + e.getMessage()); + } + return null; + } + + /** + * 打印byte数组的内容 + * @param bs + * @return + */ + private String printByteArray(byte[] bs){ + String result = ""; + if(bs == null || bs.length == 0){ + return "【】"; + } + for (int i = 0; i < bs.length; i++) { + if(i == 0){ + result = "【" + bs[i]; + }else{ + result += "," + bs[i]; + } + } + result += "】"; + return result; + } + +} Index: ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizerrecord/service/SenohSterilizerRecordManager.java =================================================================== diff -u --- ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizerrecord/service/SenohSterilizerRecordManager.java (revision 0) +++ ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizerrecord/service/SenohSterilizerRecordManager.java (revision 33731) @@ -0,0 +1,24 @@ +package com.forgon.disinfectsystem.sterilizationmanager.sterilizerrecord.service; + +import java.util.List; + +import com.forgon.disinfectsystem.entity.basedatamanager.deviceinterface.DeviceInterface; +import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.SenohStageDetails; +import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.SenohSterilizerRecord; +import com.forgon.tools.hibernate.BasePoManager; + +/** + * 读取千樱灭菌炉运行参数的接口 + * @author ZhouPeiMian + * @since 2022-05-10 + */ +public interface SenohSterilizerRecordManager extends BasePoManager{ + + /** + * 读取千樱灭菌炉运行参数 + * @param deviceInterface 设备接口 + * @param senohSterilizerRecord 运行参数记录 + */ + public List readAndSaveSenohStageDetails(DeviceInterface deviceInterface, SenohSterilizerRecord senohSterilizerRecord); + +} Index: ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/service/SterilizationRecordManagerImpl.java =================================================================== diff -u -r33582 -r33731 --- ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/service/SterilizationRecordManagerImpl.java (.../SterilizationRecordManagerImpl.java) (revision 33582) +++ ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/service/SterilizationRecordManagerImpl.java (.../SterilizationRecordManagerImpl.java) (revision 33731) @@ -27,6 +27,8 @@ import java.util.UUID; import java.util.Map.Entry; import java.util.Set; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @@ -37,6 +39,7 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.time.DateUtils; import org.hibernate.Query; import org.hibernate.Session; import org.springframework.beans.factory.annotation.Autowired; @@ -93,13 +96,16 @@ 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.SenohStageDetails; +import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.SenohSterilizerRecord; import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizerrecord.SterilizerRecord; import com.forgon.disinfectsystem.entity.systemwarning.SystemWarningVo; import com.forgon.disinfectsystem.entity.urgent.UrgentLevel; import com.forgon.disinfectsystem.expirationdateinfo.service.ExpirationDateInfoManager; import com.forgon.disinfectsystem.sterilizationmanager.sterilizationTransition.service.SterilizationTransitionItemManager; import com.forgon.disinfectsystem.sterilizationmanager.sterilizationrecord.vo.SterilizationRecordPrintTousseItem; import com.forgon.disinfectsystem.sterilizationmanager.sterilizationunload.service.SterileUnloadScanTousseManager; +import com.forgon.disinfectsystem.sterilizationmanager.sterilizerrecord.service.SenohSterilizerRecordManager; import com.forgon.disinfectsystem.stockmanage.departmentstock.service.DepartmentStockManager; import com.forgon.disinfectsystem.tousse.imagefilemanager.service.ImageFileManager; import com.forgon.disinfectsystem.tousse.toussedefinition.service.TousseDefinitionManager; @@ -189,7 +195,16 @@ private OperationManager operationManager; private ImageFileManager imageFileManager; + + private SenohSterilizerRecordManager senohSterilizerRecordManager; + + private ScheduledExecutorService executorService = Executors.newScheduledThreadPool(4); + public void setSenohSterilizerRecordManager( + SenohSterilizerRecordManager senohSterilizerRecordManager) { + this.senohSterilizerRecordManager = senohSterilizerRecordManager; + } + public void setImageFileManager(ImageFileManager imageFileManager) { this.imageFileManager = imageFileManager; } @@ -2330,10 +2345,174 @@ if(enableScanSterilizationMonitoringPackage){ isNeedScanMonitoringTousse(sterilizationRecord); } + + // 同步千樱脉动真空灭菌炉运行参数 + syncSenohSterilizerRecord(sterilizationRecord); return result; } + /** + * 同步千樱脉动真空灭菌炉运行参数 + * @param sterilizationRecord + */ + private void syncSenohSterilizerRecord(SterilizationRecord sterilizationRecord) { + if(sterilizationRecord == null || !DatabaseUtil.isPoIdValid(sterilizationRecord.getId())){ + throw new RuntimeException("灭菌记录不能为空!"); + } + + if(!sterilizationRecord.isSterilizationBegin()){ + return; + } + + int delay = getFirstDelay(sterilizationRecord); + if(delay < 0){ + return; + } + Sterilizer sterilizer = sterilizationRecord.getSterilizer(); + if(sterilizer == null){ + throw new RuntimeException("灭菌炉不能为空!"); + } + DeviceInterface deviceInterface = sterilizer.getDeviceInterface(); + if(deviceInterface != null && StringUtils.equals(deviceInterface.getDeviceBrand(), DeviceInterface.SENOH)){ + if(senohSterilizerRecordManager == null){ + return; + } + readSenohSterilizerRecord(sterilizationRecord.getId(), delay); + } + } + + /** + * 读取千樱灭菌器的运行参数 + * @param sterilizationRecordId + * @param delay + */ + private void readSenohSterilizerRecord(Long sterilizationRecordId, long delay) { + executorService.schedule(new Runnable() { + @Override + public void run() { + try { + logger.debug("开始读取灭菌炉参数,灭菌记录Id为:" + sterilizationRecordId + "; " + Thread.currentThread().getName()); + long st = System.currentTimeMillis(); + // 查找灭菌记录 + SterilizationRecord sterilizationRecord = get(sterilizationRecordId); + if(sterilizationRecord == null){ + logger.error(String.format("未找到id为%s的灭菌记录!", sterilizationRecordId)); + } + Sterilizer sterilizer = sterilizationRecord.getSterilizer(); + if(sterilizer == null){ + logger.error(String.format("未找到名字为%s的灭菌炉!", sterilizationRecord.getSterilizerName())); + } + DeviceInterface deviceInterface = sterilizer.getDeviceInterface(); + if(deviceInterface == null){ + logger.error(String.format("未找到%s的设备接口!", sterilizer.getName())); + } + if(!StringUtils.equals(deviceInterface.getDeviceBrand(), DeviceInterface.SENOH)){ + logger.warn(String.format("%s的设备接口品牌已改为%s,终止读取!", sterilizer.getName(), deviceInterface.getDeviceBrand())); + } + + String dataSql = String.format("select po from %s po where po.sterilizationRecord.id = %s", + SenohSterilizerRecord.class.getSimpleName(), + sterilizationRecordId); + SenohSterilizerRecord senohSterilizerRecord = null; + List senohSterilizerRecordList = objectDao.findByHql(dataSql); + if(CollectionUtils.isNotEmpty(senohSterilizerRecordList)){ + senohSterilizerRecord = senohSterilizerRecordList.get(0); + } + if(senohSterilizerRecord == null){ + senohSterilizerRecord = new SenohSterilizerRecord(); + senohSterilizerRecord.setMachineNumber(sterilizer.getMachineNumber()); + senohSterilizerRecord.setStartDate(new Date()); + senohSterilizerRecord.setSterilizationRecord(sterilizationRecord); + objectDao.saveOrUpdate(senohSterilizerRecord); + } + //读取温度及压力 + List list =senohSterilizerRecordManager.readAndSaveSenohStageDetails(deviceInterface, senohSterilizerRecord); + + if(CollectionUtils.isNotEmpty(list)){ + sterilizationRecord.setSterilizationParaType(SterilizationRecord.STERILIZATIONPARATYPE_SENOH); + objectDao.update(sterilizationRecord); + } + + long et = System.currentTimeMillis(); + long dt = Math.abs(et - st)/1000; + logger.info(String.format("结束读取灭菌炉参数,用时%s秒", dt)); + + //每分钟读取一次 + long delay = 60; + if (dt < delay) { + delay = delay - dt; + } else { + delay = 0; + } + + //灭菌记录的状态不为“灭菌中”时,停止同步灭菌炉运行参数; + if (sterilizationRecord.isSterilizationBegin() && isSterilizationRecordInprogress(sterilizationRecord)) { + readSenohSterilizerRecord(sterilizationRecordId, delay); + }else{ + logger.info("读取灭菌炉参数完成!灭菌记录Id为:" + sterilizationRecordId + "; "); + } + } catch (Throwable e) { + logger.info("读取灭菌炉参数异常,灭菌记录Id为:" + sterilizationRecordId + "; " + e.getMessage()); + } + } + + }, delay, TimeUnit.SECONDS); + } + + private boolean isSterilizationRecordInprogress(SterilizationRecord sterilizationRecord) { + if(sterilizationRecord == null){ + return false; + } + Date startDate = sterilizationRecord.getStartDate(); + Date endDate = sterilizationRecord.getEndDate(); + if(startDate == null){ + return false; + } + Date now = new Date(); + // 大于24小时,强制停止 + if(now.after(DateUtils.addHours(startDate, 24))){ + return false; + } + // 结束时间有可能会为null + if(endDate == null){ + if(now.after(startDate)){ + return true; + } + }else{ + if(now.after(startDate) && now.before(endDate)){ + return true; + } + } + return false; + } + + private int getFirstDelay(SterilizationRecord sterilizationRecord) { + if(sterilizationRecord == null){ + return -1; + } + Date startDate = sterilizationRecord.getStartDate(); + Date endDate = sterilizationRecord.getEndDate(); + if(startDate == null){ + return -1; + } + Date now = new Date(); + // 大于24小时,强制停止 + if(now.after(DateUtils.addHours(startDate, 24))){ + return -1; + } + if(endDate != null && now.after(endDate)){ + return -1; + } + if(now.after(startDate)){ + return 0; + }else{ + long diff = (startDate.getTime() - now.getTime())/1000; + return (int)diff; + } + } + + /** * 验证验证是否需要扫描监测包条码 * @param sr * @param sterilizationRecord