Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/deviceinterface/DeviceInterface.java =================================================================== diff -u -r24875 -r25306 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/deviceinterface/DeviceInterface.java (.../DeviceInterface.java) (revision 24875) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/deviceinterface/DeviceInterface.java (.../DeviceInterface.java) (revision 25306) @@ -1,10 +1,6 @@ package com.forgon.disinfectsystem.entity.basedatamanager.deviceinterface; import javax.persistence.Entity; - -import org.hibernate.annotations.DynamicInsert; -import org.hibernate.annotations.DynamicUpdate; - import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @@ -13,6 +9,8 @@ import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; /** * @author ZengJiongChao 2016-01-29 @@ -69,6 +67,8 @@ */ private String IP; + private Integer port; + private String userName; private String password; @@ -120,6 +120,14 @@ IP = iP; } + public Integer getPort() { + return port; + } + + public void setPort(Integer port) { + this.port = port; + } + public String getUserName() { return userName; } Index: ssts-wash/src/main/java/com/forgon/disinfectsystem/washanddisinfectmanager/washanddisinfectrecord/service/WashAndDisinfectRecordManagerImpl.java =================================================================== diff -u -r25289 -r25306 --- ssts-wash/src/main/java/com/forgon/disinfectsystem/washanddisinfectmanager/washanddisinfectrecord/service/WashAndDisinfectRecordManagerImpl.java (.../WashAndDisinfectRecordManagerImpl.java) (revision 25289) +++ ssts-wash/src/main/java/com/forgon/disinfectsystem/washanddisinfectmanager/washanddisinfectrecord/service/WashAndDisinfectRecordManagerImpl.java (.../WashAndDisinfectRecordManagerImpl.java) (revision 25306) @@ -1,5 +1,7 @@ package com.forgon.disinfectsystem.washanddisinfectmanager.washanddisinfectrecord.service; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; @@ -16,6 +18,9 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import net.sf.json.JSONArray; @@ -47,6 +52,7 @@ import com.forgon.disinfectsystem.common.CssdUtils; import com.forgon.disinfectsystem.entity.basedatamanager.cleanmethod.CleanMethod; import com.forgon.disinfectsystem.entity.basedatamanager.container.Container; +import com.forgon.disinfectsystem.entity.basedatamanager.deviceinterface.DeviceInterface; import com.forgon.disinfectsystem.entity.basedatamanager.materialdefinition.MaterialDefinition; import com.forgon.disinfectsystem.entity.basedatamanager.materialinstance.MaterialInstance; import com.forgon.disinfectsystem.entity.basedatamanager.position.Position; @@ -140,6 +146,8 @@ private TimeoutManager timeoutManager; + private ScheduledExecutorService executorService = Executors.newScheduledThreadPool(4); + public void setIdCardDefinitionManager( IDCardDefinitionManager idCardDefinitionManager) { this.idCardDefinitionManager = idCardDefinitionManager; @@ -665,6 +673,8 @@ updatePackingTaskAndTousseInstanceWashTime(recordId, orgWashStartTime, orgWashEndTime,startDateStr,endDateStr); } } + // 美雅洁接口处理 + margeProcess(washRecord); } private Map getClassifyBasketInfoMap( String classifyBasketInfo) { @@ -2640,4 +2650,128 @@ } return null; } + + /** + * 美雅洁接口处理,定时读取modbus + */ + private void margeProcess(WashAndDisinfectRecord washAndDisinfectRecord) { + + if(washAndDisinfectRecord == null || !DatabaseUtil.isPoIdValid(washAndDisinfectRecord.getId())){ + throw new RuntimeException("清洗记录不能为空!"); + } + if(!isWashAndDisinfectRecordInprogress(washAndDisinfectRecord)){ + return; + } + Rinser rinser = rinserManager.getRinserByName(washAndDisinfectRecord.getDisinfectIdentification()); + if(rinser == null){ + throw new RuntimeException("清洗机不能为空!"); + } + DeviceInterface deviceInterface = rinser.getDeviceInterface(); + if(deviceInterface != null && StringUtils.equals(deviceInterface.getDeviceBrand(), "Marge")){ + readWashData(washAndDisinfectRecord.getId(), 0); + } + } + + private boolean isWashAndDisinfectRecordInprogress(WashAndDisinfectRecord washAndDisinfectRecord){ + if(washAndDisinfectRecord == null){ + return false; + } + Date startDate = washAndDisinfectRecord.getStartDate(); + Date endDate = washAndDisinfectRecord.getEndDate(); + if(startDate == null || endDate == null){ + return false; + } + Date now = new Date(); + if(now.after(startDate) && now.before(endDate)){ + return true; + } + return false; + } + + private void readWashData(Long washAndDisinfectRecordId, long deltaSeconds) { + long interval = 10; + if (deltaSeconds < interval) { + interval = interval - deltaSeconds; + } else { + interval = 0; + } + executorService.schedule(new Runnable() { + @Override + public void run() { + try { + logger.info("开始读取清洗机参数"); + long st = System.currentTimeMillis(); + // 查找清洗记录 + WashAndDisinfectRecord washAndDisinfectRecord = get(washAndDisinfectRecordId); + if(washAndDisinfectRecord == null){ + logger.error(String.format("未找到id为%s的清洗记录!", washAndDisinfectRecordId)); + } + Rinser rinser = rinserManager.getRinserByName(washAndDisinfectRecord.getDisinfectIdentification()); + if(rinser == null){ + logger.error(String.format("未找到名字为%s的清洗机!", washAndDisinfectRecord.getDisinfectIdentification())); + } + DeviceInterface deviceInterface = rinser.getDeviceInterface(); + if(deviceInterface == null){ + logger.error(String.format("未找到%s的设备接口!", washAndDisinfectRecord.getDisinfectIdentification())); + } + if(!StringUtils.equals(deviceInterface.getDeviceBrand(), "Marge")){ + logger.warn(String.format("%s的设备接口品牌已改为%s,终止读取!", washAndDisinfectRecord.getDisinfectIdentification(),deviceInterface.getDeviceBrand())); + } + + // 读取数据 + WashData washData = new WashData(); + readWashDataFromDeviceInterface(washAndDisinfectRecord,deviceInterface, washData, 10); + washData.setDeviceInterfaceID(deviceInterface.getId().toString()); + objectDao.save(washData); + + Long washDataAmount = washAndDisinfectRecord.getWashDataAmount(); + if(washDataAmount == null){ + washDataAmount = 0L; + } + washAndDisinfectRecord.setWashDataAmount(washDataAmount+1); + objectDao.update(washAndDisinfectRecord); + long et = System.currentTimeMillis(); + long dt = Math.abs(et - st)/1000; + logger.info(String.format("结束读取清洗机参数,用时%s秒", dt)); + + if (isWashAndDisinfectRecordInprogress(washAndDisinfectRecord)) { + readWashData(washAndDisinfectRecordId, dt); + } + + } catch (Throwable e) { + e.printStackTrace(); + logger.error(e); + } + } + }, interval, TimeUnit.SECONDS); + } + + private void readWashDataDummy(WashAndDisinfectRecord washAndDisinfectRecord,WashData washData) { + // 随机设置温度等信息 + double t1Temp = Math.random() * 100; + washData.setT1Temp(new BigDecimal(t1Temp).setScale(1,RoundingMode.HALF_UP).toString()); + washData.setTime(new SimpleDateFormat("yyyy/M/dd HH:mm:ss") + .format(new Date())); + washData.setMachineNo("1"); + washData.setCycleCounter(washAndDisinfectRecord.getCycleCounter()); + } + + private void readWashDataFromDeviceInterface( + WashAndDisinfectRecord washAndDisinfectRecord,DeviceInterface deviceInterface, WashData washData, + int timeoutSeconds) { + String ip = StringUtils.defaultIfEmpty(deviceInterface.getIP(), ""); + String portStr = ""; + Integer port = deviceInterface.getPort(); + if (port != null) { + portStr = port.toString(); + } + String ipPort = ip + ":" + portStr; + String msg = String + .format("readWashDataFromDeviceInterface,name=%s,ip:port=%s,deviceId=%s", + deviceInterface.getName(), ipPort, + deviceInterface.getDeviceId()); + logger.info(msg); + +// readWashDataDummy(washAndDisinfectRecord,washData); + } } Index: ssts-web/src/main/webapp/disinfectsystem/basedatamanager/deviceInterface/deviceInterfaceView.js =================================================================== diff -u -r23079 -r25306 --- ssts-web/src/main/webapp/disinfectsystem/basedatamanager/deviceInterface/deviceInterfaceView.js (.../deviceInterfaceView.js) (revision 23079) +++ ssts-web/src/main/webapp/disinfectsystem/basedatamanager/deviceInterface/deviceInterfaceView.js (.../deviceInterfaceView.js) (revision 25306) @@ -92,6 +92,10 @@ header : "IP地址", width : 100, dataIndex : 'IP' + }, { + header : "端口", + width : 100, + dataIndex : 'port' },{ header : "用户名", width : 100, @@ -125,6 +129,8 @@ }, { name : 'IP' }, { + name : 'port' + }, { name : 'folderPath' },{ name : 'userName' Index: ssts-web/src/main/webapp/disinfectsystem/basedatamanager/deviceInterface/deviceInterfaceForm.js =================================================================== diff -u -r24875 -r25306 --- ssts-web/src/main/webapp/disinfectsystem/basedatamanager/deviceInterface/deviceInterfaceForm.js (.../deviceInterfaceForm.js) (revision 24875) +++ ssts-web/src/main/webapp/disinfectsystem/basedatamanager/deviceInterface/deviceInterfaceForm.js (.../deviceInterfaceForm.js) (revision 25306) @@ -53,7 +53,24 @@ layout : 'form', columnWidth : 0.5, labelWidth : 70, + id:'portWrap', +// hidden: true, items : [ { + xtype : 'numberfield', + fieldLabel : "端口", + name : "port", + id : "port", + minValue: 0, + maxValue: 65535, + allowBlank : true, + anchor : '97.5%' + }] + },{ + layout : 'form', + columnWidth : 0.5, + labelWidth : 70, + id:'folderPathWrap', + items : [ { xtype : 'textfield', fieldLabel : "共享文件夹", name : "folderPath", @@ -65,6 +82,7 @@ layout : 'form', columnWidth : 0.5, labelWidth : 70, + id:'userNameWrap', items : [ { xtype : 'textfield', fieldLabel : "用户名", @@ -78,6 +96,7 @@ layout : 'form', columnWidth : 0.5, labelWidth : 70, + id:'passwordWrap', items : [ { xtype : 'textfield', fieldLabel : "密码", @@ -100,7 +119,7 @@ displayField : 'value', store : new Ext.data.SimpleStore({ fields : [ 'value' ], - data : [['Belimed'],[ 'Steris'],['Getinge'],['JiangHan'],['ChangLong'],['XinHua']] + data : [['Belimed'],[ 'Steris'],['Getinge'],['JiangHan'],['ChangLong'],['XinHua'],['Marge']] } ), forceSelection : true, @@ -111,11 +130,8 @@ anchor : '97.5%', listeners : { select : function(thiz,record,index){ - if(record.data.value == 'JiangHan'){ - top.Ext.getCmp('deviceIdWrap').show(); - }else{ - top.Ext.getCmp('deviceIdWrap').hide(); - } + onDeviceBrandChange(); + } } }] @@ -171,9 +187,7 @@ waitMsg : '正在加载数据,请稍候', success : function(form, action) { top.Ext.getCmp("oldDeviceId").setValue(action.result.data.deviceId); - if(action.result.data.deviceBrand == 'JiangHan'){ - top.Ext.getCmp('deviceIdWrap').show(); - } + onDeviceBrandChange(); }, failure : function(form, action) { }, @@ -183,6 +197,49 @@ }); } +function showCmt(wrapId,id,allowBlank){ + top.Ext.getCmp(wrapId).show(); + if(allowBlank){ + top.Ext.getCmp(id).allowBlank = true; + top.Ext.getCmp(id).clearInvalid(); + }else{ + top.Ext.getCmp(id).allowBlank = false; + } +} +function hideCmt(wrapId,id,allowBlank){ + top.Ext.getCmp(wrapId).hide(); + if(allowBlank){ + top.Ext.getCmp(id).allowBlank = true; + top.Ext.getCmp(id).clearInvalid(); + }else{ + top.Ext.getCmp(id).allowBlank = false; + } +} +function onDeviceBrandChange(){ + var deviceBrand = top.Ext.getCmp('deviceBrand').getValue(); + + hideCmt('portWrap','port',true); + hideCmt('deviceIdWrap','deviceId',true); + showCmt('userNameWrap','userName',false); + showCmt('folderPathWrap','folderPath',false); + showCmt('passwordWrap','password',false); + + if(deviceBrand == 'JiangHan'){ + showCmt('deviceIdWrap','deviceId',true); + }else if(deviceBrand == 'Marge'){ + showCmt('deviceIdWrap','deviceId',false); + showCmt('portWrap','port',false); + + hideCmt('userNameWrap','userName',true); + hideCmt('folderPathWrap','folderPath',true); + hideCmt('passwordWrap','password',true); + }else{ +// top.Ext.getCmp('deviceIdWrap').hide(); +// top.Ext.getCmp('portWrap').hide(); + } + +} + function validateAndSubmit(){ //validate的过程,放在保存里 // Ext.Ajax.request({ // url : WWWROOT + '/disinfectSystem/baseData/deviceInterfaceAction!validate.do',