yangys
2025-08-14 33e6270d2d3a40591e58d45fd8435d2f3eaf66b2
启动固化流程优化
已修改3个文件
158 ■■■■■ 文件已修改
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/CureFlowService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/DNCSendBackService.java 135 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcNodeService.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/CureFlowService.java
@@ -52,10 +52,10 @@
    private final FlowProgramFileService flowProgramFileService;
    @Transactional
    public void startCure(List<NcNode> programPackageList, Map<Long,List<NcNode>> allFlowProgramFiles) {
    public void startCure(List<NcNode> programPackageList, Map<Long,List<NcNode>> allFlowProgramFilesMap) {
        //根据分组启动流程,并插入关联表
        programPackageList.forEach(pkg -> {
            this.startOne(pkg,allFlowProgramFiles.get(pkg.getId()));
            this.startOne(pkg,allFlowProgramFilesMap.get(pkg.getId()));
        });
    }
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/DNCSendBackService.java
@@ -25,6 +25,7 @@
import org.springblade.mdm.program.mapper.NcProgramExchangeMapper;
import org.springblade.mdm.program.vo.DncSendBackData;
import org.springblade.mdm.utils.EntityUtil;
import org.springblade.mdm.utils.FileContentUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -79,7 +80,6 @@
            InputStream zipFileInputStream = file.getInputStream();//test
            //byte[] bytes = FileUtil.copyToByteArray(zipFileInputStream);
            list = parseProgramListFromZip(zipFileInputStream);
        } catch (IOException e) {
@@ -100,34 +100,60 @@
        List<DncSendBackData> list = new ArrayList<>();
        Path tempZipFile = createTempFile(inputStream);
        List<String> fileEntryNameList = new ArrayList<>();
        List<String> dirEntryNameList = new ArrayList<>();
        try (ZipFile zipFile = new ZipFile(tempZipFile.toFile())) {
            Enumeration<? extends ZipEntry> zipEntries = zipFile.entries();
            ZipEntry entry;
            Enumeration<? extends ZipEntry> zipEntris = zipFile.entries();
            while (zipEntris.hasMoreElements()) {
                entry = zipEntris.nextElement();
                DncSendBackData progData = new DncSendBackData();
                String entryName = entry.getName();
                if (entry.isDirectory()){
                    //目录,才是程序包,
                    //查询数据库,对应上才能确认时有效的程序包
                    String packageName = StringUtils.removeEnd(entryName,"/");
                    NcNode programPackageNode = ncNodeService.getLastEditionTryingProgramPackage(packageName);
                    NcNode curedProgramPkg = ncNodeService.getLastEditionCuredProgramPackage(packageName);
            //获取所有的entry名称
            while (zipEntries.hasMoreElements()) {
                entry = zipEntries.nextElement();
                    if(programPackageNode!=null && curedProgramPkg == null) {//无固化程序,才放入列表
                        //NcNode programPackageNode = pkgList.get(0);
                        progData.setId(programPackageNode.getId());
                        progData.setProgramName(packageName);
                        progData.setFileBackTime(DateUtil.fromInstant(entry.getLastModifiedTime().toInstant()));
                        progData.setProgramNo(programPackageNode.getProgramNo());
                        list.add(progData);
                    }
                if(entry.isDirectory()){
                    dirEntryNameList.add(entry.getName());
                }else{
                    fileEntryNameList.add(entry.getName());
                }
            }
            NcNode programPackageNode;
            //目录列表,即程序包列表
            for(String entryName : dirEntryNameList){
                DncSendBackData progData = new DncSendBackData();
                String packageName = StringUtils.removeEnd(entryName,"/");
                progData.setProgramName(packageName);
                String statusLine = "";
                Optional<String> optFilename = fileEntryNameList.stream().filter(n -> n.startsWith(packageName)).findFirst();
                if(optFilename.isPresent()){
                    entry = zipFile.getEntry(optFilename.get());
                    InputStream ins = zipFile.getInputStream(entry);
                    progData.setFileBackTime(DateUtil.fromInstant(entry.getLastModifiedTime().toInstant()));
                    statusLine = FileContentUtil.readLineAt(ins,2);
                    if(statusLine.contains("SQ")){
                        //试切
                        programPackageNode = ncNodeService.getLastEditionTryingProgramPackage(packageName);
                    }else if(statusLine.contains("GH")){
                        //固化
                        programPackageNode = ncNodeService.getLastEditionCuredProgramPackage(packageName);
                    }else if(statusLine.contains("PL")){
                        //偏离
                        programPackageNode =ncNodeService.getLastEditionDeviationProgramPackage(packageName);
                    }else{
                        throw new ServiceException("未找到程序文件中的状态注释");
                    }
                    if(programPackageNode != null) {
                        progData.setId(programPackageNode.getId());
                        progData.setProgramNo(programPackageNode.getProgramNo());
                        list.add(progData);
                    }else{
                        throw new ServiceException("找不到程序包名:"+packageName+statusLine);
                    }
                }else{
                    throw new ServiceException(entryName+"包下未找到文件"+statusLine);
                }
            }
        }
        return list;
@@ -148,9 +174,9 @@
        log.info("filekey={},文件名={}",filekey,pkgFileName);
        Map<Long,List<NcNode>> programPackageSubMap = new HashMap<>();
        List<NcNode> newProgramPckageList = updateNodeDataByDNCBackData(pkgFileName,idList,programPackageSubMap);
        log.info("需要启动固化流程的程序包名数量:{}",newProgramPckageList.size());
        for(NcNode pkgNode :newProgramPckageList){
        List<NcNode> newProgramPackageList = updateNodeDataByDNCBackData(pkgFileName,idList,programPackageSubMap);
        log.info("需要启动固化流程的程序包名数量:{}",newProgramPackageList.size());
        for(NcNode pkgNode :newProgramPackageList){
            exchange = new NcProgramExchange();
            exchange.setName(pkgNode.getName());
            exchange.setExchangeType(2);//回传
@@ -162,7 +188,8 @@
        this.ossTemplate.removeFile(pkgFileName);
        log.info("删除oss文件:{}",pkgFileName);
        cureFlowService.startCure(newProgramPckageList,programPackageSubMap);
        cureFlowService.startCure(newProgramPackageList,programPackageSubMap);
    }
    /**
@@ -180,53 +207,47 @@
        ZipEntry entry;
        try (java.util.zip.ZipFile zipFile = new java.util.zip.ZipFile(tempZipFile.toFile())) {
            Enumeration<? extends ZipEntry> entris = zipFile.entries();
            while(entris.hasMoreElements()) {
                entry = entris.nextElement();
            Enumeration<? extends ZipEntry> entries = zipFile.entries();
            while(entries.hasMoreElements()) {
                entry = entries.nextElement();
                entryNameList.add(entry.getName());
            }
            log.info("allentrynames:{}",entryNameList);
            List<NcNode> allAcceptPackages =  this.ncNodeService.lambdaQuery().in(NcNode::getId,programPackageIdList).list();
            //根据内部文件,读取和分析程序包和程序文件数据
            List<String> dirList = entryNameList.stream().filter(s -> s.endsWith("/")).toList();
            for(String dir : dirList){
                String programPackageName = StringUtils.removeEnd(dir,"/");
                Optional<NcNode> optPackageNode = allAcceptPackages.stream().filter(node -> StringUtils.equals(node.getName(),programPackageName)).findFirst();
                NcNode tryProgramPkg = this.ncNodeService.getLastEditionTryingProgramPackage(programPackageName);
                NcNode curedProgramPkg = ncNodeService.getLastEditionCuredProgramPackage(programPackageName);
                if(curedProgramPkg != null){
                    throw new ServiceException(programPackageName+"已经固化,请勿重复入库。");
                if(optPackageNode.isEmpty()){
                    throw new ServiceException("找不到程序"+programPackageName);
                }
                if(tryProgramPkg == null){
                    log.warn("文件夹未发现匹配的程序包名{}",dir);
                    continue;
                NcNode packageNode = optPackageNode.get();
                if(packageNode.hasCured()) {
                    throw new ServiceException(programPackageName + "已经固化,请勿重复入库。");
                }
                //检查是否在审批过程中
                //根据节点信息查询流程
                boolean active = flowCommonService.isProcessInstanceActive(tryProgramPkg.getProcessInstanceId());
                boolean active = flowCommonService.isProcessInstanceActive(packageNode.getProcessInstanceId());
                if(active){
                    throw new ServiceException(programPackageName+"正在审批中,请勿重复入库。");
                }
                /*
                if(oriProgramPkg.hasCured()){
                    throw new ServiceException(programPackageName+"已经固化,请勿重复入库。");
                }*/
                if(!programPackageIdList.contains(tryProgramPkg.getId())){
                    //不在勾选的范围内
                    log.info("{}不在勾选范围内",programPackageName);
                    continue;
                }
                NcNode newProgramPkg = new NcNode();
                BeanUtils.copyProperties(tryProgramPkg, newProgramPkg);
                BeanUtils.copyProperties(packageNode, newProgramPkg);
                EntityUtil.clearBaseProperties(newProgramPkg);
                newProgramPkg.setIsLastEdition(1);
                ncNodeService.save(newProgramPkg);
                newProgramPackageNodeList.add(newProgramPkg);
                //旧数据更新为老版本
                tryProgramPkg.setIsLocked(1);//旧版自动锁定
                tryProgramPkg.setIsLastEdition(0);;
                ncNodeService.updateById(tryProgramPkg);
                packageNode.setIsLocked(1);//旧版自动锁定
                packageNode.setIsLastEdition(0);;
                ncNodeService.updateById(packageNode);
                //List<FlowProgramFile> newFlowFiles = new ArrayList<>();
                List<NcNode> newProgramNodes = new ArrayList<>();
@@ -236,26 +257,25 @@
                    if(!entryName.endsWith("/")){
                        //实际的文件
                        String fileName = StringUtils.removeStart(entryName,dir);//去除文件名路径部分
                        NcNode oldProgramNode = this.ncNodeService.getLastEditionProgramFile(fileName,tryProgramPkg.getId());
                        NcNode oldProgramNode = this.ncNodeService.getLastEditionProgramFile(fileName,packageNode.getId());
                        if(oldProgramNode == null){
                            log.info("{}找不到程序文件",entryName);
                            return;
                            throw new ServiceException(programPackageName+"下找不到程序文件"+fileName);
                        }
                        //创建新版本的程序节点
                        NcNode newProgramNode = new NcNode();
                        BeanUtils.copyProperties(oldProgramNode, newProgramNode);
                        EntityUtil.clearBaseProperties(newProgramNode);
                        newProgramNode.setIsLastEdition(1);
                        newProgramNode.setParentId(newProgramPkg.getId());
                        newProgramNode.setParentIds(newProgramPkg.getParentIds()+","+newProgramPkg.getId());
                        //ncNodeService.save(newProgramNode);
                        //将回传文件上传,并记录到数据库
                        FlowProgramFile oldFlowFile = flowProgramFileService.getById(newProgramNode.getFlowProgramFileId());
                        FlowProgramFile newFlowFile = new FlowProgramFile();
                        BeanUtils.copyProperties(oldFlowFile, newFlowFile);
                        newFlowFile.setProcessInstanceId(null);
                        newFlowFile.setProcessInstanceId(null);//先置为空,启动流程后设置该值
                        EntityUtil.clearBaseProperties(newFlowFile);
                        try {
@@ -269,10 +289,6 @@
                        newProgramNode.setVersionNumber(oldProgramNode.genNewVersionNumber());
                        newProgramNodes.add(newProgramNode);
                        //旧节点处理,咋办?如果导出工控网 重复导出呢?,isLastEdition不用设置了,因为 程序包节点 是新的
                        //TODO 待验证
                        //oldProgramNode.setIsLastEdition(原来是0);
                        //oldProgramNode.setIsLocked(1);
                        //ncNodeService.updateById(oldProgramNode);
                    }
                });
@@ -280,7 +296,6 @@
            }
        }
        return newProgramPackageNodeList;
    }
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcNodeService.java
@@ -244,7 +244,24 @@
     */
    public NcNode getLastEditionCuredProgramPackage(String programPkgName) {
        List<NcNode> nodes = lambdaQuery().eq(NcNode::getNodeType,NcNode.TYPE_PROGRAM_PACKAGE)
            .eq(NcNode::getName, programPkgName).eq(NcNode::getIsCured,1)
            .eq(NcNode::getName, programPkgName).likeRight(NcNode::getParentIds,"0,2,").eq(NcNode::getIsCured,1)
            .eq(NcNode::getIsLastEdition,1).list();
        if(nodes.isEmpty()){
            return null;
        }else {
            return nodes.get(0);
        }
    }
    /**
     * 获取最新版本的 偏离节点
     * @param programPkgName 程序包名
     * @return 偏离的程序节点
     */
    public NcNode getLastEditionDeviationProgramPackage(String programPkgName) {
        List<NcNode> nodes = lambdaQuery().eq(NcNode::getNodeType,NcNode.TYPE_PROGRAM_PACKAGE)
            .eq(NcNode::getName, programPkgName).likeRight(NcNode::getParentIds,"0,3,")
            .eq(NcNode::getIsLastEdition,1).list();
        if(nodes.isEmpty()){