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