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