package org.springblade.mdm.config; import jakarta.annotation.PostConstruct; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springblade.mdm.basesetting.machine.service.MachineService; import org.springblade.mdm.basesetting.machine.entity.Machine; import org.springblade.mdm.commons.service.MachineDirTranslator; import org.springblade.mdm.commons.service.ParamService; import org.springblade.mdm.flow.service.TaskDispatchService; import org.springblade.mdm.machinefile.entity.MachineFile; import org.springblade.mdm.machinefile.filewatch.*; import org.springblade.mdm.machinefile.service.MachineFileScanService; import org.springblade.mdm.machinefile.service.MachineFileService; import org.springblade.mdm.program.service.ProgramAnnotationService; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.stereotype.Component; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; @Slf4j @AllArgsConstructor @Component @EnableAsync public class InitBean { private final DirectorLockService directorLockService; private final DynamicDirectoryWatcher directoryWatcher; private final MachineService machineService; private final MachineFileService machineFileService; private final ParamService paramService; private final ProgramAnnotationService annotationService; private final MachineFileScanService machineFileScanService; private final TaskDispatchService taskDispatchService; private final MachineDirTranslator dirTranslator; private final TaskPropertieBean taskPropertieBean; @PostConstruct public void init() { log.info("应用启动时执行初始化操作 @PostConstruct"); String networkType = paramService.networkType(); if(!ParamService.NETWORK_TYPE_SHEMI.equals(networkType)) { if(taskPropertieBean.isFileScanOnStart()) { machineFileScanService.scanMachineFile(); } //工控网才启动文件监控 log.info("工控网启动文件监控"); initMachineDirMonitor(); }else{ //涉密网 taskDispatchService.resetDrawingNos(); } } /** * 初始化监控目录 */ void initMachineDirMonitor() { /* boolean locked = directorLockService.acquireLock(); if (!locked) { log.info("回传接收目录已经被其他部署点位锁定,直接返回"); return; } */ List machineList = machineService.getEnableMachines();; List monitorInfoList = new ArrayList<>(); machineList.forEach(m -> { addToWatchDirList(monitorInfoList,m); }); for (WatchInfo info : monitorInfoList) { try { Path dirPath = Paths.get(info.getPath()); if(!dirPath.toFile().exists()) { dirPath.toFile().mkdirs(); } directoryWatcher.addDirectory(dirPath,getListener(info)); } catch (Exception e) { log.error("添加监控目录异常",e); } } } void addToWatchDirList(List monitorDirList,Machine machine){ String dir; //加入send文件夹 if (StringUtils.isNotEmpty(machine.getProgSendDir())) { //dir = dirTranslator.trans(StringUtils.removeEnd(StringUtils.removeEnd(machine.getProgSendDir(), "/"), "\\")); dir = fixMachineDir(machine.getProgSendDir()); WatchInfo watchInfo = new WatchInfo(); watchInfo.setMachine(machine); watchInfo.setDirType(MachineFile.DIR_TYPE_SEND); watchInfo.setPath(dir); if (!monitorDirList.contains(watchInfo)) { monitorDirList.add(watchInfo); } } //加入rec文件夹 if (StringUtils.isNotEmpty(machine.getProgReceiveDir())) { //dir = StringUtils.removeEnd(StringUtils.removeEnd(machine.getProgReceiveDir(), "/"), "\\"); dir = fixMachineDir(machine.getProgReceiveDir()); WatchInfo watchInfo = new WatchInfo(); watchInfo.setMachine(machine); watchInfo.setDirType(MachineFile.DIR_TYPE_REC); watchInfo.setPath(dir); if (!monitorDirList.contains(watchInfo)) { monitorDirList.add(watchInfo); } } //加入temp文件夹 if (StringUtils.isNotEmpty(machine.getProgTempDir())) { //dir = StringUtils.removeEnd(StringUtils.removeEnd(machine.getProgTempDir(), "/"), "\\"); dir = fixMachineDir(machine.getProgTempDir()); WatchInfo watchInfo = new WatchInfo(); watchInfo.setMachine(machine); watchInfo.setDirType(MachineFile.DIR_TYPE_TEMP); watchInfo.setPath(dir); if (!monitorDirList.contains(watchInfo)) { monitorDirList.add(watchInfo); } } } /** * 翻译共享文件夹路径到 标准网络路径,去掉末尾路径分割不 * @param dirpath 原始路径 * @return 转换后的路径 */ String fixMachineDir(String dirpath){ return dirTranslator.trans(StringUtils.removeEnd(StringUtils.removeEnd(dirpath, "/"), "\\")); } FileWatcherService.FileChangeListener getListener(WatchInfo info) { return new MachineFileChangeListener(machineFileService,annotationService,info); } }