public virtual void GetActiveAssignmentsDynamicAssignmentsDynamicChartValue(Sungero.Domain.GetWidgetPlotChartValueEventArgs e) { var period = _parameters.Period == Widgets.ActiveAssignmentsDynamic.Period.Last90Days ? -90 : (_parameters.Period == Widgets.ActiveAssignmentsDynamic.Period.Last180Days ? -180 : -30); var periodEnd = Sungero.Core.Calendar.Today.EndOfDay(); var periodBegin = Sungero.Core.Calendar.Today.AddDays(period).BeginningOfDay(); var allEmployees = Employees.GetAll(); Structures.Module.ObjectCreateDynamicCache cache; if (Equals(_parameters.CarriedObjects, Widgets.DocumentsCreatingDynamic.CarriedObjects.All) && Docflow.PublicFunctions.Module.Remote.IsAdministratorOrAdvisor()) { // Общий кэш для аудиторов и администраторов по всем сотрудникам. cache = Functions.Module.GetCachedActiveAssignmentDynamic(null, allEmployees.Select(x => x.Id).ToList(), _parameters.CarriedObjects); } else { // Получение списка сотрудников департамента текущего сотрудника. var employees = Functions.Module.FilterWidgetRecipientsBySubstitution(allEmployees, _parameters.CarriedObjects == Widgets.DocumentsCreatingDynamic.CarriedObjects.My, _parameters.CarriedObjects == Widgets.DocumentsCreatingDynamic.CarriedObjects.MyDepartment) .Select(x => x.Id).ToList(); cache = Functions.Module.GetCachedActiveAssignmentDynamic(Users.Current, employees, _parameters.CarriedObjects); } var cachedPoint = cache.Points.Where(x => x.Date >= periodBegin); if (!cachedPoint.Any()) { return; } e.Chart.Axis.X.AxisType = AxisType.DateTime; e.Chart.Axis.Y.Title = Resources.WidgetActiveAssignmentsDynamicYAxisTitle; var assignmentsInWork = e.Chart.AddNewSeries(Resources.WidgetActiveAssignmentsDynamicSeriesAllTitle, Colors.Charts.Color1); var activeAssignments = cachedPoint.Where(x => x.TypeDiscriminator == Constants.Module.ActiveAssignments).ToList(); var maxValue = activeAssignments.Select(aa => aa.Count).Max(); foreach (var point in activeAssignments) { assignmentsInWork.AddValue(point.Date, point.Count); } var overduedAssignmentsInWork = e.Chart.AddNewSeries(Resources.WidgetActiveAssignmentsDynamicSeriesOverduedTitle, Colors.Charts.Red); var activeOverduedAssignments = cachedPoint.Where(x => x.TypeDiscriminator == Constants.Module.OverduedAssignments).ToList(); var minValue = activeOverduedAssignments.Select(aoa => aoa.Count).Min(); foreach (var point in activeOverduedAssignments) { overduedAssignmentsInWork.AddValue(point.Date, point.Count); } // Dmitriev_IA: Ограничение оси Oy графика if (minValue > Math.Round(maxValue * 0.1)) { e.Chart.Axis.Y.MinValue = Math.Round(minValue * 0.95); } else { e.Chart.Axis.Y.MinValue = 0; } e.Chart.Axis.Y.MaxValue = Math.Round(maxValue * 1.05); }
public virtual void GetDocumentsCreatingDynamicDocumentsDynamicChartValue(Sungero.Domain.GetWidgetPlotChartValueEventArgs e) { var period = _parameters.Period == Widgets.DocumentsCreatingDynamic.Period.Last90Days ? -90 : (_parameters.Period == Widgets.DocumentsCreatingDynamic.Period.Last180Days ? -180 : -30); var periodEnd = Sungero.Core.Calendar.Today.EndOfDay(); var periodBegin = Sungero.Core.Calendar.Today.AddDays(period).BeginningOfDay(); var palette = Functions.Module.GetPlotColorPalette(); var allEmployees = Employees.GetAll(); var topSeriesCount = 4; Structures.Module.ObjectCreateDynamicCache cachedDocuments; if (Equals(_parameters.CarriedObjects, Widgets.DocumentsCreatingDynamic.CarriedObjects.All) && Docflow.PublicFunctions.Module.Remote.IsAdministratorOrAdvisor()) { // Общий кэш для аудиторов и администраторов по всем сотрудникам. cachedDocuments = Functions.Module.GetCachedDocuments(null, allEmployees.Select(x => x.Id).ToList(), _parameters.CarriedObjects); } else { // Получение списка сотрудников департамента текущего сотрудника. var employees = Functions.Module.FilterWidgetRecipientsBySubstitution(allEmployees, _parameters.CarriedObjects == Widgets.DocumentsCreatingDynamic.CarriedObjects.My, _parameters.CarriedObjects == Widgets.DocumentsCreatingDynamic.CarriedObjects.MyDepartment) .Select(x => x.Id).ToList(); cachedDocuments = Functions.Module.GetCachedDocuments(Users.Current, employees, _parameters.CarriedObjects); } var documents = cachedDocuments.Points.Where(x => x.Date >= periodBegin).ToList(); if (!documents.Any()) { return; } // Упорядоченный список типов. Т.к. в точках хранится накопительная сумма, значение на последний день будет максимальным, по нему и определяем топ. var maxDate = documents.Max(x => x.Date); var topTypeList = documents.Where(x => x.Date == maxDate).OrderByDescending(x => x.Count).Select(x => x.TypeDiscriminator).ToList(); e.Chart.Axis.X.AxisType = AxisType.DateTime; e.Chart.Axis.Y.Title = Resources.WidgetDocumentsCreatingDynamicYAxisTitle; var maxValue = 0; var minValue = int.MaxValue; // Все типы. if (topTypeList.Any()) { var iteratedPeriodBegin = periodBegin; var iteratedPeriodEnd = periodBegin.EndOfDay(); var serieColor = palette.FirstOrDefault(); var serie = e.Chart.AddNewSeries(Resources.WidgetDocumentsCreatingDynamicSeriesAllDocuments, serieColor); while (iteratedPeriodEnd <= periodEnd) { var count = documents.Where(x => x.Date == iteratedPeriodEnd.Date).Sum(x => x.Count); if (count > maxValue) { maxValue = count; } serie.AddValue(iteratedPeriodEnd.Date, count); iteratedPeriodBegin = iteratedPeriodBegin.AddDays(1); iteratedPeriodEnd = iteratedPeriodEnd.AddDays(1); } } // Топовые типы. var topTypes = topTypeList.Take(topSeriesCount).ToList(); foreach (var docType in topTypes) { // Dmitriev_IA: важно знать позицию, а не сам индекс. Позиция типа документа в списке всегда на 1 больше, чем индекс. var docTypeIndex = topTypes.FindIndex(t => Equals(t, docType)) + 1; var serieColor = palette.Skip(docTypeIndex).FirstOrDefault(); var points = documents.Where(x => Equals(x.TypeDiscriminator, docType)).ToList(); var startPoint = points.OrderBy(x => x.Date).First(); var startCount = startPoint.Count; var startDate = startPoint.Date; var iteratedPeriodBegin = periodBegin; var iteratedPeriodEnd = periodBegin.EndOfDay(); var typeName = string.Empty; // Поиск локализованного названия документа в метаданных. Учитывает слои. Guid docTypeGuid; if (Guid.TryParse(docType, out docTypeGuid)) { var docTypeType = Sungero.Domain.Shared.TypeExtension.GetFinalTypeGuid(docTypeGuid).GetTypeByGuid(); if (docTypeType != null) { typeName = docTypeType.GetEntityMetadata().GetSingularDisplayName(); } } var serie = e.Chart.AddNewSeries(typeName, serieColor); while (iteratedPeriodEnd <= periodEnd) { var count = iteratedPeriodEnd < startDate ? 0 : startCount; var point = points.Where(x => x.Date == iteratedPeriodEnd.Date).FirstOrDefault(); if (point != null) { count = point.Count; } serie.AddValue(iteratedPeriodEnd.Date, count); if (count < minValue) { minValue = count; } iteratedPeriodBegin = iteratedPeriodBegin.AddDays(1); iteratedPeriodEnd = iteratedPeriodEnd.AddDays(1); } } // Прочие типы. var top3Types = topTypeList.Skip(topSeriesCount).ToList(); var otherDocs = documents.Where(x => top3Types.Contains(x.TypeDiscriminator)).ToList(); if (otherDocs.Any()) { var iteratedPeriodBegin = periodBegin; var iteratedPeriodEnd = periodBegin.EndOfDay(); var serieColor = palette.Skip(topSeriesCount + 1).FirstOrDefault(); var serie = e.Chart.AddNewSeries(Resources.WidgetDocumentsCreatingDynamicSeriesOtherDocuments, serieColor); while (iteratedPeriodEnd <= periodEnd) { var count = otherDocs.Select(x => x).Where(x => x.Date == iteratedPeriodEnd.Date).Sum(x => x.Count); serie.AddValue(iteratedPeriodEnd.Date, count); iteratedPeriodBegin = iteratedPeriodBegin.AddDays(1); iteratedPeriodEnd = iteratedPeriodEnd.AddDays(1); } } // Dmitriev_IA: Ограничение оси Oy графика if (minValue > Math.Round(maxValue * 0.1)) { e.Chart.Axis.Y.MinValue = Math.Round(minValue * 0.95); } else { e.Chart.Axis.Y.MinValue = 0; } e.Chart.Axis.Y.MaxValue = Math.Round(maxValue * 1.05); }