示例#1
0
        public override void Execute(object parameter)
        {
            var doc    = (DocumentView)((DataSourceProvider)System.Windows.Application.Current.MainWindow.DataContext).Data;
            var folder = (FolderView)parameter;

            try
            {
                var keyPath             = Tools.JsonIO.DefaultIfEmptyDir(doc.KeyPath);
                var accountEmailAddress = doc.AccountEmailAddress;
                var ids = doc.IDs;

                var requests        = folder.Requests;
                var fileName        = folder.FileName;
                var applicationName = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;

                //загрузить весь DataSet
                var     ext = System.IO.Path.GetExtension(fileName);//
                DataSet ds;
                if (System.IO.File.Exists(fileName))
                {
                    switch (ext)
                    {
                    case ".json":
                        ds = JsonIO.Open <DataSet>(fileName);
                        break;

                    case ".xlsx":
                        ds = new DataSet();
                        ds.Tables.AddRange(
                            requests
                            .Select(e => GetData.FromExcel(JsonIO.DefaultIfEmptyDir(fileName), e.Title, null))
                            .ToArray());

                        break;

                    case ".xml":
                        throw new NotImplementedException("Актуализация XML еще не поддерживается");
                    //TODO сделать поддержку XML
                    //break;

                    default:
                        ds = new DataSet();
                        break;
                    }
                }
                else
                {
                    ds = new DataSet();
                }

                foreach (var request in requests)
                {
                    var title = request.Title;

                    var startDate  = String.IsNullOrEmpty(request.StartDate) ? folder.StartDate : request.StartDate;
                    var endDate    = String.IsNullOrEmpty(request.EndDate) ? folder.EndDate : request.EndDate;
                    var metrics    = String.IsNullOrEmpty(request.Metrics) ? folder.Metrics : request.Metrics;
                    var dimensions = String.IsNullOrEmpty(request.Dimensions) ? folder.Dimensions : request.Dimensions;
                    var filters    = String.IsNullOrEmpty(request.Filters) ? folder.Filters : request.Filters;
                    var segment    = String.IsNullOrEmpty(request.Segment) ? folder.Segment : request.Segment;
                    var sort       = String.IsNullOrEmpty(request.Sort) ? folder.Sort : request.Sort;
                    var maxResults = request.MaxResults;

                    bool desample = folder.Desample || request.Desample;

                    //выбрать таблицу, если пустая - потом просто добавим, если непустая, то обработаем
                    var str_isoYearIsoWeek = "isoYearIsoWeek";

                    if (ds.Tables.Contains(title) && ds.Tables[title].Columns.Contains(str_isoYearIsoWeek))
                    {//только если в измерениях есть неделя, остальные случаи необходимо доработать
                     //Обрабатываем
                        var dt = ds.Tables[title];

                        //определить актуальность таблицы по последней неделе
                        //определяем год и номер последней недели
                        var lastIsoYearIsoWeek = dt.AsEnumerable().LastOrDefault().Field <string>(str_isoYearIsoWeek);

                        //определяем понедельник предыдущей недели
                        var lastDate           = GetDateByWeek(lastIsoYearIsoWeek);
                        var prevDate           = lastDate.AddDays(-7);
                        var prevIsoYearIsoWeek = string.Format("{0}{1}", prevDate.Year, WeekNumber(prevDate));

                        //удаляем лишние строки, где год-неделя соответствуют неактуальным датам
                        var rowsToRemove = dt.AsEnumerable()
                                           .Where(e => e.Field <string>(str_isoYearIsoWeek) == prevIsoYearIsoWeek || e.Field <string>(str_isoYearIsoWeek) == lastIsoYearIsoWeek)
                                           .ToArray();

                        foreach (var element in rowsToRemove)
                        {
                            dt.Rows.Remove(element);
                        }

                        //выполняем запрос начиная с актуальной даты
                        var dt2 = GaAccess
                                  .GetGaData(keyPath, accountEmailAddress, applicationName, ids, prevDate.ToString(datePattern), endDate, metrics, dimensions, filters, segment, sort, maxResults, desample)
                                  .ToDataTable(title, dimensions.Split(',').Count());

                        foreach (var element in dt2.AsEnumerable())
                        {
                            var row = dt.NewRow();
                            for (int i = 0; i < dt.Columns.Count; i++)
                            {
                                row[i] = element[i];
                            }

                            dt.Rows.Add(row);
                        }

                        dt.AcceptChanges();
                    }
                    else
                    {
                        //просто выполняем и добавляем

                        ds.Tables.Add(GaAccess
                                      .GetGaData(keyPath, accountEmailAddress, applicationName, ids, startDate, endDate, metrics, dimensions, filters, segment, sort, maxResults, desample)
                                      .ToDataTable(title, dimensions.Split(',').Count()));
                    }
                }

                //после выполнения всего раздела, если название файла не пустое, то объединить все файлы в один
                if (!String.IsNullOrEmpty(fileName))
                {
                    ds.SaveAs(fileName);
                }

                MessageBox.Show(string.Format("{0} {1} {2}", Properties.Resources.RefreshSuccessMessage0, folder.Title, Properties.Resources.RefreshSuccessMessage1), string.Format("{0} {1}", Application.Current.MainWindow.Title, folder.Title), MessageBoxButton.OK, MessageBoxImage.Information);
            }
            catch (Exception ex)
            {
                MessageBox.Show(string.Format("{0} {1}.\n\n{2}", Properties.Resources.RefreshErrorMessage, folder.Title, ex.Message), string.Format("{0} {1}", Application.Current.MainWindow.Title, folder.Title), MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }