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.handler.SerialPortListener; import com.chinaztt.mes.docx.pojo.TestBatch; import com.chinaztt.mes.docx.service.DocxService; import com.chinaztt.mes.docx.util.XMLFileListener; import com.chinaztt.mes.docx.util.Result; import com.chinaztt.mes.docx.util.TakeWords; 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.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 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 Result.failed("未查询到该路径:" + getFileDto.getFilePath() + "下存在:" + getFileDto.getFileExtension() + "结尾的文件!"); } switch (getFileDto.getFileExtension()) { case ".docx": return Result.ok(TakeWords.readWordFile(file)); case ".pngInExcel": return Result.ok(TakeWords.readPngContextInExcel(file)); case ".xls": case ".xlsx": try { return Result.ok(TakeWords.readExcelFile(file)); } catch (Exception e) { return Result.failed("另一个程序正在使用此文件,无法进行数据采集。"); } case ".txt": return Result.ok(TakeWords.readTxtFile(file)); case ".csv": return Result.ok(TakeWords.readCsvFile(file)); case ".mdb": if (ObjectUtil.isEmpty(getFileDto.getDbFileName()) || Objects.equals(getFileDto.getDbFileName(), "null")) { return Result.failed("未配置.mdb采集文件名称!"); } return Result.ok(TakeWords.readMdbFile(file, getFileDto)); case ".db": if (ObjectUtil.isEmpty(getFileDto.getDbFileName()) || Objects.equals(getFileDto.getDbFileName(), "null")) { return Result.failed("未配置.db采集文件名称!"); } return Result.ok(TakeWords.readDbFile(file, getFileDto)); case ".mysql": if (ObjectUtil.isEmpty(getFileDto.getDbFileName()) || Objects.equals(getFileDto.getDbFileName(), "null")) { return Result.failed("未配置.mysql采集文件名称!"); } return Result.ok(TakeWords.getMysqlFile(getFileDto)); case ".png": return Result.ok(TakeWords.readPngFile(file)); case ".mqtt": return Result.ok("mqtt---"); case ".serialPort": List 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 Result.failed("后缀名配置错误!"); } } @Override public Result 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 Result.ok("文件移动成功!"); } else { return Result.failed("文件移动失败!"); } }catch(Exception e) { return Result.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 readXml() { XMLFileListener fileListener = new XMLFileListener(); List testBatches = fileListener.explainXml(new File("C:\\Users\\27233\\Desktop\\251117数采文件\\数采文件\\光谱仪Results_20251018133246.xml")); testBatches.forEach(System.out::println); } }