| | |
| | | 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.core.tool.utils.SpringUtil; |
| | | import org.springblade.mdm.basesetting.machine.entity.Machine; |
| | | import org.springblade.mdm.basesetting.machine.service.MachineService; |
| | | import org.springblade.mdm.flow.excution.events.CureFinishedEvent; |
| | | 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; |
| | | 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.*; |
| | |
| | | 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 AnnotationProcessorHelper annotationProcessorHelper; |
| | | private final ProgramAnnotationService programAnnotationService; |
| | | |
| | | |
| | | private final MachineBackTaskService machineBackTaskService; |
| | | /** |
| | | * 导出到涉密网 |
| | | * @param acceptedFileIds |
| | |
| | | @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())); |
| | | |
| | | 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); |
| | | } |
| | | |
| | | } |
| | | |
| | | 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(); |
| | | |
| | | |
| | | } |
| | | |
| | | void finishTask(List<Long> backTaskIdList){ |
| | | if(backTaskIdList.isEmpty()){ |
| | | return; |
| | | } |
| | | List<MachineBackTask> tasks = machineBackTaskService.lambdaQuery().in(MachineBackTask::getId,backTaskIdList).list(); |
| | | for(MachineBackTask backTask : tasks){ |
| | | backTask.setStatus(MachineBackTask.STATUS_FINISHED); |
| | | backTask.setFinishTime(new Date()); |
| | | |
| | | public void addInputStreamToZip(ZipOutputStream zipOut, InputStream inputStream, String entryName) |
| | | 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 条目 |
| | | 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 = 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); |
| | | } |
| | | } |
| | | |