From 7deef9a264eb746e26bf66daa5be509a3f33670d Mon Sep 17 00:00:00 2001 From: Mikhail Trubnikov Date: Tue, 4 Jun 2024 12:03:15 +1000 Subject: [PATCH] =?UTF-8?q?feat(all):=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=BE=D1=81=D0=BB?= =?UTF-8?q?=D0=B5=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D1=8B=20WorkGroup?= =?UTF-8?q?.=20=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=BB=D0=BE=D0=B3=D0=B8=D0=BA=D0=B0=20=D0=B3=D0=B5?= =?UTF-8?q?=D0=BD=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D0=B8=20=D1=88=D0=B0=D0=B1?= =?UTF-8?q?=D0=BB=D0=BE=D0=BD=D0=BE=D0=B2=20=D1=81=20=D1=83=D1=87=D0=B5?= =?UTF-8?q?=D1=82=D0=BE=D0=BC=20=D1=80=D0=B0=D0=B1=D0=BE=D1=87=D0=B8=D1=85?= =?UTF-8?q?=20=D0=B3=D1=80=D1=83=D0=BF=D0=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PARR.API/Contracts/V1/ApiRoutes.cs | 8 ++ .../V1/Requests/ApplicationInWorkRequest.cs | 2 + .../V1/Requests/Queries/WorkGroupQuery.cs | 10 +++ .../V1/Responses/ApplicationInWorkResponse.cs | 2 + .../V1/Responses/HostBaseResponse.cs | 4 +- .../V1/Responses/WorkGroupResponse.cs | 9 ++ .../V1/ApplicationInWorkController.cs | 28 ++++++- .../Controllers/V1/RobotTaskController.cs | 6 +- .../Controllers/V1/WorkGroupController.cs | 83 +++++++++++++++++++ .../DomainToResponseProfile.cs | 21 +++-- .../Validators/ApplicationInWorkValidator.cs | 24 ++++-- .../Implementations/TemplateService.cs | 4 +- PARR.EsppScheduleSync/ScheduleSyncher.cs | 3 +- PARR.EsppTemplateSync/TemplateMQSyncer.cs | 3 +- .../Services/TemplateManager.cs | 40 ++++++++- 15 files changed, 227 insertions(+), 20 deletions(-) create mode 100644 PARR.API/Contracts/V1/Requests/Queries/WorkGroupQuery.cs create mode 100644 PARR.API/Contracts/V1/Responses/WorkGroupResponse.cs create mode 100644 PARR.API/Controllers/V1/WorkGroupController.cs diff --git a/PARR.API/Contracts/V1/ApiRoutes.cs b/PARR.API/Contracts/V1/ApiRoutes.cs index 2ae50e0e..dc91e5c7 100644 --- a/PARR.API/Contracts/V1/ApiRoutes.cs +++ b/PARR.API/Contracts/V1/ApiRoutes.cs @@ -107,6 +107,14 @@ public const string getParam = "{id}"; } + public static class WorkGroup + { + public const string GetAll = Base + "/work-groups/"; + public const string Get = Base + "/work-groups/" + getParam; + + public const string getParam = "{id}"; + } + public static class RobotHistoryLevel { public const string GetAll = Base + "/robot-history-levels/"; diff --git a/PARR.API/Contracts/V1/Requests/ApplicationInWorkRequest.cs b/PARR.API/Contracts/V1/Requests/ApplicationInWorkRequest.cs index d811c045..90c4eb80 100644 --- a/PARR.API/Contracts/V1/Requests/ApplicationInWorkRequest.cs +++ b/PARR.API/Contracts/V1/Requests/ApplicationInWorkRequest.cs @@ -28,6 +28,8 @@ //public required ScheduleRequest Schedule { get; set; } public List Schedule { get; set; } = new List(); + + public List WorkGroups { get; set; } = new List(); } diff --git a/PARR.API/Contracts/V1/Requests/Queries/WorkGroupQuery.cs b/PARR.API/Contracts/V1/Requests/Queries/WorkGroupQuery.cs new file mode 100644 index 00000000..8ee75781 --- /dev/null +++ b/PARR.API/Contracts/V1/Requests/Queries/WorkGroupQuery.cs @@ -0,0 +1,10 @@ +namespace PARR.API.Contracts.V1.Requests.Queries +{ + public class WorkGroupQuery + { + /// + /// Поиск по имени, например "АСУ" + /// + public string? Name { get; set; } + } +} diff --git a/PARR.API/Contracts/V1/Responses/ApplicationInWorkResponse.cs b/PARR.API/Contracts/V1/Responses/ApplicationInWorkResponse.cs index 3a829494..5d25ff4c 100644 --- a/PARR.API/Contracts/V1/Responses/ApplicationInWorkResponse.cs +++ b/PARR.API/Contracts/V1/Responses/ApplicationInWorkResponse.cs @@ -31,6 +31,8 @@ public int TemplatesCount { get; set; } public ApplicationInWorkScheduleResponse? Schedule { get; set; } + + public List? WorkGroups { get; set; } } diff --git a/PARR.API/Contracts/V1/Responses/HostBaseResponse.cs b/PARR.API/Contracts/V1/Responses/HostBaseResponse.cs index b9f8a155..7a8332ad 100644 --- a/PARR.API/Contracts/V1/Responses/HostBaseResponse.cs +++ b/PARR.API/Contracts/V1/Responses/HostBaseResponse.cs @@ -10,7 +10,9 @@ public string? Status { get; set; } - public string? WorkGroup { get; set; } + public string? WorkGroupName { get; set; } + + public WorkGroupResponse? WorkGroup { get; set; } public string? ResponseArea { get; set; } diff --git a/PARR.API/Contracts/V1/Responses/WorkGroupResponse.cs b/PARR.API/Contracts/V1/Responses/WorkGroupResponse.cs new file mode 100644 index 00000000..87580677 --- /dev/null +++ b/PARR.API/Contracts/V1/Responses/WorkGroupResponse.cs @@ -0,0 +1,9 @@ +namespace PARR.API.Contracts.V1.Responses +{ + public class WorkGroupResponse + { + public Guid Id { get; set; } + + public required string Name { get; set; } + } +} diff --git a/PARR.API/Controllers/V1/ApplicationInWorkController.cs b/PARR.API/Controllers/V1/ApplicationInWorkController.cs index 20cd494e..d99ba263 100644 --- a/PARR.API/Controllers/V1/ApplicationInWorkController.cs +++ b/PARR.API/Controllers/V1/ApplicationInWorkController.cs @@ -58,7 +58,8 @@ namespace PARR.API.Controllers.V1 { query = query.Include(t => t.Application).ThenInclude(t => t!.ApplicationType) .Include(t => t.Work) - .Include(t => t.Templates); + .Include(t => t.Templates) + .Include(t => t.WorkGroups).ThenInclude(t => t.WorkGroup); } query = query.OrderBy(t => t.ShortDescription); @@ -93,6 +94,7 @@ namespace PARR.API.Controllers.V1 .Include(t => t.Application).ThenInclude(t => t!.ApplicationType) .Include(t => t.Work) .Include(t => t.Templates) + .Include(t => t.WorkGroups).ThenInclude(t => t.WorkGroup) .FirstOrDefaultAsync(t => t.Id == id); if (applicationInWork == null) @@ -149,6 +151,16 @@ namespace PARR.API.Controllers.V1 }); }); + //Добавляем рабочие группы + request.WorkGroups.ForEach(workGroupId => + { + applicationInWork.WorkGroups.Add(new AppInWorkInWorkGroup + { + ApplicationsInWorkId = applicationInWork.Id, + WorkGroupId = workGroupId + }); + }); + if (!await applicationsInWorkService.CreateAsync(applicationInWork) || !await applicationsInWorkService.CommitAsync()) return BadRequest(new Response(false, new List { new ErrorModel { Message = "Ошибка при созании задания на выполнение работ" } })); @@ -159,6 +171,7 @@ namespace PARR.API.Controllers.V1 .Include(t => t.Application).ThenInclude(t => t!.ApplicationType) .Include(t => t.Work) .Include(t => t.Templates) + .Include(t => t.WorkGroups).ThenInclude(t => t.WorkGroup) .FirstAsync(t => t.Id == applicationInWork.Id); var locationUri = uriService.GetUri(ApiRoutes.Job.Get, ApiRoutes.Job.getParam, createdApplicationInWork.Id); @@ -215,6 +228,18 @@ namespace PARR.API.Controllers.V1 }); }); + //Обновляем рабочие группы + orig.WorkGroups.Clear(); + request.WorkGroups.ForEach(workGroupId => + { + orig.WorkGroups.Add(new AppInWorkInWorkGroup + { + ApplicationsInWorkId = orig.Id, + WorkGroupId = workGroupId + }); + }); + + if (!await applicationsInWorkService.CommitAsync()) return BadRequest(new Response(false, new List { new ErrorModel { Message = "Ошибка при изменении задания на выполнение работ." } })); @@ -227,6 +252,7 @@ namespace PARR.API.Controllers.V1 .Include(t => t.Application).ThenInclude(t => t!.ApplicationType) .Include(t => t.Work) .Include(t => t.Templates) + .Include(t => t.WorkGroups).ThenInclude(t => t.WorkGroup) .FirstAsync(t => t.Id == orig.Id); return Ok(new Response(mapper.Map(updatedApplicationInWork), true)); diff --git a/PARR.API/Controllers/V1/RobotTaskController.cs b/PARR.API/Controllers/V1/RobotTaskController.cs index cbbe0d14..f471df85 100644 --- a/PARR.API/Controllers/V1/RobotTaskController.cs +++ b/PARR.API/Controllers/V1/RobotTaskController.cs @@ -63,19 +63,21 @@ namespace PARR.API.Controllers.V1 // шаблоны query = query.Include(t => t.Template) .ThenInclude(t => t!.Host).ThenInclude(t => t!.ResponseArea) + .ThenInclude(t => t!.Hosts).ThenInclude(t => t.WorkGroupItem) .Include(t => t.Template) .ThenInclude(a => a!.ApplicationsInWork) .ThenInclude(w => w!.Work) .ThenInclude(t => t!.Tnk) .ThenInclude(s => s!.Subprocess) - .ThenInclude(p => p!.Process) - .AsSplitQuery(); + .ThenInclude(p => p!.Process); + //.AsSplitQuery(); break; case RobotsEnum.ScheduleOrder: //расписание // тут не делаем AsSplitQuery, не может подтянуть все таблицы query = query.Include(t => t.Template) .ThenInclude(t => t!.Host).ThenInclude(t => t!.ResponseArea) + .ThenInclude(t => t!.Hosts).ThenInclude(t => t.WorkGroupItem) .Include(t => t.Template) .ThenInclude(t => t!.ApplicationsInWork) .ThenInclude(t => t!.EsppSchValues) diff --git a/PARR.API/Controllers/V1/WorkGroupController.cs b/PARR.API/Controllers/V1/WorkGroupController.cs new file mode 100644 index 00000000..ab0615e2 --- /dev/null +++ b/PARR.API/Controllers/V1/WorkGroupController.cs @@ -0,0 +1,83 @@ +using AutoMapper; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; +using PARR.API.Contracts.V1; +using PARR.API.Contracts.V1.Requests.Queries; +using PARR.API.Contracts.V1.Responses; +using PARR.API.Contracts.V1.Responses.Base; +using PARR.API.Controllers.V1.Base; +using PARR.API.Extensions; +using PARR.Constants; +using PARR.DAL.DomainModels; +using PARR.DAL.Models; +using PARR.DAL.Services.Interfaces; + +namespace PARR.API.Controllers.V1 +{ + /// + /// Рабочие группы + /// + [Authorize(Roles = ParrRoles.Administrator.Role)] + public class WorkGroupController : BaseApiController + { + private readonly IMapper mapper; + private readonly IWorkGroupService workGroupService; + + public WorkGroupController( + IMapper mapper, + IWorkGroupService workGroupService + ) + { + this.mapper = mapper; + this.workGroupService = workGroupService; + } + + + /// + /// Список рабочих групп постранично + /// + /// + [HttpGet(ApiRoutes.WorkGroup.GetAll)] + public async Task GetAll([FromQuery] PaginationQuery paginationQuery, [FromQuery] WorkGroupQuery filter) + { + var paginationFilter = mapper.Map(paginationQuery); + + IQueryable query = workGroupService.Get() + .OrderBy(t => t.Name); + + if (!string.IsNullOrEmpty(filter.Name)) + query = query.Where(t => t.Name.ToLower().Contains(filter.Name.ToLower())); + + var workGroups = await workGroupService.GetPage(query, paginationFilter).ToListAsync(); + + if (!workGroups.Any()) + return NoContent(); + + var workGroupResponse = mapper.Map>(workGroups); + var paginationResponse = new PagedResponse(workGroupResponse, true).GetPaginatedProps(paginationFilter, query); + + return Ok(paginationResponse); + } + + + /// + /// Получить рабочую группу по id + /// + /// + /// + [HttpGet(ApiRoutes.WorkGroup.Get)] + public async Task Get([FromRoute] Guid id) + { + var workGroup = await workGroupService.GetAsync(id); + + if (workGroup == null) + return NotFound(); + + var response = mapper.Map(workGroup); + + return Ok(new Response(response, true)); + } + + } +} diff --git a/PARR.API/MappingProfiles/DomainToResponseProfile.cs b/PARR.API/MappingProfiles/DomainToResponseProfile.cs index b540fd00..58ca8bc9 100644 --- a/PARR.API/MappingProfiles/DomainToResponseProfile.cs +++ b/PARR.API/MappingProfiles/DomainToResponseProfile.cs @@ -81,20 +81,26 @@ namespace PARR.API.MappingProfiles CreateMap(); - #region Host + #region Host - // --- Host --- CreateMap() .Include() .Include() .ForMember(d => d.Status, o => o.MapFrom(s => s.EkStatus!.Name)) - .ForMember(d => d.ResponseArea, o => o.MapFrom(s => s.ResponseArea!.Name)); + .ForMember(d => d.ResponseArea, o => o.MapFrom(s => s.ResponseArea!.Name)) + .ForMember(d => d.WorkGroupName, o => o.MapFrom(s => s.WorkGroupItem.Name)) + .ForMember(d => d.WorkGroup, o => o.MapFrom(s => s.WorkGroupItem)); CreateMap(); CreateMap() .ForMember(d => d.Applications, o => o.MapFrom(s => s.ApplicationsInHosts.Select(t => t.Application).OrderBy(t => t.Name))); - // === Host === + + #endregion + + #region WorkGroup + + CreateMap(); #endregion @@ -133,7 +139,7 @@ namespace PARR.API.MappingProfiles .ForMember(d => d.TemplateDuration, o => o.MapFrom(s => s.Template!.ApplicationsInWork!.TemplateDuration)) .ForMember(d => d.Initiator, o => o.MapFrom()) .ForMember(d => d.Category, o => o.MapFrom()) - .ForMember(d => d.WorkGroup, o => o.MapFrom(s => s.Template!.Host!.WorkGroup)) + .ForMember(d => d.WorkGroup, o => o.MapFrom(s => s.Template!.Host!.WorkGroupItem!.Name)) .ForMember(d => d.Ek, o => o.MapFrom(s => s.Template!.Host!.Ek)) .ForMember(d => d.Name, o => o.MapFrom(s => s.Template!.Name)) .ForMember(d => d.ProcessName, o => o.MapFrom(s => s.Template!.ApplicationsInWork!.Work!.Tnk!.Subprocess!.Process!.Name)) @@ -154,7 +160,7 @@ namespace PARR.API.MappingProfiles .ForMember(d => d.ResponseArea, o => o.MapFrom(s => s.Template!.Host!.ResponseArea!.Name)) .ForMember(d => d.TemplateName, o => o.MapFrom(s => s.Template!.Name)) .ForMember(d => d.TemplateId, o => o.MapFrom(s => s.Template!.Id)) - .ForMember(d => d.WorkGroup, o => o.MapFrom(s => s.Template!.Host!.WorkGroup)) + .ForMember(d => d.WorkGroup, o => o.MapFrom(s => s.Template!.Host!.WorkGroupItem!.Name)) .ForMember(d => d.Exclude, o => o.MapFrom()) .ForMember(d => d.Timezone, o => o.MapFrom()) .ForMember(d => d.RepeatRange, o => o.MapFrom()) @@ -251,7 +257,8 @@ namespace PARR.API.MappingProfiles .ForMember(d => d.Work, o => o.MapFrom(s => s.Work)) .ForMember(d => d.Application, o => o.MapFrom(s => s.Application)) .ForMember(d => d.TemplatesCount, o => o.MapFrom(s => s.Templates.Count())) - .ForMember(d => d.Schedule, o => o.MapFrom()); + .ForMember(d => d.Schedule, o => o.MapFrom()) + .ForMember(d => d.WorkGroups, o => o.MapFrom(s => s.WorkGroups.OrderBy(t => t.WorkGroup.Name).Select(t => t.WorkGroup))); #endregion diff --git a/PARR.API/Validators/ApplicationInWorkValidator.cs b/PARR.API/Validators/ApplicationInWorkValidator.cs index 225d309b..f973f46f 100644 --- a/PARR.API/Validators/ApplicationInWorkValidator.cs +++ b/PARR.API/Validators/ApplicationInWorkValidator.cs @@ -1,6 +1,6 @@ using FluentValidation; +using Microsoft.EntityFrameworkCore; using PARR.API.Contracts.V1.Requests; -using PARR.API.Contracts.V1.Responses.Base; using PARR.DAL.Services.Interfaces; namespace PARR.API.Validators @@ -10,17 +10,19 @@ namespace PARR.API.Validators private readonly IApplicationsInWorkService applicationsInWorkService; private readonly IWorkService workService; private readonly IEsppSchTypeConfigService esppSchTypeConfigService; + private readonly IWorkGroupService workGroupService; public ApplicationInWorkValidator( IApplicationsInWorkService applicationsInWorkService, IWorkService workService, - IEsppSchTypeConfigService esppSchTypeConfigService + IEsppSchTypeConfigService esppSchTypeConfigService, + IWorkGroupService workGroupService ) { this.applicationsInWorkService = applicationsInWorkService; this.workService = workService; this.esppSchTypeConfigService = esppSchTypeConfigService; - + this.workGroupService = workGroupService; RuleFor(t => t.TemplateDuration) .NotNull().NotEmpty()//.WithMessage("Длительность данного задания на выполнение работ не может быть пустым") @@ -45,8 +47,8 @@ namespace PARR.API.Validators RuleFor(t => t.ApplicationId) .MustAsync(async (entity, value, c) => await IsApplicationExist(entity)) .WithMessage("Указан несуществующий Id программного обеспечения"); - //.MustAsync(async (entity, value, c) => await AppInWorkIsUnique(entity)) - // .WithMessage("Задание на выполнение работ с такими ПО и работой уже существует"); + //.MustAsync(async (entity, value, c) => await AppInWorkIsUnique(entity)) + // .WithMessage("Задание на выполнение работ с такими ПО и работой уже существует"); //.WithMessage("У данного задания на выполнение работ указан несуществующий Id программного обеспечения"); @@ -89,6 +91,18 @@ namespace PARR.API.Validators // .When(t => t.Schedule != null).WithMessage("Не удалось найти подходящую конфигруцию планировщика задания на выполнение работ"); #endregion + + + RuleFor(t => t.WorkGroups) + .MustAsync(async (entity, value, c) => await IsWorkGroupsExistAsync(entity)) + .WithMessage("Указаные несуществующие Id рабочих групп"); + } + + private async Task IsWorkGroupsExistAsync(ApplicationInWorkRequest entity) + { + var result = await workGroupService.Get().Where(t => entity.WorkGroups.Contains(t.Id)).ToListAsync(); + + return entity.WorkGroups.Count() == result.Count(); } //private bool IsEsppSchValuesExist(ApplicationInWorkRequest request) diff --git a/PARR.DAL/Services/Implementations/TemplateService.cs b/PARR.DAL/Services/Implementations/TemplateService.cs index 8a85860a..f99d21c4 100644 --- a/PARR.DAL/Services/Implementations/TemplateService.cs +++ b/PARR.DAL/Services/Implementations/TemplateService.cs @@ -27,7 +27,7 @@ namespace PARR.DAL.Services.Implementations public async Task GetTemplateByNameAsync(string name) { return await GetWithIncludes() - .Include(t=>t.RobotConfigurations) + .Include(t => t.RobotConfigurations) .FirstOrDefaultAsync(t => t.Name == name); } @@ -36,6 +36,8 @@ namespace PARR.DAL.Services.Implementations return Get() .Include(h => h.Host) .ThenInclude(t => t!.ResponseArea) + .Include(h => h.Host) + .ThenInclude(t => t!.WorkGroupItem) .Include(h => h.Host) .ThenInclude(t => t!.EkStatus) .Include(a => a.ApplicationsInWork) diff --git a/PARR.EsppScheduleSync/ScheduleSyncher.cs b/PARR.EsppScheduleSync/ScheduleSyncher.cs index 11debea7..78f79912 100644 --- a/PARR.EsppScheduleSync/ScheduleSyncher.cs +++ b/PARR.EsppScheduleSync/ScheduleSyncher.cs @@ -84,7 +84,8 @@ namespace PARR.EsppScheduleSync ScheduleName = template.Name, IsActive = template.IsActiveSchedule, ResponseArea = template.Host!.ResponseArea!.Name, - WorkGroup = template.Host!.WorkGroup!, + //WorkGroup = template.Host!.WorkGroup!, + WorkGroup = template.Host!.WorkGroupItem!.Name, //Мы решили, что для всех расписаний "Нет исключений", если что-то поменяется, тут нужно переделать TypeV60calendar = settingsFromDb.ScheduleExclude == "Нет исключений" ? "NONE" : "", Scheduled = EsppScheduleHelpers.GetNextRun(template.ApplicationsInWork!.NextRun), diff --git a/PARR.EsppTemplateSync/TemplateMQSyncer.cs b/PARR.EsppTemplateSync/TemplateMQSyncer.cs index b609c0ee..46c9c37e 100644 --- a/PARR.EsppTemplateSync/TemplateMQSyncer.cs +++ b/PARR.EsppTemplateSync/TemplateMQSyncer.cs @@ -73,7 +73,8 @@ namespace PARR.EsppTemplateSync { TemplateName = template.Name, IsActive = template.IsActiveTemplate, - WorkGroup = template.Host!.WorkGroup!, + //WorkGroup = template.Host!.WorkGroup!, + WorkGroup = template.Host!.WorkGroupItem!.Name, ShortDescription = Normalize(template.ApplicationsInWork!.ShortDescription), ResponseArea = template.Host!.ResponseArea!.Name, Duration = template.ApplicationsInWork.TemplateDuration, diff --git a/PARR.GeneratorTemplates/Services/TemplateManager.cs b/PARR.GeneratorTemplates/Services/TemplateManager.cs index 97fa9c35..af550c6e 100644 --- a/PARR.GeneratorTemplates/Services/TemplateManager.cs +++ b/PARR.GeneratorTemplates/Services/TemplateManager.cs @@ -18,13 +18,15 @@ namespace PARR.GeneratorTemplates.Services private readonly ILogger logger; private readonly SettingsFromDb settingsFromDb; private readonly IRobotConfigurationService robotConfigurationService; + private readonly IApplicationsInWorkService applicationsInWorkService; public TemplateManager( ITemplateService templateService, IHostService hostService, ILogger logger, SettingsFromDb settingsFromDb, - IRobotConfigurationService robotConfigurationService + IRobotConfigurationService robotConfigurationService, + IApplicationsInWorkService applicationsInWorkService ) { this.templateService = templateService; @@ -32,10 +34,24 @@ namespace PARR.GeneratorTemplates.Services this.logger = logger; this.settingsFromDb = settingsFromDb; this.robotConfigurationService = robotConfigurationService; + this.applicationsInWorkService = applicationsInWorkService; } public async Task CreateTemplates(GeneratorTemplateMq query) { + //В таблице AppInWork находим РР, и смотрим ее рабочие группы. Затем по ним будем фильтровать хосты + var appInWorkWg = await applicationsInWorkService.Get() + .Include(t => t.WorkGroups) + .FirstAsync(t => t.ApplicationId == query.ApplicationId && t.WorkId == query.WorkId); + + if (!appInWorkWg.WorkGroups.Any()) + { + logger.LogWarning($"Не генерирую шаблоны. Нет рабочих групп у ApplicationInWork с id: {appInWorkWg.Id}"); + return; + } + + var workGroups = appInWorkWg.WorkGroups.ToList(); + //Согласно параметрам, находит все ЭК в таблице Hosts. //Далее проверяет есть ли такие шаблоны в таблице Templates, если нет, то создает, активирует и ставит статус Creating. //Если такие шаблоны уже есть, ничего с ними не делает. @@ -44,6 +60,7 @@ namespace PARR.GeneratorTemplates.Services // список хостов для создания шаблонов var queryHosts = hostService.Get() + //.Include(t => t.WorkGroupItem) .Include(t => t.ApplicationsInHosts) .ThenInclude(t => t.Application).ThenInclude(t => t!.ApplicationsInWorks).ThenInclude(w => w.Work) .Include(t => t.Templates) @@ -57,6 +74,8 @@ namespace PARR.GeneratorTemplates.Services && EF.Functions.Like(t.Ek.ToLower(), ekPattern) // смотрим что нет такого шаблона && t.Templates.Any(templ => templ.ApplicationsInWork!.WorkId == query.WorkId && templ.ApplicationsInWork.ApplicationId == query.ApplicationId) == false + // смотрим что у этих хостов есть нужные группы + //&& workGroups.Any(x => x.WorkGroupId == t.WorkGroupId) ); // статус ЭК @@ -67,6 +86,8 @@ namespace PARR.GeneratorTemplates.Services .AsSplitQuery() .ToListAsync(); + // Исключаем хосты у которых нет нужных групп + hosts = hosts.Where(t => workGroups.Any(x => x.WorkGroupId == t.WorkGroupId)).ToList(); if (!hosts.Any()) { logger.LogInformation($"Не найдено ЭК попадающих под условие: ${JsonSerializer.Serialize(query)}"); @@ -112,6 +133,20 @@ namespace PARR.GeneratorTemplates.Services public async Task DeactivateTemplates(GeneratorTemplateMq query) { + //В таблице AppInWork находим РР, и смотрим ее рабочие группы. Затем по ним будем фильтровать хосты + var appInWorkWg = await applicationsInWorkService.Get() + .Include(t => t.WorkGroups) + .FirstAsync(t => t.ApplicationId == query.ApplicationId && t.WorkId == query.WorkId); + + if (!appInWorkWg.WorkGroups.Any()) + { + logger.LogWarning($"Не деактивируем шаблоны. Нет рабочих групп у ApplicationInWork с id: {appInWorkWg.Id}"); + return; + } + + var workGroups = appInWorkWg.WorkGroups.ToList(); + + //Ищет все активные шаблоны согласно параметрам в таблице Templates, и деактивирует их. Меняем на статус Updating // делаем sql формат для like из запроса. @@ -136,6 +171,9 @@ namespace PARR.GeneratorTemplates.Services .AsSplitQuery() .ToListAsync(); + // Исключаем хосты у которых нет нужных групп + existTemplates = existTemplates.Where(t => workGroups.Any(x => x.WorkGroupId == t.Host.WorkGroupId)).ToList(); + if (!existTemplates.Any()) { logger.LogInformation("Нет шаблонов для деактивации");