@@ -115,7 +115,7 @@ namespace PARR.DAL.NextRunServices
logger . LogDebug ( "Нужно группировать по РГ" ) ;
// получаем для каждого шаблона РГ и сразу группируем по РГ
var templatesByWorkGroup = new Dictionary < string? , List < Template > > ( ) ;
var templatesByWorkGroup = new Dictionary < string? , List < Template > > ( StringComparer . OrdinalIgnoreCase ) ;
foreach ( var template in allTemplates )
{
var workGroupName = await shortcodesService . ApplyShortcodesAsync ( template . Job ! . WorkGroupMask , template ) ;
@@ -199,7 +199,7 @@ namespace PARR.DAL.NextRunServices
logger . LogDebug ( "Использовать ЧАСОВОЙ ПОЯС З О (нужно сгруппировать шаблоны по часовым поясам, затем отдельно распределить каждую группу)" ) ;
// получаем для каждого шаблона З О и сразу группируем по З О
var templatesByResponseArea = new Dictionary < string? , List < Template > > ( ) ;
var templatesByResponseArea = new Dictionary < string? , List < Template > > ( StringComparer . OrdinalIgnoreCase ) ;
foreach ( var template in allTemplates )
{
var responseArea = await shortcodesService . ApplyShortcodesAsync ( template . Job ! . ResponseAreaMask , template ) ;
@@ -260,6 +260,214 @@ namespace PARR.DAL.NextRunServices
}
public async Task < DateTimeOffset > GetNextRunForNewTemplateAsync ( Guid jobGroupId , string workGroupName , string responseAreaName )
{
logger . LogDebug ( "Получить nextRun для вновь создаваемого шаблона. jobGroupId: {jobGroupId}, workGroupName: {workGroupName}, responseAreaName: {responseAreaName}" ,
jobGroupId , workGroupName , responseAreaName ) ;
var jobGroup = await jobGroupService . Get ( )
. AsNoTracking ( )
. Include ( t = > t . DistributionConfig )
. ThenInclude ( t = > t . DistributionPeriod )
. FirstOrDefaultAsync ( t = > t . Id = = jobGroupId ) ;
if ( jobGroup = = null )
{
logger . LogError ( "Н е найдена группа работ с Id: {jobGroupId}." , jobGroupId ) ;
throw new ArgumentNullException ( nameof ( jobGroupId ) , $"Н е найдена группа работ с Id: {jobGroupId}" ) ;
}
if ( jobGroup . IsAutoDistributionEnabled )
{
// автораспределение
logger . LogDebug ( "Расчет используя метод распределения работ" ) ;
if ( jobGroup . DistributionConfig = = null )
{
logger . LogError ( "Для группы работ {jobGroupId}, указано автораспределение, но отсутствует конфиг в таблице {GroupDistributionConfigs}" , jobGroupId , nameof ( JobGroupDistributionConfig ) ) ;
throw new ArgumentNullException ( nameof ( JobGroupDistributionConfig ) , $"Для jobGroupId: {jobGroupId} отсутствует конфигурация автораспределения в таблице {nameof(JobGroupDistributionConfig)}" ) ;
}
var startDate = GetDateStart ( ) ;
var duration = GetDurationDays ( jobGroup . DistributionConfig ) ;
var excludeWeekends = jobGroup . DistributionConfig . IsExcludeWeekends ;
var targetTemplate = new TemplateNextRunDto ( Guid . Empty , null ) ;
var templateStatusType = TemplateStatusTypeEnum . Used ;
var allTemplatesQuery = templateService . Get ( )
. AsNoTracking ( )
. Include ( t = > t . Job )
. Where ( t = > t . StatusTypeId = = templateStatusType & & t . Job ! . GroupId = = jobGroupId ) ;
// группировать по РГ
var isGroupingByWorkGroup = jobGroup . DistributionConfig . IsGroupingByWorkGroup ;
// использовать часовой пояс РГ
var isResponseAreaTimeZone = jobGroup . IsResponseAreaTimezone ;
if ( isGroupingByWorkGroup )
{
// группировать по РГ
logger . LogDebug ( "Нужно группировать по РГ" ) ;
// получаем для всех шаблонов РГ и группируем их по РГ
var templatesByWorkGroup = new Dictionary < string? , List < Template > > ( StringComparer . OrdinalIgnoreCase ) ;
var allTemplates = await allTemplatesQuery . ToListAsync ( ) ;
foreach ( var template in allTemplates )
{
var templateWorkGroupName = await shortcodesService . ApplyShortcodesAsync ( template . Job ! . WorkGroupMask , template ) ;
// Если даже workGroupName == null, ну и ладно, сгруппируем по null
if ( templateWorkGroupName = = null )
logger . LogWarning ( "Для шаблона {id}, с маской РГ '{workGroupMask}', не смог с помощью шорткода определить рабочую группу, шорткод сервис вернул РГ: '{workGroupName}'" ,
template . Id , template . Job ! . WorkGroupMask , templateWorkGroupName ) ;
// Добавляем шаблон в группу
if ( ! templatesByWorkGroup . TryGetValue ( templateWorkGroupName , out var templatesList ) )
{
templatesList = new List < Template > ( ) ;
templatesByWorkGroup [ templateWorkGroupName ] = templatesList ;
}
templatesList . Add ( template ) ;
}
//Берем шаблоны только нашей РГ workGroupName
templatesByWorkGroup . TryGetValue ( workGroupName , out var templatesWithWorkGroup ) ;
var templatesByWorkGroupDto = ( templatesWithWorkGroup ? ? new List < Template > ( ) ) . Select ( t = > new TemplateNextRunDto ( t . Id , t . NextRun ) ) . ToList ( ) ;
logger . LogDebug ( "Шаблонов в РГ {workGroupName} - {count} шт." , workGroupName , templatesByWorkGroupDto . Count ) ;
if ( isResponseAreaTimeZone )
{
// использовать часовой пояс РГ
logger . LogDebug ( "Использовать часовой пояс РГ '{responseAreaName}'" , responseAreaName ) ;
var offset = GetOffsetForDistributionByResponseArea ( responseAreaName ) ;
var referenceDate = GetReferenceDate ( jobGroup , responseAreaName ) ;
var nextRun = await templateDistributor . GetNextRunForTemplateAsync ( startDate , duration , referenceDate , offset , targetTemplate , templatesByWorkGroupDto , excludeWeekends , isNew : true ) ;
return nextRun . NextRun ;
}
else
{
// не нужно использовать часовой пояс РГ (используем часовой пояс У З ЕСПП)
logger . LogDebug ( "Н е нужно использовать часовой пояс РГ (используем часовой пояс У З ЕСПП)" ) ;
var offset = GetOffsetForDistributionByResponseArea ( ) ;
var referenceDate = GetReferenceDate ( jobGroup , null ) ;
var nextRun = await templateDistributor . GetNextRunForTemplateAsync ( startDate , duration , referenceDate , offset , targetTemplate , templatesByWorkGroupDto , excludeWeekends , isNew : true ) ;
return nextRun . NextRun ;
}
}
else
{
// не нужно группировать по РГ
logger . LogDebug ( "Н е нужно группировать по РГ" ) ;
if ( isResponseAreaTimeZone )
{
// использовать ЧАСОВОЙ ПОЯС З О
logger . LogDebug ( "Нужно использовать часовой пояс З О '{responseAreaName}'" , responseAreaName ) ;
// получить все шаблоны, сгруппировать их по З О , получить nextRun в рамках переданной З О
var referenceDate = GetReferenceDate ( jobGroup , responseAreaName ) ;
var offset = GetOffsetForDistributionByResponseArea ( responseAreaName ) ;
var allTemplates = await allTemplatesQuery . ToListAsync ( ) ;
// получаем для каждого шаблона З О и сразу группируем по З О
var templatesByResponseArea = new Dictionary < string? , List < Template > > ( StringComparer . OrdinalIgnoreCase ) ;
foreach ( var template in allTemplates )
{
var responseArea = await shortcodesService . ApplyShortcodesAsync ( template . Job ! . ResponseAreaMask , template ) ;
if ( responseArea = = null )
logger . LogWarning ( "Для шаблона {id}, с маской З О '{responseAreaMask}', не смог с помощью шорткода определить З О , шорткод сервис вернул З О : '{responseArea}'" ,
template . Id , template . Job ! . ResponseAreaMask , responseArea ) ;
// Добавляем шаблон в группу
if ( ! templatesByResponseArea . TryGetValue ( responseArea , out var templateList ) )
{
templateList = new List < Template > ( ) ;
templatesByResponseArea [ responseArea ] = templateList ;
}
templateList . Add ( template ) ;
}
// из сгруппированных шаблонов, получаем существующие с нашей переданной responseAreaName
templatesByResponseArea . TryGetValue ( responseAreaName , out var templatesWithResponseArea ) ;
var templatesWithResponseAreaDto = ( templatesWithResponseArea ? ? new List < Template > ( ) ) . Select ( t = > new TemplateNextRunDto ( t . Id , t . NextRun ) ) . ToList ( ) ;
logger . LogDebug ( "Существующих шаблонов в БД с responseAreaName: {responseAreaName} - {count} шт." , responseAreaName , templatesWithResponseAreaDto . Count ) ;
var nextRun = await templateDistributor . GetNextRunForTemplateAsync ( startDate , duration , referenceDate , offset , targetTemplate , templatesWithResponseAreaDto , excludeWeekends , isNew : true ) ;
return nextRun . NextRun ;
}
else
{
// не нужно использовать часовой пояс З О
logger . LogDebug ( "Н е нужно использовать часовой пояс З О ." ) ;
var referenceDate = GetReferenceDate ( jobGroup , null ) ;
var offset = GetOffsetForDistributionByResponseArea ( ) ;
var allTemplates = await allTemplatesQuery
. Select ( t = > new TemplateNextRunDto ( t . Id , t . NextRun ) )
. ToListAsync ( ) ;
var nextRun = await templateDistributor . GetNextRunForTemplateAsync ( startDate , duration , referenceDate , offset , targetTemplate , allTemplates , excludeWeekends , isNew : true ) ;
return nextRun . NextRun ;
}
}
}
else
{
// расписание ЕСПП
logger . LogDebug ( "Расчет используя метод ЕСПП" ) ;
if ( jobGroup . IsResponseAreaTimezone )
{
// использовать часовой пояс РГ
var referenceDate = GetReferenceDate ( jobGroup , responseAreaName ) ;
var offset = GetOffsetForDistributionByResponseArea ( responseAreaName ) ;
logger . LogDebug ( "Расчет nextRun используя метод ЕСПП, использую часовой пояс З О '{responseAreaName}, referenceDate: {referenceDate}, offset: {offset}'" , responseAreaName , referenceDate , offset ) ;
var nextRun = await esppScheduleTransformService . GetNextDateAsync ( jobGroupId , referenceDate , offset ) ;
return nextRun ;
}
else
{
// не использовать часовой пояс РГ
// так как это классическое расписание еспп, и не используется часовой пояс РГ, то нам нужно считать в часовом поясе У З ЕСПП, т.е . М С К
var referenceDate = GetReferenceDate ( jobGroup , null ) ;
var offset = GetOffsetForDistributionByResponseArea ( ) ;
logger . LogDebug ( "Расчет nextRun используя метод ЕСПП, не использую часовой пояс З О , использую часовой пояс У З ЕСПП, referenceDate: {referenceDate}, offset: {offset}" , referenceDate , offset ) ;
var nextRun = await esppScheduleTransformService . GetNextDateAsync ( jobGroupId , referenceDate , offset ) ;
return nextRun ;
}
}
}
public async Task < DateTimeOffset > GetNextRunForTemplateAsync ( Guid templateId , bool isNew )
{
logger . LogDebug ( "Получить nextRun для существующего шаблона, templateId: {templateId}, isNew: {isNew}" , templateId , isNew ) ;
throw new NotImplementedException ( ) ;
}
/// <summary>
/// Получить продолжительность в днях
/// </summary>
@@ -354,7 +562,6 @@ namespace PARR.DAL.NextRunServices
}
/// <summary>
/// Получить referenceDate для расчета с учетом часового пояса З О или без учета
/// </summary>
@@ -413,7 +620,5 @@ namespace PARR.DAL.NextRunServices
}
}
}
}