diff --git a/src/main/java/com/xujie/sys/modules/reader/controller/GetInformationForExcelController.java b/src/main/java/com/xujie/sys/modules/reader/controller/GetInformationForExcelController.java index 394efcec..1355a31b 100644 --- a/src/main/java/com/xujie/sys/modules/reader/controller/GetInformationForExcelController.java +++ b/src/main/java/com/xujie/sys/modules/reader/controller/GetInformationForExcelController.java @@ -8,6 +8,12 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + @RequestMapping("getInformation") @RestController @Slf4j @@ -22,13 +28,69 @@ public class GetInformationForExcelController { return R.ok(); } -// public static void main(String[] args) throws Exception { + public static void main(String[] args) throws Exception { + + String filePath ="E:\\file\\cs.tff"; + int startLine = 15; // 第一次读取开始的行数 + int firstReadLines = 41; + int columnInterval = 11; + + + try { + BufferedReader reader = new BufferedReader(new FileReader(filePath)); + String line; + List list=new ArrayList<>(); + // 第一次读取从第 15 行开始的 41 行数据 + for (int i = 1; i < startLine; i++) { //跳过前面的15行 + line=reader.readLine(); + } + for (int i = 0; i < firstReadLines; i++) { + line = reader.readLine(); + if (line != null) { + // 处理当前行数据 + list.add(line); + } + } + // 移动到下一列 + for (int i = 0; i < columnInterval; i++) { + line = reader.readLine(); + } + + // 每隔 11 行读取往下 41 行的数据 + while ((line = reader.readLine()) != null) { + // 从当前行开始读取指定行数 + for (int i = 0; i < firstReadLines; i++) { + if (line != null) { + // 处理当前行数据 + list.add(line); + } + line = reader.readLine(); + } + + // 移动到下一列 + for (int i = 0; i < columnInterval-1; i++) { + line = reader.readLine(); + } + } + + for (String s : list) { + String[] data = s.split("\t"); + System.out.println(data[0]); + System.out.println(data[1]); + System.out.println(data[2]); + System.out.println(data[3]); + System.out.println(data[4]); + System.out.println(data[5]); + System.out.println(data[6]); + System.out.println(data[7]); + System.out.println(data[8]); + System.out.println(data[9]); + } + reader.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } -// String filePath ="E:\\file\\cs.tff"; -// BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath)); -// String line; -// while ((line=bufferedReader.readLine())!=null){ -// System.out.println(line); -// } -// } } + diff --git a/src/main/java/com/xujie/sys/modules/reader/entity/EquipmentFolderLocation.java b/src/main/java/com/xujie/sys/modules/reader/entity/EquipmentFolderLocation.java index 6d7fe2de..08d55563 100644 --- a/src/main/java/com/xujie/sys/modules/reader/entity/EquipmentFolderLocation.java +++ b/src/main/java/com/xujie/sys/modules/reader/entity/EquipmentFolderLocation.java @@ -15,7 +15,9 @@ public class EquipmentFolderLocation { private String site; private String buNo; private String itemNo; + private String backupFolderPath; //文件编号 private String fileNo; + } diff --git a/src/main/java/com/xujie/sys/modules/reader/service/impl/GetInformationForExcelServiceImpl.java b/src/main/java/com/xujie/sys/modules/reader/service/impl/GetInformationForExcelServiceImpl.java index 787ff4da..6396afb5 100644 --- a/src/main/java/com/xujie/sys/modules/reader/service/impl/GetInformationForExcelServiceImpl.java +++ b/src/main/java/com/xujie/sys/modules/reader/service/impl/GetInformationForExcelServiceImpl.java @@ -15,7 +15,11 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.io.BufferedReader; import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.nio.file.Files; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -34,24 +38,31 @@ public class GetInformationForExcelServiceImpl extends ServiceImpl locationList = equipmentFolderLocationService.list(); - if(CollectionUtils.isEmpty(locationList)){ + if (CollectionUtils.isEmpty(locationList)) { return; } //创建线程池 ExecutorService executorService = Executors.newFixedThreadPool(locationList.size());//线程池的最大数量为文件夹的个数 for (EquipmentFolderLocation excel : locationList) { - String folderFiler = excel.getFolderPath(); - executorService.submit(()->{ - saveInformation(folderFiler,excel); + + executorService.submit(() -> { + try { + //对文件夹下的文件进行读取并保存 + saveInformation(excel); + }catch (Exception e){ + e.printStackTrace(); + } + }); } //关闭线程 executorService.shutdown(); try { executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); // 等待所有任务完成 + } catch (InterruptedException e) { Thread.currentThread().interrupt(); log.info("线程池中断异常"); @@ -59,54 +70,248 @@ public class GetInformationForExcelServiceImpl extends ServiceImpl files=getExcelFiles(folderFiler); - if(CollectionUtils.isEmpty(files)){ + List files = getExcelFiles(folderFiler); + if (CollectionUtils.isEmpty(files)) { return; } //判断这个批次号应该是多少 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(EquipmentDataDetail::getBuNo,excel.getBuNo()); - queryWrapper.eq(EquipmentDataDetail::getSite,excel.getSite()); - queryWrapper.eq(EquipmentDataDetail::getFileNo,excel.getFileNo()); + queryWrapper.eq(EquipmentDataDetail::getBuNo, excel.getBuNo()); + queryWrapper.eq(EquipmentDataDetail::getSite, excel.getSite()); + queryWrapper.eq(EquipmentDataDetail::getFileNo, excel.getFileNo()); List equipments = this.list(queryWrapper); //定义批次号 Integer batchNo; - if (CollectionUtils.isEmpty(equipments)){ - batchNo=1; - }else { - batchNo=equipments.get(equipments.size()-1).getBatchNo()+1; + if (CollectionUtils.isEmpty(equipments)) { + batchNo = 1; + } else { + batchNo = equipments.get(equipments.size() - 1).getBatchNo() + 1; } - List equipmentDataDetails =new ArrayList<>(); //创建一个list用来存储所有的的excel文件路径 List fileName = new ArrayList<>(); + //创建一个list用来存储所有的txt文件路径 + List txtName = new ArrayList<>(); for (File file : files) { //找到.的索引 int dotIndex = file.getName().lastIndexOf("."); String s = file.getName().substring(dotIndex + 1); - if (s.equals("csv")){ - fileName.add(folderFiler+"\\"+file.getName()); + if (s.equals("csv")) { + fileName.add(folderFiler + "\\" + file.getName()); + } + if (s.equals("tff")) { + txtName.add(folderFiler + "\\" + file.getName()); + } + } + + //excel(csv)不为空就做新增 + if (CollectionUtils.isNotEmpty(fileName)) { + List equipmentDataDetails = saveExcel(fileName, excel, batchNo); + //批量新增 + getInformationForExcelMapper.saveByExcels(equipmentDataDetails); + for (String s : fileName) { + deleteBypath(s, excel.getBackupFolderPath()); + } + } + //txt(tff)不为空就做新增 + if (CollectionUtils.isNotEmpty(txtName)) { + List equipmentDataDetails = saveTxt(txtName, excel, batchNo); + // 创建一个固定大小的线程池,这里假设有10个线程 + ExecutorService executor = Executors.newFixedThreadPool(equipmentDataDetails.size()/100); + int startList =0; + int endList=100; + for (int i = startList; i < equipmentDataDetails.size(); i= startList) { + if (endList>equipmentDataDetails.size()){ + endList = equipmentDataDetails.size(); + } + List details = equipmentDataDetails.subList(startList, endList); + startList=startList+endList; + endList=endList+endList; + executor.execute(()->{ + //批量新增 + getInformationForExcelMapper.saveByExcels(details); + }); + } + // 关闭线程池 + executor.shutdown(); + for (String s : txtName) { + deleteBypath( s, excel.getBackupFolderPath()); + } + } + } + + //新增完之后把原路径的文件复制到另一个文件并删除原路径的下的文件 + private static void deleteBypath(String endPath,String suffixName) throws Exception{ + // 创建源文件对象和目标文件夹对象 + File sourceFile = new File(endPath); + File destinationDir = new File(suffixName); + + // 确保源文件存在且是文件 + if (sourceFile.exists() && sourceFile.isFile()) { + // 确保目标文件夹存在且是目录 + if (!destinationDir.exists()) { + destinationDir.mkdirs(); // 创建目标文件夹及其父目录 + } + + // 构建目标文件路径 + String destinationPath = suffixName + File.separator + sourceFile.getName(); + File destinationFile = new File(destinationPath); + + try { + // 复制文件到目标文件夹 + Files.copy(sourceFile.toPath(), destinationFile.toPath()); + System.out.println("文件复制成功!"); + + // 删除源文件 + if (sourceFile.delete()) { + System.out.println("源文件删除成功!"); + } else { + System.out.println("源文件删除失败!"); + } + } catch (IOException e) { + System.out.println("文件操作出错:" + e.getMessage()); + } + } else { + System.out.println("源文件不存在或不是文件。"); + } + } + + public static void main(String[] args)throws Exception { + // 源文件路径 + String sourcePath = "E:\\file\\cs.tff"; + // 目标文件夹路径 + String destinationFolder = "E:\\info"; + + // 创建源文件对象和目标文件夹对象 + File sourceFile = new File(sourcePath); + File destinationDir = new File(destinationFolder); + + // 确保源文件存在且是文件 + if (sourceFile.exists() && sourceFile.isFile()) { + // 确保目标文件夹存在且是目录 + if (!destinationDir.exists()) { + destinationDir.mkdirs(); // 创建目标文件夹及其父目录 + } + + // 构建目标文件路径 + String destinationPath = destinationFolder + File.separator + sourceFile.getName(); + File destinationFile = new File(destinationPath); + + try { + // 复制文件到目标文件夹 + Files.copy(sourceFile.toPath(), destinationFile.toPath()); + System.out.println("文件复制成功!"); + + // 删除源文件 + if (sourceFile.delete()) { + System.out.println("源文件删除成功!"); + } else { + System.out.println("源文件删除失败!"); + } + } catch (IOException e) { + System.out.println("文件操作出错:" + e.getMessage()); + } + } else { + System.out.println("源文件不存在或不是文件。"); + } + } + + //对tff文件进行操作 + private static List saveTxt(List fileName, EquipmentFolderLocation excel, Integer batchNo) { + List equipmentDataDetails = new ArrayList<>(); + for (String s : fileName) { + int startLine = 15; // 第一次读取开始的行数 + int firstReadLines = 41; + int columnInterval = 11; + try { + BufferedReader bufferedReader = new BufferedReader(new FileReader(s)); + String line; + List list = new ArrayList<>(); + // 第一次读取从第 15 行开始的 41 行数据 + for (int i = 1; i < startLine; i++) { + bufferedReader.readLine(); // 跳过前面的行数 + } + for (int i = 0; i < firstReadLines; i++) { + line = bufferedReader.readLine(); + if (line != null) { + // 处理当前行数据 + list.add(line); + } + } + // 移动到下一列 + for (int i = 0; i < columnInterval; i++) { + line = bufferedReader.readLine(); + } + + // 每隔 11 行读取往下 41 行的数据 + while ((line = bufferedReader.readLine()) != null) { + // 从当前行开始读取指定行数 + for (int i = 0; i < firstReadLines; i++) { + if (line != null) { + // 处理当前行数据 + list.add(line); + } + line = bufferedReader.readLine(); + } + // 移动到下一列 + for (int i = 0; i < columnInterval-1; i++) { + line = bufferedReader.readLine(); + } + } + //对数据进行切割封装 + for (String info : list) { + String[] data = info.split("\t"); + EquipmentDataDetail equipmentDataDetail = new EquipmentDataDetail(); + equipmentDataDetail.setEquipmentNo(excel.getEquipmentNo()); + equipmentDataDetail.setBuNo(excel.getBuNo()); + equipmentDataDetail.setSite(excel.getSite()); + equipmentDataDetail.setBatchNo(batchNo); + equipmentDataDetail.setItemNo(excel.getItemNo()); + equipmentDataDetail.setFileNo(excel.getFileNo()); + equipmentDataDetails.add(equipmentDataDetail); + equipmentDataDetail.setValue0(data[0]); + equipmentDataDetail.setValue1(data[1]); + equipmentDataDetail.setValue2(data[2]); + equipmentDataDetail.setValue3(data[3]); + equipmentDataDetail.setValue4(data[4]); + equipmentDataDetail.setValue5(data[5]); + equipmentDataDetail.setValue6(data[6]); + equipmentDataDetail.setValue7(data[7]); + equipmentDataDetail.setValue8(data[8]); + equipmentDataDetail.setValue9(data[9]); + equipmentDataDetails.add(equipmentDataDetail); + } + bufferedReader.close(); + } catch (IOException e) { + e.printStackTrace(); } } + return equipmentDataDetails; + } + + //对excel(csv)文件进行操作 + private static List saveExcel(List fileName, EquipmentFolderLocation excel, Integer batchNo) { + List equipmentDataDetails = new ArrayList<>(); //获取每个excel下的所有关于Test的两个值并保存 for (String s : fileName) { File excelFile = new File(s); - List> list=new ArrayList<>(); - try{ + List> list = new ArrayList<>(); + try { list = EasyExcel.read(excelFile) .excelType(ExcelTypeEnum.XLSX) .headRowNumber(0) .sheet() .doReadSync(); - }catch (Exception e){ - log.info("读取文件失败,文件为:"+s+"失败日志:"+e.getMessage()); + } catch (Exception e) { + log.info("读取文件失败,文件为:" + s + "失败日志:" + e.getMessage()); } //获取TEST后面的两个值 - for (int i=0;i getExcelFiles(String folderFiler) { //创建本地文件夹路径 File file = new File(folderFiler); - //获取本地文件夹下所有excel表格 + //获取本地文件夹下所有文件 File[] files = file.listFiles(); - List excelFiles=new ArrayList<>(); - if (file !=null ){ + List excelFiles = new ArrayList<>(); + if (file != null) { for (File file1 : files) { - if (file1.isFile()){ + if (file1.isFile()) { excelFiles.add(file1); } } diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 03b3415b..ff103f91 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -46,7 +46,7 @@ task: data: site: 2,3 #事业部 eamWorkPlanTime: 0 0 0 * * ? #点检、维保计划自动生成,每天0点执行 - getExcelInformation: 0/10 * * * * ? #每十秒读取一次文件 + getExcelInformation: 0/30 * * * * ? #每三十秒读取一次文件 #--------------------------------------------接口地址和开关控制-------------------------------------------------