package org.springblade.mdm.machinefile.service; import jakarta.servlet.ServletOutputStream; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springblade.core.mp.base.BizServiceImpl; import org.springblade.core.oss.OssTemplate; import org.springblade.core.tool.utils.DateUtil; import org.springblade.mdm.machinefile.entity.MachineAcceptedFile; import org.springblade.mdm.program.entity.NcProgramExchange; import org.springblade.mdm.program.mapper.NcProgramExchangeMapper; import org.springblade.mdm.utils.ProgramFileNameParser; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; 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; /** * 导出到涉密网 * @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())); List exportedFiles = new ArrayList<>(); 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()) ) { addInputStreamToZip(zipOut,ins , programName + "/" + acceptedFile.getName()); } acceptedFile.setExportTime(DateUtil.now()); } } machineAcceptedService.updateBatchById(acceptedFiles); } os.close(); } public void addInputStreamToZip(ZipOutputStream zipOut, InputStream inputStream, String entryName) throws IOException { // 创建新的 ZIP 条目 ZipEntry zipEntry = new ZipEntry(entryName); zipOut.putNextEntry(zipEntry); // 将输入流写入 ZIP 输出流 byte[] buffer = new byte[1024]; int length; while ((length = inputStream.read(buffer)) >= 0) { zipOut.write(buffer, 0, length); } // 关闭当前条目 zipOut.closeEntry(); } }