public Dictionary <string, DetailFieldInfo> AddColumnsTi(ref int k, ArchivesValues_List2 archivesList, bool isSumTiForChart, bool isDetailOv) { var result = new Dictionary <string, DetailFieldInfo>(); if (archivesList == null || archivesList.ArchiveValues == null) { return(result); } var objectType = typeof(ObjectIdCollection); var vType = typeof(IFValue); if (isSumTiForChart) { #region Нужно просумировать поканально все ТИ var tiValues = new List <TArchivesValue>(); //Перебираем ТИ foreach (var aVals in archivesList.ArchiveValues.Values) { tiValues.AddRange(aVals); } var dataSourcePair = EnumClientServiceDictionary.DataSourceTypeList.FirstOrDefault(); //Перебираем каналы foreach (var aVals in tiValues.GroupBy(a => a.TI_Ch_ID.DataSourceType)) { var valuesDict = new Dictionary <byte, Dictionary <int, IFValue> >(); if (dataSourcePair.Key != aVals.Key) { dataSourcePair = EnumClientServiceDictionary.DataSourceTypeList.FirstOrDefault(ds => ds.Key.HasValue && ds.Key.Value == aVals.Key); } foreach (var aVal in aVals.OrderBy(a => a.TI_Ch_ID.ChannelType)) { if (aVal.Val_List == null) { continue; } Dictionary <int, IFValue> chVals; if (!valuesDict.TryGetValue(aVal.TI_Ch_ID.ChannelType, out chVals)) { var columnName = "F_VALUE" + k; //Это новая колонка var col = new DataColumn(columnName, vType) { Caption = "Сумма по " + ChannelFactory.ChanelTypeNameFSK[aVal.TI_Ch_ID.ChannelType] + "\n" + (dataSourcePair.Value ?? "По приоритету") }; Columns.Add(col); k++; chVals = new Dictionary <int, IFValue>(); valuesDict[aVal.TI_Ch_ID.ChannelType] = chVals; result[columnName] = new DetailFieldInfo { ColumnName = columnName, Id = null, DataSource = aVals.Key, MeasureUnitUn = null, Values = chVals, ChannelType = aVal.TI_Ch_ID.ChannelType, }; } //Суммируем поканально for (var i = 0; i < aVal.Val_List.Count; i++) { var v = aVal.Val_List[i]; IFValue r;; if (!chVals.TryGetValue(i, out r) || r == null) { chVals.Add(i, new TVALUES_DB { F_FLAG = v.F_FLAG, F_VALUE = v.F_VALUE }); } else { r.F_VALUE += v.F_VALUE; r.F_FLAG = r.F_FLAG.CompareAndReturnMostBadStatus(v.F_FLAG); } } } } #endregion } else { #region Просто добавляем колонки по каждой ТИ var comparer = new IFreeHierarchyObjectComparerTyped(); var freeHierarchyComparer = new IFreeHierarchyObjectEqualityComparer(); foreach (var groupByObject in archivesList.ArchiveValues .Select(pair => { var ti = EnumClientServiceDictionary.TIHierarchyList[pair.Key]; if (ti == null) { return(null); } var ps = EnumClientServiceDictionary.DetailPSList[ti.PS_ID]; if (ps == null) { return(null); } return(new Tuple <IFreeHierarchyObject, IFreeHierarchyObject, List <TArchivesValue> >(ps, ti, pair.Value)); }) .Where(tuple => tuple != null) .OrderBy(tuple => tuple.Item1, comparer) //сначала сортируем по ПС .ThenBy(tuple => tuple.Item2, comparer) .GroupBy(tuple => tuple.Item2, freeHierarchyComparer)) //Группируем по объекту { var id = new ID_Hierarchy { ID = groupByObject.Key.Id.ToString(), TypeHierarchy = groupByObject.Key.Type, }; foreach (var objects in groupByObject) { var isOv = false; Dictionary <int, TDateTimeOV> tiReplaced = null; #region Добавление обычных колонок //Теперь сортируем по категории ед.измерения foreach (var tiValue in objects.Item3.OrderBy(aVal => aVal.TI_Ch_ID.ChannelType) .ThenBy(aVal => aVal.MeasureUnit_UN == null) .ThenBy(aVal => aVal.MeasureUnit_UN)) { //Обходной ли это выключатель isOv = tiValue.IsOV;// && tiValue.TiByOvReplaced != null && tiValue.TiByOvReplaced.Count > 0; if (tiReplaced == null) { tiReplaced = tiValue.TiByOvReplaced; } var columnName = "F_VALUE" + k; if (isOv) { Columns.Add(new DataColumn(columnName, typeof(TOvValue)) { ReadOnly = true, }); } else { Columns.Add(new DataColumn(columnName, vType) { ReadOnly = true, }); } k++; result[columnName] = new DetailFieldInfo { ColumnName = columnName, Id = id, DataSource = tiValue.TI_Ch_ID.DataSourceType, MeasureUnitUn = tiValue.MeasureUnit_UN, Values = tiValue.Val_List.Select((s, i) => new { s, i }).ToDictionary(v => v.i, v => v.s as IFValue), ChannelType = tiValue.TI_Ch_ID.ChannelType, UseMeasureModule = string.IsNullOrEmpty(tiValue.MeasureUnit_UN), IsOv = isOv, TiReplaced = tiValue.TiByOvReplaced, }; } #endregion #region Если это ОВ, добавляем колонки о замещаемых ТИ if (isOv && isDetailOv) { #region Это колонка с информацией о замещаемой ТИ var columnName = "ovInfo" + k; //По названию определяемся что это информация об ОВ Columns.Add(new DataColumn(columnName, objectType) { ReadOnly = true, }); result[columnName] = new DetailFieldInfo { ColumnName = columnName, Id = new ID_Hierarchy { ID = id.ID, TypeHierarchy = enumTypeHierarchy.Info_TI, }, DataSource = null, MeasureUnitUn = null, Values = null, ChannelType = 0, TiReplaced = tiReplaced, }; #endregion //Объекты которые замещает ОВ foreach (var tiValue in objects.Item3.OrderBy(aVal => aVal.TI_Ch_ID.ChannelType) .ThenBy(aVal => aVal.MeasureUnit_UN == null) .ThenBy(aVal => aVal.MeasureUnit_UN)) { if (tiValue.TiByOvReplaced != null) { foreach (var replacedTi in tiValue.TiByOvReplaced) { var groupByReplacedTiName = "ovValue_" + id.ID + "_" + replacedTi.Key + "_"; columnName = groupByReplacedTiName + tiValue.TI_Ch_ID.ChannelType + (tiValue.TI_Ch_ID.DataSourceType.HasValue ? tiValue.TI_Ch_ID.DataSourceType.Value.ToString() : string.Empty); Columns.Add( new DataColumn(columnName, vType) //Это колонка со значениями замещаемых ТИ { ReadOnly = true, }); result[columnName] = new DetailFieldInfo { ColumnName = columnName, Id = new ID_Hierarchy { ID = tiValue.TI_Ch_ID.TI_ID.ToString(), TypeHierarchy = enumTypeHierarchy.Info_TI, }, DataSource = tiValue.TI_Ch_ID.DataSourceType, MeasureUnitUn = tiValue.MeasureUnit_UN, Values = tiValue.Val_List.Select((s, i) => new { s, i }).ToDictionary(v => v.i, v => v.s as IFValue), ChannelType = tiValue.TI_Ch_ID.ChannelType, TiReplaced = tiValue.TiByOvReplaced, ReplacedId = new ID_Hierarchy { ID = replacedTi.Key.ToString(), TypeHierarchy = enumTypeHierarchy.Info_TI, }, GroupByReplacedTiName = groupByReplacedTiName, UseMeasureModule = string.IsNullOrEmpty(tiValue.MeasureUnit_UN) }; } } } } #endregion } } #endregion } return(result); }
public Dictionary <string, DetailFieldInfo> AddColumnsBalances(ref int k, BalanceFreeHierarchyResults balanceFreeHierarchy) { var result = new Dictionary <string, DetailFieldInfo>(); if (balanceFreeHierarchy == null || balanceFreeHierarchy.CalculatedValues == null) { return(result); } var objectType = typeof(ObjectIdCollection); var vType = typeof(IFValue); var comparer = new IFreeHierarchyObjectComparerTyped(); var freeHierarchyComparer = new IFreeHierarchyObjectEqualityComparer(); foreach (var balance in balanceFreeHierarchy.CalculatedValues.Values) { if (balance.CalculatedByDiscretePeriods == null || balance.CalculatedByDiscretePeriods.Count == 0) { continue; } var id = new ID_Hierarchy { ID = balance.BalanceFreeHierarchyUn, TypeHierarchy = enumTypeHierarchy.UniversalBalance }; #region Перебираем подгруппы //Фактический небаланс,кВт (по модулю) FactUnbalanceValue var columnName = "FactUnbalanceValue" + k; Columns.Add(new DataColumn(columnName, vType) { ReadOnly = true, }); k++; result[columnName] = new DetailFieldInfo { ColumnName = columnName, Id = id, UseMeasureModule = true, //MeasureUnitUn = tiValue.MeasureUnit_UN, BalanceValues = balance.CalculatedByDiscretePeriods, }; //Фактический небаланс,% columnName = "FactUnbalancePercent" + k; Columns.Add(new DataColumn(columnName, vType) { ReadOnly = true, }); k++; result[columnName] = new DetailFieldInfo { ColumnName = columnName, Id = id, UseMeasureModule = false, MeasureUnitUn = "RatioUnit.Percent", BalanceValues = balance.CalculatedByDiscretePeriods, }; #endregion } return(result); }
private Tuple <List <IDHierarchy>, string, CancellationToken> InvokeSearch(string text, string parentText, enumTypeHierarchy?typeHierarchy, CancellationToken token) { var needFindTI = _descriptor.NeedFindTI; var needFindUaNode = _descriptor.NeedFindUaNode; var needFindTransformatorsAndreactors = _descriptor.NeedFindTransformatorsAndreactors; //Необходим поиск трансформаторов и реакторов по базе (т.к. еще не подгрузились) var freeHierTreeId = _descriptor.Tree_ID ?? -101; var findUspdAndE422InTree = _descriptor.ShowUspdAndE422InTree; var tiComparer = new IFreeHierarchyObjectComparerTyped(); var objectComparer = new HierarchyObjectFoundedComparer(); var foundedObjects = new ConcurrentStack <IDHierarchy>(); #if DEBUG System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); sw.Start(); #endif Parallel.Invoke(() => { //if (_findTiType == EnumFindTiType.Pik) return; try { //поиск прочих объектов var hierObjects = ARM_Service.TREE_FindHierObject(text, parentText, Manager.User.User_ID, freeHierTreeId, _findTiType.ToString(), findUspdAndE422InTree, typeHierarchy); if (hierObjects != null && hierObjects.Count > 0) { foundedObjects.PushRange(hierObjects.OrderBy(h => h.TypeHierarchy).ThenByDescending(h => h, objectComparer).ToArray()); } } catch (Exception ex) { Manager.UI.ShowMessage(ex.Message); } }, () => { if (!needFindTransformatorsAndreactors) { return; } try { //Поиск трансформаторов и реакторов var reactorsAndTransformators = ServiceFactory.ArmServiceInvokeSync <Tuple <List <Hard_PTransformator>, List <Hard_PReactors> > >("TREE_TransformatorOrReactor", text); if (reactorsAndTransformators != null) { if (reactorsAndTransformators.Item1 != null) { reactorsAndTransformators.Item1.ForEach(transformator => { foundedObjects.Push( EnumClientServiceDictionary.GetOrAddTransformator(transformator.PTransformator_ID, transformator)); }); } if (reactorsAndTransformators.Item2 != null) { reactorsAndTransformators.Item2.ForEach(reactor => { foundedObjects.Push( EnumClientServiceDictionary.GetOrAddReactor(reactor.PReactor_ID, reactor)); }); } } } catch (Exception ex) { Manager.UI.ShowMessage(ex.Message); } }, () => { //Поиск узлов OPC на дереве if (!needFindUaNode) { return; } try { var opcNodes = UAService.Service.UA_FindNode(text, freeHierTreeId, _findTiType == EnumFindTiType.MeterSerialNumber ? "UANode_ID" : null); // "UANode_ID" if (opcNodes != null && opcNodes.Count > 0) { //Предварительная прогрузка узлов с типами найденных узлов (чтобы визуалка не тормозила) UAHierarchyDictionaries.UANodesDict.Prepare(new HashSet <long>(opcNodes .Where(fn => fn.Node.UATypeNode_ID.HasValue) .Select(fn => fn.Node.UATypeNode_ID.Value))); foundedObjects.PushRange(opcNodes.ToArray()); } } catch (Exception ex) { Manager.UI.ShowMessage(ex.Message); } }); #if DEBUG sw.Stop(); Console.WriteLine("Поиск {0} млс", sw.ElapsedMilliseconds); #endif //Отмена поиска if (token.IsCancellationRequested) { return(null); } //Подготавливаем словари Task.Factory.StartNew(() => FreeHierarchyTreePreparer.PrepareGlobalDictionaries(foundedObjects, token: token)); return(new Tuple <List <IDHierarchy>, string, CancellationToken>(foundedObjects.OrderByDescending(d => d.TypeHierarchy).ToList(), text, token)); }