yangys
2025-09-17 ee6af8dff591418168d5104d281a6f0bf3c961e8
现场编制功能适配
已添加3个文件
已修改4个文件
168 ■■■■■ 文件已修改
blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machine/service/MachineService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/contants/RegExpConstants.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/config/InitBean.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/config/TaskPropertieBean.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/service/ReceiveFileCheckService.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/MdmProgramImportService.java 70 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/test/java/org/springblade/mdm/commons/contants/RegExpConstantsTest.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/machine/service/MachineService.java
@@ -335,6 +335,10 @@
     * @param sendPathLine ä¸‹å‘路径注释文本
     */
    public Machine getMachineBySendPathAnnotation(String sendPathLine) {
        //路径为空,不匹配任何机器
        if(StringUtils.isBlank(sendPathLine)){
            return null;
        }
        //去掉首位括号,排除发那科机床注释
        String sendPath = escapeSqlWildcard(StringUtils.trim(StringUtils.removeEnd(StringUtils.removeStart(sendPathLine,"("),")")));
blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/contants/RegExpConstants.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
package org.springblade.mdm.commons.contants;
import java.util.regex.Pattern;
public class RegExpConstants {
    /**
     * ç¨‹åºæ–‡ä»¶å æ­£åˆ™
     */
    public static final Pattern PROGRAM_FILE_PATTERN = Pattern.compile("^[0-9a-zA-Z_\\-]+\\-[0-9a-zA-Z]+-[0-9a-zA-Z]+\\-\\d+\\-\\d+\\.*[a-zA-Z]*$");
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/config/InitBean.java
@@ -13,8 +13,6 @@
import org.springblade.mdm.machinefile.service.MachineFileScanService;
import org.springblade.mdm.machinefile.service.MachineFileService;
import org.springblade.mdm.program.service.ProgramAnnotationService;
import org.springblade.system.feign.ISysClient;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.stereotype.Component;
@@ -36,12 +34,19 @@
    private final ProgramAnnotationService annotationService;
    private final MachineFileScanService machineFileScanService;
    private final TaskDispatchService taskDispatchService;
    //@Value("${task.file_scan_on_start:true}")
    //@Value("${task.fileScanOnStart:true}")
    //public boolean fileScanOnStart;
    private final TaskPropertieBean taskPropertieBean;
    @PostConstruct
    public void init() {
        log.info("应用启动时执行初始化操作 @PostConstruct");
        String networkType = paramService.networkType();
        if(!ParamService.NETWORK_TYPE_SHEMI.equals(networkType)) {
            machineFileScanService.scanMachineFile();
            if(taskPropertieBean.isFileScanOnStart()) {
                machineFileScanService.scanMachineFile();
            }
            //工控网才启动文件监控
            log.info("工控网启动文件监控");
blade-service/blade-mdm/src/main/java/org/springblade/mdm/config/TaskPropertieBean.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package org.springblade.mdm.config;
import lombok.Getter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Getter
@Component
public class TaskPropertieBean {
    @Value("${task.file_scan_on_start:true}")
    //@Value("${task.fileScanOnStart:true}")
    private boolean fileScanOnStart;
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/service/ReceiveFileCheckService.java
@@ -5,6 +5,7 @@
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.contants.RegExpConstants;
import org.springblade.mdm.commons.service.ParamService;
import org.springblade.mdm.gkw.programnode.vo.ProgramNameVO;
import org.springblade.mdm.machinefile.entity.FileSendRecord;
@@ -31,6 +32,7 @@
import java.util.Date;
import java.util.List;
import java.util.Optional;
import java.util.regex.Matcher;
@Slf4j
@Component
@@ -59,10 +61,13 @@
                //非文本
                machineFile.setExceptionType(MachineFile.EXCEPTION_NOT_TEXT);
            }else{
                ProgramNameVO progNameVO =  ProgramFileNameParser.parseProgramName(machineFile.getName());
                if(!progNameVO.isValidFilename()){
                Matcher matcher = RegExpConstants.PROGRAM_FILE_PATTERN.matcher(machineFile.getName());
                boolean filenameValid = matcher.find();
                if(!filenameValid){
                    machineFile.setExceptionType(MachineFile.EXCEPTION_BAD_FILENAME);
                }else {
                    ProgramNameVO progNameVO =  ProgramFileNameParser.parseProgramName(machineFile.getName());
                    String prefix = progNameVO.logicProgramName()+"-";
                    long matchCount = allFilesInDir.stream().filter(file -> file.getName().startsWith(prefix)).count();
                    if(matchCount != progNameVO.getSegmentCount()){//文件段数缺失
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/MdmProgramImportService.java
@@ -16,6 +16,7 @@
import org.springblade.mdm.machinefile.service.FileSendRecordService;
import org.springblade.mdm.program.entity.NcProgramExchange;
import org.springblade.mdm.program.mapper.NcProgramExchangeMapper;
import org.springblade.mdm.program.service.programannotation.AnnotationProperties;
import org.springblade.mdm.program.vo.MdmProgramImportVO;
import org.springblade.mdm.utils.FileContentUtil;
import org.springframework.beans.factory.annotation.Autowired;
@@ -86,15 +87,6 @@
            extractZipToTempDir(tempZipFile,extractDir);
            //读取文件目录
            /*
            BladeFile bfile = ossTemplate.putFile(file);//上传,供后续入库使用
            //设置一个缓存,2小时过期
            InputStream zipFileInputStream = file.getInputStream();//test
            byte[] bytes = FileUtil.copyToByteArray(zipFileInputStream);
            list = parseMdmZipFromByteArray(bytes);
            */
            list = readTempDir(extractDir);
        } catch (IOException e) {
            log.error("导入涉密网摆渡文件失败",e);
@@ -109,9 +101,6 @@
        Path tempPath = Paths.get(tempDir);
        // åˆ›å»ºè§£åŽ‹ç›®æ ‡ç›®å½•ï¼ˆåœ¨ä¸´æ—¶ç›®å½•ä¸‹åˆ›å»ºä¸€ä¸ªå”¯ä¸€å­ç›®å½•ï¼‰
        //Path extractDir = Files.createTempDirectory(tempPath, "unzip_");
        System.out.println("解压目录: " + extractDir.toString());
        //Files.newInputStream(Paths.get(zipFilePath));
        try (InputStream fis = Files.newInputStream(zipFilePath);
             ZipInputStream zis = new ZipInputStream(fis)) {
@@ -161,51 +150,16 @@
        return normalizePath;
    }
    /*
    public static List<MdmProgramImportVO> parseMdmZipFromByteArray(byte[] zipData) throws IOException {
        List<MdmProgramImportVO> list = new ArrayList<>();
        Map<String,String> fileMd5Map = new HashMap<>();
        Map<String,MdmProgramImportVO> fileDataMap = new HashMap<>();
        try (SeekableInMemoryByteChannel channel = new SeekableInMemoryByteChannel(zipData);
             ZipFile zipFile = new ZipFile(channel)) {
            ZipArchiveEntry entry;
            Enumeration<ZipArchiveEntry> entries = zipFile.getEntries();
            while (entries.hasMoreElements()) {
                entry = entries.nextElement();
                String entryName = entry.getName();
                if (!entry.isDirectory()) {
                    //直接解析程序的json文件
                }
            }
        }
        //设置md5值
        fileDataMap.forEach((k,v)->{
            if(fileMd5Map.containsKey(k)){
                v.setMd5(fileMd5Map.get(k));
            }
        });
        return list;
    }
    */
    public List<MdmProgramImportVO> readTempDir(Path extractDir) throws IOException {
        List<MdmProgramImportVO> list = new ArrayList<>();
        List<Machine> machines = machineService.lambdaQuery().eq(Machine::getStatus,Machine.STATUS_ENABLE).list();
        //List<Machine> machines = machineService.getEnableMachines();
        //读取所有文件夹
        //List<Path> dirs = Files.list(extractDir).filter(Files::isDirectory).toList();
        try (DirectoryStream<Path> stream = Files.newDirectoryStream(extractDir)) {
            for (Path path : stream) {
                if (Files.isDirectory(path)) {
                    // å¦‚果是子目录,读取其中的文件
                    try (DirectoryStream<Path> subStream = Files.newDirectoryStream(path)) {
@@ -215,8 +169,6 @@
                            }
                        }
                    }
                    //vo.setFiles(files);
                } else if (Files.isRegularFile(path)) {
                    System.out.println("找到文件2: " + path);
                    //这里 æ‰¾åˆ°çš„æ–‡ä»¶ä¸æ˜¯
@@ -237,19 +189,25 @@
                    try (InputStream inputStream = Files.newInputStream(path, StandardOpenOption.READ)) {
                        // ä½¿ç”¨è¾“入流读取文件内容
                        ByteArrayInputStream bas = new ByteArrayInputStream(inputStream.readAllBytes());
                        String line1 = FileContentUtil.readLineAt(bas,1);
                        AnnotationProperties defAnnoProperties = AnnotationProperties.getDefault();
                        String sendPathLine = FileContentUtil.readLineAt(bas,defAnnoProperties.getSendPathLineIndex());
                        //bas.mark(0);
                        bas.reset();
                        String line2 = FileContentUtil.readLineAt(bas,2);
                        System.out.println("line1="+line1);
                        Machine matchedMachine = null;
                        String statusLine = FileContentUtil.readLineAt(bas,defAnnoProperties.getStatusLineIndex());
                        log.info("sendPathLine={}", sendPathLine);
                        Machine matchedMachine = machineService.getMachineBySendPathAnnotation(sendPathLine);
                        /*
                        for (Machine machine : machines) {
                            if(Func.isNotBlank(machine.getProgSendDir()) && line1.contains(machine.getProgSendDir())){
                            if(Func.isNotBlank(machine.getProgSendDir()) && sendPathLine.contains(machine.getProgSendDir())){
                                matchedMachine = machine;
                                break;
                            }
                        }
                         */
                        if (matchedMachine != null) {
                            vo.setName(parseProgramName(vo.getFilename()));
                            vo.setMachineCode(matchedMachine.getCode());
@@ -257,7 +215,7 @@
                            vo.setFullPath(path.toString());//文件地址
                            vo.setSendPath(matchedMachine.getProgSendDir());
                            vo.setId(vo.getFullPath());
                            vo.setProgramStatus(programAnnotationService.removeAnnotation(matchedMachine.getControlSystem(),line2));
                            vo.setProgramStatus(programAnnotationService.removeAnnotation(matchedMachine.getControlSystem(),statusLine));
                            list.add(vo);
                        }
blade-service/blade-mdm/src/test/java/org/springblade/mdm/commons/contants/RegExpConstantsTest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,50 @@
package org.springblade.mdm.commons.contants;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import java.util.regex.Matcher;
public class RegExpConstantsTest {
    @Test
    public void testFilePattern(){
        Matcher m = RegExpConstants.PROGRAM_FILE_PATTERN.matcher("J_YDT290-10-02B-35-A-1-1.txt");
        Assertions.assertTrue(m.find());
        //零组件带横杠也合理
        m = RegExpConstants.PROGRAM_FILE_PATTERN.matcher("J-YDT290-10-02B-35-A-1-1.txt");
        Assertions.assertTrue(m.find());
        m = RegExpConstants.PROGRAM_FILE_PATTERN.matcher("O0001.TXT");
        Assertions.assertFalse(m.find());
        //无扩展名也需要匹配
        m = RegExpConstants.PROGRAM_FILE_PATTERN.matcher("J_YDT290-10-02B-35-A-1-1");
        Assertions.assertTrue(m.find());
        //无工序号或版次段
        m = RegExpConstants.PROGRAM_FILE_PATTERN.matcher("J_YDT290-A-1-1.TXT");
        Assertions.assertFalse(m.find());
        //无工序号和 ç‰ˆæ¬¡æ®µ
        m = RegExpConstants.PROGRAM_FILE_PATTERN.matcher("J_YDT290-1-1.TXT");
        Assertions.assertFalse(m.find());
        //无段数段号
        m = RegExpConstants.PROGRAM_FILE_PATTERN.matcher("J_YDT290-10-02B-35-A.TXT");
        Assertions.assertFalse(m.find());
        //段数段号 ç¼ºä¸€ä¸ª
        m = RegExpConstants.PROGRAM_FILE_PATTERN.matcher("J_YDT290-10-02B-35-A-1.TXT");
        Assertions.assertFalse(m.find());
        //缺数号
        m = RegExpConstants.PROGRAM_FILE_PATTERN.matcher("J_YDT290-10-02B-35-A-1-.TXT");
        Assertions.assertFalse(m.find());
        //数号非数字
        m = RegExpConstants.PROGRAM_FILE_PATTERN.matcher("J_YDT290-10-02B-35-A-1-e.TXT");
        Assertions.assertFalse(m.find());
    }
}