public IFreeHierarchyObject UpdateSource(List <Info_Balance_FreeHierarchy_Description> descriptions, Dispatcher dispatcher,
                                                 Action onFieldChanged, out bool isAdded)
        {
            isAdded = false;

            //List<Info_Balance_FreeHierarchy_Description> descriptions = null;

            if (_balance != null && descriptions == null)
            {
                descriptions = ARM_Service.BL_GetFreeHierarchyBalanceDescritions(_balance.BalanceFreeHierarchy_UN);
            }

            var sections = ARM_Service.BL_GetFreeHierarchyBalanceSections(BalanceFreeHierarchyTypeID);

            if (sections == null || sections.Count == 0)
            {
                Manager.UI.ShowMessage("Не описаны разделы для данного типа баланса!");
                return(null);
            }

            var source = new List <BalanceFreeHierarchySectionRow>();
            var isExistsDescription = descriptions != null && descriptions.Count > 0;
            var tps        = EnumClientServiceDictionary.GetTps();
            var isFirst    = true;
            var isFirstRow = true;

            IFreeHierarchyObject result = null;

            foreach (var section in sections.Where(s => s.UseInTotalResult))
            {
                var row = new BalanceFreeHierarchySectionRow(section, dispatcher);
                if (isFirst)
                {
                    row.IsSelected = true;
                    isFirst        = false;
                }

                if (isExistsDescription)
                {
                    //Если есть описание данного баланса
                    foreach (var description in descriptions.Where(d => string.Equals(d.BalanceFreeHierarchySection_UN, section.BalanceFreeHierarchySection_UN)).OrderBy(d => d.SortNumber))
                    {
                        var isIntegral = false;
                        IFreeHierarchyObject hierarchyObject = null;
                        if (description.TI_ID.HasValue)
                        {
                            TInfo_TI ti;
                            if (!EnumClientServiceDictionary.TIHierarchyList.TryGetValue(description.TI_ID.Value, out ti) || ti == null)
                            {
                                continue;
                            }
                            hierarchyObject = ti;
                        }
                        if (description.IntegralTI_ID.HasValue)
                        {
                            isIntegral = true;
                            TInfo_TI ti;
                            if (!EnumClientServiceDictionary.TIHierarchyList.TryGetValue(description.IntegralTI_ID.Value, out ti) || ti == null)
                            {
                                continue;
                            }
                            hierarchyObject = ti;
                        }
                        else if (description.TP_ID.HasValue && tps != null)
                        {
                            TPoint tp;
                            if (!tps.TryGetValue(description.TP_ID.Value, out tp) || tp == null)
                            {
                                continue;
                            }
                            hierarchyObject = tp;
                        }
                        else if (!string.IsNullOrEmpty(description.Formula_UN) && EnumClientServiceDictionary.FormulasList != null)
                        {
                            var formula = EnumClientServiceDictionary.FormulasList[description.Formula_UN];
                            hierarchyObject = formula;
                        }
                        else if (!string.IsNullOrEmpty(description.OurFormula_UN))
                        {
                            TFormulaForSection formula;
                            if (!EnumClientServiceDictionary.FormulaFsk.TryGetValue(description.OurFormula_UN, out formula) || formula == null)
                            {
                                continue;
                            }
                            hierarchyObject = formula;
                        }
                        else if (!string.IsNullOrEmpty(description.ContrFormula_UN))
                        {
                            TFormulaForSection formula;
                            if (!EnumClientServiceDictionary.FormulaCA.TryGetValue(description.ContrFormula_UN, out formula) || formula == null)
                            {
                                continue;
                            }
                            hierarchyObject = formula;
                        }
                        else if (description.PTransformator_ID.HasValue)
                        {
                            var transformator = EnumClientServiceDictionary.GetOrAddTransformator(description.PTransformator_ID.Value, null);
                            hierarchyObject = transformator;
                        }
                        else if (description.PReactor_ID.HasValue)
                        {
                            var reactor = EnumClientServiceDictionary.GetOrAddReactor(description.PReactor_ID.Value, null);
                            hierarchyObject = reactor;
                        }
                        else if (description.Section_ID.HasValue)
                        {
                            var      hierarhicalSections = EnumClientServiceDictionary.GetSections();
                            TSection hierarhicalSection;
                            if (hierarhicalSections != null && hierarhicalSections.TryGetValue(description.Section_ID.Value, out hierarhicalSection))
                            {
                                hierarchyObject = hierarhicalSection;
                            }
                        }
                        else if (!string.IsNullOrEmpty(description.FormulaConstant_UN))
                        {
                            var formulaConstant = EnumClientServiceDictionary.FormulaConstantDictionary[description.FormulaConstant_UN];
                            hierarchyObject = formulaConstant;
                        }

                        if (hierarchyObject == null)
                        {
                            continue;
                        }

                        var itemRows = FindDescriptions(description, row, dispatcher);
                        if (itemRows != null)
                        {
                            itemRows.Add(new BalanceFreeHierarchyItemRow(hierarchyObject, description.ChannelType, description.Coef ?? 1, onFieldChanged,
                                                                         description.SortNumber, itemRows, isIntegral, (EnumDataSourceType?)description.DataSource_ID));
                        }

                        //Раскрываем дерево на первом объекте баланса
                        if (isFirstRow)
                        {
                            //fhTree.Dispatcher.BeginInvoke((Action)(() =>
                            //{
                            //    var freeHierTreeId = FormulaEditor_Frame.FindTreeByObjectType(hierarchyObject);
                            //    fhTree.ReloadTree(freeHierTreeId, hierarchyObject: hierarchyObject);
                            //}), DispatcherPriority.Background);

                            result = hierarchyObject;

                            isAdded    = true;
                            isFirstRow = false;
                        }
                    }
                }

                source.Add(row);
            }

            dispatcher.BeginInvoke((Action)(() => Source.AddRange(source)));

            //if (!isAdded)
            //{
            //    Task.Factory.StartNew(() =>
            //    {
            //        Thread.Sleep(100);
            //        //Раскрываем дерево на родителе баланса
            //        fhTree.Dispatcher.BeginInvoke((Action)(() =>
            //           fhTree.ExpandAndSelect(_hierarchyObject, true)), DispatcherPriority.ContextIdle);
            //    });
            //}

            return(result);
        }
Exemplo n.º 2
0
        public static DataTableEx ExecuteValidateValue(FormulasResult formulasResult, ArchivesValidate_List archivesList,
                                                       ArchivesTPValueAllChannels archivesTpList, IVisualDataRequestObjectsNames getNameInterface, List <DateTime> dts)
        {
            if ((archivesList == null || archivesList.Result_Values == null) &&
                (formulasResult == null || formulasResult.Result_Values == null) &&
                (archivesTpList == null || archivesTpList.Result_Values == null))
            {
                return(null);
            }

            int                  countColumn;
            DateTime             dtStart, dtEnd;
            enumTimeDiscreteType discreteType;

            if (archivesList != null && archivesList.Result_Values != null && archivesList.Result_Values.Count > 0)
            {
                dtStart      = archivesList.DTStart;
                dtEnd        = archivesList.DTEnd;
                countColumn  = archivesList.NumbersValues;
                discreteType = archivesList.DiscreteType;
            }
            else if (formulasResult != null && formulasResult.Result_Values != null && formulasResult.Result_Values.Count > 0 &&
                     formulasResult.Result_Values[0].Result_Values != null &&
                     formulasResult.Result_Values[0].Result_Values.Count > 0)
            {
                dtStart      = formulasResult.DTStart;
                dtEnd        = formulasResult.DTEnd;
                countColumn  = formulasResult.NumbersValues;
                discreteType = formulasResult.DiscreteType;
            }
            else if (archivesTpList != null && archivesTpList.Result_Values != null)
            {
                dtStart      = archivesTpList.DTStart;
                dtEnd        = archivesTpList.DTEnd;
                countColumn  = archivesTpList.NumbersValues;
                discreteType = archivesTpList.DiscreteType;
            }
            else
            {
                return(null);
            }

            string labelFormat;

            if (discreteType == enumTimeDiscreteType.DBHours || discreteType == enumTimeDiscreteType.DBHalfHours)
            {
                labelFormat = "dd.MM.yy\nHH:mm";
            }
            else
            {
                labelFormat = "dd.MM.yy";
            }

            var userTable = new DataTableEx()
            {
                FieldForSearch = "NameTI",
            };

            userTable.BeginLoadData();

            try
            {
                #region -------------Таблица для представления данных----------------------------

                userTable.Columns.Add("NameTI", typeof(IFreeHierarchyObject));
                userTable.Columns.Add("Channel", typeof(object));
                userTable.Columns.Add("Parent", typeof(IFreeHierarchyObject));
                userTable.Columns.Add("DataSource", typeof(string));

                var fType = typeof(VALUES_FLAG_DB);

                userTable.Columns.Add(new DataColumn("TotalFlag", fType)
                {
                    Caption = "Итого",
                });

                var i = 0;
                foreach (var dt in dts)
                {
                    userTable.Columns.Add(new DataColumn("Valid" + i, fType)
                    {
                        Caption = dt.ToString(labelFormat),
                    });
                    i++;
                }

                #endregion

                #region ------------Перебираем ТИ в архиве---------------------------------------

                if (archivesList != null && archivesList.Result_Values != null)
                {
                    userTable.Description = new DataTableDescription
                    {
                        DtStart      = archivesList.DTStart,
                        DiscreteType = archivesList.DiscreteType,
                        TimeZoneId   = archivesList.TimeZoneId,
                    };

                    //сортировка
                    foreach (var pair in archivesList.Result_Values
                             .Select(v => new Tuple <TPSHierarchy, TArchivesValidate, TInfo_TI>(
                                         EnumClientServiceDictionary.DetailPSList[v.TI_Validate.PS_ID], v,
                                         v.TI_Validate.TI_Ch_ID.IsCA
                                    ? EnumClientServiceDictionary.TICAList[v.TI_Validate.TI_Ch_ID.TI_ID]
                                    : EnumClientServiceDictionary.TIHierarchyList[v.TI_Validate.TI_Ch_ID.TI_ID]))
                             .Where(v => v.Item1 != null && v.Item3 != null && v.Item2.TI_Validate != null)
                             .OrderBy(v => v.Item2.TI_Validate.TI_Ch_ID.IsCA)
                             .ThenBy(v => v.Item1.Name)
                             .ThenBy(v => v.Item2.TI_Validate.PS_ID)
                             .ThenBy(v => v.Item3.Name)
                             .ThenBy(v => v.Item2.TI_Validate.TI_Ch_ID.TI_ID)
                             .ThenBy(v => v.Item2.TI_Validate.TI_Ch_ID.ChannelType % 10)
                             .ThenBy(v => v.Item2.TI_Validate.TI_Ch_ID.ChannelType))
                    {
                        var archiveValidateValue = pair.Item2;
                        var validate             = archiveValidateValue.TI_Validate;
                        //--------колонки в промежуточную таблицу-----------
                        var row = userTable.NewRow() as DataRowEx;
                        if (validate != null)
                        {
                            row["NameTI"]  = pair.Item3;
                            row["Channel"] = new TTariffPeriodID
                            {
                                ChannelType    = validate.TI_Ch_ID.ChannelType,
                                IsOV           = false,
                                TI_ID          = validate.TI_Ch_ID.TI_ID,
                                StartDateTime  = dtStart,
                                FinishDateTime = dtEnd,
                            };
                            row["Parent"]     = pair.Item1;
                            row["DataSource"] = EnumClientServiceDictionary
                                                .DataSourceTypeList
                                                .FirstOrDefault(v =>
                                                                EqualityComparer <EnumDataSourceType?> .Default.Equals(validate.TI_Ch_ID.DataSourceType,
                                                                                                                       v.Key))
                                                .Value;

                            var id = new ID_Hierarchy
                            {
                                ID            = validate.TI_Ch_ID.TI_ID.ToString(),
                                TypeHierarchy =
                                    validate.TI_Ch_ID.IsCA ? enumTypeHierarchy.Info_ContrTI : enumTypeHierarchy.Info_TI
                            };

                            row["TotalFlag"] = validate.Total_Flag;

                            if (validate.F_FLAG_List != null)
                            {
                                for (var j = 0; j < countColumn; j++)
                                {
                                    var flag = validate.F_FLAG_List.ElementAtOrDefault(j);
                                    row.SetValue("Valid" + j, j, validate.TI_Ch_ID.ChannelType, id, validate.TI_Ch_ID.DataSourceType, null, flag);
                                }
                            }
                        }

                        userTable.Rows.Add(row);
                        validate = archiveValidateValue.ContrTI_Validate;
                        if (validate != null)
                        {
                            row           = userTable.NewRow() as DataRowEx;
                            row["NameTI"] = "ТИ КА -" + getNameInterface.GetHierarchyDbTreeObject(
                                validate.TI_Ch_ID.TI_ID.ToString(),
                                validate.TI_Ch_ID.IsCA
                                                        ? enumTypeHierarchy.Info_ContrTI
                                                        : enumTypeHierarchy.Info_TI);
                            row["Parent"]  = EnumClientServiceDictionary.DetailContrPSList[validate.PS_ID];
                            row["Channel"] = validate.TI_Ch_ID.ChannelType;
                            if (validate.F_FLAG_List != null)
                            {
                                for (var j = 0; j < countColumn; j++)
                                {
                                    var flag = validate.F_FLAG_List.ElementAtOrDefault(j);
                                    row["Valid" + j] = flag;
                                }
                            }

                            row["TotalFlag"] = validate.Total_Flag;
                            userTable.Rows.Add(row);
                        }
                    }
                }

                #endregion

                #region ------------Перебираем формулы---------------------------------------------

                var tps = EnumClientServiceDictionary.GetTps();
                if (tps == null)
                {
                    return(userTable);
                }

                if (formulasResult != null && formulasResult.Result_Values != null)
                {
                    if (userTable.Description == null)
                    {
                        userTable.Description = new DataTableDescription
                        {
                            DtStart      = formulasResult.DTStart,
                            DiscreteType = formulasResult.DiscreteType,
                            TimeZoneId   = formulasResult.TimeZoneId,
                        };
                    }

                    foreach (var pair in formulasResult.Result_Values
                             .Where(fr => fr.Result_Values != null && fr.Result_Values.Count > 0)
                             .Select(fr =>

                                     new Tuple <IFreeHierarchyObject, IFormulaInfo, TFormulaResultsList>(fr.TP_CH_ID != null
                                        ? (IFreeHierarchyObject)tps[fr.TP_CH_ID.TP_ID]
                                        : EnumClientServiceDictionary.DetailPSList[fr.PS_ID],
                                                                                                         fr.GetFormulaInfo(getNameInterface),
                                                                                                         fr))
                             .OrderBy(p => p.Item1 == null ? "Формулы" : p.Item1.Name)
                             .ThenBy(p => p.Item2 == null ? string.Empty : p.Item2.FormulaName))
                    {
                        var formula = pair.Item3;

                        var formulaResult = formula.Result_Values[0];
                        var row           = userTable.NewRow() as DataRowEx;
                        row["NameTI"]  = pair.Item2;
                        row["Channel"] = null;
                        row["Parent"]  = pair.Item1;

                        var totalFlag = VALUES_FLAG_DB.None;

                        enumTypeHierarchy typeHierarchy;
                        switch (pair.Item2.FormulasTable)
                        {
                        case enumFormulasTable.Info_Formula_Description:
                            typeHierarchy = enumTypeHierarchy.Formula;
                            break;

                        case enumFormulasTable.Info_TP2_OurSide_Formula_Description:
                            typeHierarchy = enumTypeHierarchy.Formula_TP_OurSide;
                            break;

                        case enumFormulasTable.Info_TP2_Contr_Formula_Description:
                            typeHierarchy = enumTypeHierarchy.Formula_TP_CA;
                            break;

                        default:
                            typeHierarchy = enumTypeHierarchy.Unknown;
                            break;
                        }

                        var id = new ID_Hierarchy
                        {
                            ID            = formulaResult.FormulaId,
                            TypeHierarchy = typeHierarchy,
                        };

                        if (formulaResult.Val_List != null && formulaResult.Val_List.Count > 0)
                        {
                            for (int j = 0; j < countColumn; j++)
                            {
                                var v = formulaResult.Val_List.ElementAt(j);
                                if (v != null)
                                {
                                    var flag = v.F_FLAG;
                                    row.SetValue("Valid" + j, j, 0, id, null, null, flag);
                                    totalFlag = totalFlag.CompareAndReturnMostBadStatus(flag);
                                }

                                //row.SetIndex(description, j);
                            }
                        }
                        row["TotalFlag"] = totalFlag.AccomulateTotalStatistic();
                        userTable.Rows.Add(row);
                    }
                }

                #endregion

                #region ------------Перебираем ТП в архиве---------------------------------------

                if (archivesTpList == null || archivesTpList.Result_Values == null)
                {
                    return(userTable);
                }

                var sections = EnumClientServiceDictionary.GetSections();
                if (sections == null)
                {
                    return(userTable);
                }

                if (userTable.Description == null)
                {
                    userTable.Description = new DataTableDescription
                    {
                        DtStart      = archivesTpList.DTStart,
                        DiscreteType = archivesTpList.DiscreteType,
                        TimeZoneId   = archivesTpList.TimeZoneId,
                    };
                }

                foreach (var pair in archivesTpList.Result_Values
                         .Select(a =>
                {
                    TPoint tp;
                    tps.TryGetValue(a.Key, out tp);

                    TSection section;
                    sections.TryGetValue(tp.Section_ID, out section);

                    return(new Tuple <TSection, TPoint, List <TArchivesTPValueAllChannels> >(section, tp, a.Value));
                })
                         .Where(p => p.Item1 != null && p.Item2 != null && p.Item3 != null)
                         .OrderBy(p => p.Item1.SectionName)
                         .ThenBy(p => p.Item2.StringName))
                {
                    foreach (var tpArchive in pair.Item3)
                    {
                        if (tpArchive.Val_List == null)
                        {
                            continue;
                        }

                        Dictionary <byte, List <TPointValue> > tpVals;
                        if (!tpArchive.Val_List.TryGetValue(tpArchive.IsMoneyOurSide, out tpVals) || tpVals == null ||
                            tpVals.Count <= 0)
                        {
                            continue;
                        }

                        foreach (var valueByChannel in tpVals)
                        {
                            var row = userTable.NewRow() as DataRowEx;
                            row["NameTI"]  = pair.Item2;
                            row["Channel"] = valueByChannel.Key;
                            row["Parent"]  = pair.Item1;
                            var totalFlag = VALUES_FLAG_DB.None;

                            var id = new ID_Hierarchy
                            {
                                ID            = pair.Item2.TP_ID.ToString(),
                                TypeHierarchy = enumTypeHierarchy.Info_TP,
                            };

                            if (valueByChannel.Value != null && valueByChannel.Value.Count > 0)
                            {
                                for (var j = 0; j < countColumn; j++)
                                {
                                    var v = valueByChannel.Value.ElementAtOrDefault(j);
                                    if (v != null)
                                    {
                                        var flag = v.F_FLAG;
                                        row.SetValue("Valid" + j, j, valueByChannel.Key, id, null, null, flag);
                                        totalFlag = totalFlag.CompareAndReturnMostBadStatus(flag);

                                        //row.SetIndex(description, j);
                                    }
                                }
                            }

                            row["TotalFlag"] = totalFlag.AccomulateTotalStatistic();
                            userTable.Rows.Add(row);
                        }
                    }
                }

                #endregion
            }
            finally
            {
                userTable.EndLoadData();
                userTable.AcceptChanges();
            }

            return(userTable);
        }
        private static ConcurrentDictionary <int, FreeHierarchyTreeItem> GenerateStandartTreeSections(FreeHierarchyTreeDescriptor descriptor)
        {
            var result = new ConcurrentDictionary <int, FreeHierarchyTreeItem>();
            var items  = new List <FreeHierarchyTreeItem>();

            HashSet <ID_TypeHierarchy> objectsHasRightDbSee = null;
            var hiers1 = EnumClientServiceDictionary.HierLev1List.Values;

            if (Manager.User != null && !Manager.User.IsAdmin)
            {
                try
                {
                    //Запрашиваем права на список объектов
                    objectsHasRightDbSee = Manager.User.UserHasRightDbSee(hiers1.Select(h1 => new ID_TypeHierarchy
                    {
                        ID            = h1.Id,
                        TypeHierarchy = enumTypeHierarchy.Dict_HierLev1,
                    }).ToList());
                }
                catch (Exception ex)
                {
                    Manager.UI.ShowMessage("Ошибка запроса прав: " + ex.Message);
                }
            }

            foreach (var item in hiers1.OrderBy(v => v.Item))
            {
                //Глобальный фильтр
                if (!IsGlobalFilterHaveItem(item))
                {
                    continue;
                }

                var minID = descriptor.GetMinIdAndDecrement();
                UserRightsForTreeObject hier1Right;
                var isExistsRight = Manager.User.AccumulateRightsAndVerify(item, EnumObjectRightType.SeeDbObjects, null, out hier1Right);
                if (!isExistsRight && Manager.User != null && !Manager.User.IsAdmin && objectsHasRightDbSee != null)
                {
                    //Проверяем через дочерних объектов
                    isExistsRight = objectsHasRightDbSee.Any(o => o.ID == item.Id && o.TypeHierarchy == item.GetTypeHierarchy());
                }

                var newItem = new FreeHierarchyTreeItem(descriptor, item, nodeName: item.Name)
                {
                    FreeHierItem_ID       = minID,
                    IncludeObjectChildren = true,
                    FreeHierItemType      = EnumFreeHierarchyItemType.HierLev1,
                    NodeRights            = hier1Right
                };

                newItem.Descriptor.Tree = result;
                bool isExistsChildSeeDbObjects = false;
                if (newItem.IncludeObjectChildren)
                {
                    isExistsChildSeeDbObjects = newItem.LoadStaticChildren(isExistsRight, isLoadStatic: true);
                }

                isExistsChildSeeDbObjects = newItem.IncludeChildrenSection(item.Id, item.Type, newItem.Children) || isExistsChildSeeDbObjects ||
                                            item.TIStatus.HasFlag(EnumTIStatus.Is_Section_Enabled);

                //У объекта нет прав на просмотр, или нет дочерних объектов на которые есть такие права
                if (isExistsChildSeeDbObjects) //Включаем только если есть сечения
                {
                    items.Add(newItem);
                }
                else
                {
                    newItem.Dispose();
                }
            }

            //Сечения которые не привязаны ни к чему
            foreach (var section in EnumClientServiceDictionary.GetSections().Values.Where(s => s.ParentId <= 0 && s.Section_ID > 0).OrderBy(s => s.Item))
            {
                UserRightsForTreeObject right;
                if (!Manager.User.AccumulateRightsAndVerify(section, EnumObjectRightType.SeeDbObjects, null, out right))
                {
                    continue;
                }

                var minID = descriptor.GetMinIdAndDecrement();
                FreeHierarchyTreeItem newItem = new FreeHierarchyTreeItem(descriptor, section)
                {
                    FreeHierItem_ID       = minID,
                    IncludeObjectChildren = true,
                    NodeRights            = right,
                    FreeHierItemType      = EnumFreeHierarchyItemType.Section,
                };

                newItem.Descriptor.Tree = result;
                newItem.LoadStaticChildren(true);

                items.Add(newItem);
            }

            if (FreeHierarchyTreeDescriptor.Sort != null)
            {
                FreeHierarchyTreeDescriptor.Sort(items);
            }
            foreach (var i in items)
            {
                result[i.FreeHierItem_ID] = i;
            }
            return(result);
        }