xyc
2024-03-28 f3ad14f8af7fb651426d1ee617e7ecb9d3fc9aab
modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/ModelLineService.java
@@ -17,10 +17,14 @@
import org.dom4j.DocumentHelper;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.zt.common.db.query.QueryFilter;
import org.springframework.transaction.annotation.Transactional;
import java.io.StringWriter;
import java.util.*;
import java.util.stream.Collectors;
@@ -121,23 +125,67 @@
        // 1. 解析出节点与边
        getNodeAndLineFromRbd(modelRbd.getId(), rbdJsonArray, modelNodeList, modelLineList, productImgList);
        // 2. 计算所有节点的入口线数及出口线数
        // 2. 对于有多根入口线的产品节点,将其上的表决、旁联关系剥离成运算符节点,添加到该节点的前面,并添加相应的边
        peelOperationFromProductNode(modelRbd.getId(), modelNodeList, modelLineList);
        // 3. 计算所有节点的入口线数及出口线数
        calcInOutLineNumAllNode(modelNodeList, modelLineList);
        // 3. 复制产品节点(node)到list
        // 4. 复制产品节点(node)到list
        List<ModelNode> modelNodeAndVnodeList = modelNodeList.stream().filter(item ->
                "node".equals(item.getNodeType())).collect(Collectors.toList());
        // 4. 不断将基本模型(串联、并联、旁联、表决、桥联)替换为虚节点而简化图形,直至无法简化为止。
        // 5. 不断将基本模型(串联、并联、旁联、表决、桥联)替换为虚节点而简化图形,直至无法简化为止。
        result = getAlgorithmFromRbd(modelRbd, modelNodeList, modelLineList, algorithmList, modelNodeAndVnodeList);
        // 5. 转换为算法库接口XML
        // 6. 转换为算法库接口XML
        if (result) {
//            result = createIfXmlFromRbd(modelRbd, algorithmList, modelNodeAndVnodeList);
            result = createIfXmlFromRbd(modelRbd, algorithmList, modelNodeAndVnodeList);
        }
        // 6. 保存模型
        // 7. 保存模型
        if (saveFlag) saveModel(modelRbd, modelNodeList, modelLineList, algorithmList, modelNodeAndVnodeList);
        return result;
    }
    private void peelOperationFromProductNode(Long modelId,
                                              List<ModelNode> modelNodeList,
                                              List<ModelLine> modelLineList) {
        List<ModelNode> nodesToAdd = new ArrayList<>();
        List<ModelLine> linesToAdd = new ArrayList<>();
        for (ModelNode node: modelNodeList) {
            List<ModelLine> inLineList = modelLineList.stream().filter(item ->
                    item.getEndCell().equals(node.getPicId())).collect(Collectors.toList());
            if ("node".equals(node.getNodeType()) &&
                    StringUtils.isNotBlank(node.getNodeTypeExt()) &&
                    inLineList.size() > 1) {
                // 旁联or表决
                ModelNode nodeNew =  new ModelNode();
                Long nodeNewId = UUIDUtil.generateId();
                nodeNew.setId(nodeNewId);
                nodeNew.setPicId(nodeNewId.toString());
                nodeNew.setModelId(modelId);
                nodeNew.setNodeType(node.getNodeTypeExt());
                nodeNew.setName(node.getNodeTypeExt());
                nodeNew.setVoteNum(node.getVoteNum());
                nodeNew.setPositionX(node.getPositionX());
                nodeNew.setPositionY(node.getPositionY());
                nodesToAdd.add(nodeNew);
                ModelLine lineNew = new ModelLine();
                Long lineNewId = UUIDUtil.generateId();
                lineNew.setId(lineNewId);
                lineNew.setPicId(lineNewId.toString());
                lineNew.setModelId(modelId);
                lineNew.setBeginCell(nodeNewId.toString());
                lineNew.setEndCell(node.getPicId());
                linesToAdd.add(lineNew);
                for(ModelLine line: inLineList){
                    line.setEndCell(nodeNewId.toString());
                }
            }
        }
        modelNodeList.addAll(nodesToAdd);
        modelLineList.addAll(linesToAdd);
    }
    private boolean createIfXmlFromRbd(ModelRbd modelRbd,
@@ -175,9 +223,20 @@
            block = link.addElement("Block");
            block.addAttribute("Name", "Start");
            document.setXMLEncoding("UTF-8");
            String xmlString = document.asXML();
            modelRbd.setIfXml(xmlString);
//            document.setXMLEncoding("UTF-8");
//            String xmlString = document.asXML();
            // 输出格式化xml
            XMLWriter xmlWriter = null;
            try {
                OutputFormat format = OutputFormat.createPrettyPrint();
                format.setEncoding("UTF-8");
                StringWriter writer = new StringWriter();
                xmlWriter = new XMLWriter(writer, format);
                xmlWriter.write(document);
                modelRbd.setPublishedXml(writer.toString());
            } finally {
                if (xmlWriter!=null) xmlWriter.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
            result = false;
@@ -681,6 +740,7 @@
                ModelNode endNode = getBranchNodesOneParallel(pathOneGroup, branchNodeList);
                if ("connect".equals(startNode.getNodeType()) && pathOneGroup.size()==lines.size()) {
                    // 替换成虚节点
                    modelNodeAndVnodeList.add(startNode);
                    replaceToVnode("parallel", modelId, modelNodeList, modelLineList,
                            algorithmList, modelNodeAndVnodeList, startNode, endNode, branchNodeList);
                } else {
@@ -876,6 +936,7 @@
        if ("connect".equals(startNode.getNodeType()) && startNode.getInLineNum()==2) {
            // 替换成虚节点
            modelNodeAndVnodeList.add(startNode);
            replaceToVnode("bridge", modelId, modelNodeList, modelLineList,
                    algorithmList, modelNodeAndVnodeList, startNode, endNode, branchNodeList);
        } else {
@@ -971,6 +1032,7 @@
                }
            }
            if (thisNodeSuccess) {
                modelNodeAndVnodeList.add(opNode);
                replaceToVnode(opNode.getNodeType(), modelId, modelNodeList, modelLineList,
                        algorithmList, modelNodeAndVnodeList, opNode, endNode, branchNodeList);
                hasSimplified = true;
@@ -1000,6 +1062,7 @@
        algorithm.setAlgorithmType(type);
        algorithm.setComputerList(computerList.get(0));
        algorithm.setObjectList(computerList.get(1));
        if ("vote".equals(type)) algorithm.setVoteNum(startNode.getVoteNum());
        algorithm.setStep(algorithmList.size()==0 ? 0 : algorithmList.get(algorithmList.size()-1).getStep()+1);
        algorithmList.add(algorithm);
@@ -1158,6 +1221,7 @@
        }
        // 更新RBD数据
        modelRbd.setPublishedContent(modelRbd.getContent());
        modelRbdDao.updateById(modelRbd);
    }