feat(api, nextRun): при изменении расписания в jobGroup, отправляется запрос на обновление nextRun в связанных шаблонах.
This commit is contained in:
@@ -407,6 +407,13 @@
|
|||||||
public const string getParam = "{id}";
|
public const string getParam = "{id}";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class JobGroupUpdateNextRun
|
||||||
|
{
|
||||||
|
public const string UpdateNextRun = Base + "/job-groups/" + getParam + "/update-next-run";
|
||||||
|
|
||||||
|
public const string getParam = "{jobGroupId}";
|
||||||
|
}
|
||||||
|
|
||||||
public static class JobGroupType
|
public static class JobGroupType
|
||||||
{
|
{
|
||||||
public const string GetAll = Base + "/job-group-types/";
|
public const string GetAll = Base + "/job-group-types/";
|
||||||
|
|||||||
@@ -11,14 +11,17 @@ using PARR.API.Contracts.V1.Responses.Base;
|
|||||||
using PARR.API.Controllers.V1.Base;
|
using PARR.API.Controllers.V1.Base;
|
||||||
using PARR.API.Extensions;
|
using PARR.API.Extensions;
|
||||||
using PARR.API.Services.Interfaces;
|
using PARR.API.Services.Interfaces;
|
||||||
|
using PARR.API.Settings;
|
||||||
|
using PARR.BLL.Domain.Mq;
|
||||||
using PARR.BLL.Helpers;
|
using PARR.BLL.Helpers;
|
||||||
|
using PARR.BLL.Services.Interfaces;
|
||||||
|
using PARR.Common.Domain;
|
||||||
using PARR.Constants;
|
using PARR.Constants;
|
||||||
using PARR.DAL.Contracts;
|
using PARR.DAL.Contracts;
|
||||||
using PARR.DAL.DomainModels;
|
using PARR.DAL.DomainModels;
|
||||||
using PARR.DAL.DomainServices.Interfaces;
|
using PARR.DAL.DomainServices.Interfaces;
|
||||||
using PARR.DAL.Models;
|
using PARR.DAL.Models;
|
||||||
using PARR.DAL.Models.Job;
|
using PARR.DAL.Models.Job;
|
||||||
using PARR.DAL.NextRunServices;
|
|
||||||
using PARR.DAL.Services.Interfaces;
|
using PARR.DAL.Services.Interfaces;
|
||||||
using PARR.DAL.Services.Interfaces.Job;
|
using PARR.DAL.Services.Interfaces.Job;
|
||||||
using PARR.DAL.Services.Interfaces.Schedule;
|
using PARR.DAL.Services.Interfaces.Schedule;
|
||||||
@@ -41,6 +44,8 @@ namespace PARR.API.Controllers.V1
|
|||||||
private readonly IJobGroupTypeService jobGroupTypeService;
|
private readonly IJobGroupTypeService jobGroupTypeService;
|
||||||
private readonly IMatchingStatusService matchingStatusService;
|
private readonly IMatchingStatusService matchingStatusService;
|
||||||
private readonly IScheduleResponseAreaTimeOffsetService scheduleResponseAreaTimeOffsetService;
|
private readonly IScheduleResponseAreaTimeOffsetService scheduleResponseAreaTimeOffsetService;
|
||||||
|
private readonly IMqService mqService;
|
||||||
|
private readonly MqSettings mqSettings;
|
||||||
|
|
||||||
public JobGroupController(
|
public JobGroupController(
|
||||||
ILogger<JobController> logger,
|
ILogger<JobController> logger,
|
||||||
@@ -52,7 +57,9 @@ namespace PARR.API.Controllers.V1
|
|||||||
IValidator<JobGroupRequest> validator,
|
IValidator<JobGroupRequest> validator,
|
||||||
IJobGroupTypeService jobGroupTypeService,
|
IJobGroupTypeService jobGroupTypeService,
|
||||||
IMatchingStatusService matchingStatusService,
|
IMatchingStatusService matchingStatusService,
|
||||||
IScheduleResponseAreaTimeOffsetService scheduleResponseAreaTimeOffsetService
|
IScheduleResponseAreaTimeOffsetService scheduleResponseAreaTimeOffsetService,
|
||||||
|
IMqService mqService,
|
||||||
|
MqSettings mqSettings
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
this.logger = logger;
|
this.logger = logger;
|
||||||
@@ -65,6 +72,8 @@ namespace PARR.API.Controllers.V1
|
|||||||
this.jobGroupTypeService = jobGroupTypeService;
|
this.jobGroupTypeService = jobGroupTypeService;
|
||||||
this.matchingStatusService = matchingStatusService;
|
this.matchingStatusService = matchingStatusService;
|
||||||
this.scheduleResponseAreaTimeOffsetService = scheduleResponseAreaTimeOffsetService;
|
this.scheduleResponseAreaTimeOffsetService = scheduleResponseAreaTimeOffsetService;
|
||||||
|
this.mqService = mqService;
|
||||||
|
this.mqSettings = mqSettings;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -248,7 +257,7 @@ namespace PARR.API.Controllers.V1
|
|||||||
if (orig == null)
|
if (orig == null)
|
||||||
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при изменении группы заданий на выполнение работ. Не найдена группа с Id: {id}" } }));
|
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при изменении группы заданий на выполнение работ. Не найдена группа с Id: {id}" } }));
|
||||||
|
|
||||||
// //Расписание было изменено, ниже добавим задание в очередь на обновление расписаний у связанных шаблонов
|
//Расписание было изменено, ниже добавим задание в очередь на обновление расписаний у связанных шаблонов
|
||||||
var isScheduleChanged = IsScheduleChanged(orig, request);
|
var isScheduleChanged = IsScheduleChanged(orig, request);
|
||||||
|
|
||||||
orig.GroupName = request.Name.Trim();
|
orig.GroupName = request.Name.Trim();
|
||||||
@@ -324,26 +333,25 @@ namespace PARR.API.Controllers.V1
|
|||||||
$" {orig.Solution}, {orig.TemplateDuration}, {orig.ReferenceDate}, {orig.IsAutoDistributionEnabled}" +
|
$" {orig.Solution}, {orig.TemplateDuration}, {orig.ReferenceDate}, {orig.IsAutoDistributionEnabled}" +
|
||||||
$", {orig.IsAgent}, {orig.AgentName}, {orig.AgentTimeOutSec}, {orig.AgentScript}");
|
$", {orig.IsAgent}, {orig.AgentName}, {orig.AgentTimeOutSec}, {orig.AgentScript}");
|
||||||
|
|
||||||
//TODO: Восстановить после перехода на JobGroup
|
|
||||||
//if (isScheduleChanged)
|
|
||||||
//{
|
|
||||||
// //расписание было обновлено, отправим задание в очередь на перерасчет NextRun
|
|
||||||
// var requestToMq = new TemplateDistributorMq
|
|
||||||
// {
|
|
||||||
// ApplicationInWorkId = id
|
|
||||||
// };
|
|
||||||
|
|
||||||
// var msg = JsonSerializer.Serialize(requestToMq);
|
#region расписание было изменено, отправим задание на перерасчет nextRun
|
||||||
|
if (isScheduleChanged)
|
||||||
|
{
|
||||||
|
// расписание было изменено, отправим задание на перерасчет nextRun
|
||||||
|
var requestToMq = new NextRunUpdateMq
|
||||||
|
{
|
||||||
|
JobGroupId = id,
|
||||||
|
Initiator = new HistoryInitiator { InitiatorComment = "Изменилось расписание группы работ в ГУИ, отправлен запрос на перерасчет nextRun", InitiatorParrComponentId = ParrComponentsEnum.Api }
|
||||||
|
};
|
||||||
|
var sendResult = await mqService.SendAsync(mqSettings.NextRun, new List<object> { requestToMq });
|
||||||
|
|
||||||
// logger.LogDebug($"Расписание в РР applicationInWorkId: {id} было изменено. Отправляем задание в очередь на перерасчет NextRun");
|
if (sendResult.IsSuccess)
|
||||||
|
logger.LogInformation("Задание на перерасчет NextRun успешно отправлено в очередь MQ {queueName}", mqSettings.NextRun.QueueName);
|
||||||
|
else
|
||||||
|
logger.LogError("Ошибка при отправке задания на перерасчет NextRun в очередь MQ {queueName}", mqSettings.NextRun.QueueName);
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
// var sendResult = mqService.Send(mqSettings.TemplateDistributor, new[] { msg });
|
|
||||||
|
|
||||||
// if (sendResult.IsSuccess)
|
|
||||||
// logger.LogInformation($"Задание на перерасчет NextRun успешно отправлено в очередь MQ {mqSettings.TemplateDistributor.QueueName}");
|
|
||||||
// else
|
|
||||||
// logger.LogError($"Ошибка при отправке задания на перерасчет NextRun в очередь MQ {mqSettings.TemplateDistributor.QueueName}");
|
|
||||||
//}
|
|
||||||
|
|
||||||
var updatedJobGroup = await groupService.Get()
|
var updatedJobGroup = await groupService.Get()
|
||||||
.Include(t => t.Jobs)
|
.Include(t => t.Jobs)
|
||||||
@@ -415,8 +423,30 @@ namespace PARR.API.Controllers.V1
|
|||||||
if (request.Schedule.Count() != orig.EsppSchValues.Count())
|
if (request.Schedule.Count() != orig.EsppSchValues.Count())
|
||||||
isScheduleChanged = true;
|
isScheduleChanged = true;
|
||||||
|
|
||||||
//if (request.IsAutoDistributionEnabled != orig.IsAutoDistributionEnabled)
|
if (request.IsAutoDistributionEnabled != orig.IsAutoDistributionEnabled)
|
||||||
// isScheduleChanged = true;
|
isScheduleChanged = true;
|
||||||
|
|
||||||
|
if (request.DistributionConfig?.DistributionPeriodId != orig.DistributionConfig?.DistributionPeriodId)
|
||||||
|
isScheduleChanged = true;
|
||||||
|
|
||||||
|
if (request.DistributionConfig?.IsExcludeWeekends != orig.DistributionConfig?.IsExcludeWeekends)
|
||||||
|
isScheduleChanged = true;
|
||||||
|
|
||||||
|
if (request.DistributionConfig?.IsGroupingByWorkGroup != orig.DistributionConfig?.IsGroupingByWorkGroup)
|
||||||
|
isScheduleChanged = true;
|
||||||
|
|
||||||
|
if (request.ScheduleExcludeTypeId != orig.ScheduleExcludeTypeId)
|
||||||
|
isScheduleChanged = true;
|
||||||
|
|
||||||
|
if (request.ScheduleExcludeTypeCalendarId != orig.ScheduleExcludeTypeCalendarId)
|
||||||
|
isScheduleChanged = true;
|
||||||
|
|
||||||
|
if (request.IsWorkGroupTimezone != orig.IsResponseAreaTimezone)
|
||||||
|
isScheduleChanged = true;
|
||||||
|
|
||||||
|
if (request.UserTimeZoneOffsetMinutes != orig.UserTimeZoneOffsetMinutes)
|
||||||
|
isScheduleChanged = true;
|
||||||
|
|
||||||
|
|
||||||
request.Schedule.ForEach(requestSchedule =>
|
request.Schedule.ForEach(requestSchedule =>
|
||||||
{
|
{
|
||||||
|
|||||||
70
PARR.API/Controllers/V1/JobGroupUpdateNextRunController.cs
Normal file
70
PARR.API/Controllers/V1/JobGroupUpdateNextRunController.cs
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
using Microsoft.AspNetCore.Authorization;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using PARR.API.Contracts.V1;
|
||||||
|
using PARR.API.Contracts.V1.Responses.Base;
|
||||||
|
using PARR.API.Controllers.V1.Base;
|
||||||
|
using PARR.API.Settings;
|
||||||
|
using PARR.BLL.Domain.Mq;
|
||||||
|
using PARR.BLL.Services.Interfaces;
|
||||||
|
using PARR.Common.Domain;
|
||||||
|
using PARR.Constants;
|
||||||
|
using PARR.DAL.Services.Interfaces.Job;
|
||||||
|
using Serilog.Core;
|
||||||
|
|
||||||
|
namespace PARR.API.Controllers.V1
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Пересчитать все nextRun для JobGroup
|
||||||
|
/// </summary>
|
||||||
|
[Authorize(Roles = ParrRoles.Administrator.Role)]
|
||||||
|
public class JobGroupUpdateNextRunController : BaseApiController
|
||||||
|
{
|
||||||
|
private readonly IMqService mqService;
|
||||||
|
private readonly MqSettings mqSettings;
|
||||||
|
private readonly IJobGroupService jobGroupService;
|
||||||
|
|
||||||
|
public JobGroupUpdateNextRunController(
|
||||||
|
IMqService mqService,
|
||||||
|
MqSettings mqSettings,
|
||||||
|
IJobGroupService jobGroupService
|
||||||
|
)
|
||||||
|
{
|
||||||
|
this.mqService = mqService;
|
||||||
|
this.mqSettings = mqSettings;
|
||||||
|
this.jobGroupService = jobGroupService;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Обновить nextRun для всех шаблонах в JobGroup
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpPost(ApiRoutes.JobGroupUpdateNextRun.UpdateNextRun)]
|
||||||
|
public async Task<IActionResult> UpdateNextRun([FromRoute] Guid jobGroupId)
|
||||||
|
{
|
||||||
|
var jobGroup = await jobGroupService.Get().AnyAsync(t => t.Id == jobGroupId);
|
||||||
|
if (!jobGroup)
|
||||||
|
return BadRequest(new Response<string?>(null, false, new List<ErrorModel> { new ErrorModel { Message = "Не найдена группа работ с ИД" } }));
|
||||||
|
|
||||||
|
var requestToMq = new NextRunUpdateMq
|
||||||
|
{
|
||||||
|
JobGroupId = jobGroupId,
|
||||||
|
Initiator = new HistoryInitiator
|
||||||
|
{
|
||||||
|
InitiatorComment = "Вручную отправлен запрос на обновление nextRun для группы работ",
|
||||||
|
InitiatorParrComponentId = ParrComponentsEnum.Api
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var sendResult = await mqService.SendAsync(mqSettings.NextRun, new List<object> { requestToMq });
|
||||||
|
|
||||||
|
if (sendResult.IsSuccess)
|
||||||
|
return Created("", new Response<string?>(null, true, new List<ErrorModel>(), "Отправлен запрос на расчет nextRun для группы работ."));
|
||||||
|
else
|
||||||
|
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = "Ошибка при отправке данных." } }));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -10,6 +10,7 @@ namespace PARR.API.Settings
|
|||||||
public MqStatistics Statistics { get; set; } = new MqStatistics();
|
public MqStatistics Statistics { get; set; } = new MqStatistics();
|
||||||
public MqTemplatesMatcher TemplatesMatcher { get; set; } = new MqTemplatesMatcher();
|
public MqTemplatesMatcher TemplatesMatcher { get; set; } = new MqTemplatesMatcher();
|
||||||
public MqTemplatesUpdater TemplatesUpdater { get; set; } = new MqTemplatesUpdater();
|
public MqTemplatesUpdater TemplatesUpdater { get; set; } = new MqTemplatesUpdater();
|
||||||
|
public MqNextRun NextRun { get; set; } = new MqNextRun();
|
||||||
}
|
}
|
||||||
|
|
||||||
public class MqGenerateTemplates : IMqSettings
|
public class MqGenerateTemplates : IMqSettings
|
||||||
@@ -70,4 +71,13 @@ namespace PARR.API.Settings
|
|||||||
public string Password { get; set; } = string.Empty;
|
public string Password { get; set; } = string.Empty;
|
||||||
public ushort? PrefetchCount { get; set; } = 0;
|
public ushort? PrefetchCount { get; set; } = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class MqNextRun : IMqSettings
|
||||||
|
{
|
||||||
|
public string HostName { get; set; } = string.Empty;
|
||||||
|
public string QueueName { get; set; } = string.Empty;
|
||||||
|
public string User { get; set; } = string.Empty;
|
||||||
|
public string Password { get; set; } = string.Empty;
|
||||||
|
public ushort? PrefetchCount { get; set; } = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,6 +45,9 @@
|
|||||||
"TemplatesUpdater": {
|
"TemplatesUpdater": {
|
||||||
"HostName": "10.99.253.216"
|
"HostName": "10.99.253.216"
|
||||||
},
|
},
|
||||||
|
"NextRun": {
|
||||||
|
"HostName": "10.99.253.216"
|
||||||
|
},
|
||||||
"Statistics": {
|
"Statistics": {
|
||||||
"StatMqAuth": {
|
"StatMqAuth": {
|
||||||
"HostName": "10.99.253.216"
|
"HostName": "10.99.253.216"
|
||||||
|
|||||||
@@ -60,6 +60,12 @@
|
|||||||
"User": "template_updater_writer",
|
"User": "template_updater_writer",
|
||||||
"Password": "sjdhgfkJHGIUFDi14asd^12"
|
"Password": "sjdhgfkJHGIUFDi14asd^12"
|
||||||
},
|
},
|
||||||
|
"NextRun": {
|
||||||
|
"HostName": "parr-rabbitmq",
|
||||||
|
"QueueName": "parr-next-run-updater",
|
||||||
|
"User": "next_run_updater_writer",
|
||||||
|
"Password": "KJHGfdsjfhg$976412!kay"
|
||||||
|
},
|
||||||
"Statistics": {
|
"Statistics": {
|
||||||
"StatMqAuth": {
|
"StatMqAuth": {
|
||||||
"HostName": "parr-rabbitmq",
|
"HostName": "parr-rabbitmq",
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
namespace PARR.BLL.Domain.Mq
|
using PARR.Common.Domain;
|
||||||
|
|
||||||
|
namespace PARR.BLL.Domain.Mq
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Запрос на обновление всех nextRun для JobGroup
|
/// Запрос на обновление всех nextRun для JobGroup
|
||||||
@@ -6,5 +8,7 @@
|
|||||||
public class NextRunUpdateMq
|
public class NextRunUpdateMq
|
||||||
{
|
{
|
||||||
public Guid JobGroupId { get; set; }
|
public Guid JobGroupId { get; set; }
|
||||||
|
|
||||||
|
public required HistoryInitiator Initiator { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ namespace PARR.NextRun
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
await UpdateNextRunAsync(query.JobGroupId);
|
await UpdateNextRunAsync(query);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -95,7 +95,7 @@ namespace PARR.NextRun
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="jobGroupId"></param>
|
/// <param name="jobGroupId"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
private async Task UpdateNextRunAsync(Guid jobGroupId)
|
private async Task UpdateNextRunAsync(NextRunUpdateMq queryMq)
|
||||||
{
|
{
|
||||||
using var scope = serviceProvider.CreateScope();
|
using var scope = serviceProvider.CreateScope();
|
||||||
|
|
||||||
@@ -105,11 +105,11 @@ namespace PARR.NextRun
|
|||||||
// Берем шаблоны только в статусе Used
|
// Берем шаблоны только в статусе Used
|
||||||
var templates = await templateService.Get()
|
var templates = await templateService.Get()
|
||||||
.Where(t =>
|
.Where(t =>
|
||||||
t.Job!.GroupId == jobGroupId
|
t.Job!.GroupId == queryMq.JobGroupId
|
||||||
&& t.StatusTypeId == TemplateStatusTypeEnum.Used
|
&& t.StatusTypeId == TemplateStatusTypeEnum.Used
|
||||||
).ToListAsync();
|
).ToListAsync();
|
||||||
|
|
||||||
logger.LogInformation("Найдено шаблонов {count} шт. в статусе Used в группе работ {jobGroupId}", templates.Count, jobGroupId);
|
logger.LogInformation("Найдено шаблонов {count} шт. в статусе Used в группе работ {jobGroupId}", templates.Count, queryMq.JobGroupId);
|
||||||
|
|
||||||
if (!templates.Any())
|
if (!templates.Any())
|
||||||
return;
|
return;
|
||||||
@@ -145,18 +145,18 @@ namespace PARR.NextRun
|
|||||||
|
|
||||||
if (updatedTemplates > 0)
|
if (updatedTemplates > 0)
|
||||||
{
|
{
|
||||||
if (await templateService.CommitAsync(new HistoryInitiator { InitiatorComment = "Запрос из очереди на перерасчет всех nextRun для jobGroupId", InitiatorParrComponentId = ParrComponentsEnum.NextRun }))
|
if (await templateService.CommitAsync(queryMq.Initiator))
|
||||||
{
|
{
|
||||||
logger.LogInformation("Успешно обновлены nextRun у {count} шаблонов, группа работ: {jobGroupId}", updatedTemplates, jobGroupId);
|
logger.LogInformation("Успешно обновлены nextRun у {count} шаблонов, группа работ: {jobGroupId}", updatedTemplates, queryMq.JobGroupId);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
logger.LogError("При сохранении nextRun для шаблонов {count} шт, произошла ошибка при сохранении в БД. JobGroupId: {jobGroupId}", updatedTemplates, jobGroupId);
|
logger.LogError("При сохранении nextRun для шаблонов {count} шт, произошла ошибка при сохранении в БД. JobGroupId: {jobGroupId}", updatedTemplates, queryMq.JobGroupId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
logger.LogInformation("Для группы работ {jobGroupId}, все nextRun актуальны. Нечего обновлять.", jobGroupId);
|
logger.LogInformation("Для группы работ {jobGroupId}, все nextRun актуальны. Нечего обновлять.", queryMq.JobGroupId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ namespace PARR.NextRunWorker
|
|||||||
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
|
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
|
||||||
{
|
{
|
||||||
logger.LogInformation("Запуск {workerName}", nameof(RabbitWorker));
|
logger.LogInformation("Запуск {workerName}", nameof(RabbitWorker));
|
||||||
await nextRunRabbitService.StopAsync();
|
await nextRunRabbitService.StartAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
public override Task StopAsync(CancellationToken cancellationToken)
|
public override Task StopAsync(CancellationToken cancellationToken)
|
||||||
|
|||||||
Reference in New Issue
Block a user