Пример #1
0
        /// <summary>
        /// Сортирует чеки по интервалу выполнения в зависимости от свойства Schedule,
        /// группирует по MaintenanceCheckType (A, B, C, D, etc),
        /// и проставляет связи между группами по приоритету MaintenanceCheckType
        /// </summary>
        public static IEnumerable <MaintenanceCheckGroupByType> GroupingCheckByType(this ICommonCollection <MaintenanceCheck> checks, int?minStep, bool schedule)
        {
            if (minStep == null)
            {
                return(null);
            }

            var groupChecks = new List <MaintenanceCheckGroupByType>();
            Func <MaintenanceCheck, int?> predicate;

            if (schedule)
            {
                predicate = check => check.Interval.Hours;
            }
            else
            {
                predicate = check => check.Interval.Days;
            }

            var v = checks.Where(c => c.Schedule == schedule)
                    .OrderBy(predicate)
                    .ThenBy(c => c.CheckType.Priority)
                    .GroupBy(c => c.CheckType.FullName);

            foreach (var grouping in v)
            {
                var groupCheck = new MaintenanceCheckGroupByType(schedule);
                foreach (MaintenanceCheck check in grouping)
                {
                    groupCheck.Checks.Add(check);
                }
                groupCheck.Sort();

                var last = groupChecks.LastOrDefault();
                if (last != null)
                {
                    last.ParentGroup = groupCheck;
                    last.CheckCycle  = groupCheck.MinInterval();
                }

                groupCheck.ParentGroup = null;
                groupCheck.CheckCycle  = groupCheck.MaxInterval();

                groupChecks.Add(groupCheck);
            }
            return(groupChecks.ToArray());
        }
Пример #2
0
        /// <summary>
        /// Вернет пакет чеков заданного типа, которые хотя бы раз должны быть выполнены до заданного ресурса
        /// Исключит из пакета те чеки, которые по группе выполнения будут совпадать с выполненными чеками
        /// </summary>
        private static MaintenanceCheckGroupByType GetCheckPacketBySource(List <MaintenanceCheckGroupByType> groupChecks,
                                                                          int?lifeLenghtResource,
                                                                          int?minStep, MaintenanceCheck lastComplianceCheck)
        {
            if (lifeLenghtResource == null ||
                lifeLenghtResource == 0 ||
                groupChecks == null ||
                minStep == null)
            {
                return(null);
            }
            int intervalGroupNum, countCompliance;
            MaintenanceCheckGroupByType group = new MaintenanceCheckGroupByType(groupChecks[0].Checks[0].Schedule);
            //список чеков, с которым в последствии будет производится сравнения на группу последнего выполнения

            //Вычисление разницы ресурсов
            int differentOfSource = lifeLenghtResource.Value -
                                    Convert.ToInt32(lastComplianceCheck.LastPerformance.OnLifelength.Days);
            //Вычисление количества просроченных групп
            int countOfOverdueGroup = differentOfSource / minStep.Value;
            //Вычисление максимального ресурса
            int maxSource = (lastComplianceCheck.LastPerformance.NumGroup + countOfOverdueGroup) *
                            Convert.ToInt32(lastComplianceCheck.Interval.Hours);

            //Максимальный ресурс и дальшенйшие вычисления производятся по часам,
            //т.к. их значение более точно, чем значение дней

            //Формирование пакета чеков
            foreach (MaintenanceCheckGroupByType groupCheck in groupChecks)
            {
                foreach (MaintenanceCheck check in groupCheck.Checks)
                {
                    //Вычисление количества, сколько раз должен выполнится чек
                    countCompliance =
                        (maxSource -
                         (maxSource % Convert.ToInt32(check.Interval.Hours))) /
                        Convert.ToInt32(check.Interval.Hours);
                    if (countCompliance != 0)
                    {
                        //чек выолняется хотя бы раз до заданного ресурса
                        //вычисление группы, на которой должен выполнится чек
                        intervalGroupNum =
                            (maxSource -
                             (maxSource % Convert.ToInt32(check.Interval.Hours))) /
                            Convert.ToInt32(lastComplianceCheck.Interval.Hours);
                        //включение чека в пакет
                        check.ComplianceGroupNum = intervalGroupNum;
                        group.Checks.Add(check);
                    }
                }
            }

            if (group.Checks.Count == 0)
            {
                return(null);
            }
            //исключение из пакета тех чеков, чья группа выполнения совпадает
            //с группой последнего выполнения заданого чека
            foreach (MaintenanceCheck maintenanceCheck in group.Checks)
            {
                if (maintenanceCheck.LastPerformance != null &&
                    maintenanceCheck.LastPerformance.NumGroup == maintenanceCheck.ComplianceGroupNum)
                {
                    group.Checks.Remove(maintenanceCheck);
                }
            }
            //заполнение дополнительных данных по группе выполнения
            differentOfSource                    -= differentOfSource % Convert.ToInt32(lastComplianceCheck.Interval.Days);
            group.GroupComplianceNum              = lastComplianceCheck.LastPerformance.NumGroup + countOfOverdueGroup;
            group.GroupComplianceDate             = lastComplianceCheck.LastPerformance.RecordDate.AddDays(differentOfSource);
            group.GroupComplianceLifelength       = new Lifelength(lastComplianceCheck.LastPerformance.OnLifelength);
            group.GroupComplianceLifelength.Days += differentOfSource;
            return(group);
        }
Пример #3
0
        /// <summary>
        /// Сортирует чеки по интервалу выполнения в зависимости от свойства Schedule,
        /// группирует по MaintenanceCheckType (A, B, C, D, etc),
        /// и проставляет связи между группами по приоритету MaintenanceCheckType
        /// </summary>
        public static MaintenanceCheckGroupCollection[] GroupingCheckByType(this ICommonCollection <MaintenanceCheck> maintenanceChecks, bool schedule,
                                                                            bool?grouping = null, LifelengthSubResource?resource = null)
        {
            //Фильтрация чеков по Schedule и упорядочивание по приоритету и группировка по названию типа
            IEnumerable <MaintenanceCheck> preFilteredChecks = maintenanceChecks.Where(c => c.Schedule == schedule);

            if (grouping != null)
            {
                preFilteredChecks = preFilteredChecks.Where(c => c.Grouping == grouping);
            }
            if (resource != null)
            {
                preFilteredChecks = preFilteredChecks.Where(c => c.Resource == resource);
            }
            IEnumerable <IGrouping <MaintenanceCheckType, MaintenanceCheck> > filteredBySchedule =
                preFilteredChecks.OrderBy(c => c.CheckType.Priority)
                .GroupBy(c => c.CheckType);
            //Формирование групп чеков по типам (A,B,C) с дополнительными критериями
            //1. Плановый чек/чек по хранению
            //2. Групповой/Одиночный
            //3. Основной ресурс (Часы/Циклы/Дни)
            List <MaintenanceCheckGroupCollection> checkGroupsCollections = new List <MaintenanceCheckGroupCollection>();

            foreach (IGrouping <MaintenanceCheckType, MaintenanceCheck> checks in filteredBySchedule)
            {
                foreach (MaintenanceCheck check in checks)
                {
                    //Поиск коллекции групп, в которую входят группы с нужными критериями
                    //по плану, группировка и основному ресурсу
                    MaintenanceCheckGroupCollection collection = checkGroupsCollections
                                                                 .FirstOrDefault(g => g.Schedule == check.Schedule &&
                                                                                 g.Grouping == check.Grouping &&
                                                                                 g.Resource == check.Resource);
                    if (collection != null)
                    {
                        //Коллекция найдена
                        //Поиск в ней группы чеков с нужным типом
                        MaintenanceCheckGroupByType groupByType = collection.FirstOrDefault(g => g.CheckType == check.CheckType);
                        if (groupByType != null)
                        {
                            groupByType.Checks.Add(check);
                        }
                        else
                        {
                            //Группы с нужным типом нет
                            //Инициализация и добавление
                            groupByType = new MaintenanceCheckGroupByType(check.Schedule)
                            {
                                Grouping  = check.Grouping,
                                Resource  = check.Resource,
                                CheckType = check.CheckType,
                            };
                            groupByType.Checks.Add(check);
                            collection.Add(groupByType);
                        }
                    }
                    else
                    {
                        //Коллекции с нужными критериями нет
                        //Созадние и добавление
                        collection = new MaintenanceCheckGroupCollection
                        {
                            Schedule = check.Schedule,
                            Grouping = check.Grouping,
                            Resource = check.Resource,
                        };
                        MaintenanceCheckGroupByType groupByType = new MaintenanceCheckGroupByType(check.Schedule)
                        {
                            Grouping  = check.Grouping,
                            Resource  = check.Resource,
                            CheckType = check.CheckType,
                        };
                        groupByType.Checks.Add(check);
                        collection.Add(groupByType);
                        checkGroupsCollections.Add(collection);
                    }
                }
            }
            //Упорядочивание каждой группы по ресурсам выполнения и проставление связей между ними
            foreach (MaintenanceCheckGroupCollection collection in checkGroupsCollections)
            {
                foreach (MaintenanceCheckGroupByType groupByType in collection)
                {
                    groupByType.Sort();

                    MaintenanceCheckGroupByType last =
                        collection.LastOrDefault(gbt => gbt.CheckType.Priority < groupByType.CheckType.Priority);
                    if (last != null)
                    {
                        last.ParentGroup = groupByType;
                        last.CheckCycle  = groupByType.MinIntervalByResource();
                    }

                    groupByType.ParentGroup = null;
                    groupByType.CheckCycle  = groupByType.MaxIntervalByResource();
                }
            }
            return(checkGroupsCollections.ToArray());
        }