package org.springblade.mdm.machinefile.service; 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.*; import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; /** * 下发/回传程序统计 * * @author yangys */ @Slf4j @Service @AllArgsConstructor public class NcProgramExportInnerService extends BizServiceImpl { private final MachineAcceptedFileService machineAcceptedService; private final OssTemplate ossTemplate; private final MachineFileService machineFileService; private final MachineService machineService; private final AnnotationProcessorHelper annotationProcessorHelper; private final ProgramAnnotationService programAnnotationService; /** * 导出到涉密网 * @param acceptedFileIds * @param os * @throws IOException */ @Transactional public void exportToInner(List acceptedFileIds, ServletOutputStream os) throws IOException { try (ZipOutputStream zipOut = new ZipOutputStream(os);) {//os List acceptedFiles = machineAcceptedService.lambdaQuery().in(MachineAcceptedFile::getId,acceptedFileIds).list(); Map> map = acceptedFiles.stream() .collect(Collectors.groupingBy(s -> ProgramFileNameParser.parseProgramName(s.getName()).logicProgramName())); for (Map.Entry> entry : map.entrySet()) { String programName = entry.getKey(); List acceptedFileList = entry.getValue(); for (MachineAcceptedFile acceptedFile : acceptedFileList) { try(InputStream ins = ossTemplate.statFileStream(acceptedFile.getOssName()) ) { 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); } } machineAcceptedService.updateBatchById(acceptedFiles); } os.close(); } /** * 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 条目 ZipEntry zipEntry = new ZipEntry(entryName); zipOut.putNextEntry(zipEntry); InputStream insAdded = setAnnotations(inputStream,filename,machineCode); // 将输入流写入 ZIP 输出流 byte[] buffer = new byte[1024]; int length; 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 = annotationProcessorHelper.getProcessor(machine.getControlSystem()); AnnotationData annoData = new AnnotationData(); annoData.setFilename(filename); annoData.setSendPath(machine.getProgSendDir()); AnnotationProperties annoProps = annoProcessor.getAnnotationProperties(); 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)){ //是3种状态之一 annoData.setProgramStatus(text); }else{ //没有按试切处理 annoData.setProgramStatus(AnnotationUtil.SQ); } byteInsStream.reset(); // return annoProcessor.putAnnotation(annoData,byteInsStream); } }