From bf95078dab81dcd0639fdb1a41e998b31c940fb1 Mon Sep 17 00:00:00 2001
From: zouyu <2723363702@qq.com>
Date: 星期二, 24 三月 2026 09:37:04 +0800
Subject: [PATCH] 采集器调整3

---
 src/main/java/com/chinaztt/mes/docx/util/Result.java                    |   38 +-
 src/main/java/com/chinaztt/mes/docx/pojo/TestBatch.java                 |   19 +
 src/main/java/com/chinaztt/mes/docx/service/impl/DocxServiceImpl.java   |  149 +++-------
 src/main/java/com/chinaztt/mes/docx/handler/GlobalExceptionHandler.java |    6 
 pom.xml                                                                 |   17 +
 src/main/java/com/chinaztt/mes/docx/handler/SerialPortListener.java     |  145 ++++++++++
 src/main/java/com/chinaztt/mes/docx/util/TakeWords.java                 |   95 ++++++
 /dev/null                                                               |   18 -
 src/main/java/com/chinaztt/mes/docx/pojo/Chemical.java                  |   22 +
 src/main/java/com/chinaztt/mes/docx/config/SerialPortStartupRunner.java |   37 ++
 src/main/java/com/chinaztt/mes/docx/controller/DocxController.java      |   13 
 src/main/java/com/chinaztt/mes/docx/util/XMLFileListener.java           |  231 ++++++++++++++++
 src/main/java/com/chinaztt/mes/docx/config/TomcatConfig.java            |    2 
 src/main/java/com/chinaztt/mes/docx/service/DocxService.java            |    8 
 src/main/resources/application.yml                                      |    6 
 15 files changed, 642 insertions(+), 164 deletions(-)

diff --git a/pom.xml b/pom.xml
index 5881d1f..8ae6c48 100644
--- a/pom.xml
+++ b/pom.xml
@@ -15,6 +15,16 @@
     </properties>
     <dependencies>
         <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>2.19.0</version>
+        </dependency>
+        <dependency>
+            <groupId>dom4j</groupId>
+            <artifactId>dom4j</artifactId>
+            <version>1.6.1</version>
+        </dependency>
+        <dependency>
             <groupId>com.alibaba</groupId>
             <artifactId>fastjson</artifactId>
             <version>2.0.23</version>
@@ -62,7 +72,12 @@
             <artifactId>poi-ooxml-full</artifactId>
             <version>5.2.5</version>
         </dependency>
-
+        <dependency>
+            <groupId>com.microsoft.sqlserver</groupId>
+            <artifactId>mssql-jdbc</artifactId>
+            <version>12.4.1.jre8</version> <!-- 閫傞厤 Java 8锛屽叾浠栫増鏈彲璋冩暣 -->
+            <scope>runtime</scope>
+        </dependency>
         <dependency>
             <groupId>org.xerial</groupId>
             <artifactId>sqlite-jdbc</artifactId>
diff --git a/src/main/java/com/chinaztt/mes/docx/config/SerialPortStartupRunner.java b/src/main/java/com/chinaztt/mes/docx/config/SerialPortStartupRunner.java
new file mode 100644
index 0000000..a896d22
--- /dev/null
+++ b/src/main/java/com/chinaztt/mes/docx/config/SerialPortStartupRunner.java
@@ -0,0 +1,37 @@
+package com.chinaztt.mes.docx.config;
+
+import com.chinaztt.mes.docx.handler.SerialPortListener;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+/**
+ * 椤圭洰鍚姩瀹屾垚鍚庢墽琛屼覆鍙g洃鍚�
+ */
+@Slf4j
+@Component
+public class SerialPortStartupRunner implements ApplicationRunner {
+
+    @Value("${serialPort.enable}")
+    public Boolean enableSerialPort;
+
+    @Resource
+    private SerialPortListener serialPortListenerService;
+
+    @Autowired
+    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
+
+    @Override
+    public void run(ApplicationArguments args) {
+        log.info("===== SpringBoot 椤圭洰鍚姩瀹屾垚锛屽紑濮嬪垵濮嬪寲涓插彛鐩戝惉 =====");
+        // 鍚姩涓插彛鐩戝惉锛堟牳蹇冭皟鐢級
+        if(enableSerialPort)threadPoolTaskExecutor.execute(() -> serialPortListenerService.serialPortDataListener());
+    }
+}
diff --git a/src/main/java/com/chinaztt/mes/docx/constant/TomcatConfig.java b/src/main/java/com/chinaztt/mes/docx/config/TomcatConfig.java
similarity index 94%
rename from src/main/java/com/chinaztt/mes/docx/constant/TomcatConfig.java
rename to src/main/java/com/chinaztt/mes/docx/config/TomcatConfig.java
index a0fdee0..05e219c 100644
--- a/src/main/java/com/chinaztt/mes/docx/constant/TomcatConfig.java
+++ b/src/main/java/com/chinaztt/mes/docx/config/TomcatConfig.java
@@ -1,4 +1,4 @@
-package com.chinaztt.mes.docx.constant;
+package com.chinaztt.mes.docx.config;
 
 import org.apache.catalina.connector.Connector;
 import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
diff --git a/src/main/java/com/chinaztt/mes/docx/controller/DocxController.java b/src/main/java/com/chinaztt/mes/docx/controller/DocxController.java
index a031ec0..7c4e04d 100644
--- a/src/main/java/com/chinaztt/mes/docx/controller/DocxController.java
+++ b/src/main/java/com/chinaztt/mes/docx/controller/DocxController.java
@@ -2,7 +2,7 @@
 
 import com.chinaztt.mes.docx.dto.GetFileDto;
 import com.chinaztt.mes.docx.service.DocxService;
-import com.chinaztt.mes.docx.util.R;
+import com.chinaztt.mes.docx.util.Result;
 import net.sourceforge.tess4j.TesseractException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -21,19 +21,18 @@
     private DocxService docxService;
 
     @GetMapping("/getFile")
-    public R<?> getFile(GetFileDto getFileDto) throws IOException, SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException, TesseractException {
+    public Result<?> getFile(GetFileDto getFileDto) throws IOException, SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException, TesseractException {
         return docxService.getFile(getFileDto);
     }
 
     @GetMapping("/moveFile")
-    public R<?> moveFile(String startFilePath, String endFilePath, String fileType) {
+    public Result<?> moveFile(String startFilePath, String endFilePath, String fileType) {
         return docxService.moveFile(startFilePath, endFilePath, fileType);
     }
 
-
-    @GetMapping("/test")
-    public void test() {
-         docxService.test();
+    @GetMapping("/readXml")
+    public void readXml() {
+         docxService.readXml();
     }
 
 }
diff --git a/src/main/java/com/chinaztt/mes/docx/handler/GlobalExceptionHandler.java b/src/main/java/com/chinaztt/mes/docx/handler/GlobalExceptionHandler.java
index b9735a0..a658526 100644
--- a/src/main/java/com/chinaztt/mes/docx/handler/GlobalExceptionHandler.java
+++ b/src/main/java/com/chinaztt/mes/docx/handler/GlobalExceptionHandler.java
@@ -1,13 +1,13 @@
 package com.chinaztt.mes.docx.handler;
 
-import com.chinaztt.mes.docx.util.R;
+import com.chinaztt.mes.docx.util.Result;
 import org.springframework.web.bind.annotation.ExceptionHandler;
 import org.springframework.web.bind.annotation.RestControllerAdvice;
 
 @RestControllerAdvice
 public class GlobalExceptionHandler {
     @ExceptionHandler({Exception.class})
-    public R<?> exception(Exception e) {
-        return R.failed(e.getMessage());
+    public Result<?> exception(Exception e) {
+        return Result.failed(e.getMessage());
     }
 }
diff --git a/src/main/java/com/chinaztt/mes/docx/handler/SerialPortListener.java b/src/main/java/com/chinaztt/mes/docx/handler/SerialPortListener.java
new file mode 100644
index 0000000..d0edcff
--- /dev/null
+++ b/src/main/java/com/chinaztt/mes/docx/handler/SerialPortListener.java
@@ -0,0 +1,145 @@
+package com.chinaztt.mes.docx.handler;
+
+import com.fazecast.jSerialComm.SerialPort;
+import com.fazecast.jSerialComm.SerialPortDataListener;
+import com.fazecast.jSerialComm.SerialPortEvent;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.List;
+
+@Slf4j
+@Component
+public class SerialPortListener {
+
+    // 涓插彛鏍稿績瀵硅薄
+    private static SerialPort serialPort;
+
+    // 瀹氫箟缂撳啿鍖猴紝鏆傚瓨闆舵暎鏁版嵁
+    private static final StringBuilder dataBuffer = new StringBuilder();
+
+    // 瀹氫箟鏁版嵁缁撴潫鏍囧織
+    private static final String END_MARK = "g";
+
+    public List<Double> dataList = new ArrayList<>(6);
+
+    private static final int MAX_COUNT = 6;
+
+    @Value("${serialPort.listenName}")
+    public String listenName;
+
+    // 鏍囪鐩戝惉鏄惁杩愯
+    private volatile boolean isListening = false;
+
+    public void serialPortDataListener(){
+        // 鍙岄噸鏍¢獙閿侊紝閬垮厤閲嶅鍚姩
+        if (isListening) {
+            log.warn("涓插彛 {} 鐩戝惉宸插惎鍔紝鏃犻渶閲嶅鎵ц", listenName);
+            return;
+        }
+
+        synchronized (this) {
+            if (isListening) {
+                return;
+            }
+            isListening = true;
+        }
+
+        // 2. 閫夋嫨鐩爣涓插彛
+        String targetPortName = listenName;
+        serialPort = SerialPort.getCommPort(targetPortName);
+
+        // 3. 閰嶇疆涓插彛鍙傛暟锛堥渶涓庤澶囩涓�鑷达級
+        serialPort.setBaudRate(9600);       // 娉㈢壒鐜�
+        serialPort.setNumDataBits(8);       // 鏁版嵁浣�
+        serialPort.setNumStopBits(1);       // 鍋滄浣�
+        serialPort.setParity(SerialPort.NO_PARITY); // 鏍¢獙浣嶏紙鏃犳牎楠岋級
+        serialPort.setFlowControl(SerialPort.NO_PARITY); // 鍏抽棴娴佹帶
+        serialPort.setComPortTimeouts(SerialPort.TIMEOUT_READ_SEMI_BLOCKING, 1000, 0); // 璇诲彇瓒呮椂
+
+        // 4. 鎵撳紑涓插彛
+        if (serialPort.openPort()) {
+            log.info("涓插彛鎵撳紑鎴愬姛锛歿}",targetPortName);
+        } else {
+            log.error("涓插彛鎵撳紑澶辫触锛佽妫�鏌ヤ覆鍙f槸鍚﹁鍗犵敤鎴栧悕绉版槸鍚︽纭�");
+            isListening = false;
+            return;
+        }
+
+        // 5. 娉ㄥ唽涓插彛鏁版嵁鐩戝惉鍣紙寮傛璇诲彇锛岄伩鍏嶉樆濉炰富绾跨▼锛�
+        try {
+            serialPort.addDataListener(new SerialPortDataListener() {
+                // 鎸囧畾鐩戝惉鐨勪簨浠剁被鍨嬶細鏁版嵁鍙敤鏃惰Е鍙�
+                @Override
+                public int getListeningEvents() {
+                    return SerialPort.LISTENING_EVENT_DATA_AVAILABLE;
+                }
+
+                // 鏁版嵁鍙敤鏃剁殑澶勭悊閫昏緫
+                @Override
+                public void serialEvent(SerialPortEvent event) {
+                    if (event.getEventType() == SerialPort.LISTENING_EVENT_DATA_AVAILABLE) {
+                        // 璇诲彇缂撳啿鍖轰腑鐨勬墍鏈夊瓧鑺�
+                        byte[] buffer = new byte[serialPort.bytesAvailable()];
+                        int readBytes = serialPort.readBytes(buffer, buffer.length);
+
+                        if (readBytes > 0) {
+                            // 鎶婃湰娆℃敹鍒扮殑闆舵暎鏁版嵁杞垚瀛楃涓诧紝杩藉姞鍒扮紦鍐插尯
+                            String received = new String(buffer, 0, readBytes, StandardCharsets.UTF_8);
+                            dataBuffer.append(received);
+
+                            // 妫�鏌ョ紦鍐插尯鏄惁鍖呭惈鈥滅粨鏉熸爣蹇椻�濓紝寰幆澶勭悊鎵�鏈夊畬鏁存暟鎹�
+                            int endIndex = dataBuffer.indexOf(END_MARK);
+                            while (endIndex != -1) {
+                                // 鎻愬彇鈥滃紑澶村埌缁撴潫鏍囧織鈥濈殑瀹屾暣鏁版嵁
+                                String completeData = dataBuffer.substring(0, endIndex).replace(" ", "").replace("\n","");
+                                // 鎵撳嵃/澶勭悊鍚堝苟鍚庣殑瀹屾暣鏁版嵁
+                                double parseDouble = Double.parseDouble(completeData);
+                                log.info("鎺ユ敹鍒扮殑鏁版嵁-->{}",parseDouble);
+                                if(dataList.size()<MAX_COUNT){
+                                    dataList.add(parseDouble);
+                                }
+                                // 绉婚櫎缂撳啿鍖轰腑宸插鐞嗙殑閮ㄥ垎锛堜繚鐣欏墿浣欐湭瀹屾垚鐨勫唴瀹癸級
+                                dataBuffer.delete(0, endIndex + END_MARK.length());
+                                // 缁х画妫�鏌ョ紦鍐插尯鏄惁杩樻湁鍏朵粬瀹屾暣鏁版嵁
+                                endIndex = dataBuffer.indexOf(END_MARK);
+                            }
+                        }
+                    }
+                }
+            });
+        } catch (Exception e) {
+            log.warn("涓插彛鐩戝惉瀛愮嚎绋嬭涓柇", e);
+            Thread.currentThread().interrupt();
+        }
+    }
+
+    /**
+     * 鍏抽棴涓插彛
+     */
+    private void closeSerialPort() {
+        if (serialPort != null && serialPort.isOpen()) {
+            serialPort.removeDataListener(); // 绉婚櫎鐩戝惉
+            serialPort.closePort(); // 鍏抽棴涓插彛
+            log.info("涓插彛 {} 宸插叧闂�", listenName);
+        }
+        isListening = false;
+    }
+
+    /**
+     * 椤圭洰鍋滄鏃跺叧闂覆鍙�
+     */
+    @PreDestroy
+    public void destroy() {
+        log.info("椤圭洰鍋滄锛屽叧闂覆鍙� {} 鐩戝惉", listenName);
+        isListening = false; // 缁堟瀛愮嚎绋嬪惊鐜�
+        closeSerialPort();
+    }
+
+}
diff --git a/src/main/java/com/chinaztt/mes/docx/pojo/Chemical.java b/src/main/java/com/chinaztt/mes/docx/pojo/Chemical.java
new file mode 100644
index 0000000..ce15cfc
--- /dev/null
+++ b/src/main/java/com/chinaztt/mes/docx/pojo/Chemical.java
@@ -0,0 +1,22 @@
+package com.chinaztt.mes.docx.pojo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @Description 鍖栧鎴愬垎淇℃伅
+ * @Author fz
+ **/
+@Data
+public class Chemical implements Serializable {
+
+    private String name;// 鍏冪礌鍚�
+    private String value = "-";// 妫�楠屾暟鍊�
+    private String record = "-";// 璁板綍鏁板��
+    private String detail = "-";// 鏍囧噯鏄庣粏
+    private String result = "-";// 妫�楠岀粨璁�
+    private Date testTime;
+    private Date equipmentTime;
+}
diff --git a/src/main/java/com/chinaztt/mes/docx/pojo/TestBatch.java b/src/main/java/com/chinaztt/mes/docx/pojo/TestBatch.java
new file mode 100644
index 0000000..9a0f6c2
--- /dev/null
+++ b/src/main/java/com/chinaztt/mes/docx/pojo/TestBatch.java
@@ -0,0 +1,19 @@
+package com.chinaztt.mes.docx.pojo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @Description 鍏夎氨浠笂鐨勬楠屼俊鎭�
+ * @Author fz
+ **/
+@Data
+public class TestBatch implements Serializable {
+
+    private String batchNo;// 妫�楠屾壒娆′俊鎭�
+    private Date equipmentTime;// 璁板綍鏃堕棿
+    private List<Chemical> chemicals;// 鍖栧鎴愬垎鍒楄〃
+}
diff --git a/src/main/java/com/chinaztt/mes/docx/service/DocxService.java b/src/main/java/com/chinaztt/mes/docx/service/DocxService.java
index 4029dd8..7b6d49d 100644
--- a/src/main/java/com/chinaztt/mes/docx/service/DocxService.java
+++ b/src/main/java/com/chinaztt/mes/docx/service/DocxService.java
@@ -1,17 +1,17 @@
 package com.chinaztt.mes.docx.service;
 
 import com.chinaztt.mes.docx.dto.GetFileDto;
-import com.chinaztt.mes.docx.util.R;
+import com.chinaztt.mes.docx.util.Result;
 import net.sourceforge.tess4j.TesseractException;
 
 import java.io.IOException;
 import java.sql.SQLException;
 
 public interface DocxService {
-    R<?> getFile(GetFileDto getFileDto) throws IOException, SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException, TesseractException;
+    Result<?> getFile(GetFileDto getFileDto) throws IOException, SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException, TesseractException;
 
-    R<?> moveFile(String startFilePath, String endFilePath, String fileType);
+    Result<?> moveFile(String startFilePath, String endFilePath, String fileType);
 
-    void test();
+    void readXml();
 
 }
diff --git a/src/main/java/com/chinaztt/mes/docx/service/impl/DocxServiceImpl.java b/src/main/java/com/chinaztt/mes/docx/service/impl/DocxServiceImpl.java
index a10f958..8a55cec 100644
--- a/src/main/java/com/chinaztt/mes/docx/service/impl/DocxServiceImpl.java
+++ b/src/main/java/com/chinaztt/mes/docx/service/impl/DocxServiceImpl.java
@@ -3,79 +3,93 @@
 import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.chinaztt.mes.docx.dto.GetFileDto;
+import com.chinaztt.mes.docx.handler.SerialPortListener;
+import com.chinaztt.mes.docx.pojo.TestBatch;
 import com.chinaztt.mes.docx.service.DocxService;
-import com.chinaztt.mes.docx.util.R;
+import com.chinaztt.mes.docx.util.XMLFileListener;
+import com.chinaztt.mes.docx.util.Result;
 import com.chinaztt.mes.docx.util.TakeWords;
-import com.fazecast.jSerialComm.SerialPort;
-import com.fazecast.jSerialComm.SerialPortDataListener;
-import com.fazecast.jSerialComm.SerialPortEvent;
+import lombok.extern.slf4j.Slf4j;
 import net.sourceforge.tess4j.TesseractException;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.io.File;
 import java.io.IOException;
-import java.nio.charset.StandardCharsets;
 import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
 
 @Service
+@Slf4j
 public class DocxServiceImpl implements DocxService {
 
+    @Autowired
+    private SerialPortListener serialPortListener;
+
     @Override
-    public R<?> getFile(GetFileDto getFileDto) throws IOException, SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException, TesseractException {
+    public Result<?> getFile(GetFileDto getFileDto) throws IOException, SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException, TesseractException {
         String fileExtension = getFileDto.getFileExtension();
         if(StringUtils.equals(".pngInExcel",getFileDto.getFileExtension())){
             fileExtension = ".xls";
         }
         File file = getFileStart(getFileDto.getFilePath(), fileExtension);
         if (file != null && !file.exists()) {
-            return R.failed("鏈煡璇㈠埌璇ヨ矾寰勶細" + getFileDto.getFilePath() + "涓嬪瓨鍦細" + getFileDto.getFileExtension() + "缁撳熬鐨勬枃浠讹紒");
+            return Result.failed("鏈煡璇㈠埌璇ヨ矾寰勶細" + getFileDto.getFilePath() + "涓嬪瓨鍦細" + getFileDto.getFileExtension() + "缁撳熬鐨勬枃浠讹紒");
         }
         switch (getFileDto.getFileExtension()) {
             case ".docx":
-                return R.ok(TakeWords.readWordFile(file));
+                return Result.ok(TakeWords.readWordFile(file));
             case ".pngInExcel":
-                return R.ok(TakeWords.readPngContextInExcel(file));
+                return Result.ok(TakeWords.readPngContextInExcel(file));
             case ".xls":
             case ".xlsx":
                 try {
-                    return R.ok(TakeWords.readExcelFile(file));
+                    return Result.ok(TakeWords.readExcelFile(file));
                 } catch (Exception e) {
-                    return R.failed("鍙︿竴涓▼搴忔鍦ㄤ娇鐢ㄦ鏂囦欢锛屾棤娉曡繘琛屾暟鎹噰闆嗐��");
+                    return Result.failed("鍙︿竴涓▼搴忔鍦ㄤ娇鐢ㄦ鏂囦欢锛屾棤娉曡繘琛屾暟鎹噰闆嗐��");
                 }
             case ".txt":
-                return R.ok(TakeWords.readTxtFile(file));
+                return Result.ok(TakeWords.readTxtFile(file));
             case ".csv":
-                return R.ok(TakeWords.readCsvFile(file));
+                return Result.ok(TakeWords.readCsvFile(file));
             case ".mdb":
                 if (ObjectUtil.isEmpty(getFileDto.getDbFileName()) || Objects.equals(getFileDto.getDbFileName(), "null")) {
-                    return R.failed("鏈厤缃�.mdb閲囬泦鏂囦欢鍚嶇О锛�");
+                    return Result.failed("鏈厤缃�.mdb閲囬泦鏂囦欢鍚嶇О锛�");
                 }
-                return R.ok(TakeWords.readMdbFile(file, getFileDto));
+                return Result.ok(TakeWords.readMdbFile(file, getFileDto));
             case ".db":
                 if (ObjectUtil.isEmpty(getFileDto.getDbFileName()) || Objects.equals(getFileDto.getDbFileName(), "null")) {
-                    return R.failed("鏈厤缃�.db閲囬泦鏂囦欢鍚嶇О锛�");
+                    return Result.failed("鏈厤缃�.db閲囬泦鏂囦欢鍚嶇О锛�");
                 }
-                return R.ok(TakeWords.readDbFile(file, getFileDto));
+                return Result.ok(TakeWords.readDbFile(file, getFileDto));
             case ".mysql":
                 if (ObjectUtil.isEmpty(getFileDto.getDbFileName()) || Objects.equals(getFileDto.getDbFileName(), "null")) {
-                    return R.failed("鏈厤缃�.mysql閲囬泦鏂囦欢鍚嶇О锛�");
+                    return Result.failed("鏈厤缃�.mysql閲囬泦鏂囦欢鍚嶇О锛�");
                 }
-                return R.ok(TakeWords.getMysqlFile(getFileDto));
+                return Result.ok(TakeWords.getMysqlFile(getFileDto));
             case ".png":
-                return R.ok(TakeWords.readPngFile(file));
+                return Result.ok(TakeWords.readPngFile(file));
             case ".mqtt":
-                return R.ok("mqtt---");
+                return Result.ok("mqtt---");
+            case ".serialPort":
+                List<Double> valList = new ArrayList<>(serialPortListener.dataList);
+                serialPortListener.dataList.clear();
+                return Result.ok(valList);
+            case ".sqlserver":
+                if (ObjectUtil.isEmpty(getFileDto.getDbFileName()) || Objects.equals(getFileDto.getDbFileName(), "null")) {
+                    return Result.failed("鏈厤缃�.sqlserver閲囬泦鏂囦欢鍚嶇О锛�");
+                }
+                return Result.ok(TakeWords.readSqlServerDataBase(getFileDto));
             default:
-                return R.failed("鍚庣紑鍚嶉厤缃敊璇紒");
+                return Result.failed("鍚庣紑鍚嶉厤缃敊璇紒");
         }
     }
 
     @Override
-    public R<?> moveFile(String startFilePath, String endFilePath, String fileType) {
+    public Result<?> moveFile(String startFilePath, String endFilePath, String fileType) {
         // 婧愭枃浠惰矾寰�
         File startFile= getFileStart(startFilePath, fileType);
         // 鐩殑鐩綍璺緞
@@ -90,15 +104,14 @@
         try {
 	    // 璋冪敤File绫荤殑鏍稿績鏂规硶renameTo
             if (startFile.renameTo(endFile)) {
-                return R.ok("鏂囦欢绉诲姩鎴愬姛锛�");
+                return Result.ok("鏂囦欢绉诲姩鎴愬姛锛�");
             } else {
-                return R.failed("鏂囦欢绉诲姩澶辫触锛�");
+                return Result.failed("鏂囦欢绉诲姩澶辫触锛�");
             }
         }catch(Exception e) {
-            return R.failed("鏂囦欢绉诲姩鍑虹幇寮傚父锛�");
+            return Result.failed("鏂囦欢绉诲姩鍑虹幇寮傚父锛�");
         }
     }
-
 
     public static File getLatestFile(List<File> files) {
         File latestFile = null;
@@ -140,84 +153,10 @@
     }
 
     @Override
-    public void test(){
-        // 1. 鑾峰彇鎵�鏈夊彲鐢ㄧ殑涓插彛
-        SerialPort[] ports = SerialPort.getCommPorts();
-        if (ports.length == 0) {
-            System.err.println("鏈壘鍒板彲鐢ㄧ殑涓插彛锛�");
-            return;
-        }
-
-        // 鎵撳嵃鎵�鏈夊彲鐢ㄤ覆鍙o紙渚涚敤鎴烽�夋嫨锛�
-        System.out.println("鍙敤涓插彛鍒楄〃锛�");
-        SerialPort targetPort = null;
-        for (int i = 0; i < ports.length; i++) {
-            if(ports[i].getSystemPortName().equals("COM7")){
-                targetPort = ports[i];
-            }
-            System.out.printf("%d: %s (%s)\n", i + 1, ports[i].getSystemPortName(), ports[i].getPortDescription());
-        }
-
-        // 2. 閫夋嫨鐩爣涓插彛锛堢ず渚嬶細閫夋嫨绗竴涓覆鍙o級
-
-        System.out.println("\n閫夋嫨鐨勪覆鍙o細" + targetPort.getSystemPortName());
-
-        // 3. 閰嶇疆涓插彛鍙傛暟锛堝繀椤讳笌璁惧涓�鑷达紝鍚﹀垯閫氫俊澶辫触锛�
-        targetPort.setComPortParameters(
-                9600,                // 娉㈢壒鐜囷紙甯歌鍊硷細9600銆�19200銆�38400銆�115200锛�
-                8,                   // 鏁版嵁浣嶏紙閫氬父涓� 8锛�
-                SerialPort.ONE_STOP_BIT,  // 鍋滄浣嶏紙1 浣嶏級
-                SerialPort.NO_PARITY     // 鏍¢獙浣嶏紙鏃犳牎楠岋級
-        );
-        targetPort.setComPortTimeouts(SerialPort.TIMEOUT_READ_SEMI_BLOCKING, 100, 0); // 璇诲彇瓒呮椂璁剧疆
-
-        // 4. 鎵撳紑涓插彛
-        if (!targetPort.openPort()) {
-            System.err.println("涓插彛鎵撳紑澶辫触锛佽妫�鏌ョ鍙f槸鍚﹁鍗犵敤鎴栨潈闄愭槸鍚﹁冻澶熴��");
-            return;
-        }
-        System.out.println("涓插彛鎵撳紑鎴愬姛锛�");
-
-        // 5. 娉ㄥ唽鏁版嵁鐩戝惉锛堝紓姝ヨ鍙栨暟鎹級
-        SerialPort finalTargetPort = targetPort;
-        targetPort.addDataListener(new SerialPortDataListener() {
-            @Override
-            public int getListeningEvents() {
-                return SerialPort.LISTENING_EVENT_DATA_AVAILABLE; // 鐩戝惉鏁版嵁鍙敤浜嬩欢
-            }
-
-            @Override
-            public void serialEvent(SerialPortEvent event) {
-                System.out.println("asasa"+event.toString());
-                if (event.getEventType() != SerialPort.LISTENING_EVENT_DATA_AVAILABLE) {
-                    return;
-                }
-
-                // 璇诲彇鍙敤鏁版嵁
-                byte[] readBuffer = new byte[finalTargetPort.bytesAvailable()];
-                int bytesRead = finalTargetPort.readBytes(readBuffer, readBuffer.length);
-
-                if (bytesRead > 0) {
-                    // 杞崲涓哄瓧绗︿覆锛堟牴鎹澶囩紪鐮佽皟鏁达紝甯歌锛歎TF-8銆丟BK锛�
-                    String data = new String(readBuffer, 0, bytesRead, StandardCharsets.UTF_8);
-                    System.out.printf("鏀跺埌鏁版嵁锛�%d 瀛楄妭锛夛細%s", bytesRead, data);
-                }
-            }
-        });
-
-        // 6. 淇濇寔绋嬪簭杩愯锛堥伩鍏嶄富绾跨▼閫�鍑猴級
-        try {
-            while (true) {
-                Thread.sleep(1000); // 涓荤嚎绋嬩紤鐪狅紝涓嶅奖鍝嶇洃鍚嚎绋�
-            }
-        } catch (InterruptedException e) {
-            Thread.currentThread().interrupt();
-            System.out.println("绋嬪簭琚腑鏂��");
-        } finally {
-            // 7. 鍏抽棴涓插彛锛堢▼搴忛��鍑烘椂閲婃斁璧勬簮锛�
-            targetPort.closePort();
-            System.out.println("涓插彛宸插叧闂��");
-        }
+    public void readXml() {
+        XMLFileListener fileListener = new XMLFileListener();
+        List<TestBatch> testBatches = fileListener.explainXml(new File("C:\\Users\\27233\\Desktop\\251117鏁伴噰鏂囦欢\\鏁伴噰鏂囦欢\\鍏夎氨浠猂esults_20251018133246.xml"));
+        testBatches.forEach(System.out::println);
     }
 
 }
diff --git a/src/main/java/com/chinaztt/mes/docx/util/CharsetChangeUtil.java b/src/main/java/com/chinaztt/mes/docx/util/CharsetChangeUtil.java
deleted file mode 100644
index 3817040..0000000
--- a/src/main/java/com/chinaztt/mes/docx/util/CharsetChangeUtil.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.chinaztt.mes.docx.util;
-
-import java.io.UnsupportedEncodingException;
-import java.util.Objects;
-
-/**
- * 瀛楃涓茬紪鐮佽浆鎹㈠伐鍏风被
- */
-public class CharsetChangeUtil {
-
-    private static final String UTF8 = "UTF-8";
-
-    private static final String GB2312 = "GB2312";
-
-
-
-
-}
diff --git a/src/main/java/com/chinaztt/mes/docx/util/R.java b/src/main/java/com/chinaztt/mes/docx/util/Result.java
similarity index 73%
rename from src/main/java/com/chinaztt/mes/docx/util/R.java
rename to src/main/java/com/chinaztt/mes/docx/util/Result.java
index c145904..63f4c24 100644
--- a/src/main/java/com/chinaztt/mes/docx/util/R.java
+++ b/src/main/java/com/chinaztt/mes/docx/util/Result.java
@@ -9,7 +9,11 @@
 
 import java.io.Serializable;
 
-public class R<T> implements Serializable {
+/**
+ * 閫氱敤杩斿洖瀵硅薄
+ * @param <T>
+ */
+public class Result<T> implements Serializable {
     private static final long serialVersionUID = 1L;
     // "杩斿洖鏍囪锛氭垚鍔熸爣璁�=0锛屽け璐ユ爣璁�=1"
     private int code;
@@ -18,36 +22,36 @@
     // "鏁版嵁"
     private T data;
 
-    public static <T> R<T> ok() {
+    public static <T> Result<T> ok() {
         return restResult(null, CommonConstants.SUCCESS, (String) null);
     }
 
-    public static <T> R<T> ok(T data) {
+    public static <T> Result<T> ok(T data) {
         return restResult(data, CommonConstants.SUCCESS, (String) null);
     }
 
-    public static <T> R<T> ok(T data, String msg) {
+    public static <T> Result<T> ok(T data, String msg) {
         return restResult(data, CommonConstants.SUCCESS, msg);
     }
 
-    public static <T> R<T> failed() {
+    public static <T> Result<T> failed() {
         return restResult(null, CommonConstants.FAIL, (String) null);
     }
 
-    public static <T> R<T> failed(String msg) {
+    public static <T> Result<T> failed(String msg) {
         return restResult(null, CommonConstants.FAIL, msg);
     }
 
-    public static <T> R<T> failed(T data) {
+    public static <T> Result<T> failed(T data) {
         return restResult(data, CommonConstants.FAIL, (String) null);
     }
 
-    public static <T> R<T> failed(T data, String msg) {
+    public static <T> Result<T> failed(T data, String msg) {
         return restResult(data, CommonConstants.FAIL, msg);
     }
 
-    private static <T> R<T> restResult(T data, int code, String msg) {
-        R<T> apiResult = new R();
+    private static <T> Result<T> restResult(T data, int code, String msg) {
+        Result<T> apiResult = new Result();
         apiResult.setCode(code);
         apiResult.setData(data);
         apiResult.setMsg(msg);
@@ -62,10 +66,10 @@
         return "R(code=" + this.getCode() + ", msg=" + this.getMsg() + ", data=" + this.getData() + ")";
     }
 
-    public R() {
+    public Result() {
     }
 
-    public R(int code, String msg, T data) {
+    public Result(int code, String msg, T data) {
         this.code = code;
         this.msg = msg;
         this.data = data;
@@ -75,7 +79,7 @@
         return this.code;
     }
 
-    public R<T> setCode(int code) {
+    public Result<T> setCode(int code) {
         this.code = code;
         return this;
     }
@@ -84,7 +88,7 @@
         return this.msg;
     }
 
-    public R<T> setMsg(String msg) {
+    public Result<T> setMsg(String msg) {
         this.msg = msg;
         return this;
     }
@@ -93,7 +97,7 @@
         return this.data;
     }
 
-    public R<T> setData(T data) {
+    public Result<T> setData(T data) {
         this.data = data;
         return this;
     }
@@ -121,8 +125,8 @@
             return this;
         }
 
-        public R<T> build() {
-            return new R(this.code, this.msg, this.data);
+        public Result<T> build() {
+            return new Result(this.code, this.msg, this.data);
         }
 
         public String toString() {
diff --git a/src/main/java/com/chinaztt/mes/docx/util/TakeWords.java b/src/main/java/com/chinaztt/mes/docx/util/TakeWords.java
index 861d5ad..e563da7 100644
--- a/src/main/java/com/chinaztt/mes/docx/util/TakeWords.java
+++ b/src/main/java/com/chinaztt/mes/docx/util/TakeWords.java
@@ -17,7 +17,6 @@
 import org.apache.poi.ooxml.POIXMLDocument;
 import org.apache.poi.ooxml.extractor.POIXMLTextExtractor;
 import org.apache.poi.openxml4j.opc.OPCPackage;
-import org.apache.poi.poifs.filesystem.POIFSFileSystem;
 import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.ss.usermodel.Workbook;
 import org.apache.poi.ss.usermodel.WorkbookFactory;
@@ -236,7 +235,7 @@
             if(StringUtils.isNotBlank(getFileDto.getMdbSampleCode())){
                 s+=" and " + getFileDto.getMdbSampleCode() + " = '" + getFileDto.getSampleCode() + "'";
             }
-            if(StringUtils.isNotBlank(getFileDto.getBushingColorField())){
+            if(ObjectUtils.allNotNull(getFileDto.getBushingColorField(), getFileDto.getBushingColor()) && !getFileDto.getBushingColorField().equals("null")){
                 s+=" and " + getFileDto.getBushingColorField() + " = '" + getFileDto.getBushingColor() + "'";
             }
 
@@ -286,7 +285,7 @@
         String table = getFileDto.getDbTable();
         // 妫�鏌ユ暟鎹簱鍚嶅拰琛ㄥ悕鏄惁涓虹┖
         if (dbName == null || dbName.isEmpty() || table == null || table.isEmpty()) {
-            return R.failed("鏁版嵁搴撳悕鎴栬〃鍚嶄笉鑳戒负绌�");
+            return Result.failed("鏁版嵁搴撳悕鎴栬〃鍚嶄笉鑳戒负绌�");
         }
         // 鏁版嵁搴撹繛鎺ヤ俊鎭�
         String url = "jdbc:mysql://localhost:3306/"+dbName+"?useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true&characterEncoding=utf8";
@@ -332,7 +331,7 @@
         } catch (Exception e) {
             e.printStackTrace();
             // 鍋囪 R 绫绘湁 failed 鏂规硶锛岃嫢娌℃湁闇�琛ュ厖瀹炵幇
-            return R.failed("鏁版嵁搴撴煡璇㈠嚭閿�: " + e.getMessage());
+            return Result.failed("鏁版嵁搴撴煡璇㈠嚭閿�: " + e.getMessage());
         } finally {
             try {
                 if (resultSet != null) {
@@ -371,9 +370,13 @@
             List<Object> list = new ArrayList<>();
             //杞箟涓枃
             String sampleCode = changeCharset(getFileDto.getSampleCode(), "GBK");
-            String sql = "select * from " + getFileDto.getDbFileName() +
-                    " where " + getFileDto.getMdbEntrustCode() + " = '" + getFileDto.getEntrustCode() +
-                    "' and " + getFileDto.getMdbSampleCode() + " = '" + sampleCode + "'";
+            String sql = "select * from " + getFileDto.getDbFileName() + " where 1=1";
+            if(StringUtils.isNotBlank(getFileDto.getMdbEntrustCode())){
+                sql+=" and " + getFileDto.getMdbEntrustCode() + " = '" + getFileDto.getEntrustCode() +"'";
+            }
+            if(StringUtils.isNotBlank(getFileDto.getMdbSampleCode())){
+                sql+=" and " + getFileDto.getMdbSampleCode() + " = '" + sampleCode + "'";
+            }
             if (ObjectUtils.allNotNull(getFileDto.getFiberOpticRibbonCode(), getFileDto.getFiberOpticRibbon()) && !getFileDto.getFiberOpticRibbonCode().equals("null")) {
                 sql = sql + " and " + getFileDto.getFiberOpticRibbonCode() + " = '" + getFileDto.getFiberOpticRibbon() + "'";
             }
@@ -456,4 +459,82 @@
         }
     }
 
+    /**
+     * 璇诲彇sqlserver鏁版嵁
+     * @param getFileDto 璇锋眰鍙傛暟瀵硅薄
+     * @return
+     */
+    public static Object readSqlServerDataBase(GetFileDto getFileDto) {
+        Map<String, Object> tableMap = new HashMap<>(16);
+        // 浠� GetFileDto 鑾峰彇鏁版嵁搴撳悕锛屽搴斻�愭枃浠跺悕绉般�戝瓧娈�
+        String dbName = getFileDto.getDbFileName();
+        String user = getFileDto.getDbUserName();
+        String password = getFileDto.getDbPassword();
+        // 浠� GetFileDto 鑾峰彇鏁版嵁琛ㄥ悕锛屽搴斻�愭暟鎹簱琛ㄥ悕銆戝瓧娈�
+        String table = getFileDto.getDbTable();
+        // 妫�鏌ユ暟鎹簱鍚嶅拰琛ㄥ悕鏄惁涓虹┖
+        if (dbName == null || dbName.isEmpty() || table == null || table.isEmpty()) {
+            return Result.failed("鏁版嵁搴撳悕鎴栬〃鍚嶄笉鑳戒负绌�");
+        }
+        // 鏁版嵁搴撹繛鎺ヤ俊鎭�
+        String url = "jdbc:sqlserver://localhost:1433;DatabaseName="+dbName+";encrypt=true;trustServerCertificate=true";
+        Connection connection = null;
+        PreparedStatement preparedStatement = null;
+        ResultSet resultSet = null;
+        List<Map<String, Object>> dataList = new ArrayList<>();
+        try {
+            // 寤虹珛杩炴帴
+            connection = DriverManager.getConnection(url, user, password);
+            // 鏋勫缓鍩虹 SQL
+
+            String sql = "SELECT * FROM "+table+" WHERE 1=1";
+            if(StringUtils.isNotBlank(getFileDto.getMdbEntrustCode()) ){
+                sql+=" AND (" + getFileDto.getMdbEntrustCode() + " = TRIM('" + getFileDto.getEntrustCode()+ "')";
+                if(StringUtils.isNotBlank(getFileDto.getLotBatchNo())){
+                    sql+=" OR "+ getFileDto.getMdbEntrustCode() + " = TRIM('" + getFileDto.getLotBatchNo()+ "')";
+                }
+                sql+=")";
+            }
+            if(StringUtils.isNotBlank(getFileDto.getMdbSampleCode())){
+                sql+=" AND " + getFileDto.getMdbSampleCode() + " = '" + getFileDto.getSampleCode() + "'";
+            }
+            if(StringUtils.isNotBlank(getFileDto.getCableTag())){
+                sql+=" AND Color = '" + getFileDto.getCableTag() + "'";
+            }
+            // 鍒涘缓 PreparedStatement 瀵硅薄鎵ц SQL
+            preparedStatement = connection.prepareStatement(sql);
+            resultSet = preparedStatement.executeQuery();
+            ResultSetMetaData metaData = resultSet.getMetaData();
+            int columnCount = metaData.getColumnCount();
+            // 閬嶅巻缁撴灉闆嗚幏鍙栨暟鎹�
+            while (resultSet.next()) {
+                Map<String, Object> rowData = new HashMap<>();
+                for (int i = 1; i <= columnCount; i++) {
+                    String columnName = metaData.getColumnName(i);
+                    rowData.put(columnName, resultSet.getObject(i));
+                }
+                dataList.add(rowData);
+            }
+            tableMap.put("data", dataList);
+        } catch (Exception e) {
+            e.printStackTrace();
+            // 鍋囪 R 绫绘湁 failed 鏂规硶锛岃嫢娌℃湁闇�琛ュ厖瀹炵幇
+            return Result.failed("鏁版嵁搴撴煡璇㈠嚭閿�: " + e.getMessage());
+        } finally {
+            try {
+                if (resultSet != null) {
+                    resultSet.close();
+                }
+                if (preparedStatement != null) {
+                    preparedStatement.close();
+                }
+                if (connection != null) {
+                    connection.close();
+                }
+            } catch (SQLException e) {
+                e.printStackTrace();
+            }
+        }
+        return tableMap;
+    }
 }
diff --git a/src/main/java/com/chinaztt/mes/docx/util/XMLFileListener.java b/src/main/java/com/chinaztt/mes/docx/util/XMLFileListener.java
new file mode 100644
index 0000000..585dfc0
--- /dev/null
+++ b/src/main/java/com/chinaztt/mes/docx/util/XMLFileListener.java
@@ -0,0 +1,231 @@
+package com.chinaztt.mes.docx.util;
+
+import com.chinaztt.mes.docx.pojo.Chemical;
+import com.chinaztt.mes.docx.pojo.TestBatch;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.SerializationUtils;
+import org.dom4j.Attribute;
+import org.dom4j.Document;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+import java.io.File;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @Description 鏂囦欢鍙樺寲澶勭悊
+ * @Author fz
+ **/
+@Slf4j
+public class XMLFileListener {
+
+    private final SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+    /**
+     * 瑙f瀽xml鏂囦欢
+     *
+     * @param file
+     */
+    public List<TestBatch> explainXml(File file) {
+        // 閫氳繃鍚庣紑鍚嶅垽鏂槸鍚︽槸xml鏂囦欢
+        if (file.exists() && file.isFile()) {
+            String fileName = file.getName();
+            if (".xml".equals(fileName.substring(fileName.lastIndexOf(".")))) {
+                // 鍒涘缓reader瀵硅薄
+                SAXReader reader = new SAXReader();
+                // 鍔犺浇xml鏂囦欢
+                Document document;
+                try {
+                    document = reader.read(file);
+                } catch (Exception e) {
+                    log.error("鏂囨。鍐呭闈瀤ml鏍煎紡锛屾棤娉曡В鏋愶紒");
+                    return null;
+                }
+                // 鏍硅妭鐐� SampleResults
+                Element root = document.getRootElement();
+                // 妫�楠屾壒娆′俊鎭妭鐐� SampleResult
+                Element sampleResult = root.element("SampleResult");
+                List<Attribute> attributes = sampleResult.attributes();
+                String name;
+                String value;
+                String batchNo = null;
+                String mark = null;
+                String reportTime = null;
+                for (Attribute attribute : attributes) {
+                    name = attribute.getName();
+                    value = attribute.getValue();
+                    if ("Type".equals(name) && "TypeStandardization".equals(value)) {
+                        log.info("鏍″噯鏁版嵁锛屼笉杩涜閲囬泦...");
+                        return null;
+                    } else if ("Name".equals(name)) {
+                        batchNo = value;
+                    } else if ("TypeCorrSample".equals(name)) {
+                        mark = value;
+                    } else if ("RecalculationDateTime".equals(name)) {
+                        reportTime = value;
+                    }
+                }
+                if (batchNo == null || batchNo.trim().length() == 0) {
+                    log.warn("鏃犳硶瑙f瀽鎵规鍙蜂俊鎭紝姝や负蹇呰淇℃伅鎵�浠ョ粓姝㈣В鏋愶紒");
+                    return null;
+                }
+                // 鍏堝垽鏂槸鍚︽槸姹熶笢閲戝叿鐨勫鎵樿鍗�
+//                List<String> batchNos = saveTestBatchService.explainBatchNo(batchNo.trim());
+//                if (batchNos == null || batchNos.size() == 0) {
+//                    return null;
+//                }
+//                if (batchNos.get(0).equals(batchNo.trim())) {
+//                    log.warn(batchNo.trim() + " 闈炴娴嬪崟鍙凤紝涓嶈繘琛岃В鏋�...");
+//                    return null;
+//                }
+                // 鍐嶅幓闄よ灪鏍撹灪姣嶇殑濮旀墭璁㈠崟(鐜颁笉鍋氶噰闆�)
+                /*batchNos = saveTestBatchService.excludeBatchNo(batchNos);
+                if (batchNos == null || batchNos.size() == 0) {
+                    log.warn("璇ユ壒娆′负铻烘爴/铻烘瘝鐨勬娴嬪崟锛岀幇涓嶅仛閲囬泦...");
+                    return null;
+                }*/
+                // 鍖呭惈鍏蜂綋妫�楠屼俊鎭妭鐐� MeasurementReplicates
+                Element measurement = sampleResult.element("MeasurementReplicates");
+                List<Element> elements = measurement.elements();
+                List<TestBatch> batches = new ArrayList<>(elements.size());
+                TestBatch batch;
+                Date time;
+                List<Element> children;
+                for (Element element : elements) {
+                    batch = new TestBatch();
+                    try {
+                        value = element.attributeValue("MeasureDateTime").replaceFirst("T", " ");
+                        time = SDF.parse(value);
+                    } catch (ParseException e) {
+                        e.printStackTrace();
+                        log.error("鎶ュ憡鏃堕棿鏍煎紡闈� yyyy-MM-ddTHH:mm:ss 鎴� yyyy-MM-dd HH:mm:ss锛屾棤娉曡В鏋愶紒");
+                        return null;
+                    }
+                    batch.setEquipmentTime(time);
+                    // 鍙栨湭琚垹闄ょ殑妫�楠屼俊鎭�
+                    value = element.attributeValue("IsDeleted");
+                    if ("No".equals(value)) {
+                        element = element.element("Measurement");
+                        // 鐪熸鍖呭惈妫�楠岀粨鏋滅殑鑺傜偣 Elements
+                        element = element.element("Elements");
+                        children = element.elements("Element");
+                        batch.setChemicals(explainElements(children, time));
+                        batches.add(batch);
+                    }
+                }
+                if (!batches.isEmpty()) {
+                    // 鍖呭惈妫�楠屾暟鎹钩鍧囧�艰妭鐐� MeasurementStatistics
+                    elements = null;
+                    try {
+                        measurement = sampleResult.element("MeasurementStatistics").element("Measurement").element("Elements");
+                        elements = measurement.elements("Element");
+                    } catch (Exception e) {
+                        log.error("妫�楠屾暟鎹钩鍧囧�兼棤娉曡В鏋愶紒");
+                    }
+                    if (elements != null && !elements.isEmpty()) {
+                        batch = new TestBatch();
+                        time = batches.get(batches.size() - 1).getEquipmentTime();
+                        batch.setEquipmentTime(time);
+                        batch.setChemicals(explainElements(elements, time));
+                        batches.add(batch);
+                    }
+//                    List<List<TestBatch>> testBatches = new ArrayList<>(batchNos.size());
+//                    if (batchNos.size() > 1) {
+//                        List<TestBatch> batchList;
+//                        for (String no : batchNos) {
+//                            log.info("鎶ュ憡妫�楠屾壒娆★細" + no + "\t鏉愭枡鐗屽彿锛�" + mark + "\t鐢熸垚鏃堕棿锛�" + reportTime);
+//                            batchList = cloneBatches(batches, no);
+//                            testBatches.add(batchList);
+//                        }
+//                    } else if (batchNos.size() == 1) {
+//                        log.info("鎶ュ憡妫�楠屾壒娆★細" + batchNos.get(0) + "\t鏉愭枡鐗屽彿锛�" + mark + "\t鐢熸垚鏃堕棿锛�" + reportTime);
+//                        for (TestBatch testBatch : batches) {
+//                            testBatch.setBatchNo(batchNos.get(0));
+//                        }
+//                        testBatches.add(batches);
+//                    }
+//                    log.info(fileName + " 瑙f瀽瀹屾垚...");
+//                    return testBatches;
+                    return batches;
+                } else {
+                    log.warn(fileName + " 鏈В鏋愬嚭鏈夋晥鏁版嵁锛�");
+                    return null;
+                }
+            }
+            log.warn(fileName + " 闈瀤ml鏂囦欢锛屾棤娉曡В鏋愶紒");
+        }
+        return null;
+    }
+
+    private List<Chemical> explainElements(List<Element> elements, Date time) {
+        List<Chemical> chemicals = new ArrayList<>(elements.size());
+        Chemical chemical;
+        String value;
+        List<Element> results;
+        for (Element child : elements) {
+            chemical = new Chemical();
+            value = child.attributeValue("ElementName");
+            chemical.setName(value);
+            results = child.elements();
+            if (results.size() == 3) {
+                for (Element result : results) {
+                    value = result.attributeValue("StatType");
+                    if ("Reported".equals(value)) {
+                        /*value = result.attributeValue("CalibrationStatus");
+                        if (!"InRange".equals(value)) {
+                            chemical.setRemark(value);
+                        }*/
+                        result = result.element("ResultValue");
+                        value = result.getTextTrim();
+                        chemical.setValue(value);
+                        chemical.setEquipmentTime(time);
+                    }
+                }
+            } else {
+                for (Element result : results) {
+                    value = result.attributeValue("Type");
+                    if ("ConcTypeCorr".equals(value)) {
+                        value = result.attributeValue("StatType");
+                        if ("Reported".equals(value)) {
+                            /*value = result.attributeValue("CalibrationStatus");
+                            if (!"InRange".equals(value)) {
+                                chemical.setRemark(value);
+                            }*/
+                            result = result.element("ResultValue");
+                            value = result.getTextTrim();
+                            chemical.setValue(value);
+                            chemical.setEquipmentTime(time);
+                        }
+                    }
+                }
+            }
+            if (!"-".equals(chemical.getValue())) {
+                chemicals.add(chemical);
+            }
+        }
+        return chemicals;
+    }
+
+    /**
+     * 瀵硅薄鏁扮粍娣辨嫹璐�
+     *
+     * @param batches
+     * @param batchNo
+     * @return
+     */
+    private List<TestBatch> cloneBatches(List<TestBatch> batches, String batchNo) {
+        List<TestBatch> testBatches = new ArrayList<>(batches.size());
+        TestBatch testBatch;
+        for (TestBatch batch : batches) {
+            testBatch = SerializationUtils.clone(batch);
+            testBatch.setBatchNo(batchNo);
+            testBatches.add(testBatch);
+        }
+        return testBatches;
+    }
+
+}
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 01a1b61..7c1d2cd 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -1,2 +1,6 @@
 server:
-  port: 9527
\ No newline at end of file
+  port: 9527
+
+serialPort:
+  enable: true # 鏄惁寮�鍚覆鍙g洃鍚�
+  listenName: COM4 # 鐩戝惉鐨勪覆鍙e悕绉�
\ No newline at end of file

--
Gitblit v1.9.3