diff --git a/PARR.API/Contracts/V1/ApiRoutes.cs b/PARR.API/Contracts/V1/ApiRoutes.cs index f67028af..76303811 100644 --- a/PARR.API/Contracts/V1/ApiRoutes.cs +++ b/PARR.API/Contracts/V1/ApiRoutes.cs @@ -55,7 +55,7 @@ public static class Template { public const string GetAll = Base + "/templates/"; - //public const string Get = Base + "/templates/" + getParam; + public const string Get = Base + "/templates/" + getParam; //public const string SetOkStatus = Base + "/templates/" + getParam + "/status/ok"; //public const string GetByStatusCode = Base + "/templates/status/{statusCode}"; @@ -63,7 +63,7 @@ public const string getParam = "{id}"; } - public static class TemplateScheduleEspp + public static class TemplateScheduleEspp { public const string Get = Base + "/templates/" + templateId + "/schedule-esppid"; diff --git a/PARR.API/Contracts/V1/Responses/EsppScheduleResponse.cs b/PARR.API/Contracts/V1/Responses/EsppScheduleResponse.cs index f6928004..d665e970 100644 --- a/PARR.API/Contracts/V1/Responses/EsppScheduleResponse.cs +++ b/PARR.API/Contracts/V1/Responses/EsppScheduleResponse.cs @@ -39,7 +39,7 @@ { public Guid Id { get; set; } - public required string Name { get; set; } + public required string Value { get; set; } } } diff --git a/PARR.API/Contracts/V1/Responses/TemplateResponse.cs b/PARR.API/Contracts/V1/Responses/TemplateResponse.cs index b17ce02c..00d13a88 100644 --- a/PARR.API/Contracts/V1/Responses/TemplateResponse.cs +++ b/PARR.API/Contracts/V1/Responses/TemplateResponse.cs @@ -16,68 +16,19 @@ public required string Solution { get; set; } public required string TemplateDuration { get; set; } - //work - //public required string Title { get; set; } - //public required string SlaInterval { get; set; } - //public required string Description { get; set; } - //public required string Resolution { get; set; } - //public required string RzdMTNKjob { get; set; } - public WorkResponse? Work { get; set; } - - //host - //public required string Assignment { get; set; } - //public required string Branch { get; set; } - //public required string ConfigurationItem { get; set; } public HostResponse? Host { get; set; } - //process - //public required string RzdMTNKprocess { get; set; } + public WorkResponse? Work { get; set; } public ProcessResponse? Process { get; set; } - - //subprocess - //public required string RzdMTNKsubprocess { get; set; } public SubprocessResponse? Subprocess { get; set; } - - //tnk - //public required string RzdMTNKtnk { get; set; } public TnkResponse? Tnk { get; set; } public List? SyncStatus { get; set; } - //TODO: тут сделать биндинг!!!!!! !!!!!! !!!!!! !!!!!! !!!!!! !!!!!! + /// + /// Расписание + /// public EsppScheduleResponse? Schedule { get; set; } } - - //public class TemplateStringResponse - //{ - // public required string Name { get; set; } - // public required string IsActive { get; set; } - // public required string Assignment { get; set; } - // public required string Title { get; set; } - // public required string Category { get; set; } - // public required string Branch { get; set; } - // public required string SlaInterval { get; set; } - // public required string ConfigurationItem { get; set; } - // public required string ContactName { get; set; } - // public required string Description { get; set; } - // public required string ResolutionCode { get; set; } - // public required string Resolution { get; set; } - - // public required string RzdMTNKprocess { get; set; } - // public required string RzdMTNKprocessId { get; set; } - - // public required string RzdMTNKsubprocess { get; set; } - // public required string RzdMTNKsubprocessId { get; set; } - - // public required string RzdMTNKtnk { get; set; } - // public required string RzdMTNKtnkId { get; set; } - - // public required string RzdMTNKjob { get; set; } - // public required string RzdMTNKjobId { get; set; } - - - // public required string Id { get; set; } - // public required string StatusCode { get; set; } - //} } diff --git a/PARR.API/Controllers/V1/TemplateController.cs b/PARR.API/Controllers/V1/TemplateController.cs index 9422f4a5..7e49b66b 100644 --- a/PARR.API/Controllers/V1/TemplateController.cs +++ b/PARR.API/Controllers/V1/TemplateController.cs @@ -70,20 +70,23 @@ namespace PARR.API.Controllers.V1 /// /// /// - //[HttpGet(ApiRoutes.Template.Get)] - //public async Task GetById([FromRoute] Guid id) - //{ - // var template = await templateService.GetWithIncludes() - // .AsSplitQuery() - // .FirstOrDefaultAsync(t => t.Id == id); + [HttpGet(ApiRoutes.Template.Get)] + public async Task GetById([FromRoute] Guid id) + { + var template = await templateService.GetWithIncludes() + .Include(t => t.RobotConfigurations).ThenInclude(t => t.Robot) + .Include(t => t.RobotConfigurations).ThenInclude(t => t.TaskStatus) + .Include(t => t.RobotConfigurations).ThenInclude(t => t.RobotStatus) + .AsSplitQuery() + .FirstOrDefaultAsync(t => t.Id == id); - // if (template == null) - // return NotFound(); + if (template == null) + return NotFound(); - // var response = mapper.Map(template); + var response = mapper.Map(template); - // return Ok(new Response(response, true)); - //} + return Ok(new Response(response, true)); + } /// /// Получить один шаблон по заданному статусу diff --git a/PARR.API/MappingProfiles/DomainToResponseProfile.cs b/PARR.API/MappingProfiles/DomainToResponseProfile.cs index 9e198f27..694b4bb2 100644 --- a/PARR.API/MappingProfiles/DomainToResponseProfile.cs +++ b/PARR.API/MappingProfiles/DomainToResponseProfile.cs @@ -2,6 +2,7 @@ using PARR.API.Contracts.V1.Responses; using PARR.API.MappingProfiles.Resolvers; using PARR.BLL.Helpers; +using PARR.DAL.DomainModels; using PARR.DAL.Models; using PARR.DAL.Models.V1; @@ -42,7 +43,8 @@ namespace PARR.API.MappingProfiles .ForMember(d => d.Initiator, o => o.MapFrom()) .ForMember(d => d.ClosingCode, o => o.MapFrom()) .ForMember(d => d.Category, o => o.MapFrom()) - .ForMember(d => d.SyncStatus, o => o.MapFrom(s => s.RobotConfigurations)); + .ForMember(d => d.SyncStatus, o => o.MapFrom(s => s.RobotConfigurations)) + .ForMember(d => d.Schedule, o => o.MapFrom()); // === Template === CreateMap(); @@ -130,6 +132,19 @@ namespace PARR.API.MappingProfiles .ForMember(d => d.RobotStatus, o => o.MapFrom(s => s.RobotStatus)); + // --- EsppSch --- + CreateMap(); + + CreateMap(); + + CreateMap(); + + CreateMap() + .ForMember(d => d.Order, o => o.MapFrom(s => s.Order)) + .ForMember(d => d.Value, o => o.MapFrom(s => s.Value)) + .ForMember(d => d.Type, o => o.MapFrom(s => s.Type)); + // === EsppSch === + } } } diff --git a/PARR.API/MappingProfiles/Resolvers/RobotTaskScheduleSchResolver.cs b/PARR.API/MappingProfiles/Resolvers/RobotTaskScheduleSchResolver.cs index fa6052c1..78990a85 100644 --- a/PARR.API/MappingProfiles/Resolvers/RobotTaskScheduleSchResolver.cs +++ b/PARR.API/MappingProfiles/Resolvers/RobotTaskScheduleSchResolver.cs @@ -8,29 +8,36 @@ namespace PARR.API.MappingProfiles.Resolvers public class RobotTaskScheduleSchResolver : IValueResolver?> { private readonly IEsppSchTypeConfigService esppConfigService; + private readonly ILogger logger; - public RobotTaskScheduleSchResolver(IEsppSchTypeConfigService esppConfigService) + public RobotTaskScheduleSchResolver( + IEsppSchTypeConfigService esppConfigService, + ILogger logger + ) { this.esppConfigService = esppConfigService; + this.logger = logger; } public List? Resolve(RobotConfiguration source, RobotTaskScheduleResponse destination, List? destMember, ResolutionContext context) { - //todo: может вынести эту логику в сервис? var appInWorksId = source.Template!.ApplicationInWorkId; - var configs = esppConfigService.GetWithSchIncludes() - .Where(t => t.EsppSchValues.Any(x => x.ApplicationsInWorkId == appInWorksId)) - .ToList(); + var schedule = esppConfigService.GetEsppScheduleDto(appInWorksId); - var response = configs.Select(conf => - new RobotTaskScheduleSchResponse - { - Order = conf.Order, - Type = conf.EsppSchType!.Name, - TypeCode = conf.EsppSchType!.Id, - Value = conf.EsppSchValues.First().EsppSchTypeValue!.Value - }); + if (schedule == null) + { + logger.LogError($"RobotTaskScheduleSchResolver: Не смог замапить расписание для робота, так как оно null. appInWorksId: {appInWorksId}"); + return null; + } + + var response = schedule.Values.Select(t => new RobotTaskScheduleSchResponse + { + Order = t.Order, + Type = t.Type.Name, + TypeCode = t.Type.Id, + Value = t.Value.Value + }); return response.OrderBy(t => t.Order).ToList(); } diff --git a/PARR.API/MappingProfiles/Resolvers/TemplateScheduleResolver.cs b/PARR.API/MappingProfiles/Resolvers/TemplateScheduleResolver.cs new file mode 100644 index 00000000..318da785 --- /dev/null +++ b/PARR.API/MappingProfiles/Resolvers/TemplateScheduleResolver.cs @@ -0,0 +1,44 @@ +using AutoMapper; +using PARR.API.Contracts.V1.Responses; +using PARR.DAL.Models; +using PARR.DAL.Services.Interfaces; + +namespace PARR.API.MappingProfiles.Resolvers +{ + public class TemplateScheduleResolver : IValueResolver + { + private readonly IEsppSchTypeConfigService esppConfigService; + private readonly ILogger logger; + private readonly IMapper mapper; + + public TemplateScheduleResolver( + IEsppSchTypeConfigService esppConfigService, + ILogger logger, + IMapper mapper + ) + { + this.esppConfigService = esppConfigService; + this.logger = logger; + this.mapper = mapper; + } + + public EsppScheduleResponse? Resolve(Template source, TemplateResponse destination, EsppScheduleResponse? destMember, ResolutionContext context) + { + var schedule = esppConfigService.GetEsppScheduleDto(source.ApplicationInWorkId); + + if (schedule == null) + { + logger.LogError($"TemplateScheduleResolver: Не смог замапить расписание для робота, так как оно null. appInWorksId: {source.ApplicationInWorkId}"); + return null; + } + + var response = new EsppScheduleResponse + { + TypeSchedule = mapper.Map(schedule.TypeSchedule), + Values = mapper.Map>(schedule.Values).OrderBy(t => t.Order).ToList() + }; + + return response; + } + } +} diff --git a/PARR.DAL/DomainModels/EsppScheduleDto.cs b/PARR.DAL/DomainModels/EsppScheduleDto.cs new file mode 100644 index 00000000..97233b25 --- /dev/null +++ b/PARR.DAL/DomainModels/EsppScheduleDto.cs @@ -0,0 +1,23 @@ +using PARR.DAL.Models; + +namespace PARR.DAL.DomainModels +{ + /// + /// Расписание ЕСПП в нормальном виде + /// + public class EsppScheduleDto + { + public required EsppSchTypeSchedule TypeSchedule { get; set; } + + public required List Values { get; set; } + } + + public class EsppScheduleValDto + { + public int Order { get; set; } + + public required EsppSchType Type { get; set; } + + public required EsppSchTypeValue Value { get; set; } + } +} diff --git a/PARR.DAL/Services/Implementations/EsppSchTypeConfigService.cs b/PARR.DAL/Services/Implementations/EsppSchTypeConfigService.cs index 7f0e30c4..4e418797 100644 --- a/PARR.DAL/Services/Implementations/EsppSchTypeConfigService.cs +++ b/PARR.DAL/Services/Implementations/EsppSchTypeConfigService.cs @@ -1,6 +1,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using PARR.DAL.Context; +using PARR.DAL.DomainModels; using PARR.DAL.Models; using PARR.DAL.Services.Abstracts; using PARR.DAL.Services.Interfaces; @@ -30,12 +31,51 @@ namespace PARR.DAL.Services.Implementations .ThenInclude(t => t!.EsppSchValues); } - //public IQueryable GetScheduleByAppInWorks(Guid applicationInWorksId) - //{ - // var configs = GetWithSchIncludes() - // .Where(t => t.EsppSchValues.Any(x => x.ApplicationsInWorkId == applicationInWorksId)) - // .ToList(); + public async Task GetEsppScheduleDtoAsync(Guid applicationInWorksId) + { + //Формирует расписание в нормальном понятном виде из БД - //} + var configs = await GetWithSchIncludes() + .Where(t => t.EsppSchValues.Any(x => x.ApplicationsInWorkId == applicationInWorksId)) + .ToListAsync(); + + if (!configs.Any()) + return null; + + var values = new List(); + + foreach (var config in configs) + { + var value = new EsppScheduleValDto + { + Order = config.Order, + Type = config.EsppSchType!, + Value = config.EsppSchValues.First().EsppSchTypeValue! + + }; + + values.Add(value); + } + + + var dto = new EsppScheduleDto + { + TypeSchedule = configs.First().EsppSchTypeSchedule!, + Values = values.OrderBy(t => t.Order).ToList() + }; + + + return dto; + } + + public EsppScheduleDto? GetEsppScheduleDto(Guid applicationInWorksId) + { + var result = Task.Run(async () => + { + return await GetEsppScheduleDtoAsync(applicationInWorksId); + }).Result; + + return result; + } } } diff --git a/PARR.DAL/Services/Interfaces/IEsppSchTypeConfigService.cs b/PARR.DAL/Services/Interfaces/IEsppSchTypeConfigService.cs index 97d94a06..d5f84c03 100644 --- a/PARR.DAL/Services/Interfaces/IEsppSchTypeConfigService.cs +++ b/PARR.DAL/Services/Interfaces/IEsppSchTypeConfigService.cs @@ -1,10 +1,25 @@ -using PARR.DAL.Models; +using PARR.DAL.DomainModels; +using PARR.DAL.Models; using PARR.DAL.Services.Interfaces.Base; namespace PARR.DAL.Services.Interfaces { public interface IEsppSchTypeConfigService : IBaseService { + /// + /// Формирует расписание в нормальном понятном виде из БД синхронно + /// + /// + /// + EsppScheduleDto? GetEsppScheduleDto(Guid applicationInWorksId); + + /// + /// Формирует расписание в нормальном понятном виде из БД асинхронно + /// + /// + /// + Task GetEsppScheduleDtoAsync(Guid applicationInWorksId); + IQueryable GetWithSchIncludes(); } }