Exemplo n.º 1
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);
        }
        /// <summary>
        /// Строим суточные интегралы
        /// </summary>
        /// <param name="archiveIntegrals">Интегралы</param>
        /// <param name="getNameInterface"></param>
        /// <param name="dts">Даты/время</param>
        /// <returns></returns>
        public static DataTableEx ExecuteDailyIntegrals(ArchTariffIntegralsTIs archiveIntegrals, enumTimeDiscreteType discreteType)
        {
            if (archiveIntegrals == null || archiveIntegrals.IntegralsValue30orHour == null)
            {
                return(null);
            }

            if (discreteType < enumTimeDiscreteType.DB24Hour)
            {
                //Допускается только 3 периода дискретизации
                discreteType = enumTimeDiscreteType.DB24Hour;
            }

            var unitDigitCoeff = (double)archiveIntegrals.UnitDigit;
            var dtStart        = archiveIntegrals.DTStart;
            var dtEnd          = archiveIntegrals.DTEnd; //Округляем до суток

            var dts = Extention.GetDateTimeListForPeriod(dtStart, dtEnd,
                                                         discreteType, archiveIntegrals.TimeZoneId.GeTimeZoneInfoById());

#if DEBUG
            var sw = new System.Diagnostics.Stopwatch();
            sw.Start();
#endif
            var userTable = new DataTableEx()
            {
                FieldForSearch = "NameTI",
            };

            userTable.BeginLoadData();
            try
            {
                #region Создаем основные колонки

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

                #endregion

                #region Посуточные колонки

                var sufixFormat = "dd.MM.yyyy";
                var prefixs     = new List <string>
                {
                    "_OnStart",
                    "_OnEnd",
                    "_Delta",
                }; //Строим 3 колонки по каждой дате

                foreach (var d in dts)
                {
                    var    startCaption = d.ToString(sufixFormat);
                    var    endCaption   = "";
                    string groupLabel;
                    switch (discreteType)
                    {
                    case enumTimeDiscreteType.DB24Hour:
                        groupLabel = "За " + startCaption;
                        endCaption = d.AddDays(1).ToString(sufixFormat);
                        break;

                    case enumTimeDiscreteType.DBMonth:
                        groupLabel = "За " + d.ToString("MMMM yyyy");
                        endCaption = d.AddMonths(1).ToString(sufixFormat);
                        break;

                    default:
                        groupLabel = "За период c " + dtStart.ToString("dd.MM.yyyy HH:mm") + " по " + dtEnd.ToString("dd.MM.yyyy HH:mm");
                        endCaption = dtEnd.Date.AddDays(1).ToString(sufixFormat);
                        break;
                    }

                    foreach (var prefix in prefixs)
                    {
                        var col = new DataColumnEx(prefix + startCaption, typeof(IConvertible));
                        switch (prefix)
                        {
                        case "_OnStart":
                            col.Caption = startCaption;
                            break;

                        case "_OnEnd":
                            col.Caption = endCaption;
                            break;

                        default:
                            col.Caption  = "Расход";
                            col.IsFValue = true;
                            break;
                        }

                        col.GroupName = groupLabel;


                        userTable.Columns.Add(col);
                    }
                }

                #endregion

                #region Наполняем содержимым

                var rd = TimeSpan.FromDays(1);

                foreach (var tiVal in archiveIntegrals.IntegralsValue30orHour)
                {
                    if (tiVal.Val_List == null)
                    {
                        continue;
                    }

                    var row = userTable.NewRow() as DataRowEx;



                    TPSHierarchy ps;
                    if (EnumClientServiceDictionary.DetailPSList.TryGetValue(tiVal.PS_ID, out ps))
                    {
                        row["Parent"] = ps;
                    }

                    TInfo_TI ti;
                    if (EnumClientServiceDictionary.TIHierarchyList.TryGetValue(tiVal.TI_Ch_ID.TI_ID, out ti))
                    {
                        row["NameTI"] = ti;
                    }

                    row["Coeff"] = tiVal.CoeffTransformation;

                    row["Channel"] = new TTariffPeriodID
                    {
                        ChannelType    = tiVal.TI_Ch_ID.ChannelType,
                        IsOV           = false,
                        TI_ID          = tiVal.TI_Ch_ID.TI_ID,
                        StartDateTime  = dtStart,
                        FinishDateTime = dtEnd,
                    };

                    row["DataSource"] = EnumClientServiceDictionary
                                        .DataSourceTypeList
                                        .FirstOrDefault(v =>
                                                        EqualityComparer <EnumDataSourceType?> .Default.Equals(tiVal.TI_Ch_ID.DataSourceType,
                                                                                                               v.Key))
                                        .Value;

                    DateTime?startRangeDt = null, endRangeDt = null; //Обрабатываемый диапазон
                    var      rangeDiff = 0.0;                        //накопленный расход за диапазон
                    var      ranfeFlag = VALUES_FLAG_DB.None;        //Состояние интегралов за диапазон
                    var      isFirst   = true;

                    //Перебираем интегралы
                    foreach (var iVal in tiVal.Val_List.OrderBy(d => d.EventDateTime))
                    {
                        if (isFirst)
                        {
                            row["CoeffLosses"] = iVal.CoeffLosses ?? 1;

                            isFirst = false;
                        }

                        var roundedDt = iVal.EventDateTime.Round(rd);

                        //Это новая запись или переход на следующую дату/время
                        if (!startRangeDt.HasValue || roundedDt >= endRangeDt)
                        {
                            if (iVal.IsIntegralType)
                            {
                                //Эта дата осталась от предыдущего диапазона, надо закрыть диапазона
                                if (startRangeDt.HasValue)
                                {
                                    row["_OnEnd" + startRangeDt.Value.ToString(sufixFormat)] = iVal.F_VALUE / unitDigitCoeff;
                                    row["_Delta" + startRangeDt.Value.ToString(sufixFormat)] = new TVALUES_DB
                                    {
                                        F_VALUE = rangeDiff,
                                        F_FLAG  = ranfeFlag,
                                    };
                                }

                                if (roundedDt > dtEnd)
                                {
                                    break;
                                }

                                //Теперь новый диапазон

                                switch (discreteType)
                                {
                                case enumTimeDiscreteType.DB24Hour:
                                    //Первая дата/время нового диапазона
                                    startRangeDt = new DateTime(roundedDt.Year, roundedDt.Month, roundedDt.Day);
                                    //Последняя дата/время нового диапазона
                                    endRangeDt = startRangeDt.Value.AddDays(1);
                                    break;

                                case enumTimeDiscreteType.DBMonth:
                                    //Первая дата/время нового диапазона
                                    startRangeDt = new DateTime(roundedDt.Year, roundedDt.Month, 1);
                                    //Последняя дата/время нового диапазона
                                    endRangeDt = startRangeDt.Value.AddMonths(1);
                                    break;

                                default:
                                    //Первая дата/время нового диапазона
                                    startRangeDt = dtStart.Date;
                                    //Последняя дата/время нового диапазона
                                    endRangeDt = dtEnd.Date.AddDays(1);
                                    break;
                                }

                                row["_OnStart" + startRangeDt.Value.ToString(sufixFormat)] = iVal.F_VALUE / unitDigitCoeff;

                                rangeDiff = 0;
                                ranfeFlag = VALUES_FLAG_DB.None;
                            }
                        }

                        rangeDiff += iVal.F_VALUE_DIFF / unitDigitCoeff;
                        ranfeFlag  = ranfeFlag.CompareAndReturnMostBadStatus(iVal.F_FLAG);
                    }

                    userTable.Rows.Add(row);
                }

                #endregion
            }
            finally
            {
                userTable.EndLoadData();
                userTable.AcceptChanges();
            }
#if DEBUG
            sw.Stop();
            Console.WriteLine("ExecuteDailyIntegralsExpand - > {0} млс", sw.ElapsedMilliseconds);
#endif
            return(userTable);
        }