yangys
2025-09-18 a3048fa6fa72fa3cc5da2c43c59bd000e00c9599
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
 
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<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
     * @param os
     * @throws IOException
     */
    @Transactional
    public void exportToInner(List<Long> acceptedFileIds, ServletOutputStream os) throws IOException {
 
        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()));
 
            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()) ) {
                        MachineFile machineFile = machineFileService.getById(acceptedFile.getMachineFileId());
                        addInputStreamToZip(zipOut,ins , programName + "/" + acceptedFile.getName(),acceptedFile.getName(),machineFile.getMachineCode());
                    }
                    acceptedFile.setExportTime(DateUtil.now());
                }
 
            }
 
            machineAcceptedService.updateBatchById(acceptedFiles);
        }
 
        os.close();
    }
 
 
    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
     * @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);
    }
}