private JsonFTATree Analyze(FTAProject docs, JsonFTATree tree) { var temp = ParseTree(docs, tree); db.FTANodes.RemoveRange(docs.FTANodes); db.FTANodeProperties.RemoveRange(docs.FTANodeProperties); db.FTANodeGates.RemoveRange(docs.FTANodeGates); docs.FTANodes.AddRange(temp.FTANodes); docs.FTANodeProperties.AddRange(temp.FTANodeProperties); docs.FTANodeGates.AddRange(temp.FTANodeGates); db.SaveChanges(); return(tree); }
private FTAProject ParseTree(FTAProject docs, JsonFTATree tree) { FTAProject resultDocs = new FTAProject(); int i = 1; int nodeId = 1; int gateId = 1; try { Dictionary <string, FTANodeGate> gateList = new Dictionary <string, FTANodeGate>(); List <JsonFTANode> FTANodesList = tree.FTANodes.FindAll(item => "square,rectangle,round".Contains(item.ItemType) == true); while (i <= FTANodesList.Count) { var node = FTANodesList[i - 1]; i++; FTANode fn = new FTANode(); fn.Id = nodeId; nodeId++; fn.FTAProjectId = docs.Id; fn.FTAProject = docs; fn.Index = node.Index; fn.EventId = node.Id; fn.NodeName = node.Name; fn.Shape = node.Shape; fn.Size = node.Size; fn.Color = node.Color; fn.X = node.X; fn.Y = node.Y; fn.ParentId = -1; fn.FTANodeGateId = -1; fn.SmallFailureRateQ = node.SmallFailureRateQ; fn.QValueIsModifiedByUser = node.SmallFailureRateQValueType; switch (node.ItemType.ToLower()) { case "square": fn.FTANodeType = db.FTANodeTypes.FirstOrDefault(item => item.Id == ShqConstants.FTANodeTypeRoot); break; case "rectangle": fn.FTANodeType = db.FTANodeTypes.FirstOrDefault(item => item.Id == ShqConstants.FTANodeTypeBrand); break; case "round": fn.FTANodeType = db.FTANodeTypes.FirstOrDefault(item => item.Id == ShqConstants.FTANodeTypeLeaf); break; } fn.FTANodeTypeId = fn.FTANodeType.Id; resultDocs.FTANodes.Add(fn); // 获取属性 var property = tree.FTAProperties.FirstOrDefault(item => item.Name == node.Name); if (property != null) { FTANodeProperties fp = new FTANodeProperties(); fp.Id = Guid.NewGuid(); fp.FTAProjectId = docs.Id; fp.FTAProject = docs; fp.Name = property.Name; fp.DClf = property.DClf; fp.DCrf = property.DCrf; fp.FailureRateQ = property.FailureRateQ; fp.FailureTime = property.FailureTime; fp.InvalidRate = property.InvalidRate; fp.InvalidRateValueIsModifiedByUser = property.InvalidRateValueIsModifiedByUser; fn.FTANodePropertiesId = fp.Id; fn.FTANodeProperties = fp; resultDocs.FTANodeProperties.Add(fp); } // 获取 门 或父亲节点 var edge = tree.FTAEdges.FirstOrDefault(item => item.Target == node.Id); if (edge != null) { var parentNode = tree.FTANodes.FirstOrDefault(item => item.Id == edge.Source); if ("orgate,andgate,nongate".Contains(parentNode.ItemType.ToLower())) { FTANodeGate gate = null; if (gateList.ContainsKey(edge.Source) == false) { gate = new FTANodeGate(); //to do gate.Id = gateId; gate.NodeGateName = parentNode.Name; gate.FTAProjectId = docs.Id; gate.FTAProject = docs; switch (parentNode.ItemType.ToLower()) { case "orgate": gate.FTANodeGateType = db.FTANodeGateTypes.FirstOrDefault(item => item.Id == ShqConstants.FTANodeGateTypeOr); break; case "andgate": gate.FTANodeGateType = db.FTANodeGateTypes.FirstOrDefault(item => item.Id == ShqConstants.FTANodeGateTypeAnd); break; case "nongate": gate.FTANodeGateType = db.FTANodeGateTypes.FirstOrDefault(item => item.Id == ShqConstants.FTANodeGateTypeXor); break; } gate.FTANodeGateTypeId = gate.FTANodeGateType.Id; gateId++; gateList.Add(parentNode.Id, gate); resultDocs.FTANodeGates.Add(gate); } else { gate = gateList[edge.Source]; } fn.FTANodeGateId = gate.Id; var parentEdge = tree.FTAEdges.FirstOrDefault(item => item.Target == edge.Source); if (parentEdge != null) { var grandParentNode = FTANodesList.FirstOrDefault(item => item.Id == parentEdge.Source); if (grandParentNode != null) { fn.ParentId = FTANodesList.IndexOf(grandParentNode) + 1; } } } } } } catch (Exception ex) { throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.NotAcceptable, ex.Message + ex.StackTrace)); } if (resultDocs.FTANodes.Count > 0) { var roots = resultDocs.FTANodes.Where(item => item.ParentId == -1 && item.FTANodeTypeId == 1); if (roots != null && roots.Count() > 1) { throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.NotAcceptable, "根节点有多个")); } foreach (var node in resultDocs.FTANodes) { switch (node.FTANodeTypeId) { case 1: if (resultDocs.FTANodes.FirstOrDefault(item => item.ParentId == node.Id) == null) { throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.NotAcceptable, "根节点没有子节点")); } break; case 2: if (resultDocs.FTANodes.FirstOrDefault(item => item.Id == node.ParentId) == null) { throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.NotAcceptable, "中间节点没有父节点")); } if (resultDocs.FTANodes.FirstOrDefault(item => item.ParentId == node.Id) == null) { throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.NotAcceptable, "中间节点没有子节点")); } break; case 3: if (resultDocs.FTANodes.FirstOrDefault(item => item.ParentId == node.Id) != null) { throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.NotAcceptable, "叶子节点不能有子节点")); } if (resultDocs.FTANodes.FirstOrDefault(item => item.Id == node.ParentId) == null) { throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.NotAcceptable, "叶子节点没有父节点")); } break; } } } else { throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.NotAcceptable, "没有节点")); } int maxLayer = int.Parse(ConfigurationManager.AppSettings["MaxLayer"]); for (int k = 0; k < resultDocs.FTANodes.Count; k++) { int layer = 0; var node = resultDocs.FTANodes[k]; while (node != null && node.ParentId != -1 && layer <= maxLayer) { layer++; node = resultDocs.FTANodes.FirstOrDefault(item => item.Id == node.ParentId); } if (layer == maxLayer) { throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.NotAcceptable, "超出最大允许深度:" + maxLayer)); } resultDocs.FTANodes[k].LayerNumber = layer; } return(resultDocs); }