feat(dal,templateMatcher): Shortcodes добавлены %МАКС:ИМЯ АТРИБУТА%, %ГР_ПОЛЕ-ПН%, %БУКВЫ:ИМЯ АТРИБУТА%, исправлена фильтрация в UnitFilter, TemplateMatcher отдельные классы для типов работ, Shortcodes теперь работает по своим моделям Dto
This commit is contained in:
@@ -1,8 +1,10 @@
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using PARR.Constants;
|
||||
using PARR.DAL.Contracts;
|
||||
using PARR.DAL.DomainServices.Interfaces;
|
||||
using PARR.DAL.DomainServices.Shortcodes;
|
||||
using PARR.DAL.DomainServices.Shortcodes.Models;
|
||||
using PARR.DAL.Models;
|
||||
using PARR.DAL.Services.Interfaces;
|
||||
using System.Reflection;
|
||||
@@ -14,23 +16,13 @@ namespace PARR.EsppSync
|
||||
private readonly ILogger<SyncService<EsppObject>> logger;
|
||||
private readonly IServiceProvider serviceProvider;
|
||||
|
||||
//private readonly ITemplateService templateService;
|
||||
//private readonly IRobotConfigurationService robotConfigurationService;
|
||||
//private readonly IShortcodesService shortcodesService;
|
||||
|
||||
public SyncService(
|
||||
ILogger<SyncService<EsppObject>> logger,
|
||||
IServiceProvider serviceProvider
|
||||
//ITemplateService templateService,
|
||||
//IRobotConfigurationService robotConfigurationService,
|
||||
//IShortcodesService shortcodesService
|
||||
)
|
||||
{
|
||||
this.logger = logger;
|
||||
this.serviceProvider = serviceProvider;
|
||||
//this.templateService = templateService;
|
||||
//this.robotConfigurationService = robotConfigurationService;
|
||||
//this.shortcodesService = shortcodesService;
|
||||
}
|
||||
|
||||
|
||||
@@ -65,98 +57,136 @@ namespace PARR.EsppSync
|
||||
|
||||
try
|
||||
{
|
||||
var template = await templateService.GetTemplateByNameAsync(esppObject.TemplateName);
|
||||
// Загружаем Template и TemplateForShortcodes в одном запросе
|
||||
var query = templateService.Get()
|
||||
.AsNoTracking()
|
||||
.Include(t => t.Job)
|
||||
.ThenInclude(j => j.Group)
|
||||
.ThenInclude(g => g.GroupType)
|
||||
.Include(t => t.Job)
|
||||
.ThenInclude(j => j.Tnk)
|
||||
.Include(t => t.UnitsInTemplate);
|
||||
|
||||
var template = await query.FirstOrDefaultAsync(t => t.Name == esppObject.TemplateName);
|
||||
|
||||
//todo: существует в ЕСПП но отсутствует в ПАРР. Может его деактивировать или еще что-то сделать. Пока просто пропустим
|
||||
if (template == null)
|
||||
{
|
||||
logger.LogWarning($"Найден объект в ЕСПП с именем шаблона {esppObject.TemplateName} незарегистрированный в ПАРР.");
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// ✅ Построим TemplateForShortcodes из уже загруженного template
|
||||
var templateForShortcodes = new TemplateForShortcodes
|
||||
{
|
||||
Id = template.Id,
|
||||
Index = template.Index,
|
||||
JobId = template.JobId,
|
||||
UnitId = template.UnitId,
|
||||
Job = template.Job == null ? null : new JobForShortcodes
|
||||
{
|
||||
Group = template.Job.Group == null ? null : new JobGroupForShortcodes
|
||||
{
|
||||
GroupingUnitFieldId = template.Job.Group.GroupingUnitFieldId,
|
||||
GroupType = template.Job.Group.GroupType == null ? null : new JobGroupTypeForShortcodes
|
||||
{
|
||||
Code = template.Job.Group.GroupType.Code
|
||||
},
|
||||
GroupName = template.Job.Group.GroupName
|
||||
},
|
||||
Tnk = template.Job.Tnk == null ? null : new TnkForShortcodes
|
||||
{
|
||||
Name = template.Job.Tnk.Name,
|
||||
ShortName = template.Job.Tnk.ShortName
|
||||
},
|
||||
WorkName = template.Job.WorkName,
|
||||
Name = template.Job.Name
|
||||
},
|
||||
UnitsInTemplate = template.UnitsInTemplate?.Select(uit => new UnitInTemplateForShortcodes { UnitId = uit.UnitId }).ToList() ?? new List<UnitInTemplateForShortcodes>()
|
||||
};
|
||||
|
||||
var dbObjectInEsppObject = converterToEsppObject.Invoke(template);
|
||||
|
||||
//Проверяем наличие Shortcode в полях объекта из БД
|
||||
var properties = dbObjectInEsppObject.GetType().GetProperties();
|
||||
|
||||
foreach (PropertyInfo property in properties)
|
||||
{
|
||||
var value = property.GetValue(dbObjectInEsppObject)?.ToString();
|
||||
|
||||
if (value != null && shortcodesService.IsAnyShortcodes(value))
|
||||
{
|
||||
var processedValue = await shortcodesService.ApplyShortcodesAsync(value, templateForShortcodes);
|
||||
property.SetValue(dbObjectInEsppObject, processedValue);
|
||||
}
|
||||
}
|
||||
|
||||
bool isChanged = false;
|
||||
//TODO: FIX ME Please, BRO
|
||||
//bool isChanged;
|
||||
|
||||
// если в БД isActive == false, то синхронизировать только по полям из IEsppObject
|
||||
|
||||
if (dbObjectInEsppObject.IsActive == false)
|
||||
{
|
||||
logger.LogDebug($"Объект деактивирован в ПАРР. Сравниваем только обязательные поля. {esppObject.TemplateName}");
|
||||
var lightDbObj = new EsppLightObject(dbObjectInEsppObject);
|
||||
var lightEsppObject = new EsppLightObject(esppObject);
|
||||
|
||||
isChanged = IsChanged(lightEsppObject, lightDbObj, esppObject.TemplateName);
|
||||
}
|
||||
else
|
||||
{
|
||||
var dbObjectInEsppObject = converterToEsppObject.Invoke(template);
|
||||
logger.LogDebug($"Объект активирован в ПАРР. Сравниваем все поля. {esppObject.TemplateName}");
|
||||
isChanged = IsChanged(esppObject, dbObjectInEsppObject, esppObject.TemplateName);
|
||||
}
|
||||
|
||||
//Проверяем наличие Shortcode в полях объекта из БД
|
||||
var properties = dbObjectInEsppObject.GetType().GetProperties();
|
||||
if (isChanged)
|
||||
{
|
||||
logger.LogDebug($"Есть изменения, требуется обновление. {esppObject.TemplateName}");
|
||||
|
||||
foreach (PropertyInfo property in properties)
|
||||
var config = robotConfigurationService.GetFromTemplateByRobotCode(esppObject.Robot, template);
|
||||
|
||||
// Если предыдущий статус был Create или Ок, то ставим ему Update
|
||||
// пусть даже Create завершился с ошибками, но раз он уже есть в ЕСПП, то изменим на Update, сбросим все счетчики и пусть попробует обновить и исправить все
|
||||
if (config.TaskStatusCode != (int)TaskStatusEnum.Updating)
|
||||
{
|
||||
var value = property.GetValue(dbObjectInEsppObject)?.ToString();
|
||||
SetUpdateStatus(ref template, robotConfigurationService, esppObject.Robot);
|
||||
|
||||
if (value != null && shortcodesService.IsAnyShortcodes(value))
|
||||
property.SetValue(dbObjectInEsppObject, await shortcodesService.ApplyShortcodesAsync(value, template.UnitId, template.JobId));
|
||||
}
|
||||
|
||||
bool isChanged = false;
|
||||
//TODO: FIX ME Please, BRO
|
||||
//bool isChanged;
|
||||
|
||||
// если в БД isActive == false, то синхронизировать только по полям из IEsppObject
|
||||
|
||||
if (dbObjectInEsppObject.IsActive == false)
|
||||
{
|
||||
logger.LogDebug($"Объект деактивирован в ПАРР. Сравниваем только обязательные поля. {esppObject.TemplateName}");
|
||||
var lightDbObj = new EsppLightObject(dbObjectInEsppObject);
|
||||
var lightEsppObject = new EsppLightObject(esppObject);
|
||||
|
||||
isChanged = IsChanged(lightEsppObject, lightDbObj, esppObject.TemplateName);
|
||||
}
|
||||
else
|
||||
{
|
||||
logger.LogDebug($"Объект активирован в ПАРР. Сравниваем все поля. {esppObject.TemplateName}");
|
||||
isChanged = IsChanged(esppObject, dbObjectInEsppObject, esppObject.TemplateName);
|
||||
}
|
||||
|
||||
if (isChanged)
|
||||
{
|
||||
logger.LogDebug($"Есть изменения, требуется обновление. {esppObject.TemplateName}");
|
||||
|
||||
var config = robotConfigurationService.GetFromTemplateByRobotCode(esppObject.Robot, template);
|
||||
|
||||
// Если предыдущий статус был Create или Ок, то ставим ему Update
|
||||
// пусть даже Create завершился с ошибками, но раз он уже есть в ЕСПП, то изменим на Update, сбросим все счетчики и пусть попробует обновить и исправить все
|
||||
if (config.TaskStatusCode != (int)TaskStatusEnum.Updating)
|
||||
{
|
||||
SetUpdateStatus(ref template, robotConfigurationService, esppObject.Robot);
|
||||
|
||||
if (!await templateService.CommitAsync())
|
||||
logger.LogError($"Не удалось изменить запись Template {template.Name}, Robot: {esppObject.Robot}");
|
||||
else
|
||||
logger.LogInformation($"Установлен принудительный статус {TaskStatusEnum.Updating}, Template {template.Name}, Robot: {esppObject.Robot}");
|
||||
}
|
||||
if (!await templateService.CommitAsync())
|
||||
logger.LogError($"Не удалось изменить запись Template {template.Name}, Robot: {esppObject.Robot}");
|
||||
else
|
||||
{
|
||||
// Если пред статус был Update, то ничего не делаем, так его и оставляем, не сбрасывам кол-во попыток и ошибок
|
||||
logger.LogInformation($"Есть изменения в Template {template.Name}, но предыдущий статус TaskStatusCode: {(TaskStatusEnum)config.TaskStatusCode}. Не меняем статус, будем разбираться вручную.");
|
||||
}
|
||||
|
||||
#region Old logic
|
||||
|
||||
//SetUpdateStatus(ref template, robotConfigurationService, esppObject.Robot);
|
||||
|
||||
//if (!await templateService.CommitAsync())
|
||||
// logger.LogError($"Не удалось изменить запись Template {template.Name}, Robot: {esppObject.Robot}");
|
||||
//else
|
||||
// logger.LogInformation($"Установлен принудительный статус {TaskStatusEnum.Updating}, Template {template.Name}, Robot: {esppObject.Robot}");
|
||||
#endregion
|
||||
}//надо ли проверять если не изменился, но был статус Updating не понятно. Доверяем роботу пока, что после окончания работ он точно сообщит
|
||||
logger.LogInformation($"Установлен принудительный статус {TaskStatusEnum.Updating}, Template {template.Name}, Robot: {esppObject.Robot}");
|
||||
}
|
||||
else
|
||||
{
|
||||
logger.LogDebug($"Нет изменений, обновление не требуется. {esppObject.TemplateName}");
|
||||
// Если пред статус был Update, то ничего не делаем, так его и оставляем, не сбрасывам кол-во попыток и ошибок
|
||||
logger.LogInformation($"Есть изменения в Template {template.Name}, но предыдущий статус TaskStatusCode: {(TaskStatusEnum)config.TaskStatusCode}. Не меняем статус, будем разбираться вручную.");
|
||||
}
|
||||
|
||||
//если все поля совпали
|
||||
//проверяем, какой был статус предыдущий статус в БД, если он был не Ок, то ставим ему ОК
|
||||
var robotConfig = robotConfigurationService.GetFromTemplateByRobotCode(esppObject.Robot, template);
|
||||
if (robotConfig.TaskStatusCode != (int)TaskStatusEnum.Ok)
|
||||
{
|
||||
robotConfigurationService.ChangeTaskStatus(TaskStatusEnum.Ok, robotConfig);
|
||||
if (!await templateService.CommitAsync())
|
||||
logger.LogError($"Не удалось изменить запись Template {template.Name}, Robot: {esppObject.Robot}");
|
||||
else
|
||||
logger.LogInformation($"Установлен принудительный статус {TaskStatusEnum.Ok}, Template {template.Name}, Robot: {esppObject.Robot}");
|
||||
}
|
||||
#region Old logic
|
||||
|
||||
//SetUpdateStatus(ref template, robotConfigurationService, esppObject.Robot);
|
||||
|
||||
//if (!await templateService.CommitAsync())
|
||||
// logger.LogError($"Не удалось изменить запись Template {template.Name}, Robot: {esppObject.Robot}");
|
||||
//else
|
||||
// logger.LogInformation($"Установлен принудительный статус {TaskStatusEnum.Updating}, Template {template.Name}, Robot: {esppObject.Robot}");
|
||||
#endregion
|
||||
}//надо ли проверять если не изменился, но был статус Updating не понятно. Доверяем роботу пока, что после окончания работ он точно сообщит
|
||||
else
|
||||
{
|
||||
logger.LogDebug($"Нет изменений, обновление не требуется. {esppObject.TemplateName}");
|
||||
|
||||
//если все поля совпали
|
||||
//проверяем, какой был статус предыдущий статус в БД, если он был не Ок, то ставим ему ОК
|
||||
var robotConfig = robotConfigurationService.GetFromTemplateByRobotCode(esppObject.Robot, template);
|
||||
if (robotConfig.TaskStatusCode != (int)TaskStatusEnum.Ok)
|
||||
{
|
||||
robotConfigurationService.ChangeTaskStatus(TaskStatusEnum.Ok, robotConfig);
|
||||
if (!await templateService.CommitAsync())
|
||||
logger.LogError($"Не удалось изменить запись Template {template.Name}, Robot: {esppObject.Robot}");
|
||||
else
|
||||
logger.LogInformation($"Установлен принудительный статус {TaskStatusEnum.Ok}, Template {template.Name}, Robot: {esppObject.Robot}");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -229,5 +259,4 @@ namespace PARR.EsppSync
|
||||
return str.ToLower();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user