public ActionResult Add(UnitTestAddModel model)
        {
            if (!ModelState.IsValid)
            {
                return(View(model));
            }

            var componentRepository = CurrentAccountDbContext.GetComponentRepository();
            var component           = componentRepository.GetById(model.ComponentId.Value);

            var unitTestTypeRepository = CurrentAccountDbContext.GetUnitTestTypeRepository();
            var unitTestType           = unitTestTypeRepository.GetById(model.UnitTestTypeId);

            var client = GetDispatcherClient();
            var data   = new GetOrCreateUnitTestRequestData()
            {
                ComponentId    = component.Id,
                UnitTestTypeId = unitTestType.Id,
                DisplayName    = model.DisplayName,
                SystemName     = model.DisplayName
            };

            var response = client.GetOrCreateUnitTest(CurrentUser.AccountId, data);
            var unitTest = response.Data;

            this.SetTempMessage(TempMessageType.Success, string.Format("Добавлена проверка <a href='{1}' class='alert-link'>{0}</a>", unitTest.DisplayName, Url.Action("ResultDetails", new { id = unitTest.Id })));
            return(RedirectToAction("Index"));
        }
Exemple #2
0
        /// <summary>
        /// Детализация по компоненту - общее состояние
        /// </summary>
        public ActionResult ComponentDetailsState(Guid id)
        {
            var repository = CurrentAccountDbContext.GetComponentRepository();
            var component  = repository.GetById(id);

            var eventsMiniStatus    = ComponentsController.GetEventsMiniStatusModel(id, CurrentAccountDbContext);
            var unittestsMiniStatus = ComponentsController.GetUnittestsMiniStatusModel(CurrentUser.AccountId, id, CurrentAccountDbContext);
            var metricsMiniStatus   = ComponentsController.GetMetricsMiniStatusModel(CurrentUser.AccountId, id, CurrentAccountDbContext);
            var childsMiniStatus    = ComponentsController.GetChildsMiniStatusModel(CurrentUser.AccountId, id, CurrentAccountDbContext);

            var model = new ComponentDetailsStateModel()
            {
                Id                  = id,
                SystemName          = component.SystemName,
                Status              = component.ExternalStatus.Status,
                StatusEventId       = component.ExternalStatus.StatusEventId,
                StatusDuration      = component.ExternalStatus.GetDuration(MvcApplication.GetServerDateTime()),
                CanEdit             = CurrentUser.CanEditCommonData() && !component.IsRoot,
                IsEnabled           = component.Enable,
                EventsMiniStatus    = eventsMiniStatus,
                UnittestsMiniStatus = unittestsMiniStatus,
                MetricsMiniStatus   = metricsMiniStatus,
                ChildsMiniStatus    = childsMiniStatus
            };

            return(PartialView(model));
        }
        protected SimplifiedComponent[] GetSimplifiedComponentList()
        {
            // Одним запросом получаем все нужные данные
            // Это быстрее, чем загружать данные компонентов по необходимости

            var componentRepository = CurrentAccountDbContext.GetComponentRepository();
            var allComponents       = componentRepository.QueryAll();

            var query = allComponents
                        .Include("EventsStatus")
                        .Select(t => new SimplifiedComponent()
            {
                Id              = t.Id,
                DisplayName     = t.DisplayName,
                SystemName      = t.SystemName,
                ParentId        = t.ParentId,
                ComponentTypeId = t.ComponentTypeId,

                HasEvents = t.EventsStatus.FirstEventId.HasValue,

                Unittests = t.UnitTests.Where(a => a.IsDeleted == false).Select(x => new SimplifiedUnittest()
                {
                    Id          = x.Id,
                    DisplayName = x.DisplayName
                }),

                Metrics = t.Metrics.Where(a => a.IsDeleted == false && a.MetricType.IsDeleted == false).Select(x => new SimplifiedMetric()
                {
                    Id          = x.Id,
                    DisplayName = x.MetricType.DisplayName
                })
            });

            var list = query.ToList();

            // Проставим ссылки на родителя и детей
            foreach (var component in list.ToArray())
            {
                if (component.ParentId.HasValue)
                {
                    var parent = list.FirstOrDefault(t => t.Id == component.ParentId.Value);
                    if (parent != null)
                    {
                        component.Parent = list.First(t => t.Id == component.ParentId.Value);
                        component.Parent.Childs.Add(component);
                    }
                    else
                    {
                        // Если не нашли родителя, значит, он удалён, выбросим компонент из дерева
                        // Вообще такого не должно быть, потому что компонент удаляется вместе с детьми
                        // Но иногда всё равно бывает
                        list.Remove(component);
                    }
                }
            }

            var result = list.ToArray();

            return(result);
        }
        public ActionResult Index(Guid?componentId, Guid?counterId, DateTime?from, DateTime?to)
        {
            var eDate = to ?? DateTime.Now;
            var sDate = from ?? eDate.AddDays(-1);

            Component component = null;

            if (componentId.HasValue)
            {
                var componentRepository = CurrentAccountDbContext.GetComponentRepository();
                component = componentRepository.GetById(componentId.Value);
            }

            var model = new CounterDataListModel()
            {
                ComponentId = componentId,
                From        = sDate,
                To          = eDate
            };

            if (component != null)
            {
                var counterRepository = CurrentAccountDbContext.GetMetricTypeRepository();

                MetricType metricType;
                if (counterId.HasValue)
                {
                    metricType        = counterRepository.GetById(counterId.Value);
                    model.CounterId   = metricType.Id;
                    model.CounterName = metricType.SystemName;
                }
                else
                {
                    var metricTypes = component.Metrics.Where(t => t.IsDeleted == false && t.MetricType.IsDeleted == false).Select(t => t.MetricType);
                    metricType        = metricTypes.OrderBy(t => t.SystemName).FirstOrDefault();
                    model.CounterId   = metricType != null ? metricType.Id : (Guid?)null;
                    model.CounterName = metricType != null ? metricType.SystemName : null;
                }

                if (model.CounterId.HasValue)
                {
                    var storageContext          = CurrentAccountDbContext;
                    var metricHistoryRepository = storageContext.GetMetricHistoryRepository();

                    var rows = metricHistoryRepository
                               .GetByPeriod(component.Id, sDate, eDate, new[] { model.CounterId.Value })
                               .OrderByDescending(t => t.BeginDate)
                               .ToArray();

                    model.Data  = rows.ToArray();
                    model.Graph = GetCounterGraphDataModel(metricType, rows.OrderBy(t => t.BeginDate).ToArray());
                }
            }

            return(View(model));
        }
Exemple #5
0
        public ActionResult GetLogRowProperties(Guid componentId, Guid logRowId)
        {
            var componentRepository = CurrentAccountDbContext.GetComponentRepository();

            componentRepository.GetById(componentId);
            var logRepository = CurrentAccountDbContext.GetLogRepository();
            var log           = logRepository.Find(logRowId, componentId);
            var model         = GetLogRowPropertiesModel(log);

            return(PartialView(model));
        }
Exemple #6
0
        /// <summary>
        /// Контейнер разделов детализации по событиям
        /// </summary>
        public ActionResult EventsDetails(Guid id)
        {
            var repository = CurrentAccountDbContext.GetComponentRepository();
            var component  = repository.GetById(id);

            var model = new EventsDetailsModel()
            {
                Id = component.Id
            };

            return(PartialView(model));
        }
Exemple #7
0
        /// <summary>
        /// Контейнер разделов детализации по компоненту
        /// </summary>
        public ActionResult ComponentDetails(Guid id)
        {
            var repository = CurrentAccountDbContext.GetComponentRepository();
            var component  = repository.GetById(id);

            var model = new ComponentDetailsModel()
            {
                Id      = component.Id,
                Name    = component.DisplayName,
                CanEdit = CurrentUser.CanEditCommonData() && !component.IsRoot
            };

            return(PartialView(model));
        }
Exemple #8
0
        public PartialViewResult GetComponentsMiniTree()
        {
            var repository = CurrentAccountDbContext.GetComponentRepository();

            // Получим нужные данные по всем компонентам
            var query = repository
                        .QueryAll()
                        .Include("ExternalStatus")
                        .Select(t => new ComponentsMiniTreeItemModel()
            {
                Id              = t.Id,
                DisplayName     = t.DisplayName,
                SystemName      = t.SystemName,
                Status          = t.ExternalStatus.Status,
                ParentId        = t.ParentId,
                ComponentTypeId = t.ComponentTypeId,
                IsRoot          = t.ComponentTypeId == SystemComponentTypes.Root.Id,
                IsFolder        = t.ComponentTypeId == SystemComponentTypes.Folder.Id
            });

            var list = query.ToList();

            // Проставим ссылки на родителя и детей
            foreach (var component in list.ToArray())
            {
                if (component.ParentId.HasValue)
                {
                    var parent = list.FirstOrDefault(t => t.Id == component.ParentId.Value);
                    if (parent != null)
                    {
                        component.Parent = list.First(t => t.Id == component.ParentId.Value);
                        component.Parent.Childs.Add(component);
                    }
                    else
                    {
                        // Если не нашли родителя, значит, он удалён, выбросим компонент из дерева
                        // Вообще такого не должно быть, потому что компонент удаляется вместе с детьми
                        // Но иногда всё равно бывает
                        list.Remove(component);
                    }
                }
            }

            var result = list.ToArray();

            var root = result.Single(t => t.IsRoot);

            return(PartialView("ComponentsMiniTreeElement", root));
        }
Exemple #9
0
        protected object GetAllComponentsForGuiSelect()
        {
            var repository = CurrentAccountDbContext.GetComponentRepository();
            var components = repository.QueryAll().
                             Where(t => t.ComponentTypeId != SystemComponentTypes.Folder.Id && t.ComponentTypeId != SystemComponentTypes.Root.Id && t.IsDeleted == false).OrderBy(t => t.DisplayName);

            return(components.Select(x => new
            {
                id = x.Id,
                systemName = x.SystemName,
                displayName = x.DisplayName,
                typeId = x.ComponentTypeId
            })
                   .ToArray());
        }
Exemple #10
0
        public ActionResult GetLogFile(Guid componentId, Guid id, Guid fileId)
        {
            var componentRepository = CurrentAccountDbContext.GetComponentRepository();

            componentRepository.GetById(componentId);
            var repository = CurrentAccountDbContext.GetLogRepository();
            var row        = repository.Find(id, componentId);
            var file       = row.Parameters.SingleOrDefault(x => x.Id == fileId);

            if (file == null)
            {
                throw new HttpException(404, "Файл не найден");
            }
            var contentType = GuiHelper.GetContentType(file.Name);
            var bytes       = Convert.FromBase64String(file.Value);

            return(File(bytes, contentType, file.Name));
        }
Exemple #11
0
        public PartialViewResult LastEventInfo(Guid id)
        {
            var eventRepository = CurrentAccountDbContext.GetEventRepository();
            var lastEvent       = eventRepository.GetLastEventByEndDate(id);

            if (lastEvent == null)
            {
                return(PartialView("NoLastEventInfo"));
            }

            var model = new EventTypeLastEventModel()
            {
                Id      = lastEvent.Id,
                EndDate = lastEvent.EndDate,
                Message = lastEvent.Message
            };

            model.Properties = ExtentionPropertiesModel.Create(lastEvent);

            // событие метрики
            if (lastEvent.Category.IsMetricCategory())
            {
                var metricRepository = CurrentAccountDbContext.GetMetricRepository();
                var metric           = metricRepository.GetById(lastEvent.OwnerId);
                model.Metric    = metric;
                model.Component = metric.Component;
            }
            // событие проверки
            else if (lastEvent.Category.IsUnitTestCategory())
            {
                var unitTestRepository = CurrentAccountDbContext.GetUnitTestRepository();
                var unitTest           = unitTestRepository.GetById(lastEvent.OwnerId);
                model.Unittest  = unitTest;
                model.Component = unitTest.Component;
            }
            else // событие компонента
            {
                var componentRepository = CurrentAccountDbContext.GetComponentRepository();
                model.Component = componentRepository.GetById(lastEvent.OwnerId);
            }

            return(PartialView(model));
        }
        public ActionResult Add(Guid?componentId = null)
        {
            // зарегистрируем дефолтный тип пльзовательской проверки
            // чтобы в выпадающем списке всегда была хотя был хотя бы один тип пользовательской проверки
            var dispatcher = GetDispatcherClient();

            dispatcher.GetOrCreateUnitTestType(CurrentUser.AccountId, new GetOrCreateUnitTestTypeRequestData()
            {
                SystemName  = "CustomUnitTestType",
                DisplayName = "Пользовательская проверка"
            });

            var model = new UnitTestAddModel();

            if (componentId.HasValue)
            {
                var componentRepository = CurrentAccountDbContext.GetComponentRepository();
                var component           = componentRepository.GetById(componentId.Value);
                model.ComponentId = component.Id;
            }
            return(View(model));
        }
Exemple #13
0
        /// <summary>
        /// Главная страница лога
        /// </summary>
        public ActionResult Index(LogFiltersModel filters)
        {
            filters = filters ?? new LogFiltersModel();

            var model = new LogIndexModel()
            {
                ComponentId = filters.ComponentId,
                LogLevel    = filters.LogLevel,
                Context     = filters.Context,
                Date        = filters.Date,
                Text        = filters.Text,
                Id          = filters.Id
            };

            if (model.ComponentId.HasValue)
            {
                var componentRepository = CurrentAccountDbContext.GetComponentRepository();
                model.Component = componentRepository.GetById(model.ComponentId.Value);
            }

            return(View(model));
        }
Exemple #14
0
        /// <summary>
        /// Вывод списка событий
        /// </summary>
        public ActionResult Index(
            Guid?componentId               = null,
            Guid?componentTypeId           = null,
            ColorStatusSelectorValue color = null,
            Guid?eventTypeId               = null,
            EventCategory?category         = null,
            string search      = null,
            DateTime?fromDate  = null,
            DateTime?toDate    = null,
            Guid?unitTestId    = null,
            Guid?metricId      = null,
            string dataType    = null,
            string versionFrom = null)
        {
            var model = new EventsListModel()
            {
                ComponentId = componentId,
                Color       = color ?? new ColorStatusSelectorValue(),
                EventTypeId = eventTypeId,
                Category    = category,
                Search      = search,
                FromDate    = fromDate,
                ToDate      = toDate,
                VersionFrom = versionFrom
            };

            IQueryable <Event> eventsQuery;

            var componentRepository = CurrentAccountDbContext.GetComponentRepository();
            var eventRepository     = CurrentAccountDbContext.GetEventRepository();

            if (componentId.HasValue)
            {
                eventsQuery = eventRepository.QueryAll(componentId.Value);
            }
            else if (unitTestId.HasValue)
            {
                model.UnitTest = CurrentAccountDbContext.GetUnitTestRepository().GetById(unitTestId.Value);
                eventsQuery    = eventRepository.QueryAll(unitTestId.Value);
            }
            else if (metricId.HasValue)
            {
                model.Metric = CurrentAccountDbContext.GetMetricRepository().GetById(metricId.Value);
                eventsQuery  = eventRepository.QueryAll(metricId.Value);
            }
            else
            {
                if (componentTypeId.HasValue)
                {
                    // поиск по типу компонента
                    var componentIds = componentRepository
                                       .QueryAll()
                                       .Where(t => t.ComponentTypeId == componentTypeId)
                                       .Select(t => t.Id)
                                       .ToArray();
                    eventsQuery = eventRepository.QueryAllByComponentId(componentIds);
                }
                else
                {
                    //  все события аккаунта
                    eventsQuery = eventRepository.QueryAllByAccount();
                }
            }

            if (eventTypeId.HasValue)
            {
                eventsQuery = eventsQuery.Where(t => t.EventTypeId == eventTypeId.Value);
            }

            if (category.HasValue)
            {
                eventsQuery = eventsQuery.Where(t => t.Category == category.Value);
            }
            else
            {
                var categories = new[]
                {
                    EventCategory.ApplicationError,
                    EventCategory.ComponentEvent
                };
                eventsQuery = eventsQuery.Where(t => categories.Contains(t.Category));
            }

            if (model.Color.Checked)
            {
                var importanceLevels = color.GetSelectedEventImportances();
                eventsQuery = eventsQuery.Where(t => importanceLevels.Contains(t.Importance));
            }

            if (fromDate.HasValue)
            {
                eventsQuery = eventsQuery.Where(t => t.ActualDate >= fromDate.Value);
            }

            if (toDate.HasValue)
            {
                eventsQuery = eventsQuery.Where(t => t.StartDate <= toDate.Value);
            }

            if (!string.IsNullOrEmpty(search))
            {
                eventsQuery = eventsQuery.Where(t => t.Message != null && t.Message.Contains(search));
            }

            if (!string.IsNullOrEmpty(versionFrom))
            {
                var versionFromLong = VersionHelper.FromString(versionFrom) ?? -1;
                eventsQuery = eventsQuery.Where(t => (t.VersionLong ?? long.MaxValue) > versionFromLong);
            }

            eventsQuery = eventsQuery.OrderByDescending(t => t.StartDate);

            var eventsModel = eventsQuery.Select(t => new EventsListItemModel()
            {
                Id          = t.Id,
                Message     = t.Message,
                OwnerId     = t.OwnerId,
                Category    = t.Category,
                EventTypeId = t.EventTypeId,
                StartDate   = t.StartDate,
                Importance  = t.Importance,
                EndDate     = t.EndDate,
                ActualDate  = t.ActualDate,
                Count       = t.Count,
                JoinKey     = t.JoinKeyHash
            });

            model.Events = eventsModel;

            model.Components = componentRepository
                               .QueryAllWithDeleted()
                               .ToArray()
                               .Select(t => new EventsListComponentModel()
            {
                Id          = t.Id,
                DisplayName = t.DisplayName,
                SystemName  = t.SystemName,
                FullName    = t.GetFullDisplayName()
            })
                               .ToDictionary(t => t.Id, t => t);

            var eventTypeRepository = CurrentAccountDbContext.GetEventTypeRepository();

            model.EventTypes = eventTypeRepository
                               .QueryAllWithDeleted()
                               .Select(t => new EventsListEventTypeModel()
            {
                Id          = t.Id,
                DisplayName = t.DisplayName,
                SystemName  = t.SystemName,
                Code        = t.Code,
                Category    = t.Category
            })
                               .ToDictionary(t => t.Id, t => t);


            if (dataType == "xml")
            {
                var xmlEvents = model.GetXmlEvents(CurrentAccountDbContext);
                return(new ActionXmlFileResult(xmlEvents, "events.xml"));
            }

            return(View(model));
        }
Exemple #15
0
        public ActionResult Index(Guid?componentId = null, string fromDate = null, string toDate = null,
                                  string category  = null, string channel  = null, string status = null, Guid?userId = null)
        {
            var sDate = !string.IsNullOrEmpty(fromDate) ? DecodeDateTimeParameter(fromDate) : (DateTime?)null;
            var eDate = !string.IsNullOrEmpty(toDate) ? DecodeDateTimeParameter(toDate) : (DateTime?)null;

            var eventCategory = EnumHelper.StringToEnum <EventCategory>(category);
            var nChannel      = EnumHelper.StringToEnum <NotificationType>(channel);
            var nStatus       = EnumHelper.StringToEnum <NotificationStatus>(status);

            var componentRepository = CurrentAccountDbContext.GetComponentRepository();
            var userRepository      = CurrentAccountDbContext.GetUserRepository();

            if (!CurrentUser.CanManageAccount())
            {
                userId = CurrentUser.Id;
            }

            if (userId.HasValue)
            {
                userRepository.GetById(userId.Value);
            }

            var users = userRepository.QueryAll().ToArray();
            var eventTypeRepository = CurrentAccountDbContext.GetEventTypeRepository();
            var eventTypes          = eventTypeRepository.QueryAll().ToArray();
            var allComponents       = componentRepository.QueryAllWithDeleted();

            var notificationRepository = CurrentAccountDbContext.GetNotificationRepository();
            var query = notificationRepository.QueryAllForGui(componentId, sDate, eDate, eventCategory, nChannel, nStatus, userId);

            query = query.OrderByDescending(t => t.CreationDate).Take(1000);
            var notifications = query.ToArray()
                                .Join(users, a => a.UserId, b => b.Id, (a, b) => new { Notification = a, User = b })
                                .Join(eventTypes, a => a.Notification.Event.EventTypeId, b => b.Id,
                                      (a, b) => new { Notification = a, EventType = b })
                                .Select(t => new NotificationsListItemModel()
            {
                Id           = t.Notification.Notification.Id,
                CreationDate = t.Notification.Notification.CreationDate,
                Event        = t.Notification.Notification.Event,
                User         = t.Notification.User,
                Component    = allComponents.Single(x => x.Id == t.Notification.Notification.Event.OwnerId),
                Address      = t.Notification.Notification.Address,
                Channel      = t.Notification.Notification.Type,
                Status       = t.Notification.Notification.Status,
                SendError    = t.Notification.Notification.SendError,
                SendDate     = t.Notification.Notification.SendDate,
                NextDate     = null,
                EventType    = t.EventType
            });

            var model = new NotificationsListModel()
            {
                AccountId     = CurrentUser.AccountId,
                ComponentId   = componentId,
                FromDate      = sDate,
                ToDate        = eDate,
                Category      = eventCategory,
                Channel       = nChannel,
                Status        = nStatus,
                UserId        = userId,
                Notifications = notifications.OrderByDescending(t => t.CreationDate).ToList()
            };

            return(View(model));
        }
Exemple #16
0
        /// <summary>
        /// Статистика запусков
        /// </summary>
        public ActionResult Starts(Guid?componentTypeId = null, Guid?componentId = null, string fromDate = null, string toDate = null)
        {
            var sDate = !string.IsNullOrEmpty(fromDate) ? DecodeDateTimeParameter(fromDate) : (DateTime?)null;
            var eDate = !string.IsNullOrEmpty(toDate) ? DecodeDateTimeParameter(toDate) : (DateTime?)null;

            Component component           = null;
            var       componentRepository = CurrentAccountDbContext.GetComponentRepository();

            if (componentId.HasValue)
            {
                component = componentRepository.GetById(componentId.Value);
            }

            ComponentType componentType           = null;
            var           componentTypeRepository = CurrentAccountDbContext.GetComponentTypeRepository();

            if (componentTypeId.HasValue)
            {
                componentType = componentTypeRepository.GetById(componentTypeId.Value);
            }
            else
            {
                componentType = componentTypeRepository.QueryAll().Where(t => t.IsDeleted == false).OrderBy(t => t.DisplayName).FirstOrDefault();
            }

            EventType startEventType = null;

            Component[] components;
            var         items = new List <StartsReportItemModel>();
            var         graph = new List <StartsReportGrapthItemModel>();
            string      error = null;

            if (componentType != null)
            {
                if (component != null)
                {
                    components = new[] { component }
                }
                ;
                else
                {
                    components =
                        componentRepository.QueryAll()
                        .Where(t => t.ComponentTypeId == componentType.Id && t.IsDeleted == false)
                        .ToArray();
                }

                var componentsIds = components.Select(t => t.Id).ToArray();

                var eventTypeRepository = CurrentAccountDbContext.GetEventTypeRepository();
                startEventType = eventTypeRepository.GetOneOrNullBySystemName(SystemEventType.ComponentStart);
                if (startEventType != null)
                {
                    var startEventTypeId = startEventType.Id;
                    var listLockObject   = new Object();

                    var eventRepository = CurrentAccountDbContext.GetEventRepository();

                    // Все события запуска за указанный интервал
                    var allEventsQuery = eventRepository.QueryAllByComponentId(componentsIds)
                                         .Where(t => t.EventTypeId == startEventTypeId);
                    if (sDate.HasValue)
                    {
                        allEventsQuery = allEventsQuery.Where(t => t.StartDate >= sDate.Value);
                    }
                    if (eDate.HasValue)
                    {
                        allEventsQuery = allEventsQuery.Where(t => t.StartDate <= eDate.Value);
                    }

                    // События запуска по компонентам
                    var startEventsQuery =
                        allEventsQuery.Select(
                            t => new { Id = t.Id, StartDate = t.StartDate, ComponentId = t.OwnerId, Count = t.Count });
                    var startEvents = startEventsQuery.GroupBy(t => t.ComponentId).ToArray();

                    var list =
                        startEvents.Join(components, a => a.Key, b => b.Id, (a, b) => new { Component = b, Events = a })
                        .Select(t => new StartsReportItemModel()
                    {
                        ComponentId          = t.Component.Id,
                        ComponentDisplayName = t.Component.DisplayName,
                        ComponentSystemName  = t.Component.SystemName,
                        CreateDate           = t.Component.CreatedDate,
                        Version    = t.Component.Version,
                        FirstStart =
                            t.Events.OrderBy(x => x.StartDate).Select(x => x.StartDate).FirstOrDefault(),
                        FirstStartId = t.Events.OrderBy(x => x.StartDate).Select(x => x.Id).FirstOrDefault(),
                        LastStart    =
                            t.Events.OrderByDescending(x => x.StartDate)
                            .Select(x => x.StartDate)
                            .FirstOrDefault(),
                        LastStartId =
                            t.Events.OrderByDescending(x => x.StartDate).Select(x => x.Id).FirstOrDefault(),
                        Count = t.Events.Sum(x => x.Count)
                    }).ToList();

                    // События запуска по датам
                    var statsEventsQuery = allEventsQuery.Select(t => new { StartDate = t.StartDate, Count = t.Count });
                    var stats            =
                        statsEventsQuery.GroupBy(t => DbFunctions.TruncateTime(t.StartDate))
                        .Select(t => new StartsReportGrapthItemModel()
                    {
                        Date  = t.Key.Value,
                        Count = t.Sum(x => x.Count)
                    }).ToList();

                    lock (listLockObject)
                    {
                        items.AddRange(list);
                        graph.AddRange(stats);
                    }
                }
                else
                {
                    error = "У выбранного типа компонента нет типа события с системным именем '" +
                            SystemEventType.ComponentStart + "'";
                }
            }

            var model = new StartsReportModel()
            {
                AccountId        = CurrentUser.AccountId,
                ComponentId      = componentId,
                ComponentTypeId  = componentTypeId,
                FromDate         = sDate,
                ToDate           = eDate,
                Items            = items.OrderBy(t => t.ComponentDisplayName).ToList(),
                Graph            = graph.OrderBy(t => t.Date).ToList(),
                Error            = error,
                StartEventTypeId = startEventType != null ? startEventType.Id : (Guid?)null,
                Total            = items.Sum(t => t.Count)
            };

            return(View(model));
        }
        public UnitTest SaveSimpleCheck(T model)
        {
            var dispatcher          = GetDispatcherClient();
            var unitTestDisplayName = GetUnitTestDisplayName(model);

            if (model.Id.HasValue)
            {
                var unitTest   = GetUnitTestById(model.Id.Value);
                var updateData = new UpdateUnitTestRequestData()
                {
                    ComponentId   = unitTest.ComponentId,
                    DisplayName   = unitTestDisplayName,
                    PeriodSeconds = TimeSpanHelper.GetSeconds(model.Period),
                    UnitTestId    = unitTest.Id,
                    ErrorColor    = unitTest.ErrorColor,
                    NoSignalColor = ObjectColor.Gray,
                    SystemName    = unitTest.SystemName,
                    SimpleMode    = true
                };
                dispatcher.UpdateUnitTest(CurrentUser.AccountId, updateData).Check();

                // Зем: название компонента решили не менять, чтобы не было неожиданных сюрпризов,
                // меняешь проверку, а меняется компонент, если нужно изменить название компонента,
                // пусть пользователь сделает это явно вручную

                // Обновим параметры
                SetUnitTestParams(unitTest, model);
                CurrentAccountDbContext.SaveChanges();

                this.SetTempMessage(TempMessageType.Success, string.Format("Обновлена проверка <a href='{1}' class='alert-link'>{0}</a>", unitTest.DisplayName, Url.Action("Edit", "Checks", new { id = unitTest.Id })));
                return(unitTest);
            }
            else // создание проверки
            {
                // Создаём компонент только если его ещё нет
                ComponentInfo component;
                if (!model.ComponentId.HasValue)
                {
                    // Создадим папку для компонента
                    var componentRepository = CurrentAccountDbContext.GetComponentRepository();
                    var root = componentRepository.GetRoot();

                    var createFolderResponse = dispatcher.GetOrCreateComponent(CurrentUser.AccountId, new GetOrCreateComponentRequestData()
                    {
                        SystemName        = GetFolderSystemName(model),
                        DisplayName       = GetFolderDisplayName(model),
                        TypeId            = SystemComponentTypes.Folder.Id,
                        ParentComponentId = root.Id
                    });

                    if (!createFolderResponse.Success)
                    {
                        throw new UserFriendlyException("Ошибка создания папки для проверки: " + createFolderResponse.ErrorMessage);
                    }

                    var folder = createFolderResponse.Data.Component;

                    // Создадим тип компонента
                    var createComponentTypeResponse = dispatcher.GetOrCreateComponentType(CurrentUser.AccountId, new GetOrCreateComponentTypeRequestData()
                    {
                        SystemName  = GetTypeSystemName(model),
                        DisplayName = GetTypeDisplayName(model)
                    });

                    if (!createComponentTypeResponse.Success)
                    {
                        throw new UserFriendlyException("Ошибка создания типа компонента для проверки: " + createComponentTypeResponse.ErrorMessage);
                    }

                    var componentType = createComponentTypeResponse.Data;

                    // Создадим компонент
                    var componentId             = Guid.NewGuid();
                    var createComponentResponse = dispatcher.GetOrCreateComponent(CurrentUser.AccountId, new GetOrCreateComponentRequestData()
                    {
                        NewId             = componentId,
                        SystemName        = GetComponentSystemName(componentId),
                        DisplayName       = GetComponentDisplayName(model),
                        TypeId            = componentType.Id,
                        ParentComponentId = folder.Id
                    });

                    if (!createComponentResponse.Success)
                    {
                        throw new UserFriendlyException("Ошибка создания компонента для проверки: " + createComponentResponse.ErrorMessage);
                    }

                    component = createComponentResponse.Data.Component;
                }
                else
                {
                    component = dispatcher.GetComponentById(CurrentUser.AccountId, model.ComponentId.Value).Data;
                }

                // Создадим проверку
                var unitTestId = Guid.NewGuid();

                var createUnitTestData = new GetOrCreateUnitTestRequestData()
                {
                    ActualTimeSecs = null,
                    ComponentId    = component.Id,
                    DisplayName    = unitTestDisplayName,
                    ErrorColor     = UnitTestResult.Alarm,
                    NewId          = unitTestId,
                    SimpleMode     = true,
                    NoSignalColor  = ObjectColor.Gray,
                    PeriodSeconds  = TimeSpanHelper.GetSeconds(model.Period),
                    SystemName     = UnitTestHelper.GetDynamicSystemName(unitTestId),
                    UnitTestTypeId = GetUnitTestTypeId()
                };
                dispatcher.GetOrCreateUnitTest(CurrentUser.AccountId, createUnitTestData).Check();
                var unitTest = GetUnitTestById(unitTestId);
                SetUnitTestParams(unitTest, model);

                CurrentAccountDbContext.SaveChanges();

                this.SetTempMessage(TempMessageType.Success, string.Format("Добавлена проверка <a href='{1}' class='alert-link'>{0}</a>", unitTest.DisplayName, Url.Action("Edit", "Checks", new { id = unitTest.Id })));
                return(unitTest);
            }
        }
        public ActionResult Index()
        {
            var model = new DashboardModel();

            // Компоненты - общая информация
            var componentRepository = CurrentAccountDbContext.GetComponentRepository();

            var components = componentRepository
                             .QueryAll()
                             .Include("ExternalStatus").
                             Where(t =>
                                   t.IsDeleted == false &&
                                   t.ComponentTypeId != SystemComponentTypes.Root.Id &&
                                   t.ComponentTypeId != SystemComponentTypes.Folder.Id)
                             .ToArray();

            model.ComponentsTotal = new DashboardComponentsInfoModel(components);

            // Компоненты - разбивка по типам
            var componentGroups = components
                                  .GroupBy(t => t.ComponentType)
                                  .OrderBy(t => t.Key.DisplayName)
                                  .ToArray();

            model.ComponentsByTypes = componentGroups
                                      .Select(t => new DashboardComponentsInfoModel(t.ToArray(), t.Key))
                                      .ToArray();

            /*
             * // События - сбор данных
             * var events = new List<DashboardEventModel>();
             * var listLockObject = new Object();
             * using (var dbProcessor = new MultipleDataBaseProcessor())
             * {
             *  dbProcessor.ForEachStorageDbForAccountId(CurrentUser.AccountId, data =>
             *  {
             *      var eventRepository = data.StorageDbContext.GetEventRepository();
             *      var eventsQuery = eventRepository.QueryAllByComponentId(components.Select(t => t.Id).ToArray(), DateTime.Now.AddMonths(-1));
             *      eventsQuery = eventsQuery.Where(t => t.Category != EventCategory.ComponentStatus);
             *      var eventsList = eventsQuery.Select(t => new DashboardEventModel()
             *      {
             *          ActualDate = t.ActualDate,
             *          EventTypeId = t.EventTypeId,
             *          Importance = t.Importance,
             *          IsProcessed = t.IsUserHandled,
             *          StartDate = t.StartDate
             *      }).ToArray();
             *      lock (listLockObject)
             *      {
             *          events.AddRange(eventsList);
             *      }
             *  });
             * }
             * var actualEvents = events.Where(t => t.ActualDate >= DateTime.Now && t.IsProcessed == false).ToArray();
             *
             * // Типы событий - общая информация
             * model.ActualEventTypesCount = actualEvents.GroupBy(t => t.EventTypeId).Count();
             * model.ActualEventTypesAlertCount = actualEvents.Where(t => t.Importance == EventImportance.Alarm).GroupBy(t => t.EventTypeId).Count();
             * model.ActualEventTypesWarningCount = actualEvents.Where(t => t.Importance == EventImportance.Warning).GroupBy(t => t.EventTypeId).Count();
             * model.ActualEventTypesInfoCount = actualEvents.Where(t => t.Importance == EventImportance.Info).GroupBy(t => t.EventTypeId).Count();
             * model.ActualEventTypesOtherCount = actualEvents.Where(t => t.Importance == EventImportance.Unknown).GroupBy(t => t.EventTypeId).Count();
             *
             * // Типы событий - сводка
             * var alertEvents = events.Where(t => t.Importance == EventImportance.Alarm).ToArray();
             * model.TypesByPeriodAlert = new DashboardEventTypesByPeriodModel(alertEvents);
             * var warningEvents = events.Where(t => t.Importance == EventImportance.Warning).ToArray();
             * model.TypesByPeriodWarning = new DashboardEventTypesByPeriodModel(warningEvents);
             * var infoEvents = events.Where(t => t.Importance == EventImportance.Info).ToArray();
             * model.TypesByPeriodInfo = new DashboardEventTypesByPeriodModel(infoEvents);
             * var otherEvents = events.Where(t => t.Importance == EventImportance.Unknown).ToArray();
             * model.TypesByPeriodOther = new DashboardEventTypesByPeriodModel(otherEvents);
             *
             * // События - общая информация
             * model.ActualEventsCount = actualEvents.Count();
             * model.ActualEventsAlertCount = actualEvents.Count(t => t.Importance == EventImportance.Alarm);
             * model.ActualEventsWarningCount = actualEvents.Count(t => t.Importance == EventImportance.Warning);
             * model.ActualEventsInfoCount = actualEvents.Count(t => t.Importance == EventImportance.Info);
             * model.ActualEventsOtherCount = actualEvents.Count(t => t.Importance == EventImportance.Unknown);
             *
             * // События - сводка
             * model.ByPeriodAlert = new DashboardEventsByPeriodModel(alertEvents);
             * model.ByPeriodWarning = new DashboardEventsByPeriodModel(warningEvents);
             * model.ByPeriodInfo = new DashboardEventsByPeriodModel(infoEvents);
             * model.ByPeriodOther = new DashboardEventsByPeriodModel(otherEvents);
             *
             * // События - по типам
             * var eventTypeRepository = CurrentAccountDbContext.GetEventTypeRepository();
             * model.ActualEventsAlert = actualEvents.Where(t => t.Importance == EventImportance.Alarm).
             *  GroupBy(t => t.EventTypeId).Select(t => new
             *  {
             *      EventType = eventTypeRepository.GetById(CurrentUser.AccountId, t.Key),
             *      Count = t.Count()
             *  }).Where(t => t.EventType != null).Select(t => new DashboardEventsByTypeModel()
             *  {
             *      EventType = t.EventType,
             *      Count = t.Count
             *  }).OrderByDescending(t => t.Count).ToArray();
             *
             * model.ActualEventsWarning = actualEvents.Where(t => t.Importance == EventImportance.Warning).
             *  GroupBy(t => t.EventTypeId).Select(t => new
             *  {
             *      EventType = eventTypeRepository.GetById(CurrentUser.AccountId, t.Key),
             *      Count = t.Count()
             *  }).Where(t => t.EventType != null).Select(t => new DashboardEventsByTypeModel()
             *  {
             *      EventType = t.EventType,
             *      Count = t.Count
             *  }).OrderByDescending(t => t.Count).ToArray();
             */

            return(View(model));
        }