2023-09-01 16:19:32 +10:00
using Microsoft.Extensions.DependencyInjection ;
using Microsoft.Extensions.Logging ;
2023-09-14 17:00:56 +10:00
using PARR.DAL.Contracts ;
2023-09-01 12:40:41 +10:00
using PARR.DAL.Models ;
2023-09-01 16:19:32 +10:00
using PARR.DAL.Services.Interfaces ;
2023-09-20 10:11:00 +10:00
using PARR.EsppTemplateSync.Settings ;
2023-09-01 11:47:39 +10:00
namespace PARR.EsppTemplateSync.Services
2023-08-31 12:04:05 +10:00
{
internal class Manager : IManager
{
2023-09-01 11:47:39 +10:00
private readonly ILogger < Manager > logger ;
2023-09-01 16:19:32 +10:00
private readonly IServiceProvider serviceProvider ;
2023-09-01 11:47:39 +10:00
private readonly IParserService parserService ;
2023-09-20 10:11:00 +10:00
private readonly GlobalSettings globalSettings ;
2023-09-01 11:47:39 +10:00
2023-09-01 16:19:32 +10:00
public Manager (
ILogger < Manager > logger ,
IServiceProvider serviceProvider ,
2023-09-20 10:11:00 +10:00
IParserService parserService ,
GlobalSettings globalSettings
2023-09-01 16:19:32 +10:00
)
2023-09-01 11:47:39 +10:00
{
this . logger = logger ;
2023-09-01 16:19:32 +10:00
this . serviceProvider = serviceProvider ;
2023-09-01 11:47:39 +10:00
this . parserService = parserService ;
2023-09-20 10:11:00 +10:00
this . globalSettings = globalSettings ;
2023-09-01 11:47:39 +10:00
}
2023-09-04 12:17:50 +10:00
2023-08-31 12:04:05 +10:00
public Task < bool > ManageFileAsync ( string path )
{
throw new NotImplementedException ( ) ;
}
2023-09-01 11:47:39 +10:00
public async Task < bool > ManageStringAsync ( string str )
2023-08-31 12:04:05 +10:00
{
2023-09-01 11:47:39 +10:00
bool isSuccess = true ;
2023-09-04 16:26:43 +10:00
////TODO:
2023-09-04 12:17:50 +10:00
// тут обязательно нужна проверка, если str не того формата, возникает exception в ParseStringAsync
2023-09-04 16:26:43 +10:00
if ( str = = null | | str . Trim ( ) . Length = = 0 )
return false ;
var template = parserService . ParseString ( str ) ;
2023-09-14 17:00:56 +10:00
if ( template = = null )
{
2023-09-04 16:26:43 +10:00
isSuccess = false ;
logger . LogError ( $"Н е удалось распознать строку({str}) в Template" ) ;
}
2023-09-14 17:00:56 +10:00
else
{
2023-09-04 16:26:43 +10:00
//если шаблон не аквтивен, пропускаем
2023-09-14 17:00:56 +10:00
if ( ! template . IsActive )
2023-09-04 16:26:43 +10:00
{
return isSuccess ;
}
2023-09-14 17:00:56 +10:00
2023-09-15 10:17:17 +10:00
//TODO: !!! тут метод называет чек, но он же и сохраняет. По идее надо чтобы чек че то вернул, а исходя из этого дургой метод сохранит или ченить изменит
2023-09-14 17:00:56 +10:00
// и опять же, saccess всегда true получается??? или это норм.
2023-09-04 16:26:43 +10:00
await CheckChangesAsync ( template ) ;
}
2023-09-01 12:40:41 +10:00
2023-09-04 12:17:50 +10:00
//todo: only true?????
2023-09-01 11:47:39 +10:00
return isSuccess ;
2023-08-31 12:04:05 +10:00
}
2023-09-01 12:40:41 +10:00
2023-09-01 16:19:32 +10:00
private async Task CheckChangesAsync ( Template esppTemplate )
2023-09-01 12:40:41 +10:00
{
2023-09-04 12:17:50 +10:00
// --- test ---
using ( var scope = serviceProvider . CreateScope ( ) )
{
var services = scope . ServiceProvider ;
2023-09-15 10:17:17 +10:00
2023-09-04 12:17:50 +10:00
var templateService = services . GetService < ITemplateService > ( ) ;
if ( templateService = = null )
{
2023-09-15 10:17:17 +10:00
throw new Exception ( $"Н е найден сервис: {nameof(ITemplateService)}" ) ;
// return;
2023-09-04 12:17:50 +10:00
}
2023-09-13 14:44:21 +10:00
var template = await templateService . GetTemplateByNameAsync ( esppTemplate . Name ) ;
2023-09-04 16:26:43 +10:00
//существует в ЕСПП но отсутствует в ПАРР.
//TODO деактивируем и видимо ещё что-то нужно
if ( template = = null )
{
2023-09-15 10:17:17 +10:00
// создает запись-шаблон из ЕСПП в ПАРР. Возможно избыточно так как эталон в ПАРР
////esppTemplate.StatusCode = "Deactivating";
////---
//esppTemplate.StatusCode = (int)StatusTemplateEnum.Ok;
//esppTemplate.IsActive = false;
2023-09-14 15:07:19 +10:00
//if (!await templateService.CreateAsync(esppTemplate) || !await templateService.CommitAsync())
//{
// logger.LogError($"Н е удалось создать запись Template {esppTemplate.Name}({esppTemplate.ShortDescription})");
//}
//else
// logger.LogInformation($"----- Создана запись Template {esppTemplate.Name}({esppTemplate.ShortDescription}) -----");
2023-09-15 10:17:17 +10:00
//---
2023-09-20 12:09:07 +10:00
logger . LogWarning ( $"----- Найден шаблон ЕСПП незарегистрированный в ПАРР {esppTemplate.Name}({esppTemplate.ApplicationsInWork?.ShortDescription}) -----" ) ;
2023-09-04 16:26:43 +10:00
}
else
{
var isChanged = false ;
2023-09-20 11:52:30 +10:00
//var ignoreTemplateFieldsList = globalSettings.IgnoreTemplateFields?.Split(",").ToList().Select(t => t.Trim().ToLower());
2023-09-04 16:26:43 +10:00
foreach ( var prop in template . GetType ( ) . GetProperties ( ) )
{
2023-09-14 15:07:19 +10:00
if ( prop = = null ) continue ;
2023-09-20 11:52:30 +10:00
if ( globalSettings . IgnoreTemplateFields ! = null & & globalSettings . IgnoreTemplateFields . Contains ( prop . Name ) ) continue ;
2023-09-20 10:11:00 +10:00
//if (prop.Name == "Id" ||
// prop.Name == "Status" ||
// prop.Name == "DateCreated" ||
// prop.Name == "DateModified" ||
// prop.Name == "StatusCode"
// ) continue;
2023-09-04 16:26:43 +10:00
2023-09-14 15:07:19 +10:00
var parrValue = template . GetType ( ) . GetProperty ( prop . Name ) ? . GetValue ( template , null ) ;
2023-09-14 15:56:17 +10:00
var esppValue = esppTemplate . GetType ( ) . GetProperty ( prop . Name ) ? . GetValue ( esppTemplate , null ) ;
2023-09-14 15:07:19 +10:00
2023-09-14 17:00:56 +10:00
if ( parrValue = = null | | esppValue = = null ) continue ;
2023-09-14 15:07:19 +10:00
2023-09-15 10:17:17 +10:00
if ( parrValue ! . ToString ( ) ! . ToLower ( ) ! = esppValue ! . ToString ( ) ! . ToLower ( ) )
2023-09-04 16:26:43 +10:00
{
2023-09-14 17:00:56 +10:00
isChanged = true ;
2023-09-14 15:07:19 +10:00
break ;
2023-09-04 16:26:43 +10:00
}
}
if ( isChanged )
{
2023-09-20 12:09:07 +10:00
logger . LogInformation ( $"----- Запись в ЕСПП отличается от Template {esppTemplate.Name}({esppTemplate.ApplicationsInWork?.ShortDescription}) -----" ) ;
2023-09-14 17:00:56 +10:00
//template.Status = "Updating";
template . StatusCode = ( int ) StatusTemplateEnum . Updating ;
if ( ! await templateService . CommitAsync ( ) )
2023-09-20 12:09:07 +10:00
logger . LogError ( $"Н е удалось обновить запись Template {esppTemplate.Name}({esppTemplate.ApplicationsInWork?.ShortDescription})" ) ;
2023-09-04 16:26:43 +10:00
else
2023-09-20 12:09:07 +10:00
logger . LogInformation ( $"----- Требуется обновление шаблона в ЕСПП роботом {esppTemplate.Name}({esppTemplate.ApplicationsInWork?.ShortDescription}) -----" ) ;
2023-09-14 15:07:19 +10:00
}
else
{
2023-09-14 17:00:56 +10:00
//if (template.Status != "Ok")
if ( template . StatusCode ! = ( int ) StatusTemplateEnum . Ok )
2023-09-14 15:07:19 +10:00
{
template . DateModified = DateTimeOffset . UtcNow ;
2023-09-14 17:00:56 +10:00
template . StatusCode = ( int ) StatusTemplateEnum . Ok ;
2023-09-15 10:17:17 +10:00
2023-09-14 15:07:19 +10:00
if ( ! await templateService . CommitAsync ( ) )
2023-09-20 12:09:07 +10:00
logger . LogInformation ( $"Шаблон в ЕСПП соответствует шаблону в ПАРР {esppTemplate.Name}({esppTemplate.ApplicationsInWork?.ShortDescription}). Установлен статус {StatusTemplateEnum.Ok}" ) ;
2023-09-14 15:07:19 +10:00
}
2023-09-04 16:26:43 +10:00
}
}
2023-09-04 12:17:50 +10:00
2023-09-04 16:26:43 +10:00
}
2023-09-01 16:19:32 +10:00
2023-09-01 12:40:41 +10:00
}
2023-08-31 12:04:05 +10:00
}
}