yangys
2025-09-13 3ffe33aaa24386337e3638558eca731c62f25521
blade-service/blade-mdm/src/main/java/org/springblade/mdm/config/InitBean.java
@@ -3,22 +3,122 @@
import jakarta.annotation.PostConstruct;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.oss.OssTemplate;
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.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.springblade.system.feign.ISysClient;
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
public class InitBean {
   private final OssTemplate ossTemplate;
   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 ISysClient sysClient;
   private final TaskDispatchService taskDispatchService;
   @PostConstruct
   public void init() {
      log.info("应用启动时执行初始化操作 @PostConstruct");
      String networkType = paramService.networkType();
      if(!ParamService.NETWORK_TYPE_SHEMI.equals(networkType)) {
         machineFileScanService.scanMachineFile();//启动执行一次扫描
         //工控网才启动文件监控
         log.info("工控网启动文件监控");
         initMachineDirMonitor();
      }else{
         //涉密网
         taskDispatchService.resetDrawingNos();
      }
   }
   /**
    * 初始化监控目录
    */
   void initMachineDirMonitor() {
      boolean locked = directorLockService.acquireLock();
      if (!locked) {
         log.info("回传接收目录已经被其他部署点位锁定,直接返回");
         return;
      }
      List<Machine> machineList = machineService.getEnableMachines();;
      List<WatchInfo> monitorInfoList = new ArrayList<>();
      machineList.forEach(m -> {
         addToWatchDirList(monitorInfoList,m);
      });
      for (WatchInfo info : monitorInfoList) {
         Path dirPath = Paths.get(info.getPath());
         try {
            if(!dirPath.toFile().exists()) {
               dirPath.toFile().mkdirs();
            }
            directoryWatcher.addDirectory(dirPath,getListener(info));
         } catch (Exception e) {
            log.error("添加监控目录异常",e);
         }
      }
   }
   void addToWatchDirList(List<WatchInfo> monitorDirList,Machine machine){
      String dir;
      //加入send文件夹
      if (StringUtils.isNotEmpty(machine.getProgSendDir())) {
         dir = StringUtils.removeEnd(StringUtils.removeEnd(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(), "/"), "\\");
         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(), "/"), "\\");
         WatchInfo watchInfo = new WatchInfo();
         watchInfo.setMachine(machine);
         watchInfo.setDirType(MachineFile.DIR_TYPE_TEMP);
         watchInfo.setPath(dir);
         if (!monitorDirList.contains(watchInfo)) {
            monitorDirList.add(watchInfo);
         }
      }
   }
   FileWatcherService.FileChangeListener getListener(WatchInfo info) {
      return new MachineFileChangeListener(machineFileService,annotationService,info);
   }
}