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> 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; /** * 项ç®å¯å¨å®æåæ§è¡ä¸²å£çå¬ */ @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()); } } src/main/java/com/chinaztt/mes/docx/config/TomcatConfig.java
ÎļþÃû´Ó src/main/java/com/chinaztt/mes/docx/constant/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; 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(); } } 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()); } } 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("䏲壿å¼å¤±è´¥ï¼è¯·æ£æ¥ä¸²å£æ¯å¦è¢«å ç¨æåç§°æ¯å¦æ£ç¡®"); 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(); } } 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; } 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;// å妿åå表 } 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(); } 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; } // æå°ææå¯ç¨ä¸²å£ï¼ä¾ç¨æ·éæ©ï¼ 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. éæ©ç®æ 串å£ï¼ç¤ºä¾ï¼éæ©ç¬¬ä¸ä¸ªä¸²å£ï¼ System.out.println("\néæ©ç串å£ï¼" + 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("䏲壿å¼å¤±è´¥ï¼è¯·æ£æ¥ç«¯å£æ¯å¦è¢«å ç¨ææéæ¯å¦è¶³å¤ã"); 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) { // 转æ¢ä¸ºåç¬¦ä¸²ï¼æ ¹æ®è®¾å¤ç¼ç è°æ´ï¼å¸¸è§ï¼UTF-8ãGBKï¼ 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æ°éæä»¶\\æ°éæä»¶\\å 谱仪Results_20251018133246.xml")); testBatches.forEach(System.out::println); } } src/main/java/com/chinaztt/mes/docx/util/CharsetChangeUtil.java
ÎļþÒÑɾ³ý src/main/java/com/chinaztt/mes/docx/util/Result.java
ÎļþÃû´Ó src/main/java/com/chinaztt/mes/docx/util/R.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() { 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; } } 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"); /** * è§£æ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("ææ¡£å 容éxmlæ ¼å¼ï¼æ æ³è§£æï¼"); 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("æ æ³è§£ææ¹æ¬¡å·ä¿¡æ¯ï¼æ¤ä¸ºå¿ è¦ä¿¡æ¯æä»¥ç»æ¢è§£æï¼"); 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 + " è§£æå®æ..."); // return testBatches; return batches; } else { log.warn(fileName + " æªè§£æåºæææ°æ®ï¼"); return null; } } log.warn(fileName + " éxmlæä»¶ï¼æ æ³è§£æï¼"); } 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; } } src/main/resources/application.yml
@@ -1,2 +1,6 @@ server: port: 9527 serialPort: enable: true # æ¯å¦å¼å¯ä¸²å£çå¬ listenName: COM4 # çå¬ç串å£åç§°