yangys
2025-09-23 72e6bac02526caebc3797a7c2934d12896805708
修复文件状态读取问题
已添加4个文件
已修改9个文件
186 ■■■■ 文件已修改
blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/contants/RegExpConstants.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/contants/ZipConstants.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/mapper/MdmDictBizMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/mapper/MdmDictBizMapper.xml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/service/MdmDictBizService.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/config/InitBean.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/service/MachineFileScanService.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/DNCSendBackService.java 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/MdmProgramImportService.java 64 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/ProgramAnnotationService.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/task/MachineFileScanTask.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/test/MyTestController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/test/java/org/springblade/mdm/utils/ProgramFileNameParserTest.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/contants/RegExpConstants.java
@@ -7,7 +7,7 @@
    /**
     * ç¨‹åºæ–‡ä»¶å æ­£åˆ™
     */
    public static final Pattern PROGRAM_FILE_PATTERN = Pattern.compile("^([\\w\\-]+)-([0-9a-zA-Z]+)-([0-9a-zA-Z]+)-(\\d+)-(\\d+)-?([Pp]\\d+)?(\\.[a-zA-Z]+)?$");
    public static final Pattern PROGRAM_FILE_PATTERN = Pattern.compile("^([\\w\\-]+)-([0-9a-zA-Z]+)-([\\u4e00-\\u9fa5a-zA-Z0-9]+)-(\\d+)-(\\d+)-?([Pp]\\d+)?(\\.[a-zA-Z]+)?$");
    //public static final Pattern PROGRAM_PACKAGE_PATTERN = Pattern.compile("[\\w\\-]+\\-\\w+\\-\\w+");
    public static final Pattern PROGRAM_PACKAGE_PATTERN = Pattern.compile("([\\w\\-]+)-[0-9a-zA-Z]+-[0-9a-zA-Z]+");
blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/contants/ZipConstants.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,8 @@
package org.springblade.mdm.commons.contants;
public class ZipConstants {
    /**
     * è¯•验解包的编码数组
     */
    public static final String[] TRY_ENCODINGS = {"UTF-8","GBK", "GB2312", "ISO-8859-1"};
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/mapper/MdmDictBizMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package org.springblade.mdm.commons.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Param;
import org.springblade.core.mp.mapper.BladeMapper;
import org.springblade.mdm.flow.entity.ApproveRecord;
import org.springblade.mdm.flow.vo.DoneQueryVO;
import org.springblade.mdm.flow.vo.FlowVO;
import org.springblade.system.pojo.entity.DictBiz;
import java.util.List;
public interface MdmDictBizMapper{
    List<DictBiz> getList(@Param("code") String code);
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/mapper/MdmDictBizMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.springblade.mdm.commons.mapper.MdmDictBizMapper">
    <!--查询用户已办列表-->
    <select id="getList" resultType="org.springblade.system.pojo.entity.DictBiz">
        select id,code,dict_key,dict_value,remark from blade_dict_biz where code=#{code} and is_deleted=0
        order by sort
    </select>
</mapper>
blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/service/MdmDictBizService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package org.springblade.mdm.commons.service;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.mdm.commons.mapper.MdmDictBizMapper;
import org.springblade.system.pojo.entity.DictBiz;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
 * ç³»ç»Ÿå‚数获取服务
 *
 * @author yangys
 */
@Slf4j
@Service
@AllArgsConstructor
public class MdmDictBizService {
    @Autowired
    private MdmDictBizMapper mdmDictBizMapper;
    public List<DictBiz> getList(String code){
        return mdmDictBizMapper.getList(code);
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/config/InitBean.java
@@ -62,12 +62,15 @@
     * åˆå§‹åŒ–监控目录
     */
    void initMachineDirMonitor() {
        /*
        boolean locked = directorLockService.acquireLock();
        if (!locked) {
            log.info("回传接收目录已经被其他部署点位锁定,直接返回");
            return;
        }
         */
        List<Machine> machineList = machineService.getEnableMachines();;
        List<WatchInfo> monitorInfoList = new ArrayList<>();
        machineList.forEach(m -> {
blade-service/blade-mdm/src/main/java/org/springblade/mdm/machinefile/service/MachineFileScanService.java
@@ -180,16 +180,16 @@
    public int readProgramStatus(Path filePath,String controlSystem,List<DictBiz> annotatiionList) throws IOException {
        int programStatus = MachineFile.PROGRAM_STATUS_UNKNOWN;
        try(InputStream ins = Files.newInputStream(filePath);
            BufferedInputStream bis = new BufferedInputStream(ins)){
            BufferedInputStream byteInsStream = new BufferedInputStream(ins)){
            boolean isText= FileContentUtil.isTextFile(bis);
            boolean isText= FileContentUtil.isTextFile(byteInsStream);
            if(!isText){
                return MachineFile.PROGRAM_STATUS_UNKNOWN;
            }
            bis.reset();
            byteInsStream.reset();
            AnnotationProcessor annoProcessor = ProcessorHelper.getProcessor(controlSystem,annoConfig);
            String statusLine = FileContentUtil.readLineAt(ins, annoProcessor.getAnnotationProperties().getStatusLineIndex());
            String statusLine = FileContentUtil.readLineAt(byteInsStream, annoProcessor.getAnnotationProperties().getStatusLineIndex());
            if(AnnotationUtil.isAnnotation(statusLine,controlSystem,annotatiionList)){
                String progStatusTxt = AnnotationUtil.removeAnnotation(controlSystem,statusLine,annotatiionList);
                if(AnnotationUtil.SQ.equals(progStatusTxt)){
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/DNCSendBackService.java
@@ -1,7 +1,6 @@
package org.springblade.mdm.program.service;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FilenameUtils;
@@ -18,10 +17,7 @@
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.basesetting.producedivision.entity.QinzheFgb;
import org.springblade.mdm.basesetting.producedivision.service.QinzheFgbService;
import org.springblade.mdm.commons.contants.RegExpConstants;
import org.springblade.mdm.commons.service.ParamService;
import org.springblade.mdm.commons.contants.ZipConstants;
import org.springblade.mdm.flow.entity.FlowProgramFile;
import org.springblade.mdm.flow.service.CureFlowService;
import org.springblade.mdm.flow.service.FlowCommonService;
@@ -32,11 +28,8 @@
import org.springblade.mdm.program.service.programannotation.*;
import org.springblade.mdm.program.vo.DncSendBackData;
import org.springblade.mdm.program.vo.DncSendBackFile;
import org.springblade.mdm.program.vo.ProgramAnnotation;
import org.springblade.mdm.utils.FileContentUtil;
import org.springblade.mdm.utils.ProgramFileNameParser;
import org.springblade.mdm.utils.ZipTextFileContentUtil;
import org.springblade.system.pojo.entity.DictBiz;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -49,11 +42,8 @@
import java.nio.file.StandardOpenOption;
import java.time.Duration;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
/**
 * DNC回传文件处理服务
@@ -82,7 +72,7 @@
     * åç¦»å•文件末尾的模式:P+数字
     */
    private static final String P_NUMBER_PATTERN = "(?i)P\\d+";
    static String[] encodings = {"UTF-8","GBK", "GB2312", "ISO-8859-1"};
    //static String[] encodings = {"UTF-8","GBK", "GB2312", "ISO-8859-1"};
    private String getFileKey(){
        return "dncimpfile-"+ AuthUtil.getUserId();
    }
@@ -125,7 +115,7 @@
        List<DncSendBackData> result = null;
        ByteArrayInputStream byteInsStream = new ByteArrayInputStream(FileUtil.copyToByteArray(inputStream));
        for (String encoding : encodings) {
        for (String encoding : ZipConstants.TRY_ENCODINGS) {
            try {
                result = parseProgramListByCharset(byteInsStream,Charset.forName(encoding));
                log.error("使用编码 {} è§£æžæˆåŠŸ ",encoding);
@@ -274,7 +264,7 @@
        Map<Long, List<FlowProgramFile>> pkgIdFileMap = new HashMap<>();
        //ByteArrayInputStream byteInsStream = new ByteArrayInputStream(FileUtil.copyToByteArray(inputStream));
        for (String encoding : encodings) {
        for (String encoding : ZipConstants.TRY_ENCODINGS) {
            try {
                pkgIdFileMap = dealWithBackFileWithCharset(ossFileName,acceptIdList,Charset.forName(encoding));
                log.error("使用编码 {} è§£æžæˆåŠŸ ",encoding);
@@ -290,7 +280,7 @@
    /**
     * å¤„理回传文件
     * @param inputStream
     * @param ossFileName
     * @param acceptIdList
     * @return
     * @throws IOException
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/MdmProgramImportService.java
@@ -16,6 +16,7 @@
import org.springblade.mdm.basesetting.machine.service.MachineService;
import org.springblade.mdm.basesetting.machine.entity.Machine;
import org.springblade.mdm.commons.contants.RegExpConstants;
import org.springblade.mdm.commons.contants.ZipConstants;
import org.springblade.mdm.gkw.programnode.vo.ProgramNameVO;
import org.springblade.mdm.machinefile.entity.FileSendRecord;
import org.springblade.mdm.machinefile.service.FileSendRecordService;
@@ -30,6 +31,8 @@
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
@@ -85,14 +88,8 @@
                Path tempZipFile = Files.createTempFile("mdmimpfile-"+System.currentTimeMillis(), ".zip");
                file.transferTo(tempZipFile);
                extractZipToTempDir(tempZipFile,extractDir);
            }else{
                //普通文件,直接放入extract文件夹
                String basename = FilenameUtils.getBaseName(file.getOriginalFilename());
                String ext = FilenameUtils.getExtension(file.getOriginalFilename());
                //Path filepath = Files.createTempFile(extractDir,basename,StringUtils.isEmpty(ext) ? "": "."+ext);
                //Path filepath = Files.createFile();
                file.transferTo(Paths.get(extractDir.toString()+File.separator+file.getOriginalFilename()));
            }
@@ -111,13 +108,24 @@
     * @param extractDir ç›®æ ‡ç›®å½•
     * @throws IOException æ–‡ä»¶æ“ä½œå¼‚常
     */
    public void extractZipToTempDir(Path zipFilePath,Path extractDir) throws IOException {
    public void extractZipToTempDir(Path zipFilePath,Path extractDir) throws IOException{
        for (String encoding : ZipConstants.TRY_ENCODINGS) {
            try {
                extractZipToTempDirWithCharset(zipFilePath,extractDir,Charset.forName(encoding));
                log.error("使用编码 {} è§£æžæˆåŠŸ ",encoding);
                break;
            } catch (Exception e) {
                log.error("使用编码 {} è§£æžå¤±è´¥: ",encoding,e);
            }
        }
    }
    public void extractZipToTempDirWithCharset(Path zipFilePath, Path extractDir, Charset charset) throws IOException {
        // èŽ·å–ç³»ç»Ÿä¸´æ—¶ç›®å½•
        String tempDir = System.getProperty("java.io.tmpdir");
        // åˆ›å»ºè§£åŽ‹ç›®æ ‡ç›®å½•ï¼ˆåœ¨ä¸´æ—¶ç›®å½•ä¸‹åˆ›å»ºä¸€ä¸ªå”¯ä¸€å­ç›®å½•ï¼‰
        try (InputStream fis = Files.newInputStream(zipFilePath);
             ZipInputStream zis = new ZipInputStream(fis)) {
             ZipInputStream zis = new ZipInputStream(fis,charset)) {
            ZipEntry zipEntry = zis.getNextEntry();
            while (zipEntry != null) {
@@ -177,8 +185,7 @@
        try (Stream<Path> paths = Files.walk(extractDir)) {
            List<Path> filePathList = paths
                .filter(Files::isRegularFile).toList();  // åªä¿ç•™æ™®é€šæ–‡ä»¶ï¼ŒæŽ’除目录
                //.collect(Collectors.toList());
            //System.out.println("所有文件"+filePathList);
            for(Path path : filePathList){
                list.add(readFileToVO(path));
            }
@@ -205,19 +212,47 @@
        }*/
        return list;
    }
    public static byte[] getUTF8BytesFromGBKString(String gbkStr) {
        int n = gbkStr.length();
        byte[] utfBytes = new byte[3 * n];
        int k = 0;
        for (int i = 0; i < n; i++) {
            int m = gbkStr.charAt(i);
            if (m < 128 && m >= 0) {
                utfBytes[k++] = (byte) m;
                continue;
            }
            utfBytes[k++] = (byte) (0xe0 | (m >> 12));
            utfBytes[k++] = (byte) (0x80 | ((m >> 6) & 0x3f));
            utfBytes[k++] = (byte) (0x80 | (m & 0x3f));
        }
        if (k < utfBytes.length) {
            byte[] tmp = new byte[k];
            System.arraycopy(utfBytes, 0, tmp, 0, k);
            return tmp;
        }
        return utfBytes;
    }
    ProgramNameVO tryParseProgramName(String fiilename){
        ProgramNameVO pnmameVO = ProgramFileNameParser.parseProgramName(fiilename);//标准utf8编码
        if(pnmameVO.getDrawingNo() == null) {
            //使用GBK编码解析
            pnmameVO = ProgramFileNameParser.parseProgramName(new String(getUTF8BytesFromGBKString(fiilename), StandardCharsets.UTF_8));
        }
        return pnmameVO;
    }
    /**
     * å°†æ–‡ä»¶ç»„织成VO
     * @param path æ–‡ä»¶path
     * @return vo
     */
    MdmProgramImportVO readFileToVO(Path path){
    MdmProgramImportVO readFileToVO(Path path) throws UnsupportedEncodingException {
        MdmProgramImportVO vo = new MdmProgramImportVO();
        vo.setFilename(path.getFileName().toString());
        ProgramNameVO pnmameVO = ProgramFileNameParser.parseProgramName(vo.getFilename());
        ProgramNameVO pnmameVO = tryParseProgramName(vo.getFilename());
        vo.setDrawingNo(pnmameVO.getDrawingNo());
        //vo.setDrawingNo(parseDrawingNo(vo.getFilename()));
        try (InputStream inputStream = Files.newInputStream(path)) {
            // ä½¿ç”¨è¾“入流读取文件内容
@@ -234,7 +269,7 @@
            AnnotationProperties defAnnoProperties = AnnotationProperties.getDefault();
            String sendPathLine = FileContentUtil.readLineAt(bas,defAnnoProperties.getSendPathLineIndex());
            //bas.mark(0);
            bas.reset();
            String statusLine = FileContentUtil.readLineAt(bas,defAnnoProperties.getStatusLineIndex());
            log.info("sendPathLine={}", sendPathLine);
@@ -242,7 +277,6 @@
            Machine matchedMachine = machineService.getMachineBySendPathAnnotation(sendPathLine);
            if (matchedMachine != null) {
                //vo.setName(parseProgramName(vo.getFilename()));
                vo.setName(pnmameVO.logicProgramName());
                vo.setMachineCode(matchedMachine.getCode());
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/ProgramAnnotationService.java
@@ -7,6 +7,7 @@
import org.jetbrains.annotations.NotNull;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.tool.api.R;
import org.springblade.mdm.commons.service.MdmDictBizService;
import org.springblade.mdm.program.service.programannotation.AnnotationUtil;
import org.springblade.mdm.program.vo.ProgramAnnotation;
import org.springblade.mdm.utils.FileContentUtil;
@@ -33,7 +34,8 @@
    @Autowired
    private IDictBizClient bizDictClient;
    @Autowired
    private MdmDictBizService mdmDictBizService;
    //private static final String DEFAULT_ANNOTATION_SETTING = "(,)";
    public static final String ANNOTATION_DICT = "machine_annotation";
@@ -54,6 +56,7 @@
    public List<DictBiz> getAnnotionDictList(){
        /*
        List<DictBiz> annotationList;
        R<List<DictBiz>> dictBizResult = bizDictClient.getList(ANNOTATION_DICT);
@@ -63,7 +66,8 @@
            annotationList = Collections.emptyList();
        }
        return annotationList;
        return annotationList;*/
        return mdmDictBizService.getList(ANNOTATION_DICT);
    }
blade-service/blade-mdm/src/main/java/org/springblade/mdm/task/MachineFileScanTask.java
@@ -17,13 +17,7 @@
@EnableScheduling
public class MachineFileScanTask {
    @Autowired
    private MachineFileService machineFileService;
    @Autowired
    private MachineService machineService;
    @Autowired
    private ParamService paramService;
    @Autowired
    private ProgramAnnotationService programAnnotationService;
    @Autowired
    private MachineFileScanService machineFileScanService;
    // æ¯5秒执行一次
blade-service/blade-mdm/src/main/java/org/springblade/mdm/test/MyTestController.java
@@ -8,9 +8,6 @@
import jakarta.xml.soap.SOAPException;
import jakarta.xml.ws.WebServiceContext;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.apache.neethi.AssertionBuilderFactory;
import org.apache.ws.commons.schema.XmlSchemaSerializer;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.SpringUtil;
blade-service/blade-mdm/src/test/java/org/springblade/mdm/utils/ProgramFileNameParserTest.java
@@ -41,6 +41,15 @@
        ProgramNameVO vo = ProgramFileNameParser.parseProgramName("CS-A-1-1-1-P1.nc");
        Assertions.assertTrue(vo.isValidFilename());
        vo = ProgramFileNameParser.parseProgramName("CS-A-无-1-1.txt");
        Assertions.assertEquals("CS",vo.getDrawingNo());
        Assertions.assertEquals("无",vo.getProcessEdition());
        ProgramNameVO pnmame1 = ProgramFileNameParser.parseProgramName("CP3-2-1-无-1-1.txt");
        Assertions.assertEquals("无",pnmame1.getProcessEdition());
    }
}