yangys
2025-09-22 c0ccbb980be6975389f09ad13dcabd7d3156dae3
更新提醒-》只提醒编程员;工控网显示临时更改单号
已修改12个文件
292 ■■■■■ 文件已修改
blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/controller/RemindController.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowProgramFileService.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramExportDNCController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/ProgramOnMachineMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/MdmProgramImportService.java 229 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramApprovedService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/NcProgramExportDncQueryVO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/ProgramOnMachineVO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/thirdpart/controller/MesController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/thirdpart/service/MesTaskService.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/thirdpart/vo/MesTaskFinishVO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/test/java/org/springblade/mdm/program/service/MdmProgramImportServiceTest.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/controller/RemindController.java
@@ -80,13 +80,8 @@
        NcProgramExportDncQueryVO query = new NcProgramExportDncQueryVO();
        query.setCurrent(1);
        query.setSize(1);
        List<String> userRoleAliasList = Func.toStrList(",", AuthUtil.getUserRole());//角色别名,多个角色逗号分隔
        String managerRole = paramService.getProgramManagerRoleAlias();
        if(!userRoleAliasList.contains(managerRole) && !AuthUtil.isAdministrator() && !AuthUtil.isAdmin()){
            //非数控管理员角色、管理员,限制未只能导出自己的程序
            query.setUserId(AuthUtil.getUserId());
        }
        query.setUserId(AuthUtil.getUserId());
        query.setQueryType(NcProgramExportDncQueryVO.TYPE_SELF);
        IPage<NcProgramExportDncPageVO> pages = ncProgramApprovedService.exportDncPageQuery(query);
        return pages.getTotal();
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowProgramFileService.java
@@ -16,6 +16,7 @@
import org.springblade.core.tool.api.IResultCode;
import org.springblade.core.tool.utils.Func;
import org.springblade.core.tool.utils.UrlUtil;
import org.springblade.mdm.commons.service.OssFileCommonService;
import org.springblade.mdm.flow.entity.FlowProgramFile;
import org.springblade.mdm.flow.mapper.FlowProgramFileMapper;
import org.springblade.mdm.flow.vo.ProgramUploadVO;
@@ -43,7 +44,7 @@
    @Autowired
    private OssTemplate ossTemplate;
    @Autowired
    private RuntimeService runtimeService;
    private OssFileCommonService ossFileCommonService;
    @Autowired
    private FlowCommonService flowCommonService;
@@ -140,13 +141,21 @@
    }
    /**
     * 流程文件下载
     * @param id 流程文件id
     * @param response http响应
     * @throws IOException 文件操作异常
     */
    public void download(Long id, HttpServletResponse response) throws IOException {
        FlowProgramFile flowFile = this.getById(id);
        ossFileCommonService.download(flowFile.getOssName(),flowFile.getName(),response);
        /*
        response.setHeader("Content-Disposition", "attachment; filename="+ UrlUtil.encode(flowFile.getName()));
        response.setContentType("application/octet-stream");
        try(InputStream ins = ossTemplate.statFileStream(flowFile.getOssName());){
            IOUtils.copy(ins,response.getOutputStream());
        }
        }*/
    }
    /**
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramExportDNCController.java
@@ -69,7 +69,6 @@
        //导出文件名称要求导出人名字+时间戳
        String uname = UrlUtil.encode(AuthUtil.getNickName());
        //String filename =AuthUtil.getNickName()+"-"+ DateUtil.format(DateUtil.now(), "yyyyMMddHHmm")+".zip";
        String filename = uname+"-"+ DateUtil.format(DateUtil.now(), "yyyyMMddHHmm")+".zip";
        response.setHeader("Content-Disposition", "attachment; filename="+filename);
        response.setContentType("application/octet-stream;charset=utf-8");
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/ProgramOnMachineMapper.xml
@@ -4,7 +4,7 @@
    <select id="pageQuery" resultType="org.springblade.mdm.program.vo.ProgramOnMachineVO">
        select p.id,p.drawing_no,p.process_no,p.process_edition,p.deviation,p.machine_code,p.process_instance_id,p.create_time,u.name create_user_name
        select p.id,p.drawing_no,p.process_no,p.process_edition,p.deviation,p.deviation_serial,p.machine_code,p.process_instance_id,p.create_time,u.name create_user_name
        from mdm_program_on_machine p left join blade_user u on p.create_user=u.id
        <where>
            p.is_deleted=0
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/MdmProgramImportService.java
@@ -4,6 +4,7 @@
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.StringUtils;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.mp.base.BizServiceImpl;
@@ -14,6 +15,8 @@
import org.springblade.core.tool.utils.Func;
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.gkw.programnode.vo.ProgramNameVO;
import org.springblade.mdm.machinefile.entity.FileSendRecord;
import org.springblade.mdm.machinefile.service.FileSendRecordService;
import org.springblade.mdm.program.entity.NcProgramExchange;
@@ -21,6 +24,7 @@
import org.springblade.mdm.program.service.programannotation.AnnotationProperties;
import org.springblade.mdm.program.vo.MdmProgramImportVO;
import org.springblade.mdm.utils.FileContentUtil;
import org.springblade.mdm.utils.ProgramFileNameParser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
@@ -32,6 +36,8 @@
import java.time.Duration;
import java.util.*;
import java.nio.file.*;
import java.util.regex.Matcher;
import java.util.stream.Stream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
/**
@@ -61,29 +67,34 @@
     * @return
     */
    public List<MdmProgramImportVO> mdmImportUpload(MultipartFile file) {
        List<MdmProgramImportVO> list = new ArrayList<>();
        List<MdmProgramImportVO> list;
        try {
            if(file == null || file.isEmpty()){
                throw new ServiceException("文件为空");
            }
            /*
            if(!StringUtils.endsWith(file.getOriginalFilename(),".zip")){
                throw new ServiceException("文件必须为zip包");
            }
            }*/
            String tempDir = System.getProperty("java.io.tmpdir");
            Path tempPath = Paths.get(tempDir);
            // 创建解压目标目录(在临时目录下创建一个唯一子目录)
            Path tempZipFile = Files.createTempFile("mdmimpfile-"+System.currentTimeMillis(), ".zip");
            file.transferTo(tempZipFile);
            // 创建解压目标目录(在临时目录下创建一个唯一子目录)
            Path extractDir = Files.createTempDirectory(tempPath, "unzip_");
            Path extractDir = Files.createTempDirectory(tempPath, "unzip_"+System.currentTimeMillis());
            bladeRedis.setEx(getFileKey(),extractDir.toString(), Duration.ofHours(2));
            if(StringUtils.endsWithIgnoreCase(file.getOriginalFilename(),".zip")){
                // 创建解压目标目录(在临时目录下创建一个唯一子目录)
                Path tempZipFile = Files.createTempFile("mdmimpfile-"+System.currentTimeMillis(), ".zip");
                file.transferTo(tempZipFile);
                extractZipToTempDir(tempZipFile,extractDir);
            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()));
            }
            //读取文件目录
            list = readTempDir(extractDir);
@@ -94,10 +105,15 @@
        return list;
    }
    /**
     * 解压zip包到临时路径
     * @param zipFilePath zip包文件服务器上的路径
     * @param extractDir 目标目录
     * @throws IOException 文件操作异常
     */
    public void extractZipToTempDir(Path zipFilePath,Path extractDir) throws IOException {
        // 获取系统临时目录
        String tempDir = System.getProperty("java.io.tmpdir");
        Path tempPath = Paths.get(tempDir);
        // 创建解压目标目录(在临时目录下创建一个唯一子目录)
        try (InputStream fis = Files.newInputStream(zipFilePath);
@@ -132,10 +148,10 @@
    /**
     * 防止ZIP Slip攻击
     * @param zipEntry
     * @param targetDir
     * @return
     * @throws IOException
     * @param zipEntry zip内部文件路径
     * @param targetDir 目标文件夹
     * @return 文件路径
     * @throws IOException 操作文件IO异常
     */
    Path zipSlipProtect(ZipEntry zipEntry, Path targetDir) throws IOException {
        Path targetDirResolved = targetDir.resolve(zipEntry.getName());
@@ -150,16 +166,28 @@
        return normalizePath;
    }
    /**
     * 读取解压文件夹下所有文件 解析成vo列表
     * @param extractDir 解压文件夹
     * @return vo列表
     * @throws IOException 解析文件的异常
     */
    public List<MdmProgramImportVO> readTempDir(Path extractDir) throws IOException {
        List<MdmProgramImportVO> list = new ArrayList<>();
        //List<Machine> machines = machineService.getEnableMachines();
        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));
            }
        }
        /*
        //读取所有文件夹
        try (DirectoryStream<Path> stream = Files.newDirectoryStream(extractDir)) {
            for (Path path : stream) {
                if (Files.isDirectory(path)) {
                    // 如果是子目录,读取其中的文件
                    try (DirectoryStream<Path> subStream = Files.newDirectoryStream(path)) {
                        for (Path subPath : subStream) {
@@ -171,70 +199,73 @@
                } else if (Files.isRegularFile(path)) {
                    System.out.println("找到文件2: " + path);
                    //这里 找到的文件不是
                    MdmProgramImportVO vo = new MdmProgramImportVO();
                    vo.setFilename(path.getFileName().toString());
                    vo.setDrawingNo(parseDrawingNo(vo.getFilename()));
                    try (InputStream inputStream = Files.newInputStream(path)) {
                        // 使用输入流读取文件内容
                        byte[] buffer = new byte[2000];
                        inputStream.read(buffer);
                        vo.setMd5(DigestUtils.md5Hex(buffer));
                    } catch (IOException e) {
                        log.error("读取文件md5失败",e);
                    }
                    try (InputStream inputStream = Files.newInputStream(path, StandardOpenOption.READ)) {
                        // 使用输入流读取文件内容
                        ByteArrayInputStream bas = new ByteArrayInputStream(inputStream.readAllBytes());
                        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);
                        Machine matchedMachine = machineService.getMachineBySendPathAnnotation(sendPathLine);
                        /*
                        for (Machine machine : machines) {
                            if(Func.isNotBlank(machine.getProgSendDir()) && sendPathLine.contains(machine.getProgSendDir())){
                                matchedMachine = machine;
                                break;
                            }
                        }
                         */
                        if (matchedMachine != null) {
                            vo.setName(parseProgramName(vo.getFilename()));
                            vo.setMachineCode(matchedMachine.getCode());
                            vo.setFullPath(path.toString());//文件地址
                            vo.setSendPath(matchedMachine.getProgSendDir());
                            vo.setId(vo.getFullPath());
                            vo.setProgramStatus(programAnnotationService.removeAnnotation(matchedMachine.getControlSystem(),statusLine));
                            list.add(vo);
                        }
                    } catch (IOException e) {
                        log.error("读取文件md5失败",e);
                    }
                    list.add(readFileToVO(path));
                }
            }
        }
        }*/
        return list;
    }
    /**
     * 将文件组织成VO
     * @param path 文件path
     * @return vo
     */
    MdmProgramImportVO readFileToVO(Path path){
        MdmProgramImportVO vo = new MdmProgramImportVO();
        vo.setFilename(path.getFileName().toString());
        ProgramNameVO pnmameVO = ProgramFileNameParser.parseProgramName(vo.getFilename());
        vo.setDrawingNo(pnmameVO.getDrawingNo());
        //vo.setDrawingNo(parseDrawingNo(vo.getFilename()));
        try (InputStream inputStream = Files.newInputStream(path)) {
            // 使用输入流读取文件内容
            byte[] buffer = new byte[2000];
            inputStream.read(buffer);
            vo.setMd5(DigestUtils.md5Hex(buffer));
        } catch (IOException e) {
            log.error("读取文件md5失败",e);
        }
        try (InputStream inputStream = Files.newInputStream(path, StandardOpenOption.READ)) {
            // 使用输入流读取文件内容
            ByteArrayInputStream bas = new ByteArrayInputStream(inputStream.readAllBytes());
            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);
            Machine matchedMachine = machineService.getMachineBySendPathAnnotation(sendPathLine);
            if (matchedMachine != null) {
                //vo.setName(parseProgramName(vo.getFilename()));
                vo.setName(pnmameVO.logicProgramName());
                vo.setMachineCode(matchedMachine.getCode());
                vo.setFullPath(path.toString());//文件地址
                vo.setSendPath(matchedMachine.getProgSendDir());
                vo.setId(vo.getFullPath());
                vo.setProgramStatus(programAnnotationService.removeAnnotation(matchedMachine.getControlSystem(),statusLine));
            }
        } catch (IOException e) {
            log.error("读取文件失败",e);
            throw new ServiceException("导入程序失败"+path.getFileName().toString()+","+e.getMessage());
        }
        return vo;
    }
    /**
     * 解析出零组件好
     * @param filename
     * @return
     */
    /*
    String parseDrawingNo(String filename){
        /*
        String drawingNo = "";
        int idx = filename.lastIndexOf("-");
        String temp;
@@ -262,6 +293,8 @@
        }
        return drawingNo;
    }
    String parseProgramName(String filename){
@@ -282,12 +315,10 @@
                }
            }
            //以上去掉了最后2段段数和段号
        }
        return programName;
    }
*/
    /**
     * 入库mdm涉密网文件
     * @param ids id列表逗号分隔
@@ -298,35 +329,37 @@
        String dictStr = bladeRedis.get(getFileKey());
        if(dictStr == null){
            throw new ServiceException("");
            throw new ServiceException("文件缓存已过期,请重新上传文件。");
        }
        Path extractDir = Paths.get(dictStr);
        List<MdmProgramImportVO> list = readTempDir(extractDir);
        String destFileFull;
        for(String str : idList){
            for(MdmProgramImportVO vo : list){
                if(StringUtils.equals(vo.getFullPath(),str)){
                    destFileFull = vo.getSendPath()+File.separator+vo.getFilename();
                    File destFile = new File(destFileFull);
                    FileUtils.forceMkdirParent(destFile);
                    FileUtils.copyFile(new File(str),destFile);
            Optional<MdmProgramImportVO> optVO = list.stream().filter(vo -> vo.getId().equals(str)).findFirst();
                    FileSendRecord record = new FileSendRecord();
                    record.setName(destFile.getName());
                    Path destPath = Paths.get(destFileFull);
                    record.setMachineCode(vo.getMachineCode());
                    record.setFileSize(Files.size(destPath));
                    try(InputStream inputStream = new FileInputStream(destFile)){
                        BladeFile bFile = ossTemplate.putFile(record.getName(), inputStream);
                        record.setOssName(bFile.getName());
                    }
                    fileSendRecordService.save(record);
                    break;
                }
            if(optVO.isEmpty()){
                continue;
            }
            MdmProgramImportVO vo = optVO.get();
            destFileFull = vo.getSendPath()+File.separator+vo.getFilename();
            File destFile = new File(destFileFull);
            FileUtils.forceMkdirParent(destFile);
            FileUtils.copyFile(new File(str),destFile);
            FileSendRecord record = new FileSendRecord();
            record.setName(destFile.getName());
            Path destPath = Paths.get(destFileFull);
            record.setMachineCode(vo.getMachineCode());
            record.setFileSize(Files.size(destPath));
            try(InputStream inputStream = new FileInputStream(destFile)){
                BladeFile bFile = ossTemplate.putFile(record.getName(), inputStream);
                record.setOssName(bFile.getName());
            }
            fileSendRecordService.save(record);
        }
    }
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramApprovedService.java
@@ -36,7 +36,6 @@
            query.setStatus(NcProgramApproved.STATUS_NOT_EXPORT);
        }
        return this.getBaseMapper().exportDncPageQuery(Condition.getPage(query),query);
    }
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/NcProgramExportDncQueryVO.java
@@ -16,6 +16,8 @@
@Setter
@Getter
public class NcProgramExportDncQueryVO extends Query {
    public static String TYPE_SELF = "self";
    @Schema(description = "程序名称")
    private String name;
    @Schema(description = "查询范围")
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/ProgramOnMachineVO.java
@@ -40,6 +40,10 @@
     */
    private String deviation;
    /**
     * 临时更改单序号
     */
    private String deviationSerial;
    /**
     * 流程实例id
     */
    private String processInstanceId;
blade-service/blade-mdm/src/main/java/org/springblade/mdm/thirdpart/controller/MesController.java
@@ -202,12 +202,13 @@
        if(StringUtils.isBlank(finishTaskVO.getOperationId())){
            errorList.add("工序唯一码不能为空");
        }
        /*
        if(StringUtils.isBlank(finishTaskVO.getInspector())){
            errorList.add("检验员不能为空");
        }
        if(finishTaskVO.getAcruslEndEime() == null){
        if(finishTaskVO.getAcruslEndTime() == null){
            errorList.add("检验反馈时间不能为空");
        }
        }*/
        return errorList;
    }
blade-service/blade-mdm/src/main/java/org/springblade/mdm/thirdpart/service/MesTaskService.java
@@ -49,14 +49,22 @@
    /**
     * mes 完成推送
     * @param finishTaskVO
     * @param finishTaskVO mes完工数据
     */
    public void finishTask(MesTaskFinishVO finishTaskVO) {
        TaskDispatch taskDispatch = taskDispatchService.getByOperationId(finishTaskVO.getOperationId());
        if(taskDispatch != null && taskDispatch.getProcessInstanceId() != null){
            taskDispatch.setProcessCard(finishTaskVO.getProcessCard());
            taskDispatch.setInspector(finishTaskVO.getInspector());
            taskDispatch.setCheckTime(finishTaskVO.getAcruslEndEime());
            if(finishTaskVO.getInspector() != null) {
                taskDispatch.setInspector(finishTaskVO.getInspector());
            }
            if(finishTaskVO.getOperationFeedbackTime() != null){
                taskDispatch.setOperateTime(finishTaskVO.getOperationFeedbackTime());
            }
            if(finishTaskVO.getAcruslEndTime() !=null ) {
                taskDispatch.setCheckTime(finishTaskVO.getAcruslEndTime());
            }
            taskDispatchService.updateById(taskDispatch);
            ProcessInstance inst = runtimeService.createProcessInstanceQuery()
blade-service/blade-mdm/src/main/java/org/springblade/mdm/thirdpart/vo/MesTaskFinishVO.java
@@ -10,7 +10,7 @@
    @Schema(description = "工序唯一码")
    private String operationId;
    @Schema(description = "检验反馈时间")
    private Date acruslEndEime;
    private Date acruslEndTime;
    @Schema(description = "检验员")
    private String inspector;
    @Schema(description = "过程卡号")
@@ -23,6 +23,6 @@
    @Schema(description = "操作者")
    private String operator;
    @Schema(description = "操作者")
    private String operationFeedbackTime;
    private Date operationFeedbackTime;
}
blade-service/blade-mdm/src/test/java/org/springblade/mdm/program/service/MdmProgramImportServiceTest.java
@@ -26,12 +26,4 @@
        System.out.println(list);
    }
    @Test
    public void testParseDrawingNo()  {
        String filename = "A12-1-a1-2-1.nc";
        MdmProgramImportService s = new MdmProgramImportService();
        String drawingNo = s.parseDrawingNo(filename);
        Assertions.assertEquals("A12", drawingNo);
    }
}