package org.springblade.mdm.program.filewatch; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springblade.core.oss.OssTemplate; import org.springblade.core.oss.model.BladeFile; import org.springblade.core.tool.api.R; import org.springblade.mdm.commons.contants.ParamContants; import org.springblade.mdm.flow.service.CureFlowService; import org.springblade.mdm.machineback.entity.MachineBackFile; import org.springblade.mdm.machineback.filewatch.*; import org.springblade.mdm.program.entity.DncBackFile; import org.springblade.mdm.program.entity.NcProgram; import org.springblade.mdm.program.mapper.NcProgramExchangeMapper; import org.springblade.mdm.program.service.DncBackFileService; import org.springblade.mdm.program.service.NcNodeService; import org.springblade.mdm.program.service.NcProgramService; import org.springblade.system.feign.ISysClient; import org.springframework.stereotype.Service; import java.io.FileInputStream; import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Arrays; import java.util.List; /** * DNC回传及监控 * * @author yangys */ @Slf4j @Service @AllArgsConstructor public class ProgramBackMonitor { private final DirectorLockService directorLockService; private final NcNodeService ncNodeService; private final NcProgramService ncProgramService; private final CureFlowService cureFlowService; private final NcProgramExchangeMapper ncProgramExchangeMapper; private final ISysClient sysClient; private final DynamicDirectoryWatcher directoryWatcher; private final OssTemplate ossTemplate; private final DncBackFileService dncBackFileService; private final String DEFAULT_MONITOR_DIR = "programback"; /** * 监控回传目录(手动回传) */ public void monitorDir(){ boolean locked = directorLockService.acquireLock(); if (!locked) { log.info("回传接收目录已经被其他部署点位锁定,直接返回"); return; } List monitorDirList = getMonitorDirs(); for (String dir : monitorDirList) { Path dirPath = Paths.get(dir); try { if(!dirPath.toFile().exists()) { dirPath.toFile().mkdirs(); } directoryWatcher.addDirectory(dirPath,getListener()); } catch (Exception e) { log.error("添加监控目录异常",e); } } } List getMonitorDirs(){ R monitorDirRes = sysClient.getParamValue(ParamContants.PROGRAM_MONITOR_DIR_KEY); String dirStr = monitorDirRes.getData(); if(StringUtils.isNotEmpty(dirStr)){ dirStr = DEFAULT_MONITOR_DIR; } String[] dirs = StringUtils.split(dirStr,","); return Arrays.asList(dirs); } FileWatcherService.FileChangeListener getListener() { return new FileWatcherService.FileChangeListener() { @Override public void onFileCreated(Path filePath) { log.info("文件创建,处理"); } @Override public void onFileModified(Path filePath) { try { if(FileLockChecker.isFileComplete(filePath)){ log.info("文件[{}]传输完成,开始处理",filePath); String programName = filePath.getFileName().toFile().getName(); NcProgram prog = ncProgramService.getByName(programName); if(prog == null){ log.warn("文件名无法匹配到数控程序,{}",filePath); return; } DncBackFile backFile = new DncBackFile(); backFile.setNcProgramId(prog.getId()); //保存文件到css,避免后续不同部署节点拿不到文件 try(FileInputStream fins = new FileInputStream(filePath.toFile());){ BladeFile bfile = ossTemplate.putFile(programName, fins); backFile.setOssName(bfile.getName()); backFile.setUrl(bfile.getLink()); } dncBackFileService.save(backFile); }else{ log.warn("文件传输中,后续再操作:{}",filePath); } } catch (IOException e) { log.error("回传文件操作IO错误",e); throw new RuntimeException(e); } catch (InterruptedException e) { log.error("sleep出错",e); } catch (Exception e) { log.error("机床回传文件处理异常",e); } } @Override public void onFileDeleted(Path filePath) { log.info("文件删除,不处理"); } }; } }