package com.chinaztt.mes.docx.service.impl; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.ObjectUtil; 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.TakeWords; import com.fazecast.jSerialComm.SerialPort; import com.fazecast.jSerialComm.SerialPortDataListener; import com.fazecast.jSerialComm.SerialPortEvent; import net.sourceforge.tess4j.TesseractException; import org.apache.commons.lang3.StringUtils; 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 public class DocxServiceImpl implements DocxService { @Override public R 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() + "结尾的文件!"); } switch (getFileDto.getFileExtension()) { case ".docx": return R.ok(TakeWords.readWordFile(file)); case ".pngInExcel": return R.ok(TakeWords.readPngContextInExcel(file)); case ".xls": case ".xlsx": try { return R.ok(TakeWords.readExcelFile(file)); } catch (Exception e) { return R.failed("另一个程序正在使用此文件,无法进行数据采集。"); } case ".txt": return R.ok(TakeWords.readTxtFile(file)); case ".csv": return R.ok(TakeWords.readCsvFile(file)); case ".mdb": if (ObjectUtil.isEmpty(getFileDto.getDbFileName()) || Objects.equals(getFileDto.getDbFileName(), "null")) { return R.failed("未配置.mdb采集文件名称!"); } return R.ok(TakeWords.readMdbFile(file, getFileDto)); case ".db": if (ObjectUtil.isEmpty(getFileDto.getDbFileName()) || Objects.equals(getFileDto.getDbFileName(), "null")) { return R.failed("未配置.db采集文件名称!"); } return R.ok(TakeWords.readDbFile(file, getFileDto)); case ".mysql": if (ObjectUtil.isEmpty(getFileDto.getDbFileName()) || Objects.equals(getFileDto.getDbFileName(), "null")) { return R.failed("未配置.mysql采集文件名称!"); } return R.ok(TakeWords.getMysqlFile(getFileDto)); case ".png": return R.ok(TakeWords.readPngFile(file)); case ".mqtt": return R.ok("mqtt---"); default: return R.failed("后缀名配置错误!"); } } @Override public R moveFile(String startFilePath, String endFilePath, String fileType) { // 源文件路径 File startFile= getFileStart(startFilePath, fileType); // 目的目录路径 File endDirection=new File(endFilePath); // 如果目的目录路径不存在,则进行创建 if(!endDirection.exists()) { endDirection.mkdirs(); } // 目的文件路径=目的目录路径+源文件名称 File endFile=new File(endDirection+ File.separator+ startFile.getName()); try { // 调用File类的核心方法renameTo if (startFile.renameTo(endFile)) { return R.ok("文件移动成功!"); } else { return R.failed("文件移动失败!"); } }catch(Exception e) { return R.failed("文件移动出现异常!"); } } public static File getLatestFile(List files) { File latestFile = null; long latestTime = 0; for (File file : files) { long lastModified = file.lastModified(); if (lastModified > latestTime) { latestTime = lastModified; latestFile = file; } } return latestFile; } public static File getFileStart(String filePath, String fileExtension) { List files = FileUtil.loopFiles(filePath); List list = new ArrayList<>(); files.forEach(i -> { boolean b; switch (fileExtension) { case ".docx": b = i.getName().endsWith(".docx") || i.getName().endsWith(".doc") || i.getName().endsWith(".DOCX") || i.getName().endsWith(".DOC"); break; case ".xlsx": b = i.getName().endsWith(".xlsx") || i.getName().endsWith(".xls") || i.getName().endsWith(".XLSX") || i.getName().endsWith(".XLS"); break; default: b = i.getName().endsWith(fileExtension); break; } if (b) { list.add(i); } }); return getLatestFile(list); } @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("串口已关闭。"); } } }