feat(api, dal, esppOrderLoader, esppScheduleSync, generatorTemplates, nextRun):

This commit is contained in:
Mikhail Trubnikov
2024-07-03 15:19:09 +10:00
parent f8bd15cd6f
commit a4f6089438
10 changed files with 80 additions and 50 deletions

View File

@@ -71,7 +71,8 @@ namespace PARR.API.Controllers.V1
&& t.ApplicationsInWork!.IsAgent == true && t.ApplicationsInWork!.IsAgent == true
&& t.IsActiveTemplate == true && t.IsActiveTemplate == true
&& t.IsActiveSchedule == true && t.IsActiveSchedule == true
&& t.ApplicationsInWork!.NextRun.DateTime.Date == date.Date.Date //&& t.ApplicationsInWork!.NextRun.DateTime.Date == date.Date.Date
&& t.NextRun.DateTime.Date == date.Date.Date
&& t.RobotConfigurations.All(c => c.TaskStatusCode == (int)TaskStatusEnum.Ok) && t.RobotConfigurations.All(c => c.TaskStatusCode == (int)TaskStatusEnum.Ok)
&& t.ApplicationsInWork.EsppSchValues.Any() && t.ApplicationsInWork.EsppSchValues.Any()
).ToListAsync(); ).ToListAsync();
@@ -87,12 +88,12 @@ namespace PARR.API.Controllers.V1
foreach (var template in templates) foreach (var template in templates)
{ {
//var templateSchedule = await esppScheduleTransformService.GetNextScheduleAsync(template.ApplicationInWorkId, template.ApplicationsInWork!.LastRun ?? template.ApplicationsInWork!.NextRun); //var templateSchedule = await esppScheduleTransformService.GetNextScheduleAsync(template.ApplicationInWorkId, template.ApplicationsInWork!.LastRun ?? template.ApplicationsInWork!.NextRun);
var templateSchedule = await esppScheduleTransformService.GetNextScheduleAsync(template.ApplicationInWorkId, template.ApplicationsInWork!.NextRun); var templateSchedule = await esppScheduleTransformService.GetNextScheduleAsync(template.ApplicationInWorkId, template.NextRun);
if (!templateSchedule.Any()) if (!templateSchedule.Any())
{ {
logger.LogWarning($"Запросили раписание для агента по NextRun и вернулся пустой список! Такого не должно быть! " + logger.LogWarning($"Запросили раписание для агента по NextRun и вернулся пустой список! Такого не должно быть! " +
$"ApplicationInWorkId: {template.ApplicationInWorkId}, latRun: {template.ApplicationsInWork!.LastRun}, NextRun: {template.ApplicationsInWork!.NextRun}, ip: {ip}, date: {date}"); $"ApplicationInWorkId: {template.ApplicationInWorkId}, latRun: {template.LastRun}, NextRun: {template.NextRun}, ip: {ip}, date: {date}");
continue; continue;
} }

View File

@@ -190,7 +190,7 @@ namespace PARR.API.Controllers.V1
if (!await applicationsInWorkService.CreateAsync(applicationInWork) || !await applicationsInWorkService.CommitAsync()) if (!await applicationsInWorkService.CreateAsync(applicationInWork) || !await applicationsInWorkService.CommitAsync())
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = "Ошибка при созании задания на выполнение работ" } })); return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = "Ошибка при созании задания на выполнение работ" } }));
logger.LogInformation($"Пользователь {User.Identity?.Name} добавил задание на выполнение работ: {applicationInWork.Id}, {applicationInWork.ShortDescription}, {applicationInWork.Solution}, {applicationInWork.NextRun}"); logger.LogInformation($"Пользователь {User.Identity?.Name} добавил задание на выполнение работ: {applicationInWork.Id}, {applicationInWork.ShortDescription}, {applicationInWork.Solution}");
var createdApplicationInWork = await applicationsInWorkService.Get() var createdApplicationInWork = await applicationsInWorkService.Get()
@@ -284,7 +284,7 @@ namespace PARR.API.Controllers.V1
logger.LogInformation($"Пользователь {User.Identity?.Name} обновил задание на выполнение работ: {orig.Id}," + logger.LogInformation($"Пользователь {User.Identity?.Name} обновил задание на выполнение работ: {orig.Id}," +
$" {orig.WorkId}, {orig.ApplicationId}, {orig.TemplateDuration}, {orig.ShortDescription}," + $" {orig.WorkId}, {orig.ApplicationId}, {orig.TemplateDuration}, {orig.ShortDescription}," +
$" {orig.FullDescription}, {orig.Solution}, {orig.NextRun}, {orig.IsAgent}, {orig.AgentName}, {orig.AgentTimeOutSec}, {orig.AgentScript}"); $" {orig.FullDescription}, {orig.Solution}, {nameof(orig.IsAutoDistributionEnabled)}: {orig.IsAutoDistributionEnabled}, {orig.IsAgent}, {orig.AgentName}, {orig.AgentTimeOutSec}, {orig.AgentScript}");
if (isScheduleChanged) if (isScheduleChanged)
@@ -354,7 +354,7 @@ namespace PARR.API.Controllers.V1
logger.LogInformation($"Пользователь {User.Identity?.Name} удалил задание на выполнение работ: {applicationsInWork.Id},{applicationsInWork.WorkId}," + logger.LogInformation($"Пользователь {User.Identity?.Name} удалил задание на выполнение работ: {applicationsInWork.Id},{applicationsInWork.WorkId}," +
$" {applicationsInWork.ApplicationId}, {applicationsInWork.TemplateDuration}, {applicationsInWork.ShortDescription}," + $" {applicationsInWork.ApplicationId}, {applicationsInWork.TemplateDuration}, {applicationsInWork.ShortDescription}," +
$" {applicationsInWork.FullDescription}, {applicationsInWork.Solution}, {applicationsInWork.NextRun}, {applicationsInWork.IsAgent}," + $" {applicationsInWork.FullDescription}, {applicationsInWork.Solution}, {nameof(applicationsInWork.IsAutoDistributionEnabled)}: {applicationsInWork.IsAutoDistributionEnabled}, {applicationsInWork.IsAgent}," +
$" {applicationsInWork.AgentName}, {applicationsInWork.AgentTimeOutSec}, {applicationsInWork.AgentScript}"); $" {applicationsInWork.AgentName}, {applicationsInWork.AgentTimeOutSec}, {applicationsInWork.AgentScript}");
return NoContent(); return NoContent();

View File

@@ -143,35 +143,52 @@ namespace PARR.API.Controllers.V1
private async Task UpdateLastNextRunDate(RobotConfiguration task) private async Task UpdateLastNextRunDate(RobotConfiguration task)
{ {
var appInWorks = task.Template!.ApplicationsInWork!; var template = task.Template!;
// передаем LastRun, если его нет, то NextRun // передаем LastRun, если его нет, то NextRun
//var nextRun = await esppScheduleTransformService.GetNextDateAsync(task.Template!.ApplicationInWorkId, task.Template.ApplicationsInWork!.LastRun ?? task.Template.ApplicationsInWork.NextRun); //var nextRun = await esppScheduleTransformService.GetNextDateAsync(task.Template!.ApplicationInWorkId, task.Template.ApplicationsInWork!.LastRun ?? task.Template.ApplicationsInWork.NextRun);
// всегда считаем по nextRun // всегда считаем по nextRun
var nextRun = await esppScheduleTransformService.GetNextDateAsync(task.Template!.ApplicationInWorkId, task.Template.ApplicationsInWork!.NextRun); var nextRun = await esppScheduleTransformService.GetNextDateAsync(template.ApplicationInWorkId, template.NextRun);
if (nextRun != appInWorks.NextRun) if (nextRun != template.NextRun)
{ {
logger.LogDebug($"Для appilcationInWork id {task.Template.ApplicationInWorkId}, шаблона id {task.TemplateId} обновляю nextRun, новое значение {nextRun}, старое значение {appInWorks.NextRun}"); logger.LogDebug($"Для шаблона id {template.Id} обновляю nextRun, новое значение {nextRun}, старое значение {template.NextRun}");
if (appInWorks.NextRun < DateTimeOffset.UtcNow) if (template.NextRun < DateTimeOffset.UtcNow)
{ {
logger.LogDebug($"Для appilcationInWork id {task.Template.ApplicationInWorkId}, шаблона id {task.TemplateId} обновляю lastRun, новое значение {appInWorks.NextRun}, старое значение {appInWorks.LastRun}"); logger.LogDebug($"Для шаблона id {template.Id} обновляю lastRun, новое значение {template.NextRun}, старое значение {template.LastRun}");
appInWorks.LastRun = appInWorks.NextRun; template.LastRun = template.NextRun;
} }
appInWorks.NextRun = nextRun; template.NextRun = nextRun;
await robotConfigurationService.CommitAsync(); await robotConfigurationService.CommitAsync();
} }
//if (appInWorks.LastRun != null) // if - ерунда какая-то. ошибка видимо. #region Old, до выноса lastRun, nextRun в templates
//if (nextRun > DateTimeOffset.UtcNow) //var appInWorks = task.Template!.ApplicationsInWork!;
// appInWorks.LastRun = appInWorks.NextRun;
//appInWorks.NextRun = nextRun; //// передаем LastRun, если его нет, то NextRun
////var nextRun = await esppScheduleTransformService.GetNextDateAsync(task.Template!.ApplicationInWorkId, task.Template.ApplicationsInWork!.LastRun ?? task.Template.ApplicationsInWork.NextRun);
//// всегда считаем по nextRun
//var nextRun = await esppScheduleTransformService.GetNextDateAsync(task.Template!.ApplicationInWorkId, task.Template.ApplicationsInWork!.NextRun);
//if (nextRun != appInWorks.NextRun)
//{
// logger.LogDebug($"Для appilcationInWork id {task.Template.ApplicationInWorkId}, шаблона id {task.TemplateId} обновляю nextRun, новое значение {nextRun}, старое значение {appInWorks.NextRun}");
// if (appInWorks.NextRun < DateTimeOffset.UtcNow)
// {
// logger.LogDebug($"Для appilcationInWork id {task.Template.ApplicationInWorkId}, шаблона id {task.TemplateId} обновляю lastRun, новое значение {appInWorks.NextRun}, старое значение {appInWorks.LastRun}");
// appInWorks.LastRun = appInWorks.NextRun;
// }
// appInWorks.NextRun = nextRun;
// await robotConfigurationService.CommitAsync();
//}
#endregion
//await robotConfigurationService.CommitAsync();
} }
} }
} }

View File

@@ -33,8 +33,10 @@ namespace PARR.API.MappingProfiles
.ForMember(d => d.SyncStatus, o => o.MapFrom(s => s.RobotConfigurations.OrderBy(t => t.RobotCode))) .ForMember(d => d.SyncStatus, o => o.MapFrom(s => s.RobotConfigurations.OrderBy(t => t.RobotCode)))
.ForMember(d => d.Schedule, o => o.MapFrom<TemplateScheduleResolver>()) .ForMember(d => d.Schedule, o => o.MapFrom<TemplateScheduleResolver>())
.ForMember(d => d.Agent, o => o.MapFrom(s => s.ApplicationsInWork)) .ForMember(d => d.Agent, o => o.MapFrom(s => s.ApplicationsInWork))
.ForMember(d => d.NextRun, o => o.MapFrom(s => s.ApplicationsInWork!.NextRun)) //.ForMember(d => d.NextRun, o => o.MapFrom(s => s.ApplicationsInWork!.NextRun))
.ForMember(d => d.LastRun, o => o.MapFrom(s => s.ApplicationsInWork!.LastRun)) //.ForMember(d => d.LastRun, o => o.MapFrom(s => s.ApplicationsInWork!.LastRun))
.ForMember(d => d.NextRun, o => o.MapFrom(s => s.NextRun))
.ForMember(d => d.LastRun, o => o.MapFrom(s => s.LastRun))
.ForMember(d => d.OrderCount, o => o.MapFrom(s => s.Orders.Count())); .ForMember(d => d.OrderCount, o => o.MapFrom(s => s.Orders.Count()));
// === Template === // === Template ===
@@ -166,8 +168,12 @@ namespace PARR.API.MappingProfiles
.ForMember(d => d.Timezone, o => o.MapFrom<RobotTaskScheduleTimezoneResolver>()) .ForMember(d => d.Timezone, o => o.MapFrom<RobotTaskScheduleTimezoneResolver>())
.ForMember(d => d.RepeatRange, o => o.MapFrom<RobotTaskScheduleRepeatRangeResolver>()) .ForMember(d => d.RepeatRange, o => o.MapFrom<RobotTaskScheduleRepeatRangeResolver>())
//.ForMember(d => d.GenerationTime, o => o.MapFrom(s => s.Template!.ApplicationsInWork!.ScheduleGenerationTime)) //.ForMember(d => d.GenerationTime, o => o.MapFrom(s => s.Template!.ApplicationsInWork!.ScheduleGenerationTime))
.ForMember(d => d.GenerationTime, o => o.MapFrom(s => EsppScheduleHelpers.GetGenerationTime(s.Template!.ApplicationsInWork!.NextRun))) //~~~~~~~~~
.ForMember(d => d.NextStart, o => o.MapFrom(s => EsppScheduleHelpers.GetNextRun(s.Template!.ApplicationsInWork!.NextRun))) //.ForMember(d => d.GenerationTime, o => o.MapFrom(s => EsppScheduleHelpers.GetGenerationTime(s.Template!.ApplicationsInWork!.NextRun)))
//.ForMember(d => d.NextStart, o => o.MapFrom(s => EsppScheduleHelpers.GetNextRun(s.Template!.ApplicationsInWork!.NextRun)))
//~~~~~~~~~
.ForMember(d => d.GenerationTime, o => o.MapFrom(s => EsppScheduleHelpers.GetGenerationTime(s.Template!.NextRun)))
.ForMember(d => d.NextStart, o => o.MapFrom(s => EsppScheduleHelpers.GetNextRun(s.Template!.NextRun)))
//.ForMember(d => d.NextStart, o => o.MapFrom(s => EsppScheduleHelpers.GetFirstStart(s.Template!.ApplicationsInWork!.ScheduleStartDate, s.Template!.ApplicationsInWork!.ScheduleGenerationTime))) //.ForMember(d => d.NextStart, o => o.MapFrom(s => EsppScheduleHelpers.GetFirstStart(s.Template!.ApplicationsInWork!.ScheduleStartDate, s.Template!.ApplicationsInWork!.ScheduleGenerationTime)))
//.ForMember(d => d.NextStart, o => o.MapFrom(s => EsppScheduleHelpers.GetNextScheduleStart(s.Template!.NextScheduleStart))) //.ForMember(d => d.NextStart, o => o.MapFrom(s => EsppScheduleHelpers.GetNextScheduleStart(s.Template!.NextScheduleStart)))
.ForMember(d => d.ScheduleType, o => o.MapFrom(s => .ForMember(d => d.ScheduleType, o => o.MapFrom(s =>

View File

@@ -38,8 +38,10 @@ namespace PARR.API.MappingProfiles.Resolvers
var response = new EsppScheduleResponse var response = new EsppScheduleResponse
{ {
NextRun = source.ApplicationsInWork!.NextRun, //NextRun = source.ApplicationsInWork!.NextRun,
LastRun = source.ApplicationsInWork.LastRun, //LastRun = source.ApplicationsInWork.LastRun,
NextRun = source.NextRun,
LastRun = source.LastRun,
Timezone = settingsFromDb.ScheduleTimezone, Timezone = settingsFromDb.ScheduleTimezone,
TypeSchedule = mapper.Map<EsppScheduleTypeScheduleResponse>(schedule.TypeSchedule), TypeSchedule = mapper.Map<EsppScheduleTypeScheduleResponse>(schedule.TypeSchedule),
Values = mapper.Map<List<EsppScheduleValResponse>>(schedule.Values).OrderBy(t => t.Order).ToList() Values = mapper.Map<List<EsppScheduleValResponse>>(schedule.Values).OrderBy(t => t.Order).ToList()

View File

@@ -69,15 +69,15 @@ namespace PARR.DAL.Models
public required string Solution { get; set; } public required string Solution { get; set; }
/// <summary> ///// <summary>
/// Время последнего запуска скрипта/генерации наряда ///// Время последнего запуска скрипта/генерации наряда
/// </summary> ///// </summary>
public DateTimeOffset? LastRun { get; set; } //public DateTimeOffset? LastRun { get; set; }
/// <summary> ///// <summary>
/// Время следующего запуска скрипта/генерации наряда ///// Время следующего запуска скрипта/генерации наряда
/// </summary> ///// </summary>
public DateTimeOffset NextRun { get; set; } //public DateTimeOffset NextRun { get; set; }
/// <summary> /// <summary>
/// Включить автораспределение /// Включить автораспределение

View File

@@ -53,7 +53,8 @@ namespace PARR.EsppOrderLoader.Services
StatusCode = (int)orderStatusService.GetOrderStatusByName(esppOrder.Status), StatusCode = (int)orderStatusService.GetOrderStatusByName(esppOrder.Status),
GenerateDate = template == null ? GenerateDate = template == null ?
null null
: CalcGenerationDate(template.ApplicationsInWork!.NextRun, template.ApplicationsInWork!.LastRun), //: CalcGenerationDate(template.ApplicationsInWork!.NextRun, template.ApplicationsInWork!.LastRun),
: CalcGenerationDate(template.NextRun, template.LastRun),
//CalcGenerationDate(esppOrder.ExpirationDateUTC, template.ApplicationsInWork!.TemplateDurationTimeSpan), //CalcGenerationDate(esppOrder.ExpirationDateUTC, template.ApplicationsInWork!.TemplateDurationTimeSpan),
ExpirationDate = esppOrder.ExpirationDateUTC ExpirationDate = esppOrder.ExpirationDateUTC
}; };

View File

@@ -88,7 +88,8 @@ namespace PARR.EsppScheduleSync
WorkGroup = template.Host!.WorkGroup!.Name, WorkGroup = template.Host!.WorkGroup!.Name,
//Мы решили, что для всех расписаний "Нет исключений", если что-то поменяется, тут нужно переделать //Мы решили, что для всех расписаний "Нет исключений", если что-то поменяется, тут нужно переделать
TypeV60calendar = settingsFromDb.ScheduleExclude == "Нет исключений" ? "NONE" : "", TypeV60calendar = settingsFromDb.ScheduleExclude == "Нет исключений" ? "NONE" : "",
Scheduled = EsppScheduleHelpers.GetNextRun(template.ApplicationsInWork!.NextRun), //Scheduled = EsppScheduleHelpers.GetNextRun(template.ApplicationsInWork!.NextRun),
Scheduled = EsppScheduleHelpers.GetNextRun(template.NextRun),
Timezone = settingsFromDb.ScheduleTimezone, Timezone = settingsFromDb.ScheduleTimezone,
//Мы решили, что для всех расписаний "Отсутствует дата завершения", если что-то поменяется, тут нужно переделать //Мы решили, что для всех расписаний "Отсутствует дата завершения", если что-то поменяется, тут нужно переделать
TerminationType = settingsFromDb.ScheduleRepeatRange == "Отсутствует дата завершения" ? "forever" : "", TerminationType = settingsFromDb.ScheduleRepeatRange == "Отсутствует дата завершения" ? "forever" : "",

View File

@@ -9,6 +9,7 @@
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\PARR.BLL\PARR.BLL.csproj" /> <ProjectReference Include="..\PARR.BLL\PARR.BLL.csproj" />
<ProjectReference Include="..\PARR.DAL\PARR.DAL.csproj" /> <ProjectReference Include="..\PARR.DAL\PARR.DAL.csproj" />
<ProjectReference Include="..\PARR.TemplateDistributor\PARR.TemplateDistributor.csproj" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@@ -36,13 +36,14 @@ namespace PARR.NextRun
{ {
using (var scope = serviceProvider.CreateScope()) using (var scope = serviceProvider.CreateScope())
{ {
var appInWorkService = scope.ServiceProvider.GetService<IApplicationsInWorkService>(); //var appInWorkService = scope.ServiceProvider.GetService<IApplicationsInWorkService>();
var esppSchService = scope.ServiceProvider.GetService<IEsppScheduleTransformService>(); var esppSchService = scope.ServiceProvider.GetService<IEsppScheduleTransformService>();
var templateService = scope.ServiceProvider.GetService<ITemplateService>();
if (appInWorkService == null || esppSchService == null) if (templateService == null || esppSchService == null)
throw new Exception("Не смог получить серивс IApplicationsInWorkService или IEsppScheduleTransformService"); throw new Exception("Не смог получить серивс ITemplateService или IEsppScheduleTransformService");
await HandlerAsync(appInWorkService, esppSchService); await HandlerAsync(templateService, esppSchService);
} }
}, workerSettings.RepeatEvery); }, workerSettings.RepeatEvery);
} }
@@ -52,30 +53,30 @@ namespace PARR.NextRun
/// Рассчет следующей даты срабатываения /// Рассчет следующей даты срабатываения
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
private async Task HandlerAsync(IApplicationsInWorkService applicationsInWorkService, IEsppScheduleTransformService esppScheduleTransformService) private async Task HandlerAsync(ITemplateService templateService, IEsppScheduleTransformService esppScheduleTransformService)
{ {
var objs = await applicationsInWorkService.Get().Where(t => t.NextRun < DateTimeOffset.UtcNow).ToListAsync(); var templates = await templateService.Get().Where(t => t.NextRun < DateTimeOffset.UtcNow).ToListAsync();
logger.LogDebug($"Объектов для обновления: {objs.Count()} шт."); logger.LogDebug($"Шаблонов для обновления: {templates.Count()} шт.");
int errorsCount = 0; int errorsCount = 0;
foreach (var obj in objs) foreach (var template in templates)
{ {
var nextRun = await esppScheduleTransformService.GetNextDateAsync(obj.Id, obj.NextRun); var nextRun = await esppScheduleTransformService.GetNextDateAsync(template.ApplicationInWorkId, template.NextRun);
obj.LastRun = obj.NextRun; template.LastRun = template.NextRun;
obj.NextRun = nextRun; template.NextRun = nextRun;
if (await applicationsInWorkService.CommitAsync()) if (await templateService.CommitAsync())
logger.LogDebug($"Обновлено значение полей NextRun: {obj.NextRun}, LastRun: {obj.LastRun} для строки {obj.Id}"); logger.LogDebug($"Обновлены значения полей NextRun: {template.NextRun}, LastRun: {template.LastRun} для шаблона {template.Name}, {template.Id}");
else else
{ {
logger.LogError($"Ошибка при обновлении значения полей NextRun {obj.NextRun}, LastRun: {obj.LastRun} для строки {obj.Id}"); logger.LogError($"Ошибка при обновлении значений полей NextRun: {template.NextRun}, LastRun: {template.LastRun} для шаблона {template.Name}, {template.Id}");
errorsCount++; errorsCount++;
} }
} }
logger.LogInformation($"Завершено обновление полей NextRun. Полей в задании: {objs.Count()}, обновлено: {objs.Count() - errorsCount}, ошибок: {errorsCount}"); logger.LogInformation($"Завершено обновление полей NextRun. Полей в задании: {templates.Count()}, обновлено: {templates.Count() - errorsCount}, ошибок: {errorsCount}");
} }
} }
} }