yangys
2025-09-19 b0d0191a88912b352385349461b500a4964d693b
blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/service/NcProgramExportInnerService.java
@@ -4,16 +4,25 @@
import jakarta.servlet.ServletOutputStream;
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.mdm.basesetting.machine.entity.Machine;
import org.springblade.mdm.basesetting.machine.service.MachineService;
import org.springblade.mdm.machinefile.entity.MachineAcceptedFile;
import org.springblade.mdm.machinefile.entity.MachineFile;
import org.springblade.mdm.program.entity.NcProgramExchange;
import org.springblade.mdm.program.mapper.NcProgramExchangeMapper;
import org.springblade.mdm.program.service.ProgramAnnotationService;
import org.springblade.mdm.program.service.programannotation.*;
import org.springblade.mdm.utils.FileContentUtil;
import org.springblade.mdm.utils.ProgramFileNameParser;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;
@@ -32,8 +41,10 @@
public class NcProgramExportInnerService extends BizServiceImpl<NcProgramExchangeMapper, NcProgramExchange> {
   private final MachineAcceptedFileService machineAcceptedService;
   private final OssTemplate ossTemplate;
   private final MachineFileService machineFileService;
   private final MachineService machineService;
   private final MachineAnnotationConfig annoConfig;
   private final ProgramAnnotationService programAnnotationService;
   /**
    * 导出到涉密网
    * @param acceptedFileIds
@@ -49,15 +60,16 @@
         Map<String,List<MachineAcceptedFile>> map =  acceptedFiles.stream()
            .collect(Collectors.groupingBy(s -> ProgramFileNameParser.parseProgramName(s.getName()).logicProgramName()));
         List<MachineAcceptedFile> exportedFiles = new ArrayList<>();
         for (Map.Entry<String, List<MachineAcceptedFile>> entry : map.entrySet()) {
            String programName = entry.getKey();
            List<MachineAcceptedFile> acceptedFileList = entry.getValue();
            for (MachineAcceptedFile acceptedFile : acceptedFileList) {
               try(InputStream ins = ossTemplate.statFileStream(acceptedFile.getOssName()) ) {
                  addInputStreamToZip(zipOut,ins , programName + "/" + acceptedFile.getName());
                  MachineFile machineFile = machineFileService.getById(acceptedFile.getMachineFileId());
                  addInputStreamToZip(zipOut,ins , programName + "/" + acceptedFile.getName(),acceptedFile.getName(),machineFile.getMachineCode());
               }
               acceptedFile.setExportTime(DateUtil.now());
               acceptedFile.setStatus(MachineAcceptedFile.STATUS_EXPORTED);
            }
         }
@@ -69,21 +81,55 @@
   }
   public void addInputStreamToZip(ZipOutputStream zipOut, InputStream inputStream, String entryName)
   public void addInputStreamToZip(ZipOutputStream zipOut, InputStream inputStream, String entryName,String filename,String machineCode)
      throws IOException {
      // 创建新的 ZIP 条目
      ZipEntry zipEntry = new ZipEntry(entryName);
      zipOut.putNextEntry(zipEntry);
      InputStream insAdded = setAnnotations(inputStream,filename,machineCode);
      // 将输入流写入 ZIP 输出流
      byte[] buffer = new byte[1024];
      int length;
      while ((length = inputStream.read(buffer)) >= 0) {
      while ((length = insAdded.read(buffer)) >= 0) {
         zipOut.write(buffer, 0, length);
      }
      // 关闭当前条目
      zipOut.closeEntry();
   }
   /**
    * 给导出文件增加注释,涉密网要用
    * @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);
      AnnotationData annoData = new AnnotationData();
      annoData.setFilename(filename);
      annoData.setSendPath(machine.getProgSendDir());
      AnnotationProperties annoProps = annoProcessor.getAnnotationProperties();
      ByteArrayInputStream bais = new ByteArrayInputStream(IOUtils.toByteArray(inputStream));
      String statusLine = FileContentUtil.readLineAt(bais,annoProps.getStatusLineIndex());
      String text = programAnnotationService.removeAnnotation(machine.getControlSystem(),statusLine);
      if(AnnotationUtil.isStatusContent(text)){
         //是3种状态之一
         annoData.setProgramStatus(text);
      }else{
         //没有按试切处理
         annoData.setProgramStatus(AnnotationUtil.SQ);
      }
      bais.reset();
      //
      return annoProcessor.putAnnotation(annoData,bais);
   }
}