public GetEnergyControl()
        {
            InitializeComponent();

            _window = TMPApplication.ServiceInjector.Instance.GetService <TMPApplication.WpfDialogs.Contracts.IWindowWithDialogs>();
            if (_window == null)
            {
                throw new ArgumentNullException("Not found Window that implementing IWindowWithDialogs");
            }

            CancelCommand = new DelegateCommand(
                o =>
            {
                var r = App.ShowQuestion(Strings.InterruptQuestion);
                if (r == MessageBoxResult.Yes)
                {
                    _cts.Cancel();
                    App.Current.MainWindow.TaskbarItemInfo.ProgressState = System.Windows.Shell.TaskbarItemProgressState.Error;
                }
            },
                o => _cts != null && (_cts.IsCancellationRequested == false));
            CloseControlCommand = new DelegateCommand(o =>
            {
                if (_onClosed != null)
                {
                    _onClosed();
                }
            });

            SaveCommand = new DelegateCommand(o =>
            {
                try
                {
                    if (_list != null)
                    {
                        Microsoft.Win32.SaveFileDialog sfd = new Microsoft.Win32.SaveFileDialog();
                        sfd.Filter             = Strings.DialogCsvFilter;
                        sfd.DefaultExt         = ".csv";
                        sfd.AddExtension       = true;
                        Nullable <bool> result = sfd.ShowDialog(App.Current.MainWindow);
                        if (result == true)
                        {
                            App.Log("Сохранение данных по ПС");
                            StringBuilder sb = new StringBuilder();
                            sb.AppendLine("Ид;Родитель;Название;A+;A-;R+;R-");
                            foreach (var item in _list)
                            {
                                EnergyValues values = (EnergyValues)item.ResultValue;
                                if (values != null && item.IsGroup == false)
                                {
                                    sb.AppendFormat("{0};{1};{2};{3};{4};{5};{6}\n",
                                                    item.Id, item.ParentTypeCode, item.Name,
                                                    values.AEnergyPlus, values.AEnergyMinus,
                                                    values.REnergyPlus, values.REnergyMinus);
                                }
                            }
                            System.IO.File.WriteAllText(sfd.FileName, sb.ToString(), Encoding.UTF8);
                        }
                    }
                }
                catch (Exception ex)
                {
                    _window.ShowDialogError(ex, Strings.ErrorOnSave);
                }
            },
                                              o => _list != null && _list.Count > 0);
            DataContext = this;
        }
        private void Go()
        {
            int itemsCount = _list.Where(i => i.TypeCode == "SUBSTATION").ToList().Count;

            App.Log("Получение суточных значений по " + itemsCount.ToString() + " подстанциям");
            Action <int> report = pos =>
            {
                Progress = 100d * pos / itemsCount;
                TMPApplication.DispatcherExtensions.InUi(() => App.Current.MainWindow.TaskbarItemInfo.ProgressValue = ((double)pos) / itemsCount);
            };

            int index = 0;

            foreach (var item in _list)
            {
                item.Status = ListPointStatus.Ожидание;
            }

            // columns - POINT_ID, POINT_CODE, ML_ID, PL_T, BT, ET, PL_V, DSTATUS
            // 381, А+ энергия за месяц"
            // 382, А- энергия за месяц"
            // 383, R+ энергия за месяц"
            // 384, R- энергия за месяц"
            // 385, А+ энергия за сутки"
            // 386, А- энергия за сутки"
            // 387, R+ энергия за сутки"
            // 388, R- энергия за сутки"
            // 389, Средняя P+ мощность за сутки"
            // 390, Средняя P- мощность за сутки"
            // 391, Средняя Q+ мощность за сутки
            // 392, Средняя Q- мощность за сутки
            // 3489, Максимальная получасовая P- мощность за сутки
            // 2301, Максимальная получасовая P+ мощность за сутки
            // 3490, Максимальная получасовая P- мощность  за месяц
            // 2303, Максимальная получасовая P+ мощность за месяц
            // 3491, Максимальная часовая P- мощность за сутки
            // 2305, Максимальная часовая P+ мощность за сутки
            // 3492, Максимальная часовая P- мощность за месяц
            // 2307, Максимальная часовая P+ мощность за месяц
            // 3497, Максимальная получасовая Q+ мощность за сутки
            // 3498, Максимальная получасовая Q+ мощность за месяц
            // 3499, Максимальная часовая Q+ мощность за сутки
            // 3500, Максимальная часовая Q+ мощность за месяц
            // 3505, Максимальная получасовая Q- мощность за сутки
            // 3506, Максимальная получасовая Q- мощность за месяц
            // 3507, Максимальная часовая Q- мощность за сутки
            // 3508, Максимальная часовая Q- мощность за месяц

            Func <List <ListPointWithResult>, EnergyValues> getResultForPoints = (points) =>
            {
                decimal?aEnergyPlus = null, aEnergyMinus = null, rEnergyPlus = null, rEnergyMinus = null;

                var values = GetValues(points, "[{id:385},{id:386},{id:387},{id:388}]");
                var aplus  = values.Where(r => r.Field <decimal?>("ML_ID") == 385).ToList();
                var aminus = values.Where(r => r.Field <decimal?>("ML_ID") == 386).ToList();
                var rplus  = values.Where(r => r.Field <decimal?>("ML_ID") == 387).ToList();
                var rminus = values.Where(r => r.Field <decimal?>("ML_ID") == 388).ToList();
                foreach (var point in points)
                {
                    EnergyValues energy = (EnergyValues)point.ResultValue;
                    if (energy == null)
                    {
                        point.ResultValue = energy = new EnergyValues();
                    }

                    aEnergyPlus         = GetSummOfValues(aplus, point);
                    aEnergyMinus        = GetSummOfValues(aminus, point);
                    energy.AEnergyPlus  = aEnergyPlus;
                    energy.AEnergyMinus = aEnergyMinus;
                    rEnergyPlus         = GetSummOfValues(rplus, point);
                    rEnergyMinus        = GetSummOfValues(rminus, point);
                    energy.REnergyPlus  = rEnergyPlus;
                    energy.REnergyMinus = rEnergyMinus;
                }
                return(new EnergyValues()
                {
                    AEnergyPlus = points.Sum(i => (i.ResultValue as EnergyValues).AEnergyPlus.HasValue ? (i.ResultValue as EnergyValues).AEnergyPlus : 0),
                    AEnergyMinus = points.Sum(i => (i.ResultValue as EnergyValues).AEnergyMinus.HasValue ? (i.ResultValue as EnergyValues).AEnergyMinus : 0),
                    REnergyPlus = points.Sum(i => (i.ResultValue as EnergyValues).REnergyPlus.HasValue ? (i.ResultValue as EnergyValues).REnergyPlus : 0),
                    REnergyMinus = points.Sum(i => (i.ResultValue as EnergyValues).REnergyMinus.HasValue ? (i.ResultValue as EnergyValues).REnergyMinus : 0)
                });
            };

            foreach (var item in _list)
            {
                if (_cts.IsCancellationRequested)
                {
                    _cts.Token.ThrowIfCancellationRequested();
                    return;
                }

                if (item.TypeCode != "SUBSTATION")
                {
                    continue;
                }
                item.Status = ListPointStatus.Получение;
                try
                {
                    if (item.IsGroup)
                    {
                        EnergyValues energy = (EnergyValues)item.ResultValue;
                        if (energy == null)
                        {
                            item.ResultValue = energy = new EnergyValues();
                        }

                        var auxItems = item.Items.Where(i => i.EсpName == "Свои нужды").ToList();
                        var trItems  = item.Items.Where(i => i.EсpName == "Трансформаторы").ToList();

                        if (auxItems != null && auxItems.Count > 0)
                        {
                            EnergyValues auxResult = getResultForPoints(auxItems);
                            energy.AuxiliaryAPlus  = auxResult.AEnergyPlus;
                            energy.AuxiliaryAMinus = auxResult.AEnergyMinus;
                        }
                        if (trItems != null && trItems.Count > 0)
                        {
                            EnergyValues trResult = getResultForPoints(trItems);
                            energy.AEnergyPlus  = trResult.AEnergyPlus;
                            energy.AEnergyMinus = trResult.AEnergyMinus;
                            energy.REnergyPlus  = trResult.REnergyPlus;
                            energy.REnergyMinus = trResult.REnergyMinus;
                        }

                        foreach (var child in item.Items)
                        {
                            child.Status = ListPointStatus.Готово;
                        }
                    }
                    item.ResultType = "decimal";
                }
                catch (Exception ex)
                {
                    App.Log("ЭНЕРГИЯ ОШИБКА: ид точки - " + item.Id.ToString() + ", название - " + item.Name + ", ошибка - " + App.GetExceptionDetails(ex));
                    item.Status = ListPointStatus.Ошибка;
                }
                item.Status = ListPointStatus.Готово;
                report(++index);
            }
        }