yangys
2025-09-17 1e2b04fabbbc4b1ae37d7951068d7ab235f5b5f9
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
package org.springblade.mdm.machinefile.service;
 
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.mdm.basesetting.machine.entity.Machine;
import org.springblade.mdm.basesetting.machine.service.MachineService;
import org.springblade.mdm.commons.service.ParamService;
import org.springblade.mdm.gkw.programnode.vo.ProgramNameVO;
import org.springblade.mdm.machinefile.entity.FileSendRecord;
import org.springblade.mdm.machinefile.entity.MachineFile;
import org.springblade.mdm.program.service.ProgramAnnotationService;
import org.springblade.mdm.program.service.programannotation.AnnotationUtil;
import org.springblade.mdm.utils.FileContentUtil;
import org.springblade.mdm.utils.ProgramFileNameParser;
import org.springblade.system.pojo.entity.DictBiz;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
 
import java.io.BufferedInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;
import java.nio.file.attribute.FileTime;
import java.util.Date;
import java.util.List;
import java.util.Optional;
 
@Slf4j
@Component
public class ReceiveFileCheckService {
    @Autowired
    private MachineFileService machineFileService;
    @Autowired
    private MachineService machineService;
    @Autowired
    private ParamService paramService;
    @Autowired
    private FileSendRecordService fileSendRecordService;
    /**
     * 文件合法性检查
     * @param machineFile
     */
    @Transactional(rollbackFor = Exception.class)
    public void check(MachineFile machineFile,List<MachineFile> allFilesInDir,Machine machine) throws IOException {
        String srcFilepath = MachineFileService.getBasePath(machine,machineFile.getDirType())+ File.separator+machineFile.getName();
        Path source = Paths.get(srcFilepath);
        if(!source.toFile().exists()){
            return;
        }
        try(InputStream fileIns = Files.newInputStream(Paths.get(srcFilepath));) {
            if(!FileContentUtil.isTextFile(fileIns)){
                //非文本
                machineFile.setExceptionType(MachineFile.EXCEPTION_NOT_TEXT);
            }else{
                ProgramNameVO progNameVO =  ProgramFileNameParser.parseProgramName(machineFile.getName());
                if(!progNameVO.isValidFilename()){
                    machineFile.setExceptionType(MachineFile.EXCEPTION_BAD_FILENAME);
                }else {
                    String prefix = progNameVO.logicProgramName()+"-";
                    long matchCount = allFilesInDir.stream().filter(file -> file.getName().startsWith(prefix)).count();
                    if(matchCount != progNameVO.getSegmentCount()){//文件段数缺失
                        machineFile.setExceptionType(MachineFile.EXCEPTION_LOST_FILES);
                    }else{
                        //检查是否匹配下发记录的段数
                        //正负3秒作为查询时间
                        Date beginTime = new Date(machineFile.getFileCreateTime().getTime()-3000);
                        Date endTime = new Date(machineFile.getFileCreateTime().getTime()+3000);
                        Optional<FileSendRecord> optFile = fileSendRecordService.lambdaQuery()
                            .eq(FileSendRecord::getMachineCode,machineFile.getMachineCode())
                            .likeRight(FileSendRecord::getName,prefix).between(FileSendRecord::getCreateTime,beginTime,endTime).oneOpt();
 
                        if(optFile.isPresent()){
                            //确实下发过,比对总段数是否相同
                            FileSendRecord sendFile = optFile.get();
                            ProgramNameVO sendProgNameVO =  ProgramFileNameParser.parseProgramName(sendFile.getName());
                            if(progNameVO.getSegmentCount() != sendProgNameVO.getSegmentCount()){
                                //段数不匹配
                                machineFile.setExceptionType(MachineFile.EXCEPTION_NOT_MATCH_SEND);
                            }else{
                                machineFile.setExceptionType(MachineFile.EXCEPTION_OK);
                            }
                        }
                    }
                }
            }
 
            machineFileService.updateById(machineFile);
        }
    }
}