This commit is contained in:
Mikhail Kuznetsov
2026-02-09 12:00:59 +10:00
13 changed files with 352 additions and 143 deletions

View File

@@ -20,20 +20,21 @@ namespace PARR.DAL.NextRunServices
Task<List<TemplateNextRunResultDto>?> GetNextRunForJobGroupWithAutoDistributionAsync(Guid jobGroupId);
/// <summary>
/// Получить NextRun по jobGroupId с расписанием ЕСПП
/// </summary>
/// <param name="jobGroupId"></param>
/// <returns></returns>
Task<DateTimeOffset> GetNextRunForJobGroupWithEsppSchedulleAsync(Guid jobGroupId);
///// <summary>
///// Получить NextRun по jobGroupId с расписанием ЕСПП
///// </summary>
///// <param name="jobGroupId"></param>
///// <returns></returns>
//Task<DateTimeOffset> GetNextRunForJobGroupWithEsppSchedulleAsync(Guid jobGroupId);
/// <summary>
/// Получить nextRun для создаваемого шаблона, которого еще нет в БД
/// </summary>
/// <param name="jobGroupId"></param>
/// <param name="responseArea">НЕ МАСКА, а прям ЗО</param>
/// <returns></returns>
Task<DateTimeOffset> GetNextRunForNewTemplateAsync(Guid jobGroupId);
Task<DateTimeOffset> GetNextRunForNewTemplateAsync(Guid jobGroupId, string responseArea);
/// <summary>

View File

@@ -1,6 +1,5 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using PARR.BLL.Helpers;
using PARR.Constants;
using PARR.DAL.Contracts;
using PARR.DAL.DomainServices.Shortcodes;
@@ -8,7 +7,6 @@ using PARR.DAL.Models;
using PARR.DAL.Models.Job;
using PARR.DAL.NextRunServices.Models;
using PARR.DAL.NextRunServices.Subservices;
using PARR.DAL.Services.Implementations.Schedule;
using PARR.DAL.Services.Interfaces;
using PARR.DAL.Services.Interfaces.Job;
using PARR.DAL.Services.Interfaces.Schedule;
@@ -136,22 +134,24 @@ namespace PARR.DAL.NextRunServices
}
public async Task<DateTimeOffset> GetNextRunForJobGroupWithEsppSchedulleAsync(Guid jobGroupId)
{
var jobGroup = await jobGroupService.Get().AsNoTracking().FirstOrDefaultAsync(t => t.Id == jobGroupId);
//public async Task<DateTimeOffset> GetNextRunForJobGroupWithEsppSchedulleAsync(Guid jobGroupId)
//{
// var jobGroup = await jobGroupService.Get().AsNoTracking().FirstOrDefaultAsync(t => t.Id == jobGroupId);
if (jobGroup == null)
{
logger.LogError("Не найдена группа работ с Id: {jobGroupId}.", jobGroupId);
throw new ArgumentNullException(nameof(jobGroupId), $"Не найдена группа работ с Id: {jobGroupId}");
}
// if (jobGroup == null)
// {
// logger.LogError("Не найдена группа работ с Id: {jobGroupId}.", jobGroupId);
// throw new ArgumentNullException(nameof(jobGroupId), $"Не найдена группа работ с Id: {jobGroupId}");
// }
// Берем из обычного расписания ЕСПП
return await esppScheduleTransformService.GetNextDateAsync(jobGroupId, jobGroup.ReferenceDate);
}
// // Берем из обычного расписания ЕСПП
// //return await esppScheduleTransformService.GetNextDateAsync(jobGroupId, jobGroup.ReferenceDate);
// return await GetNextRunForEsppStandardScheduleAsync(template);
//}
public async Task<DateTimeOffset> GetNextRunForNewTemplateAsync(Guid jobGroupId)
public async Task<DateTimeOffset> GetNextRunForNewTemplateAsync(Guid jobGroupId, string responseArea)
{
// определяю это автораспределение или нет, вызываю соответствующий рассчет
@@ -199,7 +199,8 @@ namespace PARR.DAL.NextRunServices
else
{
// тут расписание ЕСПП
var nextRun = await esppScheduleTransformService.GetNextDateAsync(jobGroup.Id, jobGroup.ReferenceDate);
//var nextRun = await esppScheduleTransformService.GetNextDateAsync(jobGroup.Id, jobGroup.ReferenceDate);
var nextRun = await GetNextRunForEsppStandardScheduleAsync(jobGroupId, jobGroup.ReferenceDate, jobGroup.IsResponseAreaTimezone, responseArea);
logger.LogDebug("Получил nextRun {nextRun} по jobGroupId {jobGroupId}, тип расписания ЕСПП", nextRun, jobGroupId);
return nextRun;
@@ -253,7 +254,13 @@ namespace PARR.DAL.NextRunServices
else
{
// считаем как ЕСПП
var nextRun = await esppScheduleTransformService.GetNextDateAsync(template.Job.Group.Id, template.Job.Group.ReferenceDate);
//var offset = GetOffsetTest();
//var nextRun = await esppScheduleTransformService.GetNextDateAsync(template.Job.Group.Id, template.Job.Group.ReferenceDate, offset);
//var nextRun = await GetNextRunForEsppStandardScheduleAsync(template.Job.Group.Id, template.Job.Group.ReferenceDate, template);
var responseArea = await shortcodesService.ApplyShortcodesAsync(template.Job.ResponseAreaMask, template);
var nextRun = await GetNextRunForEsppStandardScheduleAsync(template.Job.GroupId, template.Job.Group.ReferenceDate, template.Job.Group.IsResponseAreaTimezone, responseArea);
logger.LogDebug("Получил nextRun {nextRun} по templateId {templateId}, isNew: {isNew}, тип расписания: ЕСПП", nextRun, templateId, isNew);
return nextRun;
@@ -262,6 +269,31 @@ namespace PARR.DAL.NextRunServices
/// <summary>
/// Расчет nextRun по расписанию ЕСПП
/// </summary>
/// <param name="jobGroupId"></param>
/// <param name="referenceDate"></param>
/// <param name="template">Template with include Job, Group</param>
/// <returns></returns>
private async Task<DateTimeOffset> GetNextRunForEsppStandardScheduleAsync(Guid jobGroupId, DateTimeOffset referenceDate, bool isResponseAreaTimezone, string? responseArea)
{
//var isResponseAreaTimezone = template.Job?.Group?.IsResponseAreaTimezone ?? false;
//string? responseArea = null;
//if (isResponseAreaTimezone)
//{
// var responseAreaMask = template.Job!.ResponseAreaMask;
// responseArea = await shortcodesService.ApplyShortcodesAsync(responseAreaMask, template);
//}
var offset = GetTimeOffset(isResponseAreaTimezone, responseArea);
//var nextRun = await esppScheduleTransformService.GetNextDateAsync(template.Job!.GroupId, template.Job!.Group!.ReferenceDate, offset);
var nextRun = await esppScheduleTransformService.GetNextDateAsync(jobGroupId, referenceDate, offset);
return nextRun;
}
/// <summary>
@@ -331,30 +363,79 @@ namespace PARR.DAL.NextRunServices
public DateTimeOffset GetNextRunWithTimezoneEsppAndResponseArea(DateTimeOffset nextRun, bool? isResponseAreaTimezone = null, string? responseArea = null)
{
logger.LogDebug("Начинаю получать nextRun с учетом УЗ ЕСПП и ЗО, входные параметры: nextRun: {nextRun}, isResponseAreaTimezone: {isResponseAreaTimezone}, responseArea: {responseArea}", nextRun, isResponseAreaTimezone, responseArea);
//logger.LogDebug("Начинаю получать nextRun с учетом УЗ ЕСПП и ЗО, входные параметры: nextRun: {nextRun}, isResponseAreaTimezone: {isResponseAreaTimezone}, responseArea: {responseArea}", nextRun, isResponseAreaTimezone, responseArea);
//var esppOffset = GetEsppAccountOffset();
//// смещение УЗ ЕСПП
//var resultNextRun = nextRun.Add(esppOffset);
//logger.LogDebug("Смещение nextRun с учетом смещения УЗ ЕСПП, новое значение: {resultNextRun}", resultNextRun);
//// если включено использовать таймзону ЗО
//if (isResponseAreaTimezone == true && !string.IsNullOrEmpty(responseArea))
//{
// // resultNextRun = офсет УЗ ЕСПП - offset ЗО
// var responseAreaOffset = scheduleResponseAreaTimeOffsetService.GetByResponseAreaOrDefault(responseArea).UtcTimeOffset;
// var resultOffset = esppOffset - responseAreaOffset;
// resultNextRun = resultNextRun.Add(resultOffset);
// logger.LogDebug("Смещение nextRun с учетом ЗО, смещение ЗО: {responseAreaOffset}, смещение с учетом смещения УЗ ЕСПП: {resultOffset}, новое значение: {resultNextRun}", responseAreaOffset, resultOffset, resultNextRun);
//}
////var resulstStr = EsppScheduleHelpers.GetNextRun(resultNextRun);
////logger.LogDebug("Результат в формате ЕСПП: {resulstStr}", resulstStr);
//return resultNextRun;
var offset = GetTimeOffset(isResponseAreaTimezone ?? false, responseArea);
return nextRun.Add(offset);
}
private TimeSpan GetTimeOffset(bool isResponseAreaTimezone, string? responseArea = null)
{
// logger.LogDebug("Начинаю получать nextRun с учетом УЗ ЕСПП и ЗО, входные параметры: nextRun: {nextRun}, isResponseAreaTimezone: {isResponseAreaTimezone}, responseArea: {responseArea}", nextRun, isResponseAreaTimezone, responseArea);
var esppOffset = GetEsppAccountOffset();
// смещение УЗ ЕСПП
var resultNextRun = nextRun.Add(esppOffset);
logger.LogDebug("Смещение nextRun с учетом смещения УЗ ЕСПП, новое значение: {resultNextRun}", resultNextRun);
logger.LogDebug("Получил оффсет {esppOffset}, для параметров: isResponseAreaTimezone: {isResponseAreaTimezone}, responseArea: {responseArea}", esppOffset, isResponseAreaTimezone, responseArea);
// если включено использовать таймзону ЗО
if (isResponseAreaTimezone == true && !string.IsNullOrEmpty(responseArea))
{
// resultNextRun = офсет УЗ ЕСПП - offset ЗО
var responseAreaOffset = scheduleResponseAreaTimeOffsetService.GetByResponseAreaOrDefault(responseArea).UtcTimeOffset;
//if (isResponseAreaTimezone == true && !string.IsNullOrEmpty(responseArea))
//{
// // resultNextRun = офсет УЗ ЕСПП - offset ЗО
// var responseAreaOffset = scheduleResponseAreaTimeOffsetService.GetByResponseAreaOrDefault(responseArea).UtcTimeOffset;
var resultOffset = esppOffset - responseAreaOffset;
// var resultOffset = esppOffset- responseAreaOffset;
resultNextRun = resultNextRun.Add(resultOffset);
logger.LogDebug("Смещение nextRun с учетом ЗО, смещение ЗО: {responseAreaOffset}, смещение с учетом смещения УЗ ЕСПП: {resultOffset}, новое значение: {resultNextRun}", responseAreaOffset, resultOffset, resultNextRun);
}
// return resultOffset;
// //logger.LogDebug("Смещение nextRun с учетом ЗО, смещение ЗО: {responseAreaOffset}, смещение с учетом смещения УЗ ЕСПП: {resultOffset}, новое значение: {resultNextRun}", responseAreaOffset, resultOffset, resultNextRun);
//}
//var resulstStr = EsppScheduleHelpers.GetNextRun(resultNextRun);
//logger.LogDebug("Результат в формате ЕСПП: {resulstStr}", resulstStr);
return esppOffset;
return resultNextRun;
// var resultOffset =
//// смещение УЗ ЕСПП
//var resultNextRun = nextRun.Add(esppOffset);
//logger.LogDebug("Смещение nextRun с учетом смещения УЗ ЕСПП, новое значение: {resultNextRun}", resultNextRun);
//// если включено использовать таймзону ЗО
//if (isResponseAreaTimezone == true && !string.IsNullOrEmpty(responseArea))
//{
// // resultNextRun = офсет УЗ ЕСПП - offset ЗО
// var responseAreaOffset = scheduleResponseAreaTimeOffsetService.GetByResponseAreaOrDefault(responseArea).UtcTimeOffset;
// var resultOffset = esppOffset - responseAreaOffset;
// resultNextRun = resultNextRun.Add(resultOffset);
// logger.LogDebug("Смещение nextRun с учетом ЗО, смещение ЗО: {responseAreaOffset}, смещение с учетом смещения УЗ ЕСПП: {resultOffset}, новое значение: {resultNextRun}", responseAreaOffset, resultOffset, resultNextRun);
//}
////var resulstStr = EsppScheduleHelpers.GetNextRun(resultNextRun);
////logger.LogDebug("Результат в формате ЕСПП: {resulstStr}", resulstStr);
//return resultNextRun;
}
public DateTimeOffset GetNextRunWithResponseAreaOffset(DateTimeOffset nextRun, string responseArea)

View File

@@ -60,21 +60,31 @@ namespace PARR.DAL.NextRunServices.Subservices
this.logger = logger;
}
public async Task<DateTimeOffset> GetNextDateAsync(Guid jobGroupId, DateTimeOffset referenceDate)
public async Task<DateTimeOffset> GetNextDateAsync(Guid jobGroupId, DateTimeOffset referenceDate, TimeSpan? offset = null)
{
var esppSchedule = await GetEsppScheduleAsync(jobGroupId);
return GetNextDate(esppSchedule, referenceDate);
return GetNextDate(esppSchedule, referenceDate, offset);
}
private DateTimeOffset GetNextDate(EsppScheduleDto esppSchedule, DateTimeOffset referenceDate)
private DateTimeOffset GetNextDate(EsppScheduleDto esppSchedule, DateTimeOffset referenceDate, TimeSpan? offset)
{
var nextRun = referenceDate;
//---------
// Для рассчета по МСК времени, потому что в ЮТС может быть еще ВСК, а по МСК это уже ПНД
var offsetReferenceDate = referenceDate.ToOffset(new TimeSpan(3, 0, 0));
//---------
var finalOffset = new TimeSpan(3, 0, 0) + offset ?? TimeSpan.Zero;
var offsetReferenceDate = referenceDate.ToOffset(finalOffset);
////---------
//// Для рассчета по МСК времени, потому что в ЮТС может быть еще ВСК, а по МСК это уже ПНД
//var offsetReferenceDate = referenceDate.ToOffset(new TimeSpan(3, 0, 0));
////---------
//// может быть offset ,это работает когда смещение для УЗ ЕСПП и применение ЗО РГ
//if (offset.HasValue)
// offsetReferenceDate = offsetReferenceDate.Off(offsetReferenceDate.Offset + offset);
// //offsetReferenceDate = offsetReferenceDate.Add(offset.Value);
switch (esppSchedule.TypeSchedule.Id)
{

View File

@@ -27,7 +27,7 @@
/// <param name="jobGroupId"></param>
/// <param name="lastRun"></param>
/// <returns></returns>
Task<DateTimeOffset> GetNextDateAsync(Guid jobGroupId, DateTimeOffset lastRun);
Task<DateTimeOffset> GetNextDateAsync(Guid jobGroupId, DateTimeOffset lastRun, TimeSpan? offset = null);
///// <summary>
///// Получить расписание по jobGroupId