|
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<String> 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<String> getMonitorDirs(){
|
R<String> 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;
|
}
|
//保存文件到css,避免后续不同部署节点拿不到文件
|
String ossName;
|
String url;
|
try(FileInputStream fins = new FileInputStream(filePath.toFile());){
|
BladeFile bfile = ossTemplate.putFile(programName, fins);
|
ossName = bfile.getName();
|
url = bfile.getLink();
|
|
}
|
|
prog.setOssName(ossName);
|
prog.setUrl(url);
|
//TODO,是否删除原来的文件?
|
ncProgramService.updateById(prog);
|
|
cureFlowService.startOne(prog);//启动一个程序的固化流程
|
/*
|
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("文件删除,不处理");
|
}
|
};
|
}
|
}
|