Index: ssts-maintain/src/main/java/com/forgon/disinfectsystem/maintain/device/service/ChangLongDataManagerImplFJSSSYY.java =================================================================== diff -u -r28055 -r28298 --- ssts-maintain/src/main/java/com/forgon/disinfectsystem/maintain/device/service/ChangLongDataManagerImplFJSSSYY.java (.../ChangLongDataManagerImplFJSSSYY.java) (revision 28055) +++ ssts-maintain/src/main/java/com/forgon/disinfectsystem/maintain/device/service/ChangLongDataManagerImplFJSSSYY.java (.../ChangLongDataManagerImplFJSSSYY.java) (revision 28298) @@ -2,16 +2,21 @@ import java.io.BufferedReader; import java.io.IOException; +import java.io.InputStream; import java.io.InputStreamReader; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import jcifs.smb.SmbFile; -import jcifs.smb.SmbFileInputStream; 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.springframework.integration.smb.session.SmbSession; import org.springframework.integration.smb.session.SmbShare; @@ -24,8 +29,11 @@ import com.forgon.disinfectsystem.entity.washanddisinfectmanager.washData.WashDataItemOfChangLong; import com.forgon.disinfectsystem.entity.washanddisinfectmanager.washData.WashDataOfChangLong; import com.forgon.disinfectsystem.entity.washanddisinfectmanager.washanddisinfectrecord.WashAndDisinfectRecord; +import com.forgon.disinfectsystem.filemanager.CommonFileManager; +import com.forgon.disinfectsystem.filemanager.FtpFileManager; import com.forgon.log.model.Log; import com.forgon.log.service.LogManager; +import com.forgon.tools.FileSystemHelper; import com.forgon.tools.date.DateTools; import com.forgon.tools.hibernate.ObjectDao; import com.forgon.tools.util.ForgonDateUtils; @@ -45,6 +53,10 @@ private DateQueryAdapter dateQueryAdapter; + private FtpFileManager ftpFileManager; + + private CommonFileManager commonFileManager; + private static final Logger logger = Logger .getLogger(ChangLongDataManagerImplFJSSSYY.class); @@ -60,6 +72,14 @@ this.dateQueryAdapter = dateQueryAdapter; } + public void setFtpFileManager(FtpFileManager ftpFileManager) { + this.ftpFileManager = ftpFileManager; + } + + public void setCommonFileManager(CommonFileManager commonFileManager) { + this.commonFileManager = commonFileManager; + } + /** * 从接口读取数据和存入数据库 */ @@ -73,45 +93,94 @@ 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 rootURL = "//"+ip+"/" + directory + "/"; + String remoteType = devInterface.getInterfaceType(); + FTPClient ftp = null; + String rootURL = null; + String backUp = null; try { - SmbShare share=new SmbShare("smb://" + userName +":"+ pwd +"@"+ ip +"/"+ directory +"/"); - //SmbShare share=new SmbShare("smb://" + ip +"/"+ directory +"/"); - session=new SmbSession(share); - String backUp=rootURL + "backUp/"; - if(!session.exists(backUp)){ - session.mkdir(backUp); - } - for (String name : share.list()){ - SmbFile smbForm=session.createSmbFileObject(rootURL + name); - if(smbForm.isDirectory()){ + FTPFile[] files = null; + String[] shareList = null; + Integer length = 0; + if(DeviceInterface.INTERFACETYPE_FTP.equals(remoteType)){ + ftp = ftpFileManager.getFTPClient(ip, 21, userName, pwd); + rootURL = ftpFileManager.getCurrentPath(ftp) + directory;//根目录 + backUp=rootURL + "/backUp/"; + ftpFileManager.changeWorkingDirectory(ftp, rootURL); + 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文件:" + file.getName()); + return false; + } + }; + files = ftpFileManager.getListFiles(ftp, "", filterXML); + length = files.length; + }else{ + rootURL = "//"+ip+"/" + directory + "/"; + backUp = rootURL + "backUp/"; + //SmbShare share=new SmbShare("smb://" + userName +":"+ pwd +"@"+ ip +"/"+ directory +"/"); + SmbShare share=new SmbShare("smb://" + ip +"/"+ directory +"/"); + session=new SmbSession(share); + if(!session.exists(backUp)){ + session.mkdir(backUp); + } + shareList = share.list(); + length = shareList.length; + } + SimpleDateFormat sdfToday = new SimpleDateFormat("yyyyMMdd"); + 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]; + smbForm = session.createSmbFileObject(rootURL + name); + if(smbForm.isDirectory()){ + continue; + } + if ( !(name.endsWith("log") || name.endsWith("LOG")) ){ + continue; + } + } + if(sdfToday.parse(name.substring(4, 12)).before(sdfToday.parse(sdfToday.format(new Date())))){ + // 根据文件名称(data20200615.log)过滤,只读取今天产生的日志文件,今天之前的文件移动到backUp文件夹中 + commonFileManager.moveFile(remoteType, name, ftp, ftpFileManager.getCurrentPath(ftp), backUp, session, smbForm); continue; } - if ( !(name.endsWith("log") || name.endsWith("LOG")) ){ - continue; - } - List washDatas = washDataReadAndSave(smbForm,devInterface.getId(), machineNo); + List washDatas = washDataReadAndSave(smbForm,devInterface.getId(), machineNo, remoteType, ftp, ftpFile); if(CollectionUtils.isNotEmpty(washDatas)){ refreshWashRecordAmounts(devInterface.getId().toString(), machineNo, washDatas); // 顺利读取到清洗机数据才把文件移动到backUp文件夹 - SmbFile desFile = session.createSmbFileObject(backUp+name); - smbForm.copyTo(desFile); - smbForm.delete(); + commonFileManager.moveFile(remoteType, name, ftp, ftpFileManager.getCurrentPath(ftp), backUp, session, smbForm); } else{ logger.warn(name); } } - } catch (IOException e){ + } catch (Exception e){ // 捕获BufferedReader对象关闭时的异常 logger.warn(e.getMessage()); e.printStackTrace(); appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_DEVICE_INTERFACE, Log.TYPE_ADD, "设备接口连接异常," + e.getMessage()); }finally{ - session.close(); + ftpFileManager.closeFTP(ftp); + if(session != null){ + session.close(); + } } } @@ -124,13 +193,24 @@ } - public List washDataReadAndSave(SmbFile remoteFile,Long devInterfaceId, String machineNo) throws IOException{ + public List washDataReadAndSave(SmbFile remoteFile,Long devInterfaceId, String machineNo, String remoteType, FTPClient ftp, FTPFile ftpFile) throws IOException{ + InputStream inputStream = null; + ByteArrayOutputStream out = null; + InputStreamReader isr = null; BufferedReader br = null; + String fileName = null; + String line = null; + List washDataList = new ArrayList(); try{ - br = new BufferedReader(new InputStreamReader( - new SmbFileInputStream(remoteFile), "GBK")); - String line = null; - List washDataList = new ArrayList(); + /*br = new BufferedReader(new InputStreamReader( + new SmbFileInputStream(remoteFile), "GBK"));*/ + if(DeviceInterface.INTERFACETYPE_FTP.equals(remoteType)){ + fileName = ftpFile.getName(); + }else{ + fileName = remoteFile.getName(); + } + inputStream = commonFileManager.getInputStream(remoteType, ftp, fileName, remoteFile, out); + br = commonFileManager.getBufferedReader(isr, inputStream,"GBK"); WashDataOfChangLong washData = null; String dateStr = ""; while ((line = br.readLine()) != null) { @@ -172,7 +252,8 @@ // 读取到不完整的数据,可能清洗机正在写入数据,则不保存这个文件的数据,也不移动文件 appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_DEVICE_INTERFACE, Log.TYPE_ADD, "清洗机数据文件存在不完整数据,文件名称:" + remoteFile.getName()); - return null; + washDataList = null; + break; } data.setMachineNo(machineNo); data.setDeviceInterfaceID(devInterfaceId); @@ -183,20 +264,17 @@ data.setCompletedTime(DateTools.getFormatDateStr(itemList.get(itemList.size()-1).getDateTime(), DateTools.COMMON_DATE_HMS)); } } - objectDao.batchSaveOrUpdate(washDataList); + if(CollectionUtils.isNotEmpty(washDataList)){ + objectDao.batchSaveOrUpdate(washDataList); + } } - return washDataList; } catch (Exception e) { e.printStackTrace(); - appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_DEVICE_INTERFACE, Log.TYPE_ADD, "设备接口文件处理中,解析参数错误," + e.getMessage()); - return null; + appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_DEVICE_INTERFACE, Log.TYPE_ADD, "设备接口文件处理中,解析参数错误," + e.getMessage() + " : " + line); }finally{ - try { - br.close(); - } catch (IOException e) { - e.printStackTrace(); - } + FileSystemHelper.closeInputStream(inputStream, br, isr, out); } + return washDataList; } /** Index: ssts-maintain/src/main/java/com/forgon/disinfectsystem/maintain/device/service/XinHuaDataManagerImplForFJSSSYY.java =================================================================== diff -u -r28055 -r28298 --- ssts-maintain/src/main/java/com/forgon/disinfectsystem/maintain/device/service/XinHuaDataManagerImplForFJSSSYY.java (.../XinHuaDataManagerImplForFJSSSYY.java) (revision 28055) +++ ssts-maintain/src/main/java/com/forgon/disinfectsystem/maintain/device/service/XinHuaDataManagerImplForFJSSSYY.java (.../XinHuaDataManagerImplForFJSSSYY.java) (revision 28298) @@ -1,17 +1,21 @@ package com.forgon.disinfectsystem.maintain.device.service; import java.io.BufferedReader; -import java.io.IOException; +import java.io.InputStream; import java.io.InputStreamReader; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import jcifs.smb.SmbFile; -import jcifs.smb.SmbFileInputStream; 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.springframework.integration.smb.session.SmbSession; import org.springframework.integration.smb.session.SmbShare; @@ -23,8 +27,11 @@ import com.forgon.disinfectsystem.entity.washanddisinfectmanager.washData.WashDataItemOfChangLong; import com.forgon.disinfectsystem.entity.washanddisinfectmanager.washData.WashDataOfChangLong; import com.forgon.disinfectsystem.entity.washanddisinfectmanager.washanddisinfectrecord.WashAndDisinfectRecord; +import com.forgon.disinfectsystem.filemanager.CommonFileManager; +import com.forgon.disinfectsystem.filemanager.FtpFileManager; import com.forgon.log.model.Log; import com.forgon.log.service.LogManager; +import com.forgon.tools.FileSystemHelper; import com.forgon.tools.date.DateTools; import com.forgon.tools.hibernate.ObjectDao; import com.forgon.tools.util.ForgonDateUtils; @@ -42,6 +49,10 @@ private LogManager appLogManager; private DateQueryAdapter dateQueryAdapter; + + private FtpFileManager ftpFileManager; + + private CommonFileManager commonFileManager; public void setAppLogManager(LogManager appLogManager) { this.appLogManager = appLogManager; @@ -55,6 +66,14 @@ this.dateQueryAdapter = dateQueryAdapter; } + public void setFtpFileManager(FtpFileManager ftpFileManager) { + this.ftpFileManager = ftpFileManager; + } + + public void setCommonFileManager(CommonFileManager commonFileManager) { + this.commonFileManager = commonFileManager; + } + @Override public void readAndSaveRecord(DeviceInterface devInterface, String machineNo, String brand, String isAutoCompleteSterilization) { @@ -65,48 +84,97 @@ 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 rootURL = "//"+ip+"/" + directory + "/"; + String remoteType = devInterface.getInterfaceType(); + String rootURL = null; + String backUp = null; + FTPClient ftp = null; try { - SmbShare share=new SmbShare("smb://" + userName +":"+ pwd +"@"+ ip +"/"+ directory +"/"); - //SmbShare share=new SmbShare("smb://" + ip +"/"+ directory +"/"); - session=new SmbSession(share); - String backUp=rootURL + "backUp/"; - if(!session.exists(backUp)){ - session.mkdir(backUp); - } - for (String name : share.list()){ - SmbFile smbForm=session.createSmbFileObject(rootURL + name); - if(smbForm.isDirectory()){ + FTPFile[] files = null; + String[] shareList = null; + Integer length = 0; + if(DeviceInterface.INTERFACETYPE_FTP.equals(remoteType)){ + ftp = ftpFileManager.getFTPClient(ip, 21, userName, pwd); + rootURL = ftpFileManager.getCurrentPath(ftp) + directory;//根目录 + backUp = rootURL + "/backUp/"; + ftpFileManager.changeWorkingDirectory(ftp, rootURL); + 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文件:" + file.getName()); + return false; + } + }; + files = ftpFileManager.getListFiles(ftp, "", filterXML); + length = files.length; + }else{ + rootURL = "//"+ip+"/" + directory + "/"; + backUp = rootURL + "backUp/"; + //SmbShare share=new SmbShare("smb://" + userName +":"+ pwd +"@"+ ip +"/"+ directory +"/"); + SmbShare share = new SmbShare("smb://" + ip +"/"+ directory +"/"); + session=new SmbSession(share); + if(!session.exists(backUp)){ + session.mkdir(backUp); + } + shareList = share.list(); + length = shareList.length; + } + SimpleDateFormat sdfToday = new SimpleDateFormat("yyyyMMdd"); + 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(rootURL + name); + if(smbForm == null || smbForm.isDirectory()){ + continue; + } + } + if(sdfToday.parse(name.substring(4, 12)).before(sdfToday.parse(sdfToday.format(new Date())))){ + // 根据文件名称(data20200615.log)过滤,只读取今天产生的日志文件,今天之前的文件移动到backUp文件夹中 + commonFileManager.moveFile(remoteType, name, ftp, ftpFileManager.getCurrentPath(ftp), backUp, session, smbForm); continue; } - if ( !(name.endsWith("log") || name.endsWith("LOG")) ){ - continue; - } - List washDatas = washDataReadAndSave(smbForm,devInterface.getId(), machineNo); + List washDatas = washDataReadAndSave(smbForm,devInterface.getId(), machineNo, remoteType, ftp, ftpFile); if(CollectionUtils.isNotEmpty(washDatas)){ refreshWashRecordAmounts(devInterface.getId().toString(), machineNo, washDatas); - // 成功读取到 - SmbFile desFile = session.createSmbFileObject(backUp+name); - smbForm.copyTo(desFile); - smbForm.delete(); + // 顺利读取到清洗机数据才把文件移动到backUp文件夹 + commonFileManager.moveFile(remoteType, name, ftp, ftpFileManager.getCurrentPath(ftp), backUp, session, smbForm); } else{ logger.warn(name); } } - } catch (IOException e){ + } catch (Exception e){ // 捕获BufferedReader对象关闭时的异常 logger.warn(e.getMessage()); appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_DEVICE_INTERFACE, Log.TYPE_ADD, "设备接口连接异常," + e.getMessage()); }finally{ - session.close(); + ftpFileManager.closeFTP(ftp); + if(session != null){ + session.close(); + } } } - + @SuppressWarnings("unchecked") public void refreshWashRecordAmounts(String devInterfaceId, String machineNo, List washDatas){ String sql = String.format(" from %s r where r.deviceInterface.id = %s and r.machineNumber = %s ", @@ -133,14 +201,25 @@ } } - @SuppressWarnings("resource") private List washDataReadAndSave(SmbFile smbForm, Long id, - String machineNo) { + String machineNo, String remoteType, FTPClient ftp, FTPFile ftpFile) { + InputStream inputStream = null; + ByteArrayOutputStream out = null; + InputStreamReader isr = null; + BufferedReader br = null; + String fileName = null; + String line = null; + List washDataList = new ArrayList(); try { - BufferedReader br = new BufferedReader(new InputStreamReader( - new SmbFileInputStream(smbForm), "GBK")); - String line; - List washDataList = new ArrayList(); + /*BufferedReader br = new BufferedReader(new InputStreamReader( + new SmbFileInputStream(smbForm), "GBK"));*/ + if(DeviceInterface.INTERFACETYPE_FTP.equals(remoteType)){ + fileName = ftpFile.getName(); + }else{ + fileName = smbForm.getName(); + } + inputStream = commonFileManager.getInputStream(remoteType, ftp, fileName, smbForm, out); + br = commonFileManager.getBufferedReader(isr, inputStream,"GBK"); WashDataOfChangLong washData = null; List startList = new ArrayList(); // 程序名称 @@ -247,17 +326,21 @@ // 读取到不完整的数据,可能清洗机正在写入数据,则不保存这个文件的数据,也不移动文件 appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_DEVICE_INTERFACE, Log.TYPE_ADD, "清洗机数据文件存在不完整数据,文件名称:" + smbForm.getName()); - return null; + washDataList = null; + break; } } } - objectDao.batchSaveOrUpdate(washDataList); - return washDataList; + if(CollectionUtils.isNotEmpty(washDataList)){ + objectDao.batchSaveOrUpdate(washDataList); + } } catch (Exception e) { - appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_DEVICE_INTERFACE, Log.TYPE_ADD, "设备接口文件处理中,解析参数错误," + e.getMessage()); + appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_DEVICE_INTERFACE, Log.TYPE_ADD, "设备接口文件处理中,解析参数错误," + e.getMessage() + " : " + line); e.printStackTrace(); + } finally{ + FileSystemHelper.closeInputStream(inputStream, br, isr, out); } - return null; + return washDataList; } @Override