private FiderGraph GetFiderGraph(TMP.DWRES.Objects.Fider fider)
        {
            // получаем схему фидера
            _graphScheme = _dwh.GetFiderLines(fider);

            // строим граф фидера
            return(MakeGraph(_graphScheme.GraphVertities, _graphScheme.GraphEdges));
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Возвращает список участков схемы фидера
        /// </summary>
        /// <param name="fider">Фидер</param>
        /// <returns>Список участков схемы, список вершин графа схемы</returns>
        public FiderScheme GetFiderLines(Model.Fider fider)
        {
            FiderScheme result = new FiderScheme();

            string query;

            int id_fider   = fider.ID;
            int id_sect_nn = fider.ID_Sect_NN;

            // словарь вершин ИД вершин схемы фидера
            ICollection <Model.LineVertex> linesVertities = GetLinesVertities(id_fider);
            // список вершин графа схемы фидера
            List <Graph.FiderGraphVertex> vertitiesList = new List <Graph.FiderGraphVertex>(linesVertities.Count);
            // словарь вершин графа схемы фидера
            Dictionary <int, Graph.FiderGraphVertex> vertities = new Dictionary <int, Graph.FiderGraphVertex>(linesVertities.Count);

            // список ребер графа схемы фидера
            List <Graph.FiderGraphEdge> edges = new List <Graph.FiderGraphEdge>();

            // заполняем словарь вершин
            foreach (Model.LineVertex item in linesVertities)
            {
                Graph.FiderGraphVertex vertex = new Graph.FiderGraphVertex(item.ID);
                vertitiesList.Add(vertex);
                vertities.Add(item.ID, vertex);
            }

            // список ребер графа схемы фидера

            // список участков схемы фидера (узел задан ИД и названием)
            List <Model.Line> linesWithNodeNameList = new List <Model.Line>();

            #region Таблица для поиска названия узла ТП по его ИД

            Dictionary <int, string> dictionaryNodeTPNames = new Dictionary <int, string>();
            query = String.Format(
                @"SELECT NODELINKS.ID, CAST((TP.NAME||'/'||SECTTP.NAME) AS CHAR(100)) NODE_NAME
                      FROM TP
                      INNER JOIN SECTTP
                      ON (SECTTP.ID_PST = TP.ID)
                      INNER JOIN NODELINKS
                      ON (SECTTP.ID_NODELINKS = NODELINKS.ID)
                      WHERE NODELINKS.NODE_TYPE=1", id_fider);
            try
            {
                using (var command = new FbCommand(query, fbConnection))
                {
                    if (fbConnection.State == System.Data.ConnectionState.Closed)
                    {
                        fbConnection.Open();
                    }
                    FbDataReader reader = command.ExecuteReader();
                    if (reader.HasRows)
                    {
                        try
                        {
                            while (reader.Read())
                            {
                                int    key   = reader[0] != DBNull.Value ? (int)reader[0] : default(int);
                                string value = reader[1] != DBNull.Value ? (string)reader[1] : default(string);

                                dictionaryNodeTPNames.Add(key, value);
                            }
                        }
                        finally { reader.Close(); }
                    }
                }
            }
            catch (Exception ex)
            {
                HasError      = true;
                LastException = ex;
                return(result);
            }

            #endregion Таблица для поиска названия узла ТП по его ИД

            #region Таблица для поиска названия узла по его ИД

            Dictionary <int, string> dictionaryNodeNames = new Dictionary <int, string>();
            query = String.Format(
                @"SELECT NODELINKS.ID, NODE.NAME NODE_NAME
                      FROM NODE
                      INNER JOIN NODELINKS
                      ON (NODE.ID_NODELINKS = NODELINKS.ID)
                      WHERE NODELINKS.NODE_TYPE=2 AND NODELINKS.ID IN
                      (
                        SELECT LINE.ID_NODE1 NODEID FROM LINE
                        WHERE LINE.ID_FIDER = {0}
                        UNION
                        SELECT LINE.ID_NODE2 NODEID FROM LINE
                        WHERE LINE.ID_FIDER = {0}
                      )", id_fider);
            try
            {
                using (var command = new FbCommand(query, fbConnection))
                {
                    if (fbConnection.State == System.Data.ConnectionState.Closed)
                    {
                        fbConnection.Open();
                    }
                    FbDataReader reader = command.ExecuteReader();
                    if (reader.HasRows)
                    {
                        try
                        {
                            while (reader.Read())
                            {
                                int    key   = reader[0] != DBNull.Value ? (int)reader[0] : default(int);
                                string value = reader[1] != DBNull.Value ? (string)reader[1] : default(string);

                                if (dictionaryNodeNames.ContainsKey(key) == false)
                                {
                                    dictionaryNodeNames.Add(key, value);
                                }
                            }
                        }
                        finally { reader.Close(); }
                    }
                }
            }
            catch (Exception ex)
            {
                HasError      = true;
                LastException = ex;
                return(result);
            }
            #endregion Таблица для поиска названия узла по его ИД

            #region Таблица для поиска названия узла подстанции по его ИД

            Dictionary <int, string> dictionaryNodePSTName = new Dictionary <int, string>();
            query = String.Format(
                @"SELECT NODELINKS.ID, CAST(('[ЦП] - '||PST.NAME||'/'||SECTPST.NAME) AS CHAR(100)) NODE_NAME
                      FROM PST
                      INNER JOIN SECTPST
                      ON  (SECTPST.ID_PST = PST.ID)
                      INNER JOIN NODELINKS
                      ON  (SECTPST.ID_NODELINKS = NODELINKS.ID)
                      WHERE NODELINKS.NODE_TYPE=3 AND SECTPST.ID = {0}", id_sect_nn);
            try
            {
                using (var command = new FbCommand(query, fbConnection))
                {
                    if (fbConnection.State == System.Data.ConnectionState.Closed)
                    {
                        fbConnection.Open();
                    }
                    FbDataReader reader = command.ExecuteReader();
                    if (reader.HasRows)
                    {
                        try
                        {
                            while (reader.Read())
                            {
                                int    key   = reader[0] != DBNull.Value ? (int)reader[0] : default(int);
                                string value = reader[1] != DBNull.Value ? (string)reader[1] : default(string);

                                dictionaryNodePSTName.Add(key, value);
                            }
                        }
                        finally { reader.Close(); }
                    }
                }
            }
            catch (Exception ex)
            {
                HasError      = true;
                LastException = ex;
                return(result);
            }
            #endregion Таблица для поиска названия узла подстанции по его ИД

            // список участков схемы фидера (узел задан ИД)
            ICollection <Model.Line> lineNodesList = GetLines(id_fider);
            // цикл по всем участкам схемы фидера
            int edgeIndex = 1;
            foreach (var item in lineNodesList)
            {
                FillVertexProperties(item.NodeStartId, ref dictionaryNodeTPNames, ref dictionaryNodeNames, ref dictionaryNodePSTName, ref vertities);
                FillVertexProperties(item.NodeEndId, ref dictionaryNodeTPNames, ref dictionaryNodeNames, ref dictionaryNodePSTName, ref vertities);

                item.NodeStart = vertities[item.NodeStartId].Name;
                item.NodeEnd   = vertities[item.NodeEndId].Name;

                edges.Add(new Graph.FiderGraphEdge(edgeIndex, vertities[item.NodeStartId], vertities[item.NodeEndId]));
                edgeIndex++;
            }

            result.Lines          = lineNodesList;
            result.GraphVertities = vertitiesList;
            result.GraphEdges     = edges;

            return(result);
        }