/// <summary> /// Возвращает пакеты задач для определенного родителя (воздушного судна, оператора и т.д.) /// </summary> /// <param name="parent">Родитель. При пережаче null вернет все пакеты задач переданного типа</param> /// <param name="statuses">Фильтр статуса рабочего пакета. (По умолчанию = null)</param> /// <param name="loadWorkPackageItems">Флаг загрузки элементов рабочих пакетов</param> /// <param name="includedTasks">Задачи, которые должны содержать пакеты (при передаче пустои коллекции запрос вернет 0 рабочих пакетов)</param> /// <returns></returns> public List <T> GetPackages <T, TV>(BaseEntityObject parent = null, WorkPackageStatus[] statuses = null, bool loadWorkPackageItems = false, BaseEntityObject[] includedTasks = null) where T : AbstractPackage <TV>, new() where TV : BasePackageRecord, new() { List <ICommonFilter> filters = new List <ICommonFilter>(); if (includedTasks != null) { if (includedTasks.Length == 0 || includedTasks.Count(t => t != null) == 0) { //Строка запроса, выдающая идентификаторы пакетов задач string recordsParentId = BaseQueries.GetSelectQueryColumnOnly <TV> (BaseDirectivePackageRecord.ParentIdProperty, new ICommonFilter[] { new CommonFilter <int>(BasePackageRecord.PackageItemTypeProperty, 0), new CommonFilter <int>(BasePackageRecord.PackageItemIdProperty, 0) } ); //Фильтр по ключевому полю таблицы обозначающий //что значения ключевого поля таблицы должны быть //среди идентификаторов пакетов задач ICommonFilter idFilter = new CommonFilter <string>(BaseEntityObject.ItemIdProperty, FilterType.In, new[] { recordsParentId }); filters.Add(idFilter); } else { Dictionary <int, string> subs = new Dictionary <int, string>(); foreach (BaseEntityObject task in includedTasks.Where(t => t != null)) { if (subs.ContainsKey(task.SmartCoreObjectType.ItemId)) { string s = subs[task.SmartCoreObjectType.ItemId]; if (s != "") { s += ", "; } s += task.ItemId; subs[task.SmartCoreObjectType.ItemId] = s; } else { subs.Add(task.SmartCoreObjectType.ItemId, task.ItemId.ToString(CultureInfo.InvariantCulture)); } } string filterString = ""; foreach (KeyValuePair <int, string> sub in subs) { if (filterString != "") { filterString += "\n or"; } filterString += $"(PackageItemTypeId = {sub.Key} and PackageItemId in ({sub.Value}))"; } //Строка запроса, выдающая идентификаторы пакетов задач string recordsParentId = BaseQueries.GetSelectQueryColumnOnly <TV> (BasePackageRecord.PackageItemIdProperty, new ICommonFilter[] { new CommonFilter <string>(null, FilterType.In, new[] { filterString }) }); //Фильтр по ключевому полю таблицы обозначающий //что значения ключевого поля таблицы должны быть //среди идентификаторов пакетов задач ICommonFilter idFilter = new CommonFilter <string>(BaseEntityObject.ItemIdProperty, FilterType.In, new[] { recordsParentId }); filters.Add(idFilter); } } if (parent != null) { filters.Add(new CommonFilter <int>(AbstractPackage <TV> .ParentIdProperty, parent.ItemId)); filters.Add(new CommonFilter <SmartCoreType>(AbstractPackage <TV> .ParentTypeIdProperty, parent.SmartCoreObjectType)); } if (statuses != null && statuses.Length > 0) { filters.Add(new CommonFilter <WorkPackageStatus>(AbstractPackage <TV> .StatusProperty, FilterType.In, statuses)); } List <T> wps = _loader.GetObjectList <T>(filters.ToArray(), true); if (!loadWorkPackageItems) { return(wps); } foreach (T wp in wps) { //Обратная ссылка на родительский объект //загрузка элементов рабочих пакетов (если требуется) LoadPackageItems <T, TV>(wp); } return(wps); }
///// <param name="status">Фильтр статуса рабочего пакета. (По умолчанию = WorkPackageStatus.All)</param> ///// <param name="loadWorkPackageItems">Флаг загрузки элементов рабочих пакетов</param> ///// <param name="includedTasks">Задачи, которые должны содержать пакеты (при передаче пустои коллекции запрос вернет 0 рабочих пакетов)</param> /// <returns></returns> public List <Discrepancy> GetDiscrepancies(Aircraft aircraft = null, DiscFilterType filterType = DiscFilterType.All, DateTime?from = null, DateTime?to = null) //TODO: Переделать на int? aircraftId = null { var resultList = new List <Discrepancy>(); var preResultList = new List <Discrepancy>(); var filters = new List <ICommonFilter>(); if (filterType == DiscFilterType.Defect) { filters.Add(new CommonFilter <bool>(Discrepancy.IsReliabilityProperty, true)); } else if (filterType == DiscFilterType.Occurrence) { filters.Add(new CommonFilter <bool>(Discrepancy.IsOccurrenceProperty, true)); } else if (from.HasValue && to.HasValue) { var flights = _loader.GetObjectList <AircraftFlight>(new ICommonFilter[] { new CommonFilter <DateTime>(AircraftFlight.FlightDateProperty, FilterType.GratherOrEqual, new [] { from.Value.Date }), new CommonFilter <DateTime>(AircraftFlight.FlightDateProperty, FilterType.LessOrEqual, new [] { to.Value.Date }), }); if (flights.Count > 0) { filters.Add(new CommonFilter <int>(Discrepancy.FlightIdProperty, FilterType.In, flights.Select(i => i.ItemId).ToArray())); } } if (aircraft != null) { preResultList.AddRange(_loader.GetObjectList <Discrepancy>(new[] { new CommonFilter <string>(Discrepancy.FlightIdProperty, FilterType.In, new [] { $"(Select ItemId from AircraftFlights where AircraftId = {aircraft.ItemId} and IsDeleted = 0)" }), })); //Строка запроса, выдающая идентификаторы родительских задач КИТов //Фильтр по ключевому полю таблицы обозначающий //что значения ключевого поля таблицы должны быть //среди идентификаторов родительских задач КИТов } else { if (filters.Count > 0) { preResultList.AddRange(_loader.GetObjectListAll <Discrepancy>(filters.ToArray(), loadChild: true)); } } #region //заполнение Discrepancies CorrectiveAction в Discrepancies нового полета// int[] deferredsIds = preResultList .Where(i => i.DirectiveId > 0) .Select(i => i.DirectiveId) .ToArray(); var deffereds = new DirectiveCollection(); if (deferredsIds.Length > 0) { deffereds = _directiveCore.GetDeferredItems(filters: new ICommonFilter[] { new CommonFilter <int>(BaseEntityObject.ItemIdProperty, FilterType.In, deferredsIds) }); } var parentFlights = new List <AircraftFlight>(); var flightIds = preResultList.Select(i => i.FlightId).Distinct().ToArray(); if (aircraft != null) { foreach (var id in flightIds) { var fl = _aircraftFlightCore.GetAircraftFlightById(aircraft.ItemId, id); if (fl != null) { parentFlights.Add(fl); resultList.Add(preResultList.FirstOrDefault(i => i.FlightId == id)); } } } else { if (flightIds.Length > 0) { var flights = _newLoader.GetObjectList <AircraftFlightDTO, AircraftFlight>(new Filter("ItemId", flightIds)); foreach (var id in flightIds) { var fl = flights.FirstOrDefault(i => i.ItemId == id); if (fl != null) { parentFlights.Add(fl); resultList.Add(preResultList.FirstOrDefault(i => i.FlightId == id)); } } } } var atlbs = new List <ATLB>(); var atlbIds = parentFlights.Select(i => i.ATLBId).Distinct().ToArray(); if (atlbIds.Length > 0) { //atlbs.AddRange(_loader.GetObjectList<ATLB>(new CommonFilter<int>(BaseEntityObject.ItemIdProperty, FilterType.In, atlbIds))); atlbs.AddRange(_newLoader.GetObjectList <ATLBDTO, ATLB>(new Filter("ItemId", atlbIds))); } var correctiveActions = new List <CorrectiveAction>(); var discrepancyIds = resultList.Select(i => i.ItemId).Distinct().ToArray(); if (discrepancyIds.Length > 0) { //correctiveActions.AddRange(_loader.GetObjectList<CorrectiveAction>(new CommonFilter<int>(CorrectiveAction.DiscrepancyIdProperty, FilterType.In, discrepancyIds), true)); correctiveActions.AddRange(_newLoader.GetObjectList <CorrectiveActionDTO, CorrectiveAction>(new Filter("DiscrepancyID", discrepancyIds), true)); } var cetificates = new List <CertificateOfReleaseToService>(); var crsIds = correctiveActions.Select(i => i.CRSID).Distinct().ToArray(); if (crsIds.Length > 0) { cetificates.AddRange(_loader.GetObjectList <CertificateOfReleaseToService>(new CommonFilter <int>(BaseEntityObject.ItemIdProperty, FilterType.In, crsIds), true)); } //cetificates.AddRange(_newLoader.GetObjectList<CertificateOfReleaseToServiceDTO, CertificateOfReleaseToService>(new Filter("ItemId", crsIds), true)); foreach (var t in resultList) { t.ParentFlight = parentFlights.FirstOrDefault(i => i.ItemId == t.FlightId); if (t.ParentFlight != null) { t.ParentFlight.ParentATLB = atlbs.FirstOrDefault(i => i.ItemId == t.ParentFlight.ATLBId); } t.DeferredItem = deffereds.GetDirectiveById(t.DirectiveId) as DeferredItem; t.CorrectiveActionCollection = new CorrectiveActionCollection(); t.CorrectiveActionCollection.AddRange(correctiveActions.Where(i => t.ItemId == i.DiscrepancyId)); t.CorrectiveAction.CertificateOfReleaseToService = cetificates.FirstOrDefault(i => i.ItemId == t.CorrectiveAction.CRSID); } #endregion return(resultList.Where(i => i.ParentFlight != null && i.ParentFlight.ParentATLB != null).ToList()); }
public List <AbstractAccessory> GetAllWorkPackageKits(int workPackageId) { var resultKits = new List <AbstractAccessory>(); #region Поиск Директив летной годности с КИТами //Строка запроса, выдающая идентификаторы родительских задач КИТов var accessoryParentId = BaseQueries.GetSelectQueryColumnOnly <AccessoryRequired> (AccessoryRequired.ParentIdProperty, new ICommonFilter[] { new CommonFilter <int>(AccessoryRequired.ParentTypeIdProperty, SmartCoreType.Directive.ItemId) } ); //Фильтр по ключевому полю таблицы обозначающий //что значения ключевого поля таблицы должны быть //среди идентификаторов родительских задач КИТов ICommonFilter idFilter = new CommonFilter <string>(BaseEntityObject.ItemIdProperty, FilterType.In, new[] { accessoryParentId }); //создаются запросы на выборку задач по компонентам с заданного рабочего пакета //дополнительно фильтрую ключевое поле. значение ключевого поля //задач по компонентам рабочего пакета должно быть среди идентификатор родительских задач КИТов var qrs = DirectiveQueries.GetSelectQueryForWp(workPackageId, DirectiveType.All, new[] { idFilter }, true); var directives = _loader.GetObjectListAll <Directive>(qrs, true); //связь КИТов с родительскими деталями foreach (var directive in directives) { resultKits.AddRange(directive.Kits.ToArray()); } #endregion #region Поиск Директив деталей с КИТами //Строка запроса, выдающая идентификаторы родительских задач КИТов accessoryParentId = BaseQueries.GetSelectQueryColumnOnly <AccessoryRequired> (AccessoryRequired.ParentIdProperty, new ICommonFilter[] { new CommonFilter <int>(AccessoryRequired.ParentTypeIdProperty, SmartCoreType.ComponentDirective.ItemId) } ); //Фильтр по ключевому полю таблицы обозначающий //что значения ключевого поля таблицы должны быть //среди идентификаторов родительских задач КИТов idFilter = new CommonFilter <string>(BaseEntityObject.ItemIdProperty, FilterType.In, new[] { accessoryParentId }); //создаются запросы на выборку задач по компонентам с заданного рабочего пакета //дополнительно фильтрую ключевое поле. значение ключевого поля //задач по компонентам рабочего пакета должно быть среди идентификатор родительских задач КИТов qrs = ComponentDirectiveQueries.GetSelectQueryForWp(workPackageId, new[] { idFilter }, true); var componentDirectives = _loader.GetObjectListAll <ComponentDirective>(qrs, true); //связь КИТов с родительскими деталями foreach (var dd in componentDirectives) { dd.ParentComponent = _componentCore.GetComponentById(dd.ComponentId); resultKits.AddRange(dd.Kits.ToArray()); } #endregion #region Поиск КИТ-ов Maintenance чеков //Строка запроса, выдающая идентификаторы родительских задач КИТов accessoryParentId = BaseQueries.GetSelectQueryColumnOnly <AccessoryRequired> (AccessoryRequired.ParentIdProperty, new ICommonFilter[] { new CommonFilter <int>(AccessoryRequired.ParentTypeIdProperty, SmartCoreType.MaintenanceCheck.ItemId) } ); //Фильтр по ключевому полю таблицы обозначающий //что значения ключевого поля таблицы должны быть //среди идентификаторов родительских задач КИТов idFilter = new CommonFilter <string>(BaseEntityObject.ItemIdProperty, FilterType.In, new[] { accessoryParentId }); var directiveIn = BaseQueries.GetSelectQueryColumnOnly <WorkPackageRecord>(WorkPackageRecord.DirectiveIdProperty, new ICommonFilter[] { new CommonFilter <int>(WorkPackageRecord.WorkPakageIdProperty, workPackageId), new CommonFilter <int>(WorkPackageRecord.WorkPackageItemTypeProperty, SmartCoreType.MaintenanceCheck.ItemId) }); //создаются запросы на выборку чеков с заданного рабочего пакета //дополнительно фильтрую ключевое поле. значение ключевого поля //чека рабочего пакета должно быть среди идентификатор родительских задач КИТов var checks = _loader.GetObjectListAll <MaintenanceCheck>(new[] { new CommonFilter <string>(BaseEntityObject.ItemIdProperty, FilterType.In, new[] { directiveIn }), idFilter }, true); //связь КИТов с родительскими деталями foreach (var dd in checks) { resultKits.AddRange(dd.Kits.ToArray()); } #endregion #region Поиск КИТ-ов NonRoutine Job-ов var jobDTOs = _nonRoutineJobDataAccess.GetNonRoutineJobDTOsWithKitsByWorkPackageId(workPackageId); //связь КИТов с родительскими деталями foreach (var jobDTO in jobDTOs) { var nonRoutineJob = NonRoutineJobHelper.Convert(jobDTO, _casEnvironment); resultKits.AddRange(nonRoutineJob.Kits.ToArray()); } #endregion #region Поиск КИТ-ов Базовых деталей directiveIn = BaseQueries.GetSelectQueryColumnOnly <WorkPackageRecord>(WorkPackageRecord.DirectiveIdProperty, new ICommonFilter[] { new CommonFilter <int>(WorkPackageRecord.WorkPakageIdProperty, workPackageId), new CommonFilter <int>(WorkPackageRecord.WorkPackageItemTypeProperty, SmartCoreType.BaseComponent.ItemId) }); var kitQrs = BaseQueries.GetSelectQueryWithWhereAll <AccessoryRequired>(new ICommonFilter[] { new CommonFilter <int>(AccessoryRequired.ParentTypeIdProperty, SmartCoreType.BaseComponent.ItemId), new CommonFilter <string>(BaseEntityObject.ItemIdProperty, FilterType.In, new[] { directiveIn }) }, true); var kits = _loader.GetObjectListAll <AccessoryRequired>(kitQrs, true); var baseComponents = _loader.GetObjectList <BaseComponent>(new CommonFilter <string>(BaseEntityObject.ItemIdProperty, FilterType.In, new[] { directiveIn })); //связь КИТов с родительскими деталями foreach (var baseComponent in baseComponents) { baseComponent.Kits.Clear(); baseComponent.Kits.AddRange(kits.Where(k => k.ParentId == baseComponent.ItemId)); foreach (var kit in baseComponent.Kits) { kit.ParentObject = baseComponent; } } resultKits.AddRange(kits.ToArray()); #endregion #region поиск КИТ-ов деталей directiveIn = BaseQueries.GetSelectQueryColumnOnly <WorkPackageRecord>(WorkPackageRecord.DirectiveIdProperty, new ICommonFilter[] { new CommonFilter <int>(WorkPackageRecord.WorkPakageIdProperty, workPackageId), new CommonFilter <int>(WorkPackageRecord.WorkPackageItemTypeProperty, SmartCoreType.Component.ItemId) }); kitQrs = BaseQueries.GetSelectQueryWithWhereAll <AccessoryRequired>(new ICommonFilter[] { new CommonFilter <int>(AccessoryRequired.ParentTypeIdProperty, SmartCoreType.Component.ItemId), new CommonFilter <string>(BaseEntityObject.ItemIdProperty, FilterType.In, new[] { directiveIn }) }, true); kits = _loader.GetObjectListAll <AccessoryRequired>(kitQrs, true); var components = _loader.GetObjectList <Entities.General.Accessory.Component>(new CommonFilter <string>(BaseEntityObject.ItemIdProperty, FilterType.In, new[] { directiveIn })); //связь КИТов с родительскими деталями foreach (var component in components) { component.Kits.Clear(); component.Kits.AddRange(kits.Where(k => k.ParentId == component.ItemId)); foreach (var kit in component.Kits) { kit.ParentObject = component; } } resultKits.AddRange(kits.ToArray()); #endregion #region Поиск MPD с КИТами //Строка запроса, выдающая идентификаторы родительских задач КИТов accessoryParentId = BaseQueries.GetSelectQueryColumnOnly <AccessoryRequired> (AccessoryRequired.ParentIdProperty, new ICommonFilter[] { new CommonFilter <int>(AccessoryRequired.ParentTypeIdProperty, SmartCoreType.MaintenanceDirective.ItemId) } ); //Фильтр по ключевому полю таблицы обозначающий //что значения ключевого поля таблицы должны быть //среди идентификаторов родительских задач КИТов idFilter = new CommonFilter <string>(BaseEntityObject.ItemIdProperty, FilterType.In, new[] { accessoryParentId }); //создаются запросы на выборку задач с заданного рабочего пакета //дополнительно фильтруя ключевое поле. значение ключевого поля //задач по компонентам рабочего пакета должно быть среди идентификатор родительских задач КИТов qrs = MaintenanceDirectiveQueries.GetSelectQueryForWp(workPackageId, new[] { idFilter }, true); var maintenanceDirectives = _loader.GetObjectListAll <MaintenanceDirective>(qrs, true); //связь КИТов с родительскими деталями foreach (var mpd in maintenanceDirectives) { resultKits.AddRange(mpd.Kits.ToArray()); } #endregion return(resultKits); }