From 6d6ff1f12e35d2310be581b91a343967e247d4e4 Mon Sep 17 00:00:00 2001
From: xyc <jc_xiong@hotmail.com>
Date: 星期三, 13 三月 2024 15:08:56 +0800
Subject: [PATCH] 优化串联、并联的识别

---
 modules/mainPart/src/main/java/com/zt/life/modules/taskReliability/service/ModelLineService.java |  189 ++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 153 insertions(+), 36 deletions(-)

diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/taskReliability/service/ModelLineService.java b/modules/mainPart/src/main/java/com/zt/life/modules/taskReliability/service/ModelLineService.java
index f60aa9e..9f4c753 100644
--- a/modules/mainPart/src/main/java/com/zt/life/modules/taskReliability/service/ModelLineService.java
+++ b/modules/mainPart/src/main/java/com/zt/life/modules/taskReliability/service/ModelLineService.java
@@ -5,15 +5,9 @@
 import com.zt.common.service.BaseService;
 import com.zt.common.utils.JsonUtils2;
 import com.zt.common.utils.UUIDUtil;
-import com.zt.life.modules.taskReliability.dao.AlgorithmDao;
-import com.zt.life.modules.taskReliability.dao.ModelLineDao;
-import com.zt.life.modules.taskReliability.dao.ModelNodeDao;
-import com.zt.life.modules.taskReliability.dao.ModelRbdDao;
+import com.zt.life.modules.taskReliability.dao.*;
 import com.zt.life.modules.taskReliability.dto.ModelLinePair;
-import com.zt.life.modules.taskReliability.model.Algorithm;
-import com.zt.life.modules.taskReliability.model.ModelLine;
-import com.zt.life.modules.taskReliability.model.ModelNode;
-import com.zt.life.modules.taskReliability.model.ModelRbd;
+import com.zt.life.modules.taskReliability.model.*;
 import org.apache.commons.lang3.StringUtils;
 import org.checkerframework.checker.units.qual.C;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -41,6 +35,8 @@
     private ModelRbdDao modelRbdDao;
     @Autowired
     private AlgorithmDao algorithmDao;
+    @Autowired
+    private ModelNodeAlgorithmDao modelNodeAlgorithmDao;
 
     /**
      * 鍒嗛〉鏌ヨ
@@ -123,7 +119,7 @@
         result = getAlgorithmFromRbd(modelId, modelNodeList, modelLineList, algorithmList, modelNodeAndVnodeList);
 
         // 5. 淇濆瓨妯″瀷
-        if (saveFlag) saveModel(modelId, modelNodeList, modelLineList, algorithmList);
+        if (saveFlag) saveModel(modelId, modelNodeList, modelLineList, algorithmList, modelNodeAndVnodeList);
 
         return result;
     }
@@ -152,15 +148,11 @@
             hasSimplified = false;
             hasSimplified = simplifySeries(modelId, modelNodeList, modelLineList, algorithmList, modelNodeAndVnodeList, hasSimplified);
             hasSimplified = simplifyParallel(modelId, modelNodeList, modelLineList, algorithmList, modelNodeAndVnodeList, hasSimplified);
-            hasSimplified = simplifyOperator("switch", modelId, modelNodeList, modelLineList, algorithmList, hasSimplified);
-            hasSimplified = simplifyOperator("vote", modelId, modelNodeList, modelLineList, algorithmList, hasSimplified);
+            hasSimplified = simplifyOperator("switch", modelId, modelNodeList, modelLineList, algorithmList, modelNodeAndVnodeList, hasSimplified);
+            hasSimplified = simplifyOperator("vote", modelId, modelNodeList, modelLineList, algorithmList, modelNodeAndVnodeList, hasSimplified);
             hasSimplified = simplifyBridge(modelId, modelNodeList, modelLineList, algorithmList, modelNodeAndVnodeList, hasSimplified);
             isEnd = simplifyEnd(modelId, modelNodeList, modelLineList, algorithmList, modelNodeAndVnodeList);
         } while (!isEnd && hasSimplified);
-
-        // 鍚堝苟纰庣墖鍖栦簡鐨勪覆鑱�
-
-        // 鍚堝苟纰庣墖鍖栦簡鐨勫苟鑱�
 
         return isEnd;
     }
@@ -204,7 +196,7 @@
         algorithm.setAlgorithmType(endNode.getNodeType());
         algorithm.setComputerList(node.getId().toString());
         algorithm.setObjectList(node.getName());
-        algorithm.setStep(algorithmList.size());
+        algorithm.setStep(algorithmList.size()==0 ? 0 : algorithmList.get(algorithmList.size()-1).getStep()+1);
         algorithmList.add(algorithm);
 
         // 鏂板缁撴潫鐨勮櫄鑺傜偣
@@ -241,17 +233,100 @@
             if ("start,switch,vote".contains(endNode.getNodeType()) || endNode.getOutLineNum()!=1) {
                 result.remove(endNode);
             }
-            List<ModelNode> seriesNodes = result.stream().filter(item ->
+            List<ModelNode> realSeriesNodes = result.stream().filter(item ->
                     !"connect".equals(item.getNodeType())).collect(Collectors.toList());
-            if (seriesNodes.size()<2) continue;
-
-            // 鏇挎崲鎴愯櫄鑺傜偣
-            replaceToVnodeSeries(modelId, modelNodeList, modelLineList,
-                    algorithmList, modelNodeAndVnodeList, result, seriesNodes);
+            if (realSeriesNodes.size()<1) {
+                if (result.size() < 2) continue;
+                // 鏇挎崲鎴愯繛绾�
+                replaceToLineSeries(modelNodeList, modelLineList, result);
+            } else if (realSeriesNodes.size()==1) {
+                if (result.size() < 2) continue;   // path涓婂彧鏈夎浜у搧鑺傜偣锛坣ode/vnode锛夎嚜宸憋紝鏃犻渶鍋氫粈涔�
+                // 灏唒ath鏇挎崲鎴愯鑺傜偣
+                replaceToTheNodeSeries(modelNodeList, modelLineList,
+                        result, realSeriesNodes.get(0));
+            } else {
+                // 灏唒ath鏇挎崲鎴愯櫄鑺傜偣
+                replaceToVnodeSeries(modelId, modelNodeList, modelLineList,
+                        algorithmList, modelNodeAndVnodeList, result, realSeriesNodes);
+            }
             hasSimplified = true;
         }
 
         return hasSimplified;
+    }
+
+    private void replaceToLineSeries(List<ModelNode> modelNodeList,
+                                     List<ModelLine> modelLineList,
+                                     List<ModelNode> path) {
+        // 鑾峰彇path鐨勮捣鐐圭殑鍑哄彛绾�
+        ModelNode finalNodeStart = path.get(0);
+        ModelNode finalNodeEnd = path.get(path.size()-1);
+        List<ModelLine> outLines = modelLineList.stream().filter(item ->
+                item.getBeginCell().equals(finalNodeStart.getPicId())).collect(Collectors.toList());
+
+        // 鍒犻櫎path涓婄殑鎵�鏈変腑闂磋繛绾垮強path鐨勭粨鏉熺偣浠ュ鐨勮妭鐐�
+        for (int i=0; i<path.size(); i++) {
+            ModelNode finalNode = path.get(i);
+            if (i < path.size() - 1) {
+                // 灏嗗叆鍙g嚎鍒犻櫎
+                List<ModelLine> lines = modelLineList.stream().filter(item ->
+                        item.getEndCell().equals(finalNode.getPicId())).collect(Collectors.toList());
+                modelLineList.removeAll(lines);
+                // 鍒犻櫎鑺傜偣
+                modelNodeList.remove(finalNode);
+                calcInOutLineNum(finalNode, modelLineList);
+            }
+        }
+
+        // 灏唒ath鐨勮捣鐐圭殑鍑哄彛绾挎敼涓鸿繛鎺ュ埌path鐨勭粨鏉熺偣
+        for (ModelLine line : outLines) {
+            line.setBeginCell(finalNodeEnd.getPicId());
+        }
+
+        calcInOutLineNum(finalNodeStart, modelLineList);
+        calcInOutLineNum(finalNodeEnd, modelLineList);
+    }
+
+    private void replaceToTheNodeSeries(List<ModelNode> modelNodeList,
+                                      List<ModelLine> modelLineList,
+                                      List<ModelNode> path,
+                                      ModelNode theNode) {
+        // 鑾峰彇path鐨勮捣鐐圭殑鍑哄彛绾�
+        ModelNode finalNodeStart = path.get(0);
+        List<ModelLine> outLines = modelLineList.stream().filter(item ->
+                item.getBeginCell().equals(finalNodeStart.getPicId())).collect(Collectors.toList());
+        // 鑾峰彇path鐨勭粨鏉熺偣鐨勫叆鍙g嚎
+        ModelNode finalNodeEnd = path.get(path.size()-1);
+        List<ModelLine> inLines = modelLineList.stream().filter(item ->
+                item.getEndCell().equals(finalNodeEnd.getPicId())).collect(Collectors.toList());
+
+        // 鍒犻櫎path涓婄殑鎵�鏈変腑闂磋繛绾垮強theNode浠ュ鐨勮妭鐐�
+        for (int i=0; i<path.size(); i++) {
+            ModelNode finalNode = path.get(i);
+            if (i < path.size() - 1) {
+                // 灏嗗叆鍙g嚎鍒犻櫎
+                List<ModelLine> lines = modelLineList.stream().filter(item ->
+                        item.getEndCell().equals(finalNode.getPicId())).collect(Collectors.toList());
+                modelLineList.removeAll(lines);
+            }
+            if (!finalNode.getId().equals(theNode.getId())) {
+                modelNodeList.remove(finalNode);
+                calcInOutLineNum(finalNode, modelLineList);
+            }
+        }
+
+        // 灏唒ath鐨勮捣鐐圭殑鍑哄彛绾挎敼涓鸿繛鎺ュ埌theNode
+        for (ModelLine line : outLines) {
+            line.setBeginCell(theNode.getPicId());
+        }
+        // 灏唒ath鐨勭粨鏉熺偣鐨勫叆鍙g嚎鏀逛负杩炴帴鍒皌heNode
+        for (ModelLine line : inLines) {
+            line.setEndCell(theNode.getPicId());
+        }
+
+        calcInOutLineNum(finalNodeStart, modelLineList);
+        calcInOutLineNum(finalNodeEnd, modelLineList);
+        calcInOutLineNum(theNode, modelLineList);
     }
 
     private void replaceToVnodeSeries(Long modelId,
@@ -262,6 +337,7 @@
                                       List<ModelNode> path,
                                       List<ModelNode> seriesNodes) {
         // 鏂板algorithm
+        List<String> computerList = createVnodeComputerList("series", algorithmList, modelNodeAndVnodeList, seriesNodes);
         Algorithm algorithm = new Algorithm();
         Long id = UUIDUtil.generateId();
         algorithm.setId(id);
@@ -269,9 +345,9 @@
         algorithm.setComputerId(id);
         algorithm.setModelType("series");
         algorithm.setAlgorithmType("series");
-        algorithm.setComputerList(joinNodeId(seriesNodes, ","));
-        algorithm.setObjectList(joinNodeName(seriesNodes, ","));
-        algorithm.setStep(algorithmList.size());
+        algorithm.setComputerList(computerList.get(0));
+        algorithm.setObjectList(computerList.get(1));
+        algorithm.setStep(algorithmList.size()==0 ? 0 : algorithmList.get(algorithmList.size()-1).getStep()+1);
         algorithmList.add(algorithm);
 
         // 鏂板铏氳妭鐐�
@@ -322,6 +398,39 @@
         }
 
         calcInOutLineNum(vnode, modelLineList);
+    }
+
+    private List<String> createVnodeComputerList(String type,
+                                                 List<Algorithm> algorithmList,
+                                                 List<ModelNode> modelNodeAndVnodeList,
+                                                 List<ModelNode> nodes) {
+        String computerIdList = "";
+        String objectList = "";
+        for (int i=nodes.size()-1; i>=0; i--) {
+            ModelNode node = nodes.get(i);
+            if ("node".equals(node.getNodeType())) {
+                objectList += "".equals(objectList) ? node.getName() : "," + node.getName();
+                computerIdList += "".equals(computerIdList) ? node.getId().toString() : "," + node.getId().toString();
+            } else {
+                // vnode
+                Algorithm algorithm = algorithmList.stream().filter(item ->
+                        item.getId().equals(node.getId())).collect(Collectors.toList()).get(0);
+                if ("series,parallel".contains(type) && type.equals(algorithm.getAlgorithmType())) {
+                    objectList += "".equals(objectList) ? algorithm.getObjectList() : "," + algorithm.getObjectList();
+                    computerIdList += "".equals(computerIdList) ? algorithm.getComputerList() : "," + algorithm.getComputerList();
+                    algorithmList.remove(algorithm);
+                    modelNodeAndVnodeList.remove(node);
+                } else {
+                    objectList += "".equals(objectList) ? node.getName() : "," + node.getName();
+                    computerIdList += "".equals(computerIdList) ? node.getId().toString() : "," + node.getId().toString();
+                }
+            }
+        }
+
+        List<String> result = new ArrayList<>();
+        result.add(computerIdList);
+        result.add(objectList);
+        return result;
     }
 
     private void seekPathSeries(List<ModelNode> modelNodeList,
@@ -385,7 +494,7 @@
                 if ("connect".equals(startNode.getNodeType()) && pathOneGroup.size()==lines.size()) {
                     // 鏇挎崲鎴愯櫄鑺傜偣
                     replaceToVnode("parallel", modelId, modelNodeList, modelLineList,
-                            algorithmList, startNode, endNode, branchNodeList);
+                            algorithmList, modelNodeAndVnodeList, startNode, endNode, branchNodeList);
                 } else {
                     // 鏂板铏氳妭鐐�
                     ModelNode vnode = new ModelNode();
@@ -405,7 +514,7 @@
                     modelLineNew.setEndCell(startNode.getPicId());
                     modelLineList.add(modelLineNew);
                     replaceToVnode("parallel", modelId, modelNodeList, modelLineList,
-                            algorithmList, vnode, endNode, branchNodeList);
+                            algorithmList, modelNodeAndVnodeList, vnode, endNode, branchNodeList);
                     calcInOutLineNum(startNode, modelLineList);
                 }
                 hasSimplified = true;
@@ -575,7 +684,7 @@
         if ("connect".contains(startNode.getNodeType()) && startNode.getInLineNum()==2) {
             // 鏇挎崲鎴愯櫄鑺傜偣
             replaceToVnode("bridge", modelId, modelNodeList, modelLineList,
-                    algorithmList, startNode, endNode, branchNodeList);
+                    algorithmList, modelNodeAndVnodeList, startNode, endNode, branchNodeList);
         } else {
             // 鏂板铏氳妭鐐�
             ModelNode vnode = new ModelNode();
@@ -595,7 +704,7 @@
             modelLineNew.setEndCell(startNode.getPicId());
             modelLineList.add(modelLineNew);
             replaceToVnode("bridge", modelId, modelNodeList, modelLineList,
-                    algorithmList, vnode, endNode, branchNodeList);
+                    algorithmList, modelNodeAndVnodeList, vnode, endNode, branchNodeList);
             calcInOutLineNum(startNode, modelLineList);
         }
 
@@ -636,6 +745,7 @@
                                      List<ModelNode> modelNodeList,
                                      List<ModelLine> modelLineList,
                                      List<Algorithm> algorithmList,
+                                     List<ModelNode> modelNodeAndVnodeList,
                                      boolean hasSimplified) {
         List<ModelNode> opNodes = modelNodeList.stream().filter(item ->
                 operator.equals(item.getNodeType())).collect(Collectors.toList());
@@ -664,7 +774,7 @@
             }
             if (thisNodeSuccess) {
                 replaceToVnode(opNode.getNodeType(), modelId, modelNodeList, modelLineList,
-                        algorithmList, opNode, endNode, branchNodeList);
+                        algorithmList, modelNodeAndVnodeList, opNode, endNode, branchNodeList);
                 hasSimplified = true;
             }
         }
@@ -677,10 +787,12 @@
                                 List<ModelNode> modelNodeList,
                                 List<ModelLine> modelLineList,
                                 List<Algorithm> algorithmList,
+                                List<ModelNode> modelNodeAndVnodeList,
                                 ModelNode startNode,
                                 ModelNode endNode,
                                 List<ModelNode> branchNodeList) {
         // 鏂板algorithm
+        List<String> computerList = createVnodeComputerList(type, algorithmList, modelNodeAndVnodeList, branchNodeList);
         Algorithm algorithm = new Algorithm();
         Long id = UUIDUtil.generateId();
         algorithm.setId(id);
@@ -688,9 +800,9 @@
         algorithm.setComputerId(id);
         algorithm.setModelType(type);
         algorithm.setAlgorithmType(type);
-        algorithm.setComputerList(joinNodeId(branchNodeList, ","));
-        algorithm.setObjectList(joinNodeName(branchNodeList, ","));
-        algorithm.setStep(algorithmList.size());
+        algorithm.setComputerList(computerList.get(0));
+        algorithm.setObjectList(computerList.get(1));
+        algorithm.setStep(algorithmList.size()==0 ? 0 : algorithmList.get(algorithmList.size()-1).getStep()+1);
         algorithmList.add(algorithm);
 
         // 鏇挎崲涓鸿櫄鑺傜偣
@@ -763,7 +875,7 @@
                 if ("node".equals(modelNode.getNodeType())) {
                     modelNode.setDataId(Long.valueOf(JsonUtils2.getJsonValueByPath(jsonObject, "data/dataId".split("/")).toString()));
 //                    modelNode.setNodeTypeExt(JsonUtils2.getJsonValueByPath(jsonObject, "data/nodeTypeExt".split("/")).toString());
-                    Object label = JsonUtils2.getJsonValueByPath(jsonObject, "attrs/label/textWrap/text".split("/"));
+                    Object label = JsonUtils2.getJsonValueByPath(jsonObject, "attrs/text/text".split("/"));
                     modelNode.setName(label==null ? "" : label.toString());
                 }
                 modelNodeList.add(modelNode);
@@ -890,7 +1002,7 @@
             } // end for
         } while (hasLeastOne);
 
-        if (saveFlag) saveModel(modelId, modelNodeList, modelLineList, algoList);
+//        if (saveFlag) saveModel(modelId, modelNodeList, modelLineList, algoList);
     }
 
     private void handleOneLine(List<ModelLine> modelLineList,
@@ -1010,11 +1122,13 @@
     private void saveModel(Long modelId,
                            List<ModelNode> modelNodeList,
                            List<ModelLine> modelLineList,
-                           List<Algorithm> algoList) {
+                           List<Algorithm> algoList,
+                           List<ModelNode> modelNodeAndVnodeList) {
         // 鍒犻櫎鏃㈡湁鏁版嵁
         modelNodeDao.deleteByModelId(modelId);
         modelLineDao.deleteByModelId(modelId);
         algorithmDao.deleteByModelId(modelId);
+        modelNodeAlgorithmDao.deleteByModelId(modelId);
 
         // 鎻掑叆鏁版嵁
         for (ModelNode modelNode : modelNodeList) {
@@ -1026,6 +1140,9 @@
         for (Algorithm algorithm : algoList) {
             algorithmDao.insert(algorithm);
         }
+        for (ModelNode modelNode : modelNodeAndVnodeList) {
+            modelNodeAlgorithmDao.insert(ModelNodeAlgorithm.from(modelNode));
+        }
     }
 
 }

--
Gitblit v1.9.1