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 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 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); } } }