feat(templateMatcher): Рефакторинг, основной метод синхронизации GroupedTemplateSynchronizer разбит на отдельные классы; Неиспользуемые шаблоны теперь привязываются к ЭК КОСМПЛЕКСЫ-[ЗО].
This commit is contained in:
@@ -1,9 +1,9 @@
|
||||
using PARR.Domain.Common.Rabbit.Messages;
|
||||
using PARR.Domain.Common.Rabbit.Messages.TemplateMatching;
|
||||
|
||||
namespace PARR.TemplateUpdater.Services
|
||||
{
|
||||
internal interface ITemplateUpdaterService
|
||||
{
|
||||
Task UpdateTemplateAsync(TemplateUpdaterMq query);
|
||||
Task UpdateTemplateAsync(TemplateUpdaterMessage query);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,8 +5,7 @@ using PARR.Core.Repositories.Interfaces;
|
||||
using PARR.Core.Repositories.Interfaces.Job;
|
||||
using PARR.Core.Repositories.Interfaces.Unit;
|
||||
using PARR.Core.Services.NextRunServices;
|
||||
using PARR.Domain.Common.Rabbit.Messages;
|
||||
using PARR.Domain.Entities;
|
||||
using PARR.Domain.Common.Rabbit.Messages.TemplateMatching;
|
||||
using PARR.Domain.Entities.Job;
|
||||
using PARR.Domain.Enums;
|
||||
|
||||
@@ -39,7 +38,7 @@ namespace PARR.TemplateUpdater.Services
|
||||
}
|
||||
|
||||
|
||||
public async Task UpdateTemplateAsync(TemplateUpdaterMq query)
|
||||
public async Task UpdateTemplateAsync(TemplateUpdaterMessage query)
|
||||
{
|
||||
var isValid = await IsValidAsync(query);
|
||||
if (!isValid)
|
||||
@@ -95,52 +94,55 @@ namespace PARR.TemplateUpdater.Services
|
||||
scheduleIsChanged = true;
|
||||
}
|
||||
|
||||
//просто обнволяем. не влияет ни на шаблон, ни на расписание
|
||||
//template.LastRun = query.LastRun;
|
||||
template.Index = query.Index;
|
||||
template.StatusTypeId = query.StatusTypeId;
|
||||
|
||||
// === Обработка изменения состава UnitsInTemplate ===
|
||||
var currentUnitIds = template.UnitsInTemplate.Select(u => u.UnitId).ToHashSet();
|
||||
var newUnitIds = query.UnitsInTemplate.ToHashSet();
|
||||
// Формируем HashSet пар (UnitId, UnitFieldValueId) для быстрого сравнения
|
||||
var currentEntries = template.UnitsInTemplate
|
||||
.Select(u => new UnitInTemplateMessage { UnitId = u.UnitId, UnitFieldValueId = u.UnitFieldValueId })
|
||||
.ToHashSet();
|
||||
|
||||
if (!currentUnitIds.SetEquals(newUnitIds))
|
||||
var newEntries = query.UnitsInTemplate.ToHashSet();
|
||||
|
||||
if (!currentEntries.SetEquals(newEntries))
|
||||
{
|
||||
// Удаляем старые связи
|
||||
// Удаляем связи, которых нет в новом наборе
|
||||
var toRemove = template.UnitsInTemplate
|
||||
.Where(u => !newUnitIds.Contains(u.UnitId))
|
||||
.Where(u => !newEntries.Contains(new UnitInTemplateMessage { UnitId = u.UnitId, UnitFieldValueId = u.UnitFieldValueId }))
|
||||
.ToList();
|
||||
|
||||
foreach (var item in toRemove)
|
||||
template.UnitsInTemplate.Remove(item);
|
||||
|
||||
// Добавляем новые связи
|
||||
var toAdd = newUnitIds.Except(currentUnitIds);
|
||||
foreach (var unitId in toAdd)
|
||||
var toAdd = newEntries.Except(currentEntries);
|
||||
foreach (var entry in toAdd)
|
||||
{
|
||||
template.UnitsInTemplate.Add(new UnitsInTemplate
|
||||
{
|
||||
TemplateId = template.Id,
|
||||
UnitId = unitId,
|
||||
UnitId = entry.UnitId,
|
||||
UnitFieldValueId = entry.UnitFieldValueId,
|
||||
DateCreated = DateTimeOffset.UtcNow
|
||||
});
|
||||
}
|
||||
|
||||
// Поскольку коллекция изменилась — шаблон считается изменённым
|
||||
templateIsChanged = true;
|
||||
}
|
||||
// === Конец обработки UnitsInTemplate ===
|
||||
|
||||
//Для правильного расчета shortcod'ов в БД должны быть сохранены данные UnitInTemplates, JobId, UnitId и т.д.
|
||||
// Для правильного расчета shortcod'ов в БД должны быть сохранены данные UnitsInTemplate, JobId, UnitId и т.д.
|
||||
if (templateIsChanged && !await templateService.CommitAsync(query.Initiator))
|
||||
{
|
||||
logger.LogError("Не удалось сохранить изменения в БД. {QueryType}: {Query}", nameof(TemplateUpdaterMq), query.ToJson());
|
||||
logger.LogError("Не удалось сохранить изменения в БД. {QueryType}: {Query}", nameof(TemplateUpdaterMessage), query.ToJson());
|
||||
return;
|
||||
}
|
||||
|
||||
var nextRun = await nextRunService.GetNextRunForTemplateAsync(template.Id, query.IsNew);
|
||||
if (!nextRun.HasValue)
|
||||
{
|
||||
logger.LogError("Ошибка при расчете нового nextRun (вернулся null) для шаблона {templateId}, {templateName}", template.Id, template.Name);
|
||||
logger.LogError("Ошибка при расчете нового nextRun (вернулся null) для шаблона {TemplateId}, {TemplateName}", template.Id, template.Name);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -151,32 +153,23 @@ namespace PARR.TemplateUpdater.Services
|
||||
scheduleIsChanged = true;
|
||||
}
|
||||
|
||||
// === конец обработки UnitsInTemplate ===
|
||||
|
||||
if (templateIsChanged)
|
||||
{
|
||||
// ставим задачу на обновление шаблона
|
||||
var config = robotConfigurationService.GetFromTemplateByRobotCode(RobotsEnum.TemplateOrder, template);
|
||||
//robotConfigurationService.ChangeTaskStatus(TaskStatusEnum.Updating, config);
|
||||
robotConfigurationService.SetUpdateTaskStatusIfAllow(config);
|
||||
|
||||
logger.LogDebug("Для шаблона {TemplateId} устанавливаю статус {Status}", template.Id, RobotStatusEnum.Wait.ToString());
|
||||
}
|
||||
|
||||
if (scheduleIsChanged)
|
||||
{
|
||||
// ставим задачу на обновление расписания
|
||||
var config = robotConfigurationService.GetFromTemplateByRobotCode(RobotsEnum.ScheduleOrder, template);
|
||||
//robotConfigurationService.ChangeTaskStatus(TaskStatusEnum.Updating, config);
|
||||
robotConfigurationService.SetUpdateTaskStatusIfAllow(config);
|
||||
|
||||
logger.LogDebug("Для расписания {TemplateId} устанавливаю статус {Status}", template.Id, RobotStatusEnum.Wait.ToString());
|
||||
}
|
||||
|
||||
|
||||
if (!await templateService.CommitAsync(query.Initiator))
|
||||
{
|
||||
logger.LogError("Не удалось сохранить изменения в БД. {QueryType}: {Query}", nameof(TemplateUpdaterMq), query.ToJson());
|
||||
logger.LogError("Не удалось сохранить изменения в БД. {QueryType}: {Query}", nameof(TemplateUpdaterMessage), query.ToJson());
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -189,7 +182,7 @@ namespace PARR.TemplateUpdater.Services
|
||||
/// </summary>
|
||||
/// <param name="query"></param>
|
||||
/// <returns></returns>
|
||||
private async Task<bool> IsValidAsync(TemplateUpdaterMq query)
|
||||
private async Task<bool> IsValidAsync(TemplateUpdaterMessage query)
|
||||
{
|
||||
var template = await templateService.Get().AsNoTracking()
|
||||
.Include(t => t.RobotConfigurations)
|
||||
|
||||
Reference in New Issue
Block a user