Manager. Mapping Template, изменен метод сравнения и обновления

This commit is contained in:
Mikhail Kuznetsov
2023-09-21 15:54:46 +10:00
parent 11cacad810
commit 9b05cda8dd
8 changed files with 121 additions and 42 deletions

View File

@@ -24,7 +24,7 @@ namespace PARR.DAL.Services.Implementations
public async Task<Template?> GetTemplateByNameAsync(string name)
{
return await EntitySet.FirstOrDefaultAsync(t => t.Name == name);
return await GetWithIncludes().FirstOrDefaultAsync(t => t.Name == name);
}
public IQueryable<Template> GetWithIncludes()

View File

@@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PARR.EsppTemplateSync.Domain
{
internal class EsppTemplate
{
public required string Name { get; set; }
public bool IsActive { get; set; }
public required string WorkGroup { get; set; }
public required string ShortDescription { get; set; }
public required string ResponseArea { get; set; }
public required string Duration { get; set; }
public required string EK { get; set; }
//public required string Initiator { get; set; }
public required string FullDescription { get; set; }
//public required string ClosingCode { get; set; }
public required string Solution { get; set; }
public required string Process { get; set; }
public required string SubProcess { get; set; }
public required string TNK { get; set; }
public required string Work { get; set; }
//public required string Worker { get; set; }
}
}

View File

@@ -18,6 +18,7 @@ namespace PARR.EsppTemplateSync
configuration.GetSection(nameof(GlobalSettings)).Bind(globalSettings);
services.AddSingleton(globalSettings);
services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
//services.AddTransient<ITemplateSyncer, TemplateFileSyncer>();
services.AddTransient<ITemplateSyncer, TemplateMQSyncer>();
services.AddTransient<IParserService, ParserService>();

View File

@@ -0,0 +1,30 @@
using AutoMapper;
using PARR.DAL.Models;
using PARR.EsppTemplateSync.Domain;
namespace PARR.EsppTemplateSync.MappingProfiles
{
public class DomainToDomainProfile : Profile
{
public DomainToDomainProfile()
{
CreateMap<Template, EsppTemplate>()
.ForMember(d => d.Name, o => o.MapFrom(s => s.Name))
.ForMember(d => d.IsActive, o => o.MapFrom(s => s.IsActive))
.ForMember(d => d.WorkGroup, o => o.MapFrom(s => s.Host!.WorkGroup))
.ForMember(d => d.ShortDescription, o => o.MapFrom(s => s.ApplicationsInWork!.ShortDescription))
.ForMember(d => d.ResponseArea, o => o.MapFrom(s => s.ApplicationsInWork!.ShortDescription))
.ForMember(d => d.Duration, o => o.MapFrom(s => s.ApplicationsInWork!.TemplateDuration))
.ForMember(d => d.EK, o => o.MapFrom(s => s.Host!.Ek))
//.ForMember(d => d.Initiator, o => o.MapFrom(s => )) TODO откуда то нужно брать инициатора
.ForMember(d => d.FullDescription, o => o.MapFrom(s => s.ApplicationsInWork!.FullDescription))
//.ForMember(d => d.ClosingCode, o => o.MapFrom(s => s.)) TODO toоda же к инициатору
.ForMember(d => d.Solution, o => o.MapFrom(s => s.ApplicationsInWork!.Solution))
.ForMember(d => d.Process, o => o.MapFrom(s => s.ApplicationsInWork!.Work!.Tnk!.Subprocess!.Process!.Name))
.ForMember(d => d.SubProcess, o => o.MapFrom(s => s.ApplicationsInWork!.Work!.Tnk!.Subprocess!.Name))
.ForMember(d => d.TNK, o => o.MapFrom(s => s.ApplicationsInWork!.Work!.Tnk!.Name))
.ForMember(d => d.Work, o => o.MapFrom(s => s.ApplicationsInWork!.Work!.Name));
}
}
}

View File

@@ -7,6 +7,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.1" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="7.0.4" />
<PackageReference Include="RabbitMQ.Client" Version="6.5.0" />
</ItemGroup>

View File

@@ -1,9 +1,9 @@
using PARR.DAL.Models;
using PARR.EsppTemplateSync.Domain;
namespace PARR.EsppTemplateSync.Services
{
internal interface IParserService
{
Template? ParseString(string str);
EsppTemplate? ParseString(string str);
}
}

View File

@@ -1,8 +1,10 @@
using Microsoft.Extensions.DependencyInjection;
using AutoMapper;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using PARR.DAL.Contracts;
using PARR.DAL.Models;
using PARR.DAL.Services.Interfaces;
using PARR.EsppTemplateSync.Domain;
using PARR.EsppTemplateSync.Settings;
namespace PARR.EsppTemplateSync.Services
@@ -13,18 +15,21 @@ namespace PARR.EsppTemplateSync.Services
private readonly IServiceProvider serviceProvider;
private readonly IParserService parserService;
private readonly GlobalSettings globalSettings;
private readonly IMapper mapper;
public Manager(
ILogger<Manager> logger,
IServiceProvider serviceProvider,
IParserService parserService,
GlobalSettings globalSettings
GlobalSettings globalSettings,
IMapper mapper
)
{
this.logger = logger;
this.serviceProvider = serviceProvider;
this.parserService = parserService;
this.globalSettings = globalSettings;
this.mapper = mapper;
}
public Task<bool> ManageFileAsync(string path)
@@ -50,10 +55,10 @@ namespace PARR.EsppTemplateSync.Services
else
{
//если шаблон не аквтивен, пропускаем
if (!esppTemplate.IsActive)
{
return isSuccess;
}
//if (!esppTemplate.IsActive)
//{
// return isSuccess;
//}
await SyncTemplateAsync(esppTemplate);
// var template = await GetTemplateAsync(esppTemplate);
@@ -110,7 +115,25 @@ namespace PARR.EsppTemplateSync.Services
return isSuccess;
}
private async Task<Template?> GetTemplateAsync(Template esppTemplate)
//private async Task<Template?> GetTemplateAsync(Template esppTemplate)
//{
// using (var scope = serviceProvider.CreateScope())
// {
// var services = scope.ServiceProvider;
// var templateService = services.GetService<ITemplateService>();
// if (templateService == null)
// {
// throw new Exception($"Не найден сервис: {nameof(ITemplateService)}");
// // return;
// }
// return await templateService.GetTemplateByNameAsync(esppTemplate.Name);
// }
//}
private async Task SyncTemplateAsync(EsppTemplate esppTemplate)
{
using (var scope = serviceProvider.CreateScope())
{
@@ -124,25 +147,7 @@ namespace PARR.EsppTemplateSync.Services
// return;
}
return await templateService.GetTemplateByNameAsync(esppTemplate.Name);
}
}
private async Task SyncTemplateAsync(Template esppTemplate)
{
using (var scope = serviceProvider.CreateScope())
{
var services = scope.ServiceProvider;
var templateService = services.GetService<ITemplateService>();
if (templateService == null)
{
throw new Exception($"Не найден сервис: {nameof(ITemplateService)}");
// return;
}
var template = await templateService.GetTemplateByNameAsync(esppTemplate.Name);
Template? template = await templateService.GetTemplateByNameAsync(esppTemplate.Name);
//существует в ЕСПП но отсутствует в ПАРР.
//TODO деактивируем и видимо ещё что-то нужно
if (template == null)
@@ -159,12 +164,15 @@ namespace PARR.EsppTemplateSync.Services
//else
// logger.LogInformation($"----- Создана запись Template {esppTemplate.Name}({esppTemplate.ShortDescription}) -----");
//---
logger.LogWarning($"----- Найден шаблон ЕСПП незарегистрированный в ПАРР {esppTemplate.Name}({esppTemplate.ApplicationsInWork?.ShortDescription}) -----");
logger.LogWarning($"----- Найден шаблон ЕСПП незарегистрированный в ПАРР {esppTemplate.Name}({esppTemplate.ShortDescription}) -----");
return;
}
else
{
var isChanged = IsChanged(template,esppTemplate);
var mappedTemplate = mapper.Map<EsppTemplate>(template);
if (mappedTemplate == null)
return;
var isChanged = IsChanged(mappedTemplate, esppTemplate);
if (isChanged)
{
@@ -188,7 +196,7 @@ namespace PARR.EsppTemplateSync.Services
template.StatusCode = (int)StatusTemplateEnum.Updating;
}
private bool IsChanged(Template template, Template esppTemplate)
private bool IsChanged(EsppTemplate template, EsppTemplate esppTemplate)
{
foreach (var prop in template.GetType().GetProperties())
{
@@ -202,8 +210,8 @@ namespace PARR.EsppTemplateSync.Services
if (parrValue == null || esppValue == null)
continue;
//if (parrValue!.ToString()!.ToLower() != esppValue!.ToString()!.ToLower())
//return true;
if (parrValue!.ToString()!.ToLower() != esppValue!.ToString()!.ToLower())
return true;
}
return false;

View File

@@ -1,7 +1,5 @@
using Microsoft.Extensions.Logging;
using PARR.DAL.Contracts;
using PARR.DAL.Models;
using PARR.DAL.Services.Interfaces;
using PARR.EsppTemplateSync.Domain;
using PARR.EsppTemplateSync.Settings;
using System.Globalization;
@@ -30,7 +28,7 @@ namespace PARR.EsppTemplateSync.Services
return isSuccess;
}
public Template? ParseString(string str)
public EsppTemplate? ParseString(string str)
{
//TODO: а если формат нет тот? Все будет ок?
@@ -60,13 +58,26 @@ namespace PARR.EsppTemplateSync.Services
var work = splittedContent[15].Trim();
var worker = splittedContent[16].Trim();
var template = new Template
var template = new EsppTemplate
{
Id = Guid.NewGuid(),
DateCreated = DateTime.UtcNow,
Name = name,
IsActive = bool.Parse(isActive),
StatusCode = (int)StatusTemplateEnum.Ok
WorkGroup = workGroup,
ShortDescription = shortDescription,
//Category = category,
ResponseArea = responseArea,
Duration = duration,
EK = ek,
//Initiator = initiator,
FullDescription = fullDescription,
//ClosingCode = closingCode,
Solution = solution,
Process = process,
SubProcess = subProcess,
TNK = tnk,
Work = work,
//Worker = worker
};
return template;