feat(templateMatcher,dal): Первая реализация SyncTemplatesForJobGroup для сгруппированных типов групп регламентных работ.
This commit is contained in:
@@ -2,6 +2,6 @@
|
||||
{
|
||||
public interface IValidatorService
|
||||
{
|
||||
Task<bool> IsValidAsync(Guid jobId, Guid unitId);
|
||||
Task<bool> IsValidAsync(Guid jobId, Guid unitId, int? index, List<Guid>? unitsInTemplate = null);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
// ValidatorService.cs
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using PARR.DAL.Services.Interfaces;
|
||||
using PARR.DAL.Services.Interfaces.Job;
|
||||
using PARR.DAL.Services.Interfaces.Unit;
|
||||
|
||||
@@ -9,22 +11,25 @@ namespace PARR.TemplateGeneratorWorker.Services
|
||||
private readonly ILogger<ValidatorService> logger;
|
||||
private readonly IJobService jobService;
|
||||
private readonly IUnitService unitService;
|
||||
private readonly ITemplateService templateService;
|
||||
|
||||
public ValidatorService(
|
||||
ILogger<ValidatorService> logger,
|
||||
IJobService jobService,
|
||||
IUnitService unitService
|
||||
IUnitService unitService,
|
||||
ITemplateService templateService
|
||||
)
|
||||
{
|
||||
this.logger = logger;
|
||||
this.jobService = jobService;
|
||||
this.unitService = unitService;
|
||||
this.templateService = templateService;
|
||||
}
|
||||
|
||||
|
||||
public async Task<bool> IsValidAsync(Guid jobId, Guid unitId)
|
||||
public async Task<bool> IsValidAsync(Guid jobId, Guid unitId, int? index, List<Guid>? unitsInTemplate = null)
|
||||
{
|
||||
|
||||
// Проверяем JobId
|
||||
var job = await jobService
|
||||
.Get().AsNoTracking()
|
||||
.FirstOrDefaultAsync(t => t.Id == jobId);
|
||||
@@ -35,6 +40,7 @@ namespace PARR.TemplateGeneratorWorker.Services
|
||||
return false;
|
||||
}
|
||||
|
||||
// Проверяем UnitId (UnitId - это ID регионального юнита)
|
||||
var unit = await unitService
|
||||
.Get().AsNoTracking()
|
||||
.FirstOrDefaultAsync(t => t.Id == unitId);
|
||||
@@ -45,7 +51,35 @@ namespace PARR.TemplateGeneratorWorker.Services
|
||||
return false;
|
||||
}
|
||||
|
||||
// Проверяем уникальность (JobId, UnitId, Index)
|
||||
var existingTemplate = await templateService
|
||||
.Get().AsNoTracking()
|
||||
.FirstOrDefaultAsync(t => t.JobId == jobId && t.UnitId == unitId && t.Index == index);
|
||||
|
||||
if (existingTemplate != null)
|
||||
{
|
||||
logger.LogError("Шаблон с JobId={JobId}, UnitId={UnitId}, Index={Index} уже существует.", jobId, unitId, index);
|
||||
return false;
|
||||
}
|
||||
|
||||
// Проверяем, что все UnitId в UnitsInTemplate существуют (если список не null и не пуст)
|
||||
if (unitsInTemplate != null && unitsInTemplate.Any())
|
||||
{
|
||||
var unitIdsToCheck = unitsInTemplate.ToHashSet();
|
||||
var existingUnitIdsCount = await unitService.Get()
|
||||
.AsNoTracking()
|
||||
.Where(u => unitIdsToCheck.Contains(u.Id))
|
||||
.Select(u => u.Id)
|
||||
.CountAsync();
|
||||
|
||||
if (existingUnitIdsCount != unitIdsToCheck.Count)
|
||||
{
|
||||
logger.LogError("Не все UnitId из UnitsInTemplate существуют в базе данных. Ожидается: {ExpectedCount}, Найдено: {FoundCount}", unitIdsToCheck.Count, existingUnitIdsCount);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,4 @@
|
||||
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using PARR.BLL.Domain.Mq;
|
||||
using PARR.BLL.Services.Interfaces;
|
||||
using PARR.Common.Domain;
|
||||
@@ -43,31 +42,23 @@ namespace PARR.TemplateGeneratorWorker
|
||||
this.templateService = templateService;
|
||||
this.esppScheduleTransformService = esppScheduleTransformService;
|
||||
}
|
||||
|
||||
public async Task GenerateTemplateAsync(string msg)
|
||||
{
|
||||
logger.LogInformation($"Получили запрос: {msg}");
|
||||
|
||||
var query = transformService.GetModelFromJson<TemplateGeneratorWorkerMq>(msg);
|
||||
var query = transformService.GetModelFromJson<TemplateGeneratorMq>(msg);
|
||||
|
||||
if (query == null)
|
||||
return;
|
||||
|
||||
|
||||
if (!await validatorService.IsValidAsync(query.JobId, query.UnitId))
|
||||
{
|
||||
logger.LogError($"Некорректные параметры регламентной работы или Unit {nameof(Job)}: {query.JobId}, {nameof(Unit)}: {query.UnitId}");
|
||||
logger.LogError("Не удалось десериализовать запрос: {Message}", msg);
|
||||
return;
|
||||
}
|
||||
|
||||
var existing = await templateService
|
||||
.Get()
|
||||
.AsNoTracking()
|
||||
.FirstOrDefaultAsync(t => t.JobId == query.JobId && t.UnitId == query.UnitId);
|
||||
|
||||
|
||||
if (existing != null)
|
||||
// Проверяем всё
|
||||
if (!await validatorService.IsValidAsync(query.JobId, query.UnitId, query.Index, query.UnitsInTemplate))
|
||||
{
|
||||
logger.LogWarning("Шаблон уже существует (Job={JobId}, Unit={UnitId}) → пропускаем Create", query.JobId, query.UnitId);
|
||||
logger.LogError($"Параметры запроса не прошли валидацию: JobId={query.JobId}, UnitId={query.UnitId}, Index={query.Index}, UnitsInTemplateCount={query.UnitsInTemplate?.Count ?? 0}");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -101,22 +92,32 @@ namespace PARR.TemplateGeneratorWorker
|
||||
IsActiveTemplate = query.IsActiveTemplate ?? false,
|
||||
IsActiveSchedule = query.IsActiveSchedule ?? false,
|
||||
NextRun = nextRun,
|
||||
//IsUnused = false,
|
||||
StatusTypeId = TemplateStatusTypeEnum.Used,
|
||||
InitiatorComment = query.HistoryInitiator?.InitiatorComment,
|
||||
InitiatorParrComponentId = query.HistoryInitiator?.InitiatorParrComponentId
|
||||
InitiatorParrComponentId = query.HistoryInitiator?.InitiatorParrComponentId,
|
||||
Index = query.Index
|
||||
};
|
||||
|
||||
if (await templateService.CreateAsync(template) && await templateService.CommitAsync(new HistoryInitiator { InitiatorComment = "Запрос на генерацию с тестового шаблона", InitiatorParrComponentId = ParrComponentsEnum.TemplateTaskGenerator }))
|
||||
// Устанавливаем UnitsInTemplate
|
||||
if (query.UnitsInTemplate != null && query.UnitsInTemplate.Any())
|
||||
{
|
||||
logger.LogInformation("Создан шаблон: Id={TemplateId}, Name={Name}, Job={JobId}, Unit={UnitId}",
|
||||
template.Id, template.Name, query.JobId, query.UnitId);
|
||||
template.UnitsInTemplate = query.UnitsInTemplate.Select(unitId => new UnitsInTemplate { UnitId = unitId }).ToList();
|
||||
}
|
||||
else
|
||||
{
|
||||
logger.LogError("Ошибка создания шаблона: Name={Name}", templateName);
|
||||
// Если список пуст, все равно инициализируем коллекцию, чтобы избежать NullReferenceException при сохранении (если это не nullable)
|
||||
template.UnitsInTemplate = new List<UnitsInTemplate>();
|
||||
}
|
||||
|
||||
if (await templateService.CreateAsync(template) && await templateService.CommitAsync(new HistoryInitiator { InitiatorComment = "Запрос на генерацию с тестового шаблона", InitiatorParrComponentId = ParrComponentsEnum.TemplateTaskGenerator }))
|
||||
{
|
||||
logger.LogInformation("Создан шаблон: Id={TemplateId}, Name={Name}, Job={JobId}, Unit={UnitId}, Index={Index}, UnitsInTemplateCount={UnitsCount}",
|
||||
template.Id, template.Name, query.JobId, query.UnitId, query.Index, template.UnitsInTemplate.Count);
|
||||
}
|
||||
else
|
||||
{
|
||||
logger.LogError("Ошибка создания шаблона: Name={Name}, JobId={JobId}, UnitId={UnitId}, Index={Index}", templateName, query.JobId, query.UnitId, query.Index);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user