From 1ab5999f546adcca439eb32ea5ecd34819a13ff6 Mon Sep 17 00:00:00 2001
From: xyc <jc_xiong@hotmail.com>
Date: 星期六, 12 十月 2024 09:31:07 +0800
Subject: [PATCH] 修改RBD识别算法

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

diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/ModelLineService.java b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/ModelLineService.java
index 0cea759..776f168 100644
--- a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/ModelLineService.java
+++ b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/ModelLineService.java
@@ -158,15 +158,17 @@
 
         // 1. 瑙f瀽鍑鸿妭鐐逛笌杈�
         getNodeAndLineFromRbd(modelRbd.getId(), rbdJsonArray, modelNodeList, modelLineList, productImgList);
-        // 2. 瀵逛簬鏈夊鏍瑰叆鍙g嚎鐨勪骇鍝佽妭鐐癸紝灏嗗叾涓婄殑琛ㄥ喅銆佹梺鑱斿叧绯诲墺绂绘垚杩愮畻绗﹁妭鐐癸紝娣诲姞鍒拌鑺傜偣鐨勫墠闈紝骞舵坊鍔犵浉搴旂殑杈�
-        peelOperationFromProductNode(modelRbd.getId(), modelNodeList, modelLineList);
-        // 3. 璁$畻鎵�鏈夎妭鐐圭殑鍏ュ彛绾挎暟鍙婂嚭鍙g嚎鏁�
+        // 2. 璁$畻鎵�鏈夎妭鐐圭殑鍏ュ彛绾挎暟鍙婂嚭鍙g嚎鏁�
         calcInOutLineNumAllNode(modelNodeList, modelLineList);
-        // 4. 澶嶅埗浜у搧鑺傜偣(node)鍒發ist
+
+        RbdTreeNode root = recognizeRbd(modelNodeList, modelLineList);
+
+/*
+        // 3. 澶嶅埗浜у搧鑺傜偣(node)鍒發ist
         List<ModelNode> modelNodeAndVnodeList = modelNodeList.stream().filter(item ->
                 "node".equals(item.getNodeType())).collect(Collectors.toList());
-        // 5. 涓嶆柇灏嗗熀鏈ā鍨嬶紙涓茶仈銆佸苟鑱斻�佹梺鑱斻�佽〃鍐炽�佹ˉ鑱旓級鏇挎崲涓鸿櫄鑺傜偣鑰岀畝鍖栧浘褰紝鐩磋嚦鏃犳硶绠�鍖栦负姝€��
-        result = getAlgorithmFromRbd(modelRbd, modelNodeList, modelLineList, algorithmList, modelNodeAndVnodeList);
+        // 4. 涓嶆柇灏嗗熀鏈ā鍨嬶紙涓茶仈銆佸苟鑱斻�佹梺鑱斻�佽〃鍐炽�佹ˉ鑱旓級鏇挎崲涓鸿櫄鑺傜偣鑰岀畝鍖栧浘褰紝鐩磋嚦鏃犳硶绠�鍖栦负姝€��
+//        result = getAlgorithmFromRbd(modelRbd, modelNodeList, modelLineList, algorithmList, modelNodeAndVnodeList);
 
         // 6. 閫掑綊璁$畻RBD鐨勫竷灞�绌洪棿澶у皬
         calcLayoutSize(modelRbd, algorithmList, modelNodeAndVnodeList);
@@ -204,6 +206,224 @@
         // 鏇存柊RBD鏁版嵁
 //        modelRbd.setAutoLayoutContent("娴嬭瘯鏂囧瓧");
 //        modelRbdDao.updateById(modelRbd);
+*/
+
+        return result;
+    }
+
+    private RbdTreeNode recognizeRbd(List<ModelNode> modelNodeList,
+                              List<ModelLine> modelLineList) {
+        Map<String, Integer> vnodeCounter = new HashMap<>();
+        vnodeCounter.put("vnodeCounter", 0);
+        RbdTreeNode root = new RbdTreeNode();
+        root.setAlgorithmType("series");
+        root.setId(UUIDUtil.generateId());
+        int counter = vnodeCounter.get("vnodeCounter");
+        root.setName("v" + counter);
+        counter++;
+        vnodeCounter.put("vnodeCounter", counter);
+        root.setNodeType("vnode");
+
+        ModelNode end = modelNodeList.stream().filter(item ->
+                "end".equals(item.getNodeType())).collect(Collectors.toList()).get(0);
+        RbdTreeNode endNode = new RbdTreeNode();
+        endNode.setId(end.getId());
+        endNode.setName("end");
+        endNode.setNodeType("end");
+        endNode.setPicId(end.getPicId());
+        endNode.setPairStartNodeId(end.getPairStartNodeId());
+        endNode.setMyWidth(end.getWidth());
+        endNode.setMyHeight(end.getHeight());
+        root.getChildren().add(endNode);
+        ModelLine lineRight = modelLineList.stream().filter(item ->
+                item.getEndCell().equals(end.getPicId())).collect(Collectors.toList()).get(0);
+        recognizeOneBranch(root,
+                lineRight,
+                null,
+                modelNodeList,
+                modelLineList,
+                vnodeCounter);
+
+        return root;
+    }
+
+    private void recognizeOneBranch(RbdTreeNode parent,
+                                 ModelLine lineRight, // 涓茶仈鐨勮捣濮嬬嚎锛堝彸杈癸級
+                                 ModelLine lineLeft, // 涓茶仈鐨勭粨鏉熺嚎锛堝乏杈癸級
+                                 List<ModelNode> modelNodeList,
+                                 List<ModelLine> modelLineList,
+                                 Map<String, Integer> vnodeCounter) {
+        ModelLine inLine = lineRight;
+        for (;;) {
+            ModelLine searchLine = inLine;
+            ModelNode node = modelNodeList.stream().filter(item ->
+                    searchLine.getBeginCell().equals(item.getPicId())).collect(Collectors.toList()).get(0);
+            if ("node".equals(node.getNodeType())) {
+                RbdTreeNode treeNode = new RbdTreeNode();
+                treeNode.setId(node.getId());
+                treeNode.setName(node.getName());
+                treeNode.setNodeType(node.getNodeType());
+                treeNode.setPicId(node.getPicId());
+                treeNode.setMyWidth(node.getWidth());
+                treeNode.setMyHeight(node.getHeight());
+                parent.getChildren().add(treeNode);
+                inLine = modelLineList.stream().filter(item ->
+                        item.getEndCell().equals(node.getPicId())).collect(Collectors.toList()).get(0);
+            } else if ("start".equals(node.getNodeType())) {
+                RbdTreeNode treeNode = new RbdTreeNode();
+                treeNode.setId(node.getId());
+                treeNode.setName(node.getNodeType());
+                treeNode.setNodeType(node.getNodeType());
+                treeNode.setPicId(node.getPicId());
+                treeNode.setMyWidth(node.getWidth());
+                treeNode.setMyHeight(node.getHeight());
+                parent.getChildren().add(treeNode);
+                break;
+            } else if ("connect".equals(node.getNodeType())) {
+                break;
+            } else if ("parallel,vote,switch,bridge".contains(node.getNodeType())) {
+                RbdTreeNode subNode = new RbdTreeNode();
+                subNode.setAlgorithmType("series");
+                subNode.setId(UUIDUtil.generateId());
+                int counter = vnodeCounter.get("vnodeCounter");
+                subNode.setName("v" + counter);
+                counter++;
+                vnodeCounter.put("vnodeCounter", counter);
+                subNode.setNodeType("vnode");
+                parent.getChildren().add(subNode);
+                ModelNode connect = modelNodeList.stream().filter(item ->
+                        node.getPairStartNodeId().equals(item.getPicId())).collect(Collectors.toList()).get(0);
+                RbdTreeNode treeNode = new RbdTreeNode();
+                treeNode.setId(connect.getId());
+                treeNode.setName(connect.getNodeType());
+                treeNode.setNodeType(connect.getNodeType());
+                treeNode.setPicId(connect.getPicId());
+                treeNode.setMyWidth(connect.getWidth());
+                treeNode.setMyHeight(connect.getHeight());
+                subNode.getChildren().add(treeNode);
+                RbdTreeNode subNodeOpe = new RbdTreeNode();
+                subNodeOpe.setAlgorithmType(node.getNodeType());
+                subNodeOpe.setId(UUIDUtil.generateId());
+                counter = vnodeCounter.get("vnodeCounter");
+                subNodeOpe.setName("v" + counter);
+                counter++;
+                vnodeCounter.put("vnodeCounter", counter);
+                subNodeOpe.setNodeType("vnode");
+                subNode.getChildren().add(subNodeOpe);
+                treeNode = new RbdTreeNode();
+                treeNode.setId(node.getId());
+                treeNode.setName(node.getNodeType());
+                treeNode.setNodeType(node.getNodeType());
+                treeNode.setPicId(node.getPicId());
+                treeNode.setPairStartNodeId(node.getPairStartNodeId());
+                treeNode.setMyWidth(node.getWidth());
+                treeNode.setMyHeight(node.getHeight());
+                subNode.getChildren().add(treeNode);
+                recognizeOpeBlock(subNodeOpe,
+                        node,
+                        modelNodeList,
+                        modelLineList,
+                        vnodeCounter);
+                inLine = modelLineList.stream().filter(item ->
+                        item.getEndCell().equals(connect.getPicId())).collect(Collectors.toList()).get(0);
+            }
+
+            if (null != lineLeft) {
+                if (inLine.getPicId().equals(lineLeft.getPicId())) break;
+            }
+        }
+        if ("series".equals(parent.getAlgorithmType())) Collections.reverse(parent.getChildren());
+    }
+
+    private void recognizeOpeBlock(RbdTreeNode parent,
+                                        ModelNode rightNode, // rbd涓殑鍙宠妭鐐癸紙鍖呮嫭end鍙�4绉嶈繍绠楃锛�
+                                        List<ModelNode> modelNodeList,
+                                        List<ModelLine> modelLineList,
+                                        Map<String, Integer> vnodeCounter) {
+        if ("parallel,vote,switch".contains(parent.getAlgorithmType())) {
+            ModelNode searchNode = rightNode;
+            List<ModelLine> lines = modelLineList.stream().filter(item ->
+                    item.getEndCell().equals(searchNode.getPicId())).collect(Collectors.toList());
+            List<ModelLine> sortedLines = sortLine(lines, modelNodeList);
+            for (ModelLine line : sortedLines) {
+                boolean isSeries = isSeriesBranch(rightNode, line, modelNodeList, modelLineList);
+                if (isSeries) {
+                    RbdTreeNode subNode = new RbdTreeNode();
+                    subNode.setAlgorithmType("series");
+                    subNode.setId(UUIDUtil.generateId());
+                    int counter = vnodeCounter.get("vnodeCounter");
+                    subNode.setName("v" + counter);
+                    counter++;
+                    vnodeCounter.put("vnodeCounter", counter);
+                    subNode.setNodeType("vnode");
+                    parent.getChildren().add(subNode);
+                    recognizeOneBranch(subNode, line, null, modelNodeList, modelLineList, vnodeCounter);
+                } else {
+                    recognizeOneBranch(parent, line,null, modelNodeList, modelLineList, vnodeCounter);
+                }
+            }
+        } else if ("bridge".contains(parent.getAlgorithmType())) {
+            // 灏嗘ˉ鑱旂湅鎴�2鏀矾骞惰仈+妗ユ帴鏀矾鐨勭粍鍚�
+        }
+    }
+
+    /**
+     * 鎸夎嚜涓婅�屼笅鐨勯『搴忔帓搴�
+      */
+    private List<ModelLine> sortLine(List<ModelLine> lines,
+                                     List<ModelNode> modelNodeList) {
+        for (ModelLine line : lines) {
+            ModelNode node = modelNodeList.stream().filter(item ->
+                    line.getBeginCell().equals(item.getPicId())).collect(Collectors.toList()).get(0);
+            line.setBeginY(node.getPositionY());
+        }
+        lines.sort(Comparator.comparing(ModelLine::getBeginY));
+
+        return lines;
+    }
+
+    private boolean isSingleNode(List<ModelNode> modelNodeList,
+                                 List<ModelLine> modelLineList) {
+        boolean result = false;
+        ModelNode start = modelNodeList.stream().filter(item ->
+                "start".equals(item.getNodeType())).collect(Collectors.toList()).get(0);
+        ModelNode end = modelNodeList.stream().filter(item ->
+                "end".equals(item.getNodeType())).collect(Collectors.toList()).get(0);
+        ModelLine line1 = modelLineList.stream().filter(item ->
+                item.getBeginCell().equals(start.getPicId())).collect(Collectors.toList()).get(0);
+        ModelNode node1 = modelNodeList.stream().filter(item ->
+                line1.getEndCell().equals(item.getPicId())).collect(Collectors.toList()).get(0);
+        ModelLine line2 = modelLineList.stream().filter(item ->
+                item.getEndCell().equals(end.getPicId())).collect(Collectors.toList()).get(0);
+        ModelNode node2 = modelNodeList.stream().filter(item ->
+                line2.getBeginCell().equals(item.getPicId())).collect(Collectors.toList()).get(0);
+        if (node1.getPicId().equals(node2.getPicId()) && "node".equals(node1.getNodeType())) result = true;
+
+        return result;
+    }
+
+    private boolean isSeriesBranch(ModelNode rightNode, // rbd涓殑鍙宠妭鐐癸紙鍖呮嫭end鍙�4绉嶈繍绠楃锛�
+                                   ModelLine line, // 鍙宠妭鐐圭殑鍏ュ彛绾�
+                                   List<ModelNode> modelNodeList,
+                                   List<ModelLine> modelLineList) {
+        boolean result = false;
+        ModelNode node = modelNodeList.stream().filter(item ->
+                line.getBeginCell().equals(item.getPicId())).collect(Collectors.toList()).get(0);
+        if ("node".equals(node.getNodeType())) {
+            ModelLine line1 = modelLineList.stream().filter(item ->
+                    item.getEndCell().equals(node.getPicId())).collect(Collectors.toList()).get(0);
+            ModelNode node1 = modelNodeList.stream().filter(item ->
+                    line1.getBeginCell().equals(item.getPicId())).collect(Collectors.toList()).get(0);
+            result = !node1.getPicId().equals(rightNode.getPairStartNodeId());
+        } else {
+            ModelNode node2 = modelNodeList.stream().filter(item ->
+                    node.getPairStartNodeId().equals(item.getPicId())).collect(Collectors.toList()).get(0);
+            ModelLine line2 = modelLineList.stream().filter(item ->
+                    item.getEndCell().equals(node2.getPicId())).collect(Collectors.toList()).get(0);
+            ModelNode node3 = modelNodeList.stream().filter(item ->
+                    line2.getBeginCell().equals(item.getPicId())).collect(Collectors.toList()).get(0);
+            result = !node3.getPicId().equals(rightNode.getPairStartNodeId());
+        }
 
         return result;
     }
@@ -1797,7 +2017,9 @@
                 if (jsonValue != null && StringUtils.isNotBlank(jsonValue.toString())) {
                     modelNode.setPairEndNodeId(jsonValue.toString());
                 }
-                if ("node".equals(modelNode.getNodeType())) {
+                if ("dashedBox".equals(modelNode.getNodeType())) {
+                    modelNode.setNodeType("node");
+                } else if ("node".equals(modelNode.getNodeType())) {
                     ProductImg productImg = new ProductImg();
                     String dataId = JsonUtils2.getJsonValueByPath(jsonObject, "data/dataId".split("/")).toString();
                     modelNode.setDataId(Long.valueOf(dataId));

--
Gitblit v1.9.1