From 84425b2a95b91ba2632aeb5d93b603e1e4ab2094 Mon Sep 17 00:00:00 2001
From: lyh <925863403@qq.com>
Date: 星期二, 10 六月 2025 13:56:07 +0800
Subject: [PATCH] 监听文件

---
 lxzn-module-system/lxzn-system-start/src/main/resources/application-dev.yml              |   14 +
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/IDocInfoService.java         |   10 +
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/DirectoryValidator.java     |   22 +++
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileMonitorBootstrap.java   |   53 ++++++++
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/MultiPathMonitor.java       |   66 +++++++++++
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileMonitorConfig.java      |   19 +++
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileListener.java           |  115 +++++++++++++++++++
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DocInfoServiceImpl.java |   14 ++
 8 files changed, 306 insertions(+), 7 deletions(-)

diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/DirectoryValidator.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/DirectoryValidator.java
new file mode 100644
index 0000000..d81e2ea
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/DirectoryValidator.java
@@ -0,0 +1,22 @@
+package org.jeecg.modules.dnc.listener;
+import java.io.File;
+import java.util.List;
+
+public class DirectoryValidator {
+    public static void validatePaths(List<String> paths) {
+        //鏍规嵁閰嶇疆鐨勭洰褰曡繘琛屾牎楠岋紝鍙互淇敼yml鏂囦欢瀵瑰簲鐨勭洃鎺х洰褰曟潵鏀瑰彉鏍¢獙鏁伴噺
+        if (paths == null || paths.size() < 3) {
+            throw new IllegalArgumentException("蹇呴』閰嶇疆涓変釜鐩戞帶鐩綍");
+        }
+
+        for (String path : paths) {
+            File dir = new File(path);
+            if (!dir.exists() || !dir.isDirectory()) {
+                throw new IllegalArgumentException("鏃犳晥鐨勭洃鎺х洰褰�: " + path);
+            }
+            if (!dir.canRead()) {
+                throw new SecurityException("鐩綍涓嶅彲璇�: " + path);
+            }
+        }
+    }
+}
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileListener.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileListener.java
new file mode 100644
index 0000000..59eb0af
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileListener.java
@@ -0,0 +1,115 @@
+package org.jeecg.modules.dnc.listener;
+import org.apache.commons.io.monitor.FileAlterationListener;
+import org.apache.commons.io.monitor.FileAlterationObserver;
+import org.jeecg.common.util.FileUtil;
+import org.jeecg.modules.dnc.service.IDocInfoService;
+import org.jeecg.modules.dnc.utils.file.FileUtilS;
+import org.jeecg.modules.message.enums.DeployEnum;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import java.io.File;
+import java.util.Objects;
+
+@Component
+public class FileListener implements FileAlterationListener {
+    private static final Logger log = LoggerFactory.getLogger(FileListener.class);
+
+    @Value("${deploy.deployType}")
+    private String deployType;    //宸ユ帶缃�/娑夊瘑缃戦儴缃� 0涓哄伐鎺х綉 1涓烘秹瀵嗙綉
+
+    @Autowired
+    private IDocInfoService docInfoService;  // 鏂囨。鏈嶅姟
+
+    @Override
+    public void onStart(FileAlterationObserver observer) {
+        log.info("寮�濮嬬洃鍚洰褰�: {}", observer.getDirectory().getAbsolutePath());
+    }
+
+    @Override
+    public void onDirectoryCreate(File directory) {
+        log.info("[鐩綍鍒涘缓]: {}", directory.getAbsolutePath());
+    }
+
+    @Override
+    public void onDirectoryChange(File directory) {
+        log.info("[鐩綍淇敼]: {}", directory.getAbsolutePath());
+    }
+
+    @Override
+    public void onDirectoryDelete(File directory) {
+        log.info("[鐩綍鍒犻櫎]: {}", directory.getAbsolutePath());
+    }
+
+    @Override
+    public void onFileCreate(File file) {
+        String filePath = file.getAbsolutePath();
+        log.info("[鏂板缓]: {}", filePath);
+        if (DeployEnum.GW.getCode().equals(deployType)) {
+            //宸ユ帶缃戣В鏋愭秹瀵嗙綉浼犺繃鏉ョ殑NC鏂囦欢涓巒c鏂囦欢杩涜瑙f瀽
+            if (filePath.startsWith("D:\\hy_test\\ncFile")) {
+                handleIndustrialDocFile(file);
+            }
+        }else {
+            //娑夊瘑缃戣В鏋愬伐鎺х綉浼犺繃鏉ョ殑NC鏂囦欢涓巒c鏂囦欢杩涜瑙f瀽锛堢▼搴忓洖浼狅級
+            if (filePath.startsWith("D:\\hy_test\\ncFile")) {
+                handleSecretDocFile(file);
+            }
+        }
+    }
+    @Override
+    public void onFileChange(File file) {
+        log.info("[淇敼]: {}", file.getAbsolutePath());
+    }
+
+    @Override
+    public void onFileDelete(File file) {
+        log.info("[鍒犻櫎]: {}", file.getAbsolutePath());
+    }
+
+    @Override
+    public void onStop(FileAlterationObserver observer) {
+        log.info("缁撴潫鐩戝惉鐩綍: {}", observer.getDirectory().getAbsolutePath());
+    }
+
+    /**
+     * 宸ユ帶缃戣В鏋愭秹瀵嗙綉浼犺繃鏉ョ殑NC鏂囦欢涓巒c鏂囦欢杩涜瑙f瀽
+     * @param file
+     */
+    private void handleIndustrialDocFile(File file) {
+        log.info("宸ユ帶缃戣В鏋愭秹瀵嗙綉浼犺繃鏉ョ殑NC鏂囦欢涓巒c鏂囦欢杩涜瑙f瀽: {}", file.getAbsolutePath());
+        try {
+            if (Objects.equals(FileUtil.getFileSuffix(file.getName()), "nc")) {
+                boolean success = docInfoService.addDocInfoAnalysisGwNcService(file.getAbsolutePath(), file);
+                if (success) {
+                    FileUtilS.copyFileRec(file.getAbsolutePath());
+                    FileUtilS.fileRecDelete(file.getAbsolutePath());
+                }
+            }else if (Objects.equals(FileUtil.getFileSuffix(file.getName()), "txt")) {
+                //todo 鏄惁瑙f瀽宸ヤ綔娴佹搷浣�
+
+            }
+        } catch (Exception e) {
+            log.error("宸ユ帶缃戣В鏋愭秹瀵嗙綉浼犺繃鏉ョ殑NC鏂囦欢涓巒c鏂囦欢杩涜瑙f瀽: {}", e.getMessage());
+        }
+    }
+
+    /**
+     * 娑夊瘑缃戣В鏋愬伐鎺х綉浼犺繃鏉ョ殑NC鏂囦欢涓巒c鏂囦欢杩涜瑙f瀽锛堢▼搴忓洖浼狅級
+     * @param file
+     */
+    private void handleSecretDocFile(File file) {
+        log.info("娑夊瘑缃戣В鏋愬伐鎺х綉浼犺繃鏉ョ殑NC鏂囦欢涓巒c鏂囦欢杩涜瑙f瀽: {}", file.getAbsolutePath());
+        try {
+            boolean b= docInfoService.addDocInfoAnalysisSmwNcService(file.getAbsolutePath(), file);
+
+        }catch (Exception e) {
+            log.error("娑夊瘑缃戣В鏋愬伐鎺х綉浼犺繃鏉ョ殑NC鏂囦欢涓巒c鏂囦欢杩涜瑙f瀽: {}", e.getMessage());
+        }
+    }
+
+
+}
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileMonitorBootstrap.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileMonitorBootstrap.java
new file mode 100644
index 0000000..e6b3d86
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileMonitorBootstrap.java
@@ -0,0 +1,53 @@
+package org.jeecg.modules.dnc.listener;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.boot.web.servlet.ServletContextInitializer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class FileMonitorBootstrap implements ApplicationRunner {
+
+    private MultiPathMonitor monitor;
+
+    @Autowired
+    private FileMonitorConfig config;
+
+    @Autowired
+    private FileListener listener;
+
+    @Bean
+    public MultiPathMonitor fileMonitor() {
+        return new MultiPathMonitor(
+                config.getPaths(),
+                config.getInterval(),
+                listener
+        );
+    }
+
+    @Override
+    public void run(ApplicationArguments args) throws Exception {
+        monitor = fileMonitor();
+        monitor.start();
+    }
+
+    // 鍦ㄥ簲鐢ㄥ叧闂椂鍋滄鐩戞帶
+    @Bean
+    public ServletContextInitializer stopMonitorOnShutdown() {
+        return servletContext -> {
+            servletContext.addListener(new javax.servlet.ServletContextListener() {
+                @Override
+                public void contextDestroyed(javax.servlet.ServletContextEvent sce) {
+                    try {
+                        if (monitor != null) {
+                            monitor.stop();
+                        }
+                    } catch (Exception e) {
+                        System.err.println("鍋滄鐩戞帶鏃跺嚭閿�: " + e.getMessage());
+                    }
+                }
+            });
+        };
+    }
+}
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileMonitorConfig.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileMonitorConfig.java
new file mode 100644
index 0000000..8be5968
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileMonitorConfig.java
@@ -0,0 +1,19 @@
+package org.jeecg.modules.dnc.listener;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Setter
+@Getter
+@Component
+@ConfigurationProperties(prefix = "file.monitor")
+public class FileMonitorConfig {
+    private List<String> paths = new ArrayList<>();
+    private long interval = 10000L; // 榛樿10绉�
+
+}
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/MultiPathMonitor.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/MultiPathMonitor.java
new file mode 100644
index 0000000..267dfc8
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/MultiPathMonitor.java
@@ -0,0 +1,66 @@
+package org.jeecg.modules.dnc.listener;
+import org.apache.commons.io.monitor.FileAlterationMonitor;
+import org.apache.commons.io.monitor.FileAlterationObserver;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+import java.util.List;
+
+public class MultiPathMonitor {
+    private static final Logger log = LoggerFactory.getLogger(MultiPathMonitor.class);
+
+    private final List<String> paths;
+    private final FileListener listener;
+    private final long interval;
+    private final FileAlterationMonitor monitor;
+
+    public MultiPathMonitor(List<String> paths, long interval, FileListener listener) {
+        // 楠岃瘉鐩綍
+        DirectoryValidator.validatePaths(paths);
+        this.paths = paths;
+        this.interval = interval;
+        this.listener = listener;
+        this.monitor = new FileAlterationMonitor(interval);
+    }
+
+    public void start() {
+        // 涓烘瘡涓矾寰勫垱寤虹嫭绔嬬殑瑙傚療鑰�
+        paths.forEach(path -> {
+            FileAlterationObserver observer = new FileAlterationObserver(new File(path));
+            observer.addListener(listener);
+            monitor.addObserver(observer);
+            log.info("寮�濮嬬洃鎺х洰褰�: {}", path);
+        });
+
+        try {
+            monitor.start();
+            log.info("鏂囦欢鐩戞帶鍣ㄥ凡鍚姩锛岀洃鎺х洰褰曟暟閲�: {}", paths.size());
+        } catch (Exception e) {
+            log.error("鐩戞帶鍚姩澶辫触", e);
+            throw new RuntimeException("鐩戞帶鍚姩澶辫触", e);
+        }
+    }
+
+    public void stop() throws Exception {
+        if (monitor != null) {
+            monitor.stop();
+            log.info("鏂囦欢鐩戞帶鍣ㄥ凡鍋滄");
+        }
+    }
+
+    // 鍔ㄦ�佹坊鍔犳柊鐩綍
+    public void addMonitorPath(String newPath) {
+        File dir = new File(newPath);
+        if (!dir.exists() || !dir.isDirectory() || !dir.canRead()) {
+            log.error("鏃犳硶娣诲姞鏃犳晥鐩綍: {}", newPath);
+            return;
+        }
+
+        FileAlterationObserver newObserver = new FileAlterationObserver(dir);
+        newObserver.addListener(listener);
+        monitor.addObserver(newObserver);
+        paths.add(newPath);
+        log.info("鏂板鐩戞帶鐩綍: {}", newPath);
+    }
+}
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/IDocInfoService.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/IDocInfoService.java
index 01cd044..15990e5 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/IDocInfoService.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/IDocInfoService.java
@@ -49,11 +49,17 @@
     boolean addDocInfoRec(String pathFile,File fileRec);
 
     /**
-     * 瑙f瀽NC鏂囨。閫氱敤鏂规硶
+     * 瑙f瀽NC鏂囨。閫氱敤鏂规硶锛堝伐鎺цВ鏋愭秹瀵嗭級
      * @param pathFile,fileRec
      * @return
      */
-    boolean addDocInfoAnalysisNcService(String pathFile,File fileRec) throws FileNotFoundException;
+    boolean addDocInfoAnalysisGwNcService(String pathFile,File fileRec) throws FileNotFoundException;
+
+    /**
+     * 绋嬪簭鍥炰紶锛堟秹瀵嗚В鏋愬伐鎺э級
+     * @param pathFile
+     */
+    boolean addDocInfoAnalysisSmwNcService(String pathFile,File fileRec);
 
     /**
      * 鏂囨。瑙f瀽
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DocInfoServiceImpl.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DocInfoServiceImpl.java
index f31c8d0..a32370c 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DocInfoServiceImpl.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DocInfoServiceImpl.java
@@ -275,7 +275,7 @@
      */
     @Override
     @Transactional(rollbackFor = {Exception.class})
-    public boolean addDocInfoAnalysisNcService(String pathFile,File file) throws FileNotFoundException {
+    public boolean addDocInfoAnalysisGwNcService(String pathFile,File file) throws FileNotFoundException {
         String line;
         int count = 0;
         String loFilePath = config.getPaths().get(0)+"/" + file.getName();
@@ -334,6 +334,18 @@
         return true;
     }
 
+
+    /**
+     * 绋嬪簭鍥炰紶锛堟秹瀵嗚В鏋愬伐鎺э級
+     * @param pathFile
+     */
+    @Override
+    @Transactional(rollbackFor = {Exception.class})
+    public boolean addDocInfoAnalysisSmwNcService(String pathFile,File fileRec){
+        //todo 绋嬪簭鍥炰紶
+        return true;
+    }
+
     @Override
     @Transactional(rollbackFor = {Exception.class})
     public boolean addDocInfoRecService(String equipmentId,File fileRec,String fileNameSuffix,String fileNameNew,String filePath ) {
diff --git a/lxzn-module-system/lxzn-system-start/src/main/resources/application-dev.yml b/lxzn-module-system/lxzn-system-start/src/main/resources/application-dev.yml
index d79ea82..5b27cd5 100644
--- a/lxzn-module-system/lxzn-system-start/src/main/resources/application-dev.yml
+++ b/lxzn-module-system/lxzn-system-start/src/main/resources/application-dev.yml
@@ -311,7 +311,13 @@
 deploy:
     #宸ユ帶缃�/娑夊瘑缃戦儴缃� 0涓烘秹瀵嗙綉 1涓哄伐鎺х綉
     deployType: 0
-    #娑夊瘑缃戜紶杈搉c鏂囦欢澶�
-    secretFolder: D:\\hy_test\\a
-    #宸ユ帶缃戠洃鎺c鏂囦欢澶�
-    workFolder: D:\\hy_test\\b
+    #娑夊瘑缃戜紶杈撳伐鎺х綉nc鏂囦欢澶�(鎸囨淳璁惧nc鏂囦欢)    宸ユ帶缃戜紶杈撴秹瀵嗙綉nc鏂囦欢澶�(瑙f瀽鍥炰紶鍚庣殑nc鏂囦欢)
+    secretFolder: D:\\test\\a
+file:
+  monitor:
+    # 涓変釜鐩戞帶鐩綍閰嶇疆
+    paths:
+      - D:\\hy_test\\ncFile #宸ユ帶璐熻矗瑙f瀽閲岄潰鐨勬枃浠�;娑夊瘑缃戣繘琛岃В鏋愬洖浼犵殑鎿嶄綔
+      - D:\\hy_test\\b
+      - D:\\hy_test\\c
+    interval: 10000  # 鐩戞帶闂撮殧(ms)

--
Gitblit v1.9.3