コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        public async Task <IHttpActionResult> TestFormat(JsonFTATree tree)
        {
            await db.SaveChangesAsync();

            return(Ok(tree));
        }