zouyu
2026-06-03 5058481100d938bc4680725c3659757a09a2dd8a
src/main/java/com/chinaztt/mes/docx/service/impl/DocxServiceImpl.java
@@ -2,80 +2,99 @@
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ObjectUtil;
import com.chinaztt.mes.docx.constant.FieldMatchRuleConstants;
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);
        String entrustCode = "";
        if(StringUtils.isNotBlank(getFileDto.getEntrustCode()) && getFileDto.getIsMatchFileName()){
            entrustCode = getFileDto.getEntrustCode().substring(8);
        }
        File file = getFileStart(getFileDto.getFilePath(), fileExtension,getFileDto.getIsMatchFileName(),getFileDto.getFieldMatchRule(),entrustCode,getFileDto.getSampleCode());
        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 +109,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;
@@ -115,7 +133,11 @@
        return latestFile;
    }
    public static File getFileStart(String filePath, String fileExtension) {
    public static File getFileStart(String filePath, String fileExtension){
        return getFileStart(filePath,fileExtension,false,null,null,null);
    }
    public static File getFileStart(String filePath, String fileExtension,Boolean isMatchFileName,String matchRule,String entrustCode,String sampleCode) {
        List<File> files = FileUtil.loopFiles(filePath);
        List<File> list = new ArrayList<>();
        files.forEach(i -> {
@@ -132,6 +154,9 @@
                    b = i.getName().endsWith(fileExtension);
                    break;
            }
            if(isMatchFileName){
                b = matchFileName(i.getName(),matchRule,entrustCode,sampleCode);
            }
            if (b) {
                list.add(i);
            }
@@ -139,85 +164,32 @@
        return getLatestFile(list);
    }
    /**
     * 匹配文件名称
     * @param fileName    文件名称
     * @param matchRule   匹配规则
     * @param entrustCode 委托编号
     * @param sampleCode  样品名称
     * @return
     */
    private static Boolean matchFileName(String fileName,String matchRule,String entrustCode,String sampleCode){
        if(FieldMatchRuleConstants.ENTRUST_CODE_EQUAL.equals(matchRule)){
            return fileName.equals(entrustCode);
        }else if(FieldMatchRuleConstants.ENTRUST_CODE_LIKE.equals(matchRule)){
            return fileName.contains(entrustCode);
        }else if(FieldMatchRuleConstants.SAMPLE_CODE_EQUAL.equals(matchRule)){
            return fileName.equals(sampleCode);
        }else if(FieldMatchRuleConstants.SAMPLE_CODE_LIKE.equals(matchRule)){
            return fileName.contains(sampleCode);
        }
        return false;
    }
    @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);
    }
}