yangys
2025-08-24 56558ee76f0b3d5226afe6446e70975db698492f
增加工控网导入 历史 查看文件功能
已添加1个文件
已修改5个文件
293 ■■■■■ 文件已修改
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/DncSendBackController.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/DncBackFileMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/DNCSendBackService.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/DncBackFileService.java 176 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/DncBackFileVO.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/utils/ZipTextFileContentUtil.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/DncSendBackController.java
@@ -78,4 +78,40 @@
        return R.data(dncBackFileService.pageQuery(query));
    }
    @Operation(summary = "回传取消", description = "工控网回传记录中取消未开始执行的流程")
    @PostMapping("/cancel-process")
    public R<Void> cancelProcess(@Parameter(description = "回传记录id")long id) {
        try{
            dncBackFileService.cancelProcess(id);
            return R.success();
        }catch (Exception e){
            log.error("流程取消失败",e);
            return R.fail(e.getMessage());
        }
    }
    @Operation(summary = "获取回传记录的文件列表", description = "获取回传记录的文件列表")
    @GetMapping("/files-by-id")
    public R<List<DncSendBackFile>> filesById(long id) {
        try {
            return R.data(dncBackFileService.filesById(id));
        }catch (Exception e){
            log.error("获取历史文件列表失败",e);
            return R.fail(e.getMessage());
        }
    }
    @GetMapping("/history-file-content")
    @Operation(summary = "临时记录回传文件内容", description = "临时记录回传文件内容")
    public R<String> historyContent(@Parameter(description = "历史记录id")long id,@Parameter(description = "文件的entryName") String entryName) {
        try {
            return R.data(dncBackFileService.getEntryFileContent(id,entryName));
        }catch(Exception e) {
            log.error("获取历史文件内容失败",e);
            return R.fail(e.getMessage());
        }
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/DncBackFileMapper.xml
@@ -13,7 +13,7 @@
    <!--DNC回传程序处理分页-->
    <select id="pageQuery" resultType="org.springblade.mdm.program.vo.DncBackFileVO">
        select f.id,n.name name,m.code machine_code, m.name machine_name,f.create_time
        select f.id,n.name name,m.code machine_code, m.name machine_name,f.create_time,n.process_instance_id
        from mdm_dnc_back_file f
        join mdm_nc_node n on f.nc_node_id=n.id
        left join mdm_machine m on n.machine_code=m.code
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/DNCSendBackService.java
@@ -26,6 +26,7 @@
import org.springblade.mdm.program.vo.DncSendBackData;
import org.springblade.mdm.program.vo.DncSendBackFile;
import org.springblade.mdm.utils.FileContentUtil;
import org.springblade.mdm.utils.ZipTextFileContentUtil;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
@@ -36,7 +37,6 @@
import java.nio.file.StandardOpenOption;
import java.time.Duration;
import java.util.*;
import java.util.regex.Pattern;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
@@ -357,6 +357,9 @@
    public String getEntryFileContent(String entryName) throws IOException {
        String result  = "";
        String zipFileName = bladeRedis.get(getFileKey());
        return ZipTextFileContentUtil.getTextContent(this.ossTemplate.statFileStream(zipFileName),entryName);
        /*
        try(InputStream inputStream = this.ossTemplate.statFileStream(zipFileName);){
            Path tempZipFile = createTempFile(inputStream);
@@ -386,7 +389,7 @@
            }
        }
        return result;
        return result;*/
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/DncBackFileService.java
@@ -5,15 +5,39 @@
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.flowable.engine.HistoryService;
import org.flowable.engine.ProcessEngine;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.mp.base.BizServiceImpl;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.oss.OssTemplate;
import org.springblade.core.oss.model.BladeFile;
import org.springblade.core.tool.utils.FileUtil;
import org.springblade.mdm.flow.entity.FlowProgramFile;
import org.springblade.mdm.flow.service.FlowBusinessService;
import org.springblade.mdm.program.entity.DncBackFile;
import org.springblade.mdm.program.entity.NcNode;
import org.springblade.mdm.program.mapper.DncBackFileMapper;
import org.springblade.mdm.program.vo.DncBackFileQueryVO;
import org.springblade.mdm.program.vo.DncBackFileVO;
import org.springblade.mdm.program.vo.DncSendBackFile;
import org.springblade.mdm.utils.FileContentUtil;
import org.springblade.mdm.utils.ZipTextFileContentUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Optional;
import java.util.zip.ZipEntry;
/**
 * DNC回传文件处理服务
@@ -26,9 +50,155 @@
public class DncBackFileService extends BizServiceImpl<DncBackFileMapper, DncBackFile> {
    private final NcNodeService ncNodeService;
    private final OssTemplate ossTemplate;
    private final HistoryService historyService;
    private final FlowBusinessService businessService;
    public IPage<DncBackFileVO> pageQuery(DncBackFileQueryVO query) {
        return this.baseMapper.pageQuery(Condition.getPage(query),query);
        IPage<DncBackFileVO> page=  this.baseMapper.pageQuery(Condition.getPage(query),query);
        page.getRecords().forEach(item->{
            item.setProcessExecuted(isProcessExecuted(item.getProcessInstanceId()));
        });
        return page;
    }
    /**
     * æ£€æŸ¥æµç¨‹å®žä¾‹æ˜¯å¦è¢«æ‰§è¡Œè¿‡ï¼ˆé€šè¿‡åŽ†å²è®°å½•ï¼‰
     */
    public boolean isProcessExecuted(String processInstanceId) {
        // æ£€æŸ¥æ˜¯å¦æœ‰åŽ†å²æ´»åŠ¨è®°å½•
        /*
        long activityCount = historyService.createHistoricActivityInstanceQuery()
            .processInstanceId(processInstanceId)
            .count();
    */
        // æ£€æŸ¥æ˜¯å¦æœ‰åŽ†å²ä»»åŠ¡è®°å½•
        long taskCount = historyService.createHistoricTaskInstanceQuery()
            .processInstanceId(processInstanceId)
            .count();
        //多于一个任务被处理,说明至少流转到第二个节点了
        return taskCount > 1;
    }
    /**
     * å–消流程
     * @param id å›žä¼ è®°å½•id
     */
    @Transactional
    public void cancelProcess(long id) {
        DncBackFile backFIle = this.getById(id);
        NcNode packageNode = ncNodeService.getById(backFIle.getNcNodeId());
        //多于一个任务被处理,说明至少流转到第二个节点了
        if(isProcessExecuted(packageNode.getProcessInstanceId())){
            throw new ServiceException("流程已经开始处理,不可取消");
        }
        businessService.deleteProcessInstance(packageNode.getProcessInstanceId());
        this.baseMapper.deleteById(id);
    }
    /**
     * èŽ·å–å›žä¼ è®°å½•çš„æ–‡ä»¶åˆ—è¡¨
     * @param id å›žä¼ è®°å½•id
     * @return
     */
    public List<DncSendBackFile> filesById(long id) throws IOException {
        List<DncSendBackFile> fileList = new ArrayList<>();
        DncBackFile backFIle = this.getById(id);
        InputStream inputStream = this.ossTemplate.statFileStream(backFIle.getOssName());
        Path tempZipFile = createTempFile(inputStream);
        List<String> entryNameList = new ArrayList<>();
        NcNode packageNode =  this.ncNodeService.getById(backFIle.getNcNodeId());
        String targetFolder = packageNode.getName()+"-"+packageNode.getProcessEdition()+"/";
        ZipEntry entry;
        try (java.util.zip.ZipFile zipFile = new java.util.zip.ZipFile(tempZipFile.toFile())) {
            Enumeration<? extends ZipEntry> entries = zipFile.entries();
            while(entries.hasMoreElements()) {
                entry = entries.nextElement();
                if(!entry.isDirectory() && entry.getName().startsWith(targetFolder)){
                    //这里面之前时入库的文件
                    DncSendBackFile file = new DncSendBackFile();
                    file.setName(entry.getName().substring(targetFolder.length()));
                    file.setEntryName(entry.getName());
                    fileList.add(file);
                }
            }
        }
        return fileList;
    }
    Path createTempFile(InputStream inputStream) throws IOException {
        byte[] zipData = FileUtil.copyToByteArray(inputStream);
        Path tempFile = Files.createTempFile("tempzip"+System.currentTimeMillis(), ".zip");
        // å†™å…¥å­—节数据到临时文件
        Files.write(tempFile, zipData, StandardOpenOption.WRITE);
        return tempFile;
    }
    /**
     * ä»Žæ–‡ä»¶å¤¹åè§£æžå‡ºç¨‹åºåŒ…名和和工序版次
     * @param folderName æ–‡ä»¶å¤¹å
     * @return ç»“构数据
     */
    PackageAndProcessEdition parseProgramPackageFromFolderName(String folderName){
        int index = StringUtils.lastIndexOf(folderName,'-');
        String processEditon = "";
        String temp;
        String packageName = "";
        if(index != -1){
            processEditon = folderName.substring(index+1);
            packageName = folderName.substring(0,index);
        }
        PackageAndProcessEdition result = new PackageAndProcessEdition();;
        result.setProgramPackageName(packageName);
        result.setProcessEdition(processEditon);
        return result;
    }
    /**
     * èŽ·å–åŽ†å²è®°å½•ä¸­çš„æ–‡ä»¶å†…å®¹
     * @param id å›žä¼ åŽ†å²è®°å½•id
     * @param entryName åŽ‹ç¼©åŒ…æ–‡ä»¶è·¯å¾„
     * @return
     */
    public String getEntryFileContent(long id, String entryName) throws IOException {
        DncBackFile backFIle = this.getById(id);
        return ZipTextFileContentUtil.getTextContent(this.ossTemplate.statFileStream(backFIle.getOssName()),entryName);
        /*
        try(InputStream inputStream = this.ossTemplate.statFileStream(backFIle.getOssName());){
            Path tempZipFile = createTempFile(inputStream);
            ZipEntry entry;
            try (java.util.zip.ZipFile zipFile = new java.util.zip.ZipFile(tempZipFile.toFile())) {
                Enumeration<? extends ZipEntry> entries = zipFile.entries();
                while (entries.hasMoreElements()) {
                    entry = entries.nextElement();
                    if (!entryName.equals(entry.getName())) {
                        continue;
                    }
                    try (InputStream fileIns = zipFile.getInputStream(zipFile.getEntry(entryName))) {
                        ByteArrayInputStream bos = new ByteArrayInputStream(fileIns.readAllBytes());
                        boolean isText = StringUtils.endsWithIgnoreCase(entryName,".txt") || StringUtils.endsWithIgnoreCase(entryName,".nc")|| StringUtils.endsWithIgnoreCase(entryName,".xml");
                        if(!isText) {
                            isText = FileContentUtil.isTextFile(bos);
                        }
                        if (isText) {
                            bos.reset();
                            result = FileContentUtil.getContentFromStream(bos);
                        } else {
                            result = "<非文本文件>";
                        }
                    }
                }
            }
        }*/
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/DncBackFileVO.java
@@ -5,8 +5,6 @@
import lombok.Setter;
import org.springblade.mdm.commons.vo.BaseVO;
import java.util.Date;
/**
 * ä»Žå·¥æŽ§ç½‘回传涉密网的导入文件历史
 */
@@ -20,4 +18,10 @@
    private String machineCode;
    @Schema(description = "程序编号")
    private String code;
    @Schema(description = "节点的流程实例id")
    private String processInstanceId;
    @Schema(description = "流程是否被执行过一步以上")
    private Boolean processExecuted;
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/utils/ZipTextFileContentUtil.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,64 @@
package org.springblade.mdm.utils;
import org.apache.commons.lang3.StringUtils;
import org.springblade.core.tool.utils.FileUtil;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
public class ZipTextFileContentUtil {
    public static String getTextContent(InputStream inputStream,String entryName) throws IOException {
        String result  = "";
        try(inputStream){
            Path tempZipFile = createTempFile(inputStream);
            ZipEntry entry;
            try (java.util.zip.ZipFile zipFile = new java.util.zip.ZipFile(tempZipFile.toFile())) {
                Enumeration<? extends ZipEntry> entries = zipFile.entries();
                while (entries.hasMoreElements()) {
                    entry = entries.nextElement();
                    if (!entryName.equals(entry.getName())) {
                        continue;
                    }
                    try (InputStream fileIns = zipFile.getInputStream(zipFile.getEntry(entryName))) {
                        ByteArrayInputStream bos = new ByteArrayInputStream(fileIns.readAllBytes());
                        boolean isText = StringUtils.endsWithIgnoreCase(entryName,".txt") || StringUtils.endsWithIgnoreCase(entryName,".nc")|| StringUtils.endsWithIgnoreCase(entryName,".xml");
                        if(!isText) {
                            isText = FileContentUtil.isTextFile(bos);
                        }
                        if (isText) {
                            bos.reset();
                            result = FileContentUtil.getContentFromStream(bos);
                        } else {
                            result = "<非文本文件>";
                        }
                    }
                }
            }
        }
        return result;
    }
    /**
     * åˆ›å»ºä¸€ä¸ªä¸´æ—¶i文件
     * @param inputStream è¾“入流
     * @return æ–‡ä»¶è·¯å¾„
     * @throws IOException
     */
    public static Path createTempFile(InputStream inputStream) throws IOException {
        byte[] zipData = FileUtil.copyToByteArray(inputStream);
        Path tempFile = Files.createTempFile("tempzip"+System.currentTimeMillis(), ".zip");
        // å†™å…¥å­—节数据到临时文件
        Files.write(tempFile, zipData, StandardOpenOption.WRITE);
        return tempFile;
    }
}