예제 #1
0
        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);
        }
예제 #2
0
        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);
        }