yangys
2025-09-29 4c7296d45efe849dc70a3b2e2240c905481a91c9
blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/service/NcProgramExportInnerService.java
@@ -5,14 +5,17 @@
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.springblade.core.mp.base.BizServiceImpl;
import org.springblade.core.oss.OssTemplate;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.SpringUtil;
import org.springblade.mdm.basesetting.machine.entity.Machine;
import org.springblade.mdm.basesetting.machine.service.MachineService;
import org.springblade.mdm.gkw.task.entity.MachineBackTask;
import org.springblade.mdm.gkw.task.service.MachineBackTaskService;
import org.springblade.mdm.machinefile.entity.MachineAcceptedFile;
import org.springblade.mdm.machinefile.entity.MachineFile;
import org.springblade.mdm.machinefile.events.ExportedToInnerEvent;
import org.springblade.mdm.program.entity.NcProgramExchange;
import org.springblade.mdm.program.mapper.NcProgramExchangeMapper;
import org.springblade.mdm.program.service.ProgramAnnotationService;
@@ -43,22 +46,25 @@
   private final OssTemplate ossTemplate;
   private final MachineFileService machineFileService;
   private final MachineService machineService;
   private final MachineAnnotationConfig annoConfig;
   private final AnnotationProcessorHelper annotationProcessorHelper;
   private final ProgramAnnotationService programAnnotationService;
   private final MachineBackTaskService machineBackTaskService;
   /**
    * 导出到涉密网
    * @param acceptedFileIds
    * @param os
    * @throws IOException
    * @param acceptedFileIds 接受的文件id离了吧
    * @param os 输出流
    * @throws IOException 操作zip可能导致的IO异常
    */
   @Transactional
   public void exportToInner(List<Long> acceptedFileIds, ServletOutputStream os) throws IOException {
      List<MachineAcceptedFile> acceptedFiles = machineAcceptedService.lambdaQuery().in(MachineAcceptedFile::getId,acceptedFileIds).list();
      try (ZipOutputStream zipOut = new ZipOutputStream(os);) {//os
         List<MachineAcceptedFile>  acceptedFiles = machineAcceptedService.lambdaQuery().in(MachineAcceptedFile::getId,acceptedFileIds).list();
         Map<String,List<MachineAcceptedFile>> map =  acceptedFiles.stream()
            .collect(Collectors.groupingBy(s -> ProgramFileNameParser.parseProgramName(s.getName()).logicProgramName()));
         this.createFoldersInZip(zipOut,map.keySet());
         for (Map.Entry<String, List<MachineAcceptedFile>> entry : map.entrySet()) {
            String programName = entry.getKey();
@@ -69,17 +75,68 @@
                  addInputStreamToZip(zipOut,ins , programName + "/" + acceptedFile.getName(),acceptedFile.getName(),machineFile.getMachineCode());
               }
               acceptedFile.setExportTime(DateUtil.now());
               acceptedFile.setStatus(MachineAcceptedFile.STATUS_EXPORTED);
            }
         }
         machineAcceptedService.updateBatchById(acceptedFiles);
         //更新任务状态
         List<Long> backTaskIdList = acceptedFiles.stream().map(MachineAcceptedFile::getBackTaskId).filter(Objects::nonNull).toList();
         this.finishTask(backTaskIdList);
         SpringUtil.publishEvent(new ExportedToInnerEvent("exportToInner",acceptedFiles));
      }
      os.close();
   }
   /**
    * 创建左右的程序包名文件夹
    * @param zipOut zip输出流
    * @param folderSet 程序报名文件夹集合
    * @throws IOException zipIO操作异常
    */
   void createFoldersInZip(ZipOutputStream zipOut,Set<String> folderSet) throws IOException {
      for(String folderName : folderSet){
         ZipEntry zipEntry = new ZipEntry(folderName+"/");// "/"结尾表示文件夹
         zipOut.putNextEntry(zipEntry);
         zipOut.closeEntry();
      }
   }
   void finishTask(List<Long> backTaskIdList){
      if(backTaskIdList.isEmpty()){
         return;
      }
      for(Long backTaskId : backTaskIdList){
         MachineBackTask backTask = machineBackTaskService.getById(backTaskId);
         List<MachineAcceptedFile> acceptedFiles = machineAcceptedService.listByBackTaskId(backTaskId);
         if(acceptedFiles.size() == backTask.getSegCount()) {
            backTask.setStatus(MachineBackTask.STATUS_FINISHED);
            backTask.setFinishTime(new Date());
            machineBackTaskService.updateById(backTask);
         }
      }
   }
   /**
    * j将输入流加入zip
    * @param zipOut zip文件输出里路
    * @param inputStream 文件的输入流
    * @param entryName entryName
    * @param filename 原始文件名
    * @param machineCode 机床代码
    * @throws IOException 异常
    */
   public void addInputStreamToZip(ZipOutputStream zipOut, InputStream inputStream, String entryName,String filename,String machineCode)
      throws IOException {
      // 创建新的 ZIP 条目
@@ -99,15 +156,15 @@
   /**
    * 给导出文件增加注释,涉密网要用
    * @param inputStream
    * @param filename
    * @param machineCode
    * @return
    * @throws IOException
    * @param inputStream 输入流
    * @param filename 文件名
    * @param machineCode 机床代码
    * @return 完成后的stream
    * @throws IOException 操作异常
    */
   InputStream setAnnotations(InputStream inputStream,String filename,String machineCode) throws IOException {
      Machine machine = this.machineService.getByCode(machineCode);
      AnnotationProcessor annoProcessor = ProcessorHelper.getProcessor(machine.getControlSystem(),annoConfig);
      AnnotationProcessor annoProcessor = annotationProcessorHelper.getProcessor(machine.getControlSystem());
      AnnotationData annoData = new AnnotationData();
      annoData.setFilename(filename);
@@ -115,8 +172,8 @@
      AnnotationProperties annoProps = annoProcessor.getAnnotationProperties();
      ByteArrayInputStream bais = new ByteArrayInputStream(IOUtils.toByteArray(inputStream));
      String statusLine = FileContentUtil.readLineAt(bais,annoProps.getStatusLineIndex());
      ByteArrayInputStream byteInsStream = new ByteArrayInputStream(IOUtils.toByteArray(inputStream));
      String statusLine = FileContentUtil.readLineAt(byteInsStream,annoProps.getStatusLineIndex());
      String text = programAnnotationService.removeAnnotation(machine.getControlSystem(),statusLine);
      if(AnnotationUtil.isStatusContent(text)){
@@ -126,9 +183,9 @@
         //没有按试切处理
         annoData.setProgramStatus(AnnotationUtil.SQ);
      }
      bais.reset();
      byteInsStream.reset();
      //
      return annoProcessor.putAnnotation(annoData,bais);
      return annoProcessor.putAnnotation(annoData,byteInsStream);
   }
}