package org.springblade.mdm.machinefile.service; import com.qiniu.util.IOUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.lang3.StringUtils; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.tool.utils.Func; import org.springblade.mdm.basesetting.machine.entity.Machine; import org.springblade.mdm.basesetting.machine.service.MachineService; import org.springblade.mdm.commons.contants.RegExpConstants; import org.springblade.mdm.commons.service.MachineDirTranslator; import org.springblade.mdm.commons.service.ParamService; import org.springblade.mdm.gkw.programnode.vo.ProgramNameVO; import org.springblade.mdm.gkw.task.entity.MachineBackTask; import org.springblade.mdm.gkw.task.service.MachineBackTaskService; import org.springblade.mdm.machinefile.entity.FileSendRecord; import org.springblade.mdm.machinefile.entity.MachineFile; import org.springblade.mdm.program.entity.ProgramOnMachine; import org.springblade.mdm.program.service.ProgramAnnotationService; import org.springblade.mdm.program.service.ProgramOnMachineService; import org.springblade.mdm.program.service.programannotation.*; 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.*; 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; import java.util.regex.Matcher; @Slf4j @Component public class ReceiveFileCheckService { @Autowired private MachineFileService machineFileService; @Autowired private MachineService machineService; @Autowired private ProgramOnMachineService programOnMachineService; @Autowired private FileSendRecordService fileSendRecordService; @Autowired private AnnotationProcessorHelper annoProcessHelper; @Autowired private MachineDirTranslator machineDirTranslator; @Autowired private MachineBackTaskService machineBackTaskService; /** * 文件合法性检查 * @param machineFile */ @Transactional(rollbackFor = Exception.class) public void check(MachineFile machineFile,List allFilesInDir,Machine machine) throws IOException { String srcFilepath = machineDirTranslator.trans(MachineFileService.getBasePath(machine,machineFile.getDirType())+ File.separator+machineFile.getName()); log.info("开始检查文件{}",srcFilepath); Path checkFilePath = Paths.get(srcFilepath); if(!checkFilePath.toFile().exists()){ return; } try(InputStream fileIns = Files.newInputStream(checkFilePath);) { int excepType = MachineFile.EXCEPTION_OK; ByteArrayInputStream byteStream = new ByteArrayInputStream(IOUtils.toByteArray(fileIns)); if(!FileContentUtil.isTextFile(byteStream)){ //非文本 excepType = MachineFile.EXCEPTION_NOT_TEXT; }else{ ProgramNameVO progNameVO = ProgramFileNameParser.parseProgramName(machineFile.getName()); boolean filenameValid = progNameVO.isValidFilename(); if(!filenameValid){ excepType = MachineFile.EXCEPTION_BAD_FILENAME; }else { String prefix = progNameVO.logicProgramName()+"-"; long matchCount = allFilesInDir.stream().filter(file -> file.getName().startsWith(prefix)).count(); if(matchCount != progNameVO.getSegmentCount()){//文件段数缺失 excepType = MachineFile.EXCEPTION_LOST_FILES; }else{ //检查是否匹配机床回传任务 byteStream.reset(); AnnotationProcessor annoProcessor = this.annoProcessHelper.getProcessor(machine.getControlSystem()); AnnotationData annoData = annoProcessor.readAnnotationData(byteStream); Optional taskOpt = backTaskForFile(machineFile,annoData); /* String nameLikeStr; if(StringUtils.isNotBlank(progNameVO.getLgPart())){ nameLikeStr = prefix +"%P%"; }else{ nameLikeStr = prefix; } Optional optFile = fileSendRecordService.lambdaQuery() .eq(FileSendRecord::getMachineCode,machineFile.getMachineCode()) .likeRight(FileSendRecord::getName,nameLikeStr).last("limit 1") .orderByDesc(FileSendRecord::getCreateTime).oneOpt(); */ //boolean matchSendRecord;//文件是否有下发记录 if(taskOpt.isPresent()){ //有任务,比对总段数是否相同 MachineBackTask backTask = taskOpt.get(); //FileSendRecord sendFile = optFile.get(); //ProgramNameVO sendProgNameVO = ProgramFileNameParser.parseProgramName(sendFile.getName()); if(!backTask.isProgramOnMachineTask() ){//工艺编制 if(progNameVO.getSegmentCount() != backTask.getSegCount()) { //段数不匹配下发记录 excepType = MachineFile.EXCEPTION_NOT_MATCH_SEND_SEG_COUNT; } }else{ //现场编程,检查更改单序号 if(StringUtils.isNotBlank(backTask.getDeviationSerial()) && !StringUtils.equals(backTask.getDeviationSerial(),progNameVO.lgSerial())){ excepType = MachineFile.EXCEPTION_NOT_MATCH_SEND_LG; } } }else{ excepType = MachineFile.EXCEPTION_NOT_MATCH_RECORD; } /* if(!matchSendRecord){//如果文件未下发过,查看是否有现场编程记录 String devSerial = null; if(StringUtils.isNotBlank(progNameVO.getLgPart())){ devSerial = progNameVO.getLgPart().substring(1); } long progOnMachineCount = programOnMachineService.lambdaQuery() .eq(ProgramOnMachine::getDrawingNo,progNameVO.getDrawingNo()) .eq(ProgramOnMachine::getProcessNo,progNameVO.getProcessNo()) .eq(ProgramOnMachine::getProcessEdition,progNameVO.getProcessEdition()) .eq(devSerial != null,ProgramOnMachine::getDeviationSerial,devSerial) .eq(ProgramOnMachine::getMachineCode,machineFile.getMachineCode()).count(); if(progOnMachineCount == 0){//无现场编程记录 excepType = MachineFile.EXCEPTION_NOT_MATCH_RECORD; } } */ } } } machineFile.setExceptionType(excepType); log.info("检查文件结束{}",srcFilepath); machineFileService.updateById(machineFile); } } Optional backTaskForFile(MachineFile machineFile,AnnotationData annoData){ ProgramNameVO progNameVO = ProgramFileNameParser.parseProgramName(machineFile.getName()); return machineBackTaskService.lambdaQuery() .eq(MachineBackTask::getStatus,MachineBackTask.STATUS_PENDING) .eq(MachineBackTask::getMachineCode,machineFile.getMachineCode()) .eq(MachineBackTask::getProgramName,progNameVO.logicProgramName()) .eq(progNameVO.lgSerial()!=null,MachineBackTask::getDeviation,annoData.getDeviation()) .eq(progNameVO.lgSerial()!=null,MachineBackTask::getDeviationSerial,progNameVO.lgSerial()) .last("limit 1").oneOpt(); } }