diff --git a/PARR.API/Contracts/V1/Requests/BaseRequests/TimeZoneOffsetClient.cs b/PARR.API/Contracts/V1/Requests/BaseRequests/TimeZoneOffsetClient.cs
index 386ed565..cead2206 100644
--- a/PARR.API/Contracts/V1/Requests/BaseRequests/TimeZoneOffsetClient.cs
+++ b/PARR.API/Contracts/V1/Requests/BaseRequests/TimeZoneOffsetClient.cs
@@ -1,10 +1,23 @@
-namespace PARR.API.Contracts.V1.Requests.BaseRequests
+using Microsoft.AspNetCore.Mvc.ModelBinding;
+
+namespace PARR.API.Contracts.V1.Requests.BaseRequests
{
///
/// Смещение таймзоны относительно клиента
///
public class TimeZoneOffsetClient
{
+ ///
+ /// Удалить TimeZoneOffsetHours и не использовать!!!!!! Использовать только в минутах TimeZoneOffsetMinutes
+ ///
public int TimeZoneOffsetHours { get; set; } = 0;
+
+ ///
+ /// Часовая зона клиента, в минутах
+ ///
+ public int TimeZoneOffsetMinutes { get; set; } = 0;
+
+ [BindNever]
+ public TimeSpan TimeZoneOffset => TimeSpan.FromMinutes(TimeZoneOffsetMinutes);
}
}
diff --git a/PARR.API/Contracts/V1/Responses/Statistics/StatTemplateDistributorResponse.cs b/PARR.API/Contracts/V1/Responses/Statistics/StatTemplateDistributorResponse.cs
index 7a090e07..61298176 100644
--- a/PARR.API/Contracts/V1/Responses/Statistics/StatTemplateDistributorResponse.cs
+++ b/PARR.API/Contracts/V1/Responses/Statistics/StatTemplateDistributorResponse.cs
@@ -29,7 +29,10 @@
public class StatDistributorItemResponse
{
- public string? WorkGroupName { get; set; }
+ ///
+ /// Наименование поля по которому группируется
+ ///
+ public string? GroupFieldName { get; set; }
public int AllCount => Statistics?.Sum(t => t.AllCount) ?? 0;
public int IsActivatedCount => Statistics?.Sum(t => t.IsActivatedCount) ?? 0;
@@ -47,15 +50,19 @@
public int IsActivatedCount { get; set; }
public int IsDeactivatedCount { get; set; }
public int TemplatesInWeekendCount => !IsWorkDay && Templates != null ? Templates.Count : 0;
- public List? Templates { get; set; }
+ public List? Templates { get; set; }
}
- public class StatTempleteDistribItem
+ public class StatTemplateDistribItem
{
+ ///
+ /// TemplateId
+ ///
+ public Guid Id { get; set; }
public required string Name { get; set; }
public DateTimeOffset NextRun { get; set; }
public bool IsActiveTemplate { get; set; }
public bool IsActiveSchedular { get; set; }
- public required ScheduleResponseAreaTimeOffsetResponse ResponseAreaOffset { get; set; }
+ //public required ScheduleResponseAreaTimeOffsetResponse ResponseAreaOffset { get; set; }
}
}
diff --git a/PARR.API/Contracts/V1/Responses/TemplateResponse.cs b/PARR.API/Contracts/V1/Responses/TemplateResponse.cs
index f7810309..3fd702f8 100644
--- a/PARR.API/Contracts/V1/Responses/TemplateResponse.cs
+++ b/PARR.API/Contracts/V1/Responses/TemplateResponse.cs
@@ -45,7 +45,7 @@
public bool IsAutoDistributionEnabled { get; set; }
- public ScheduleResponseAreaTimeOffsetResponse? ResponseAreaOffset { get; set; }
+ //public ScheduleResponseAreaTimeOffsetResponse? ResponseAreaOffset { get; set; }
}
diff --git a/PARR.API/Controllers/V1/Statistics/StatTemplateDistributionController.cs b/PARR.API/Controllers/V1/Statistics/StatTemplateDistributionController.cs
index 862a196f..3cf90b87 100644
--- a/PARR.API/Controllers/V1/Statistics/StatTemplateDistributionController.cs
+++ b/PARR.API/Controllers/V1/Statistics/StatTemplateDistributionController.cs
@@ -29,7 +29,7 @@ namespace PARR.API.Controllers.V1.Statistics
private readonly IJobGroupService jobGroupService;
private readonly IMapper mapper;
private readonly IShortcodesService shortcodesService;
- private readonly INextRunService nextRunService;
+ private readonly INextRunServiceV2 nextRunService;
private readonly ILogger logger;
private readonly IScheduleResponseAreaTimeOffsetService scheduleResponseAreaTimeOffsetService;
@@ -38,7 +38,7 @@ namespace PARR.API.Controllers.V1.Statistics
IJobGroupService jobGroupService,
IMapper mapper,
IShortcodesService shortcodesService,
- INextRunService nextRunService,
+ INextRunServiceV2 nextRunService,
ILogger logger,
IScheduleResponseAreaTimeOffsetService scheduleResponseAreaTimeOffsetService
)
@@ -63,8 +63,6 @@ namespace PARR.API.Controllers.V1.Statistics
{
// eadc5498-dba6-4f10-9b4b-a1653e3c3e61
- //TODO: похоже что timeZoneQuery лишняя
-
var jobGroup = await jobGroupService.Get()
.Include(t => t.DistributionConfig)
.ThenInclude(t => t.DistributionPeriod)
@@ -95,65 +93,86 @@ namespace PARR.API.Controllers.V1.Statistics
ItemsList = null
}, true));
- var (dateStart, dateEnd) = GetStartEndPeriod(jobGroup, items.Max(t => t.Template.NextRun), timeZoneQuery.TimeZoneOffsetHours);
+
+ var (dateStart, dateEnd) = GetStartEndPeriod(jobGroup, items.Min(t => t.Template.NextRun), items.Max(t => t.Template.NextRun), timeZoneQuery.TimeZoneOffset);
// получаем список рабочих дней
// получет все дни, даже с выходными, чтоб видеть реальную картину
- var workDays = await nextRunService.GetWorkDaysAsync(dateStart, dateEnd, false, jobGroup.ReferenceDate);
+ var allDays = await nextRunService.GetWorkDaysAsync(dateStart, dateEnd, false);
// получить список выходных дней (показываем только если IsExcludeWeekends = true)
var weekends = jobGroup.DistributionConfig.IsExcludeWeekends
- ? await nextRunService.GetWeekendsAsync(dateStart, dateEnd, jobGroup.ReferenceDate)
+ ? await nextRunService.GetWeekendsAsync(dateStart, dateEnd)
: new HashSet();
+
var responseItemsList = new List();
if (jobGroup.DistributionConfig.IsGroupingByWorkGroup)
{
// тут группируем по рабочим группам
+ logger.LogDebug("Группируем по рабочим группам");
// Получаем список пар (WorkGroupName, Template)
- var templatesWithWorkGroupNames = new List<(string WorkGroupName, (Template Template, string ResponseArea))>();
+ var templatesWithWorkGroupNames = new List<(string WorkGroupName, Template Template)>();
- // получаем названия рабочих групп и ЗО
+ // получаем названия рабочих групп
foreach (var item in items)
{
var workGroupName = await shortcodesService.ApplyShortcodesAsync(item.WorkGroupMask, item.Template);
- var responseArea = await shortcodesService.ApplyShortcodesAsync(item.ResponseAreaMask, item.Template);
- templatesWithWorkGroupNames.Add((workGroupName, (item.Template, responseArea)));
+ templatesWithWorkGroupNames.Add((workGroupName, item.Template));
}
// Группируем по WorkGroupName
var grouped = templatesWithWorkGroupNames
.GroupBy(x => x.WorkGroupName)
- .ToDictionary(g => g.Key, g => g.Select(x => x.Item2).ToList());
+ .ToDictionary(g => g.Key, g => g.Select(x => x.Template).ToList());
foreach (var groupedItem in grouped)
{
- var statResult = GetResponseByWorkGroup(groupedItem.Key, groupedItem.Value.ToList(), workDays, weekends, timeZoneQuery.TimeZoneOffsetHours, jobGroup.ReferenceDate);
+ var statResult = GetResponseByWorkGroup(groupedItem.Key, groupedItem.Value.ToList(), allDays, weekends, timeZoneQuery.TimeZoneOffset);
+ responseItemsList.Add(statResult);
+ }
+ }
+ else if (jobGroup.IsResponseAreaTimezone && !jobGroup.DistributionConfig.IsGroupingByWorkGroup)
+ {
+ // грппируем только по ЗО
+ logger.LogDebug("Группируем по ЗО");
+
+ // Будет группироваться по EsppValue, по MSK, MSK+1...
+ // получаем названия ЗО, из ЗО часовой пояс, формируем список шаблонов с часовым поясом ЗО
+ var templatesWithTimeZone = new List<(Template Template, string MskTimeZone)>();
+ foreach (var item in items)
+ {
+ var responseArea = await shortcodesService.ApplyShortcodesAsync(item.ResponseAreaMask, item.Template);
+ var mskTimeZone = scheduleResponseAreaTimeOffsetService.GetByResponseAreaOrDefault(responseArea);
+ templatesWithTimeZone.Add((item.Template, mskTimeZone.EsppValue));
+ }
+
+ // Группируем по часовому поясу
+ var grouped = templatesWithTimeZone
+ .GroupBy(x => x.MskTimeZone)
+ .ToDictionary(g => g.Key, g => g.Select(x => x.Template).ToList());
+
+ foreach (var groupedItem in grouped)
+ {
+ var statResult = GetResponseByWorkGroup(groupedItem.Key, groupedItem.Value.ToList(), allDays, weekends, timeZoneQuery.TimeZoneOffset);
responseItemsList.Add(statResult);
}
}
else
{
- // не нужно группировать по рабочим группам
-
- // получаем названия ЗО
- var templatesWithResponseArea = new List<(Template Template, string ResponseArea)>();
- foreach (var item in items)
- {
- var responseArea = await shortcodesService.ApplyShortcodesAsync(item.ResponseAreaMask, item.Template);
- templatesWithResponseArea.Add((item.Template, responseArea));
- }
+ // не нужно группировать
+ logger.LogDebug("Без группировки");
// сразу формируем response
- responseItemsList.Add(GetResponseByWorkGroup(null, templatesWithResponseArea, workDays, weekends, timeZoneQuery.TimeZoneOffsetHours, jobGroup.ReferenceDate));
+ responseItemsList.Add(GetResponseByWorkGroup(null, items.Select(t => t.Template).ToList(), allDays, weekends, timeZoneQuery.TimeZoneOffset));
}
var response = new StatTemplateDistributorResponse
{
JobGroup = mapper.Map(jobGroup),
- ItemsList = responseItemsList.OrderBy(t => t.WorkGroupName).ToList()
+ ItemsList = responseItemsList.OrderBy(t => t.GroupFieldName).ToList()
};
return Ok(new Response(response, true));
@@ -163,29 +182,33 @@ namespace PARR.API.Controllers.V1.Statistics
/// Получить дату начала и конца периода
///
///
+ ///
///
- ///
+ ///
///
- private (DateOnly dateStart, DateOnly dateEnd) GetStartEndPeriod(JobGroup jobGroup, DateTimeOffset maxNextRunTemplate, int timeZoneOffsetHours)
+ private (DateOnly dateStart, DateOnly dateEnd) GetStartEndPeriod(JobGroup jobGroup, DateTimeOffset minNextRunTemplate, DateTimeOffset maxNextRunTemplate, TimeSpan clientOffset)
{
var durationDays = nextRunService.GetDurationDays(jobGroup.DistributionConfig!);
- var dateStart = DateOnly.FromDateTime(DateTime.UtcNow.AddHours(timeZoneOffsetHours));
+ var dateStart = DateOnly.FromDateTime(DateTime.UtcNow.Add(clientOffset));
// последний день, не может быть меньше чем durationDays
var dateEnd = dateStart.AddDays(durationDays);
// последний день, не может быть меньше чем refDate+durationDays
- var sumRefDuration = DateOnly.FromDateTime(jobGroup.ReferenceDate.AddHours(timeZoneOffsetHours).AddDays(durationDays).Date);
+ var sumRefDuration = DateOnly.FromDateTime(jobGroup.ReferenceDate.Add(clientOffset).AddDays(durationDays).Date);
if (dateEnd < sumRefDuration)
dateEnd = sumRefDuration;
- // с DateEnd вообще какая-то шурпатня :(
- // как наглядно понять ок не ок распределяется, если на каком-то графике dateEnd может ухеать за период распределения
// последний день, не может быть меньше чем дата последнего шаблона maxNextRunTemplate
- var lastTempalteDate = DateOnly.FromDateTime(maxNextRunTemplate.AddHours(timeZoneOffsetHours).Date);
- if (dateEnd < lastTempalteDate)
- dateEnd = lastTempalteDate;
+ var lastTemplateDate = DateOnly.FromDateTime(maxNextRunTemplate.Add(clientOffset).Date);
+ if (dateEnd < lastTemplateDate)
+ dateEnd = lastTemplateDate;
+
+ // Дата начала, не может быть меньше чем minNextRunTemplate
+ var minNextRunDate = DateOnly.FromDateTime(minNextRunTemplate.Add(clientOffset).Date);
+ if (dateStart < minNextRunDate)
+ dateStart = minNextRunDate;
return (dateStart, dateEnd);
}
@@ -193,49 +216,49 @@ namespace PARR.API.Controllers.V1.Statistics
///
/// Заполнить респонс
///
- ///
+ ///
///
- ///
- ///
+ ///
+ ///
+ ///
///
- private StatDistributorItemResponse GetResponseByWorkGroup(string? workGroupName, List<(Template Template, string ResponseArea)> templateList, List workDays, HashSet weekends, int timeZoneOffsetHours, DateTimeOffset referenceDate)
+ private StatDistributorItemResponse GetResponseByWorkGroup(string? groupFieldName, List templateList, List allDays, HashSet weekends, TimeSpan clientOffset)
{
var result = new StatDistributorItemResponse
{
- WorkGroupName = workGroupName,
- Statistics = workDays.OrderBy(t => t).Select(t => new StatTemplateDistributorDateStat
+ GroupFieldName = groupFieldName,
+ Statistics = allDays.OrderBy(t => t).Select(t => new StatTemplateDistributorDateStat
{
AllCount = 0,
- Date = new DateTimeOffset(t.Year, t.Month, t.Day, referenceDate.Hour, referenceDate.Minute, referenceDate.Second, referenceDate.Offset),
+ // вычтем clientOffset, чтоб когда на клиенте он прибавился обратно, дата стала верной для клиента
+ Date = new DateTimeOffset(t.Year, t.Month, t.Day, 0, 0, 0, TimeSpan.Zero).Add(-clientOffset),
IsWorkDay = !weekends.Contains(t),
IsActivatedCount = 0,
IsDeactivatedCount = 0,
- Templates = new List()
+ Templates = new List()
}).ToList()
};
- //foreach (var templatesFromDate in templates.GroupBy(t => DateOnly.FromDateTime(t.NextRun.Date)))
- // смещаем по часовой зоне и группируем по дате
- //foreach (var templatesFromDate in templates.GroupBy(t => DateOnly.FromDateTime(t.NextRun.AddHours(timeZoneOffsetHours).Date)))
- foreach (var templatesFromDate in templateList.GroupBy(t => DateOnly.FromDateTime(t.Template.NextRun.AddHours(timeZoneOffsetHours).Date)))
+ // смещаем по часовой зоне клиента и группируем по дате
+ foreach (var templatesFromDate in templateList.GroupBy(t => DateOnly.FromDateTime(t.NextRun.Add(clientOffset).Date)))
{
- var statisticsForDate = result.Statistics.FirstOrDefault(t => DateOnly.FromDateTime(t.Date.AddHours(timeZoneOffsetHours).Date) == templatesFromDate.Key);
+ var statisticsForDate = result.Statistics.FirstOrDefault(t => DateOnly.FromDateTime(t.Date.Add(clientOffset).Date) == templatesFromDate.Key);
if (statisticsForDate == null)
{
- logger.LogWarning("В списке рабочих дней, нет дня для шаблонов {count} шт. выполняющихся в {date}", templatesFromDate.Count(), templatesFromDate.Key);
+ logger.LogWarning("В списке дней, нет дня для шаблонов {count} шт. выполняющихся в {date}", templatesFromDate.Count(), templatesFromDate.Key);
continue;
}
statisticsForDate.AllCount = templatesFromDate.Count();
- statisticsForDate.IsDeactivatedCount = templatesFromDate.Count(t => !t.Template.IsActiveTemplate || !t.Template.IsActiveSchedule);
- statisticsForDate.IsActivatedCount = templatesFromDate.Count(t => t.Template.IsActiveTemplate && t.Template.IsActiveSchedule);
- statisticsForDate.Templates = templatesFromDate.Select(t => new StatTempleteDistribItem
+ statisticsForDate.IsDeactivatedCount = templatesFromDate.Count(t => !t.IsActiveTemplate || !t.IsActiveSchedule);
+ statisticsForDate.IsActivatedCount = templatesFromDate.Count(t => t.IsActiveTemplate && t.IsActiveSchedule);
+ statisticsForDate.Templates = templatesFromDate.Select(t => new StatTemplateDistribItem
{
- Name = t.Template.Name,
- IsActiveSchedular = t.Template.IsActiveSchedule,
- IsActiveTemplate = t.Template.IsActiveTemplate,
- NextRun = t.Template.NextRun,
- ResponseAreaOffset = mapper.Map(scheduleResponseAreaTimeOffsetService.GetByResponseAreaOrDefault(t.ResponseArea))
+ Id = t.Id,
+ Name = t.Name,
+ IsActiveSchedular = t.IsActiveSchedule,
+ IsActiveTemplate = t.IsActiveTemplate,
+ NextRun = t.NextRun
})
.OrderBy(t => t.Name)
.ToList();
diff --git a/PARR.API/Controllers/V1/TemplateController.cs b/PARR.API/Controllers/V1/TemplateController.cs
index af348e92..5e53142e 100644
--- a/PARR.API/Controllers/V1/TemplateController.cs
+++ b/PARR.API/Controllers/V1/TemplateController.cs
@@ -36,7 +36,6 @@ namespace PARR.API.Controllers.V1
private readonly ILogger logger;
private readonly IShortcodesService shortcodesService;
private readonly IOrderService orderService;
- private readonly INextRunService nextRunService;
private readonly SettingsFromDb settingsFromDb;
private readonly IScheduleResponseAreaTimeOffsetService scheduleResponseAreaTimeOffsetService;
@@ -48,7 +47,6 @@ namespace PARR.API.Controllers.V1
ILogger logger,
IShortcodesService shortcodesService,
IOrderService orderService,
- INextRunService nextRunService,
SettingsFromDb settingsFromDb,
IScheduleResponseAreaTimeOffsetService scheduleResponseAreaTimeOffsetService
)
@@ -60,7 +58,6 @@ namespace PARR.API.Controllers.V1
this.logger = logger;
this.shortcodesService = shortcodesService;
this.orderService = orderService;
- this.nextRunService = nextRunService;
this.settingsFromDb = settingsFromDb;
this.scheduleResponseAreaTimeOffsetService = scheduleResponseAreaTimeOffsetService;
}
@@ -138,7 +135,7 @@ namespace PARR.API.Controllers.V1
{
//await ApplyTemplateShortcodesAsync(responseItem, templates.First(t => t.Id == responseItem.Id));
await ApplyTemplateShortcodesAsync(responseItem, templatesDict[responseItem.Id]);
- FillResponseAreaOffset(responseItem);
+ //FillResponseAreaOffset(responseItem);
}
//logger.LogDebug("Получение шорткодов: {ElapsedMs} мс", sw.ElapsedMilliseconds);
//sw.Stop();
@@ -183,7 +180,7 @@ namespace PARR.API.Controllers.V1
var response = mapper.Map(template);
await ApplyTemplateShortcodesAsync(response, template);
- FillResponseAreaOffset(response);
+ //FillResponseAreaOffset(response);
var ordersCountResult = await GetOrdersCountAsync(new List { response.Id });
response.OrderCount = ordersCountResult.Count > 0 ? ordersCountResult.First().Value : 0;
@@ -277,7 +274,7 @@ namespace PARR.API.Controllers.V1
var response = mapper.Map(templateToResponse);
await ApplyTemplateShortcodesAsync(response, templateToResponse);
- FillResponseAreaOffset(response);
+ //FillResponseAreaOffset(response);
var ordersCountResult = await GetOrdersCountAsync(new List { response.Id });
response.OrderCount = ordersCountResult.Count > 0 ? ordersCountResult.First().Value : 0;
@@ -323,36 +320,36 @@ namespace PARR.API.Controllers.V1
}
- ///
- /// Заполнить ResponseAreaOffset
- ///
- ///
- private void FillResponseAreaOffset(TemplateBaseResponse response)
- {
- // если стоит галка IsResponseAreaTimezone и есть ЗО, то возвращаем оффсет
- if (response.IsResponseAreaTimezone && !string.IsNullOrEmpty(response.ResponseArea))
- {
- var responseArea = response.ResponseArea;
- response.ResponseAreaOffset = mapper.Map(scheduleResponseAreaTimeOffsetService.GetByResponseAreaOrDefault(responseArea));
- }
- else
- {
- response.ResponseAreaOffset = null;
- }
+ /////
+ ///// Заполнить ResponseAreaOffset
+ /////
+ /////
+ //private void FillResponseAreaOffset(TemplateBaseResponse response)
+ //{
+ // // если стоит галка IsResponseAreaTimezone и есть ЗО, то возвращаем оффсет
+ // if (response.IsResponseAreaTimezone && !string.IsNullOrEmpty(response.ResponseArea))
+ // {
+ // var responseArea = response.ResponseArea;
+ // response.ResponseAreaOffset = mapper.Map(scheduleResponseAreaTimeOffsetService.GetByResponseAreaOrDefault(responseArea));
+ // }
+ // else
+ // {
+ // response.ResponseAreaOffset = null;
+ // }
- //var responseArea = response.IsResponseAreaTimezone && !string.IsNullOrEmpty(response.ResponseArea)
- // ? response.ResponseArea
- // : settingsFromDb.DefaultResponseAreaToTimeOffset;
+ // //var responseArea = response.IsResponseAreaTimezone && !string.IsNullOrEmpty(response.ResponseArea)
+ // // ? response.ResponseArea
+ // // : settingsFromDb.DefaultResponseAreaToTimeOffset;
- //response.NextRunResponseAreaInLocal = response.IsResponseAreaTimezone && !string.IsNullOrEmpty(response.ResponseArea)
- // ? nextRunService.GetNextRunWithResponseAreaOffset(response.NextRun, response.ResponseArea)
- // // возвращаем в дефолтной зоне
- // : nextRunService.GetNextRunWithResponseAreaOffset(response.NextRun, settingsFromDb.DefaultResponseAreaToTimeOffset);
+ // //response.NextRunResponseAreaInLocal = response.IsResponseAreaTimezone && !string.IsNullOrEmpty(response.ResponseArea)
+ // // ? nextRunService.GetNextRunWithResponseAreaOffset(response.NextRun, response.ResponseArea)
+ // // // возвращаем в дефолтной зоне
+ // // : nextRunService.GetNextRunWithResponseAreaOffset(response.NextRun, settingsFromDb.DefaultResponseAreaToTimeOffset);
- //response.NextRunResponseAreaInLocal = nextRunService.GetNextRunWithResponseAreaOffset(response.NextRun, responseArea);
+ // //response.NextRunResponseAreaInLocal = nextRunService.GetNextRunWithResponseAreaOffset(response.NextRun, responseArea);
- //response.ResponseAreaOffset = mapper.Map(scheduleResponseAreaTimeOffsetService.GetByResponseAreaOrDefault(responseArea));
- }
+ // //response.ResponseAreaOffset = mapper.Map(scheduleResponseAreaTimeOffsetService.GetByResponseAreaOrDefault(responseArea));
+ //}
}
}
diff --git a/PARR.DAL/NextRunServices/INextRunServiceV2.cs b/PARR.DAL/NextRunServices/INextRunServiceV2.cs
index 750afd1b..37d41a23 100644
--- a/PARR.DAL/NextRunServices/INextRunServiceV2.cs
+++ b/PARR.DAL/NextRunServices/INextRunServiceV2.cs
@@ -1,4 +1,5 @@
using PARR.Constants;
+using PARR.DAL.Models.Job;
using PARR.DAL.NextRunServices.Models;
namespace PARR.DAL.NextRunServices
@@ -38,6 +39,28 @@ namespace PARR.DAL.NextRunServices
///
TimeSpan GetEsppAccountOffset();
+ ///
+ /// Получить продолжительность в днях
+ ///
+ ///
+ ///
+ int GetDurationDays(JobGroupDistributionConfig config);
+ ///
+ /// Получить список рабочих дней в диапазоне, исключая выходные и праздники.
+ ///
+ ///
+ ///
+ /// Исключить выходные и праздники
+ ///
+ Task> GetWorkDaysAsync(DateOnly start, DateOnly end, bool excludeWeekends);
+
+ ///
+ /// Получить список выходных дней
+ ///
+ ///
+ ///
+ ///
+ Task> GetWeekendsAsync(DateOnly startDate, DateOnly endDate);
}
}
diff --git a/PARR.DAL/NextRunServices/NextRunServiceV2.cs b/PARR.DAL/NextRunServices/NextRunServiceV2.cs
index 3d8c7c9e..aa1dff2b 100644
--- a/PARR.DAL/NextRunServices/NextRunServiceV2.cs
+++ b/PARR.DAL/NextRunServices/NextRunServiceV2.cs
@@ -564,7 +564,7 @@ namespace PARR.DAL.NextRunServices
{
// не нужно использовать часовой пояс РГ (используем часовой пояс УЗ ЕСПП)
logger.LogDebug("Не нужно использовать часовой пояс РГ (используем часовой пояс УЗ ЕСПП)");
-
+
var offset = GetOffsetForDistributionByResponseArea();
var referenceDate = GetReferenceDate(jobGroup, null);
@@ -675,12 +675,7 @@ namespace PARR.DAL.NextRunServices
}
- ///
- /// Получить продолжительность в днях
- ///
- ///
- ///
- private int GetDurationDays(JobGroupDistributionConfig config)
+ public int GetDurationDays(JobGroupDistributionConfig config)
{
var period = config.DistributionPeriod;
var periodType = period!.Type;
@@ -714,6 +709,17 @@ namespace PARR.DAL.NextRunServices
}
+ public async Task> GetWorkDaysAsync(DateOnly start, DateOnly end, bool excludeWeekends)
+ {
+ return await templateDistributor.GetWorkDaysAsync(start, end, excludeWeekends);
+ }
+
+
+ public async Task> GetWeekendsAsync(DateOnly startDate, DateOnly endDate)
+ {
+ return await templateDistributor.GetWeekendsAsync(startDate, endDate);
+ }
+
///
/// Получить часовую зону для распределения
///
diff --git a/PARR.DAL/NextRunServices/Subservices/ITemplateDistributorV2.cs b/PARR.DAL/NextRunServices/Subservices/ITemplateDistributorV2.cs
index 4bdb0ad2..57c10510 100644
--- a/PARR.DAL/NextRunServices/Subservices/ITemplateDistributorV2.cs
+++ b/PARR.DAL/NextRunServices/Subservices/ITemplateDistributorV2.cs
@@ -38,5 +38,14 @@ namespace PARR.DAL.NextRunServices.Subservices
///
///
Task> GetWeekendsAsync(DateOnly startDate, DateOnly endDate);
+
+ ///
+ /// Получить список рабочих дней в диапазоне, исключая выходные и праздники.
+ ///
+ ///
+ ///
+ /// Исключить выходные и праздники
+ ///
+ Task> GetWorkDaysAsync(DateOnly start, DateOnly end, bool excludeWeekends);
}
}
diff --git a/PARR.DAL/NextRunServices/Subservices/TemplateDistributorV2.cs b/PARR.DAL/NextRunServices/Subservices/TemplateDistributorV2.cs
index a1f74237..511b799b 100644
--- a/PARR.DAL/NextRunServices/Subservices/TemplateDistributorV2.cs
+++ b/PARR.DAL/NextRunServices/Subservices/TemplateDistributorV2.cs
@@ -1189,14 +1189,7 @@ namespace PARR.DAL.NextRunServices.Subservices
}
- ///
- /// Получить список рабочих дней в диапазоне, исключая выходные и праздники.
- ///
- ///
- ///
- /// Исключить выходные и праздники
- ///
- private async Task> GetWorkDaysAsync(DateOnly start, DateOnly end, bool excludeWeekends)
+ public async Task> GetWorkDaysAsync(DateOnly start, DateOnly end, bool excludeWeekends)
{
// Получаем список выходных/праздничных дней
var weekends = new HashSet();
diff --git a/PARR.NextRun/NextRunManager.cs b/PARR.NextRun/NextRunManager.cs
index 38ac112a..555bf983 100644
--- a/PARR.NextRun/NextRunManager.cs
+++ b/PARR.NextRun/NextRunManager.cs
@@ -117,139 +117,6 @@ namespace PARR.NextRun
}
- #region old
-
- ///
- /// Обновить nextRun для ВСЕХ шаблонов, для групп у которых расписание ЕСПП (выключено автораспределение)
- ///
- ///
- private async Task UpdateNextRunWithEsppScheduleAsync(ITemplateService templateService, INextRunService nextRunService, IJobGroupService jobGroupService)
- {
- // выбираем шаблоны которые не учавствуют в автораспределении
- // и у которых Used
- // обновляем для всех шаблонов, у которых nextRun!=рассчитанному
-
- var templatesForUpdate = await templateService.Get()
- .Where(t =>
- t.StatusTypeId == TemplateStatusTypeEnum.Used
- && t.Job!.Group!.IsAutoDistributionEnabled == false
- && t.NextRun < DateTimeOffset.UtcNow
- ).ToListAsync();
-
-
- logger.LogInformation("Найдено шаблонов с выключенным автораспределением, с просроченным NextRun {count} шт.", templatesForUpdate.Count);
-
- if (!templatesForUpdate.Any())
- return;
-
- foreach (var template in templatesForUpdate)
- {
- var newNextRun = await nextRunService.GetNextRunForTemplateAsync(template.Id, false);
-
- template.LastRun = template.NextRun;
- template.NextRun = newNextRun;
- }
-
- if (await templateService.CommitAsync(new HistoryInitiator { InitiatorComment = "Обновлён NextRun", InitiatorParrComponentId = ParrComponentsEnum.NextRun }))
- {
- logger.LogInformation("Обновлены значения ПРОСРОЧЕННЫХ полей NextRun для шаблонов с ВЫКЛЮЧЕННЫМ автораспределением, {count} шт.", templatesForUpdate.Count);
- }
- else
- {
- logger.LogError("Ошибка при обновлении ПРОСРОЧЕННЫХ значений полей NextRun, для шаблонов {count} шт., с ВЫКЛЮЧЕННЫМ автораспределением", templatesForUpdate.Count);
- }
-
-
-
- //// выбираем шаблоны которые не учавствуют в автораспределении
- //// и у которых Used
- //// затем группируем по GroupId, так как nextRun и расписание настраивается для группы, то для всех дочерних шаблонов, nextRun будет одинаковым
- //// обновляем для всех шаблонов, у которых nextRun!=рассчитанному
-
-
- //var groups = await jobGroupService.Get()
- // .Where(t => t.IsAutoDistributionEnabled == false)
- // .Select(t => new { t.Id, t.ReferenceDate })
- // .ToListAsync();
-
- //logger.LogInformation("Найдено {GroupCount} групп с выключенным автораспределением для обработки.", groups.Count);
-
- //foreach (var group in groups)
- //{
- // //получаем по каждой группе следующий nextRun и сравниваем с существующим, если не равны, то обновляем
- // //var nextRun = await esppScheduleTransformService.GetNextDateAsync(group.Id, group.ReferenceDate);
- // var nextRun = await nextRunService.GetNextRunForJobGroupWithEsppSchedulleAsync(group.Id);
-
-
- // // Загружаем только шаблоны текущей группы где nextRun в БД не равен расчетному
- // var templatesToUpdate = await templateService.Get()
- // .Where(t => t.StatusTypeId == TemplateStatusTypeEnum.Used && t.Job!.GroupId == group.Id && t.NextRun != nextRun)
- // .ToListAsync();
-
- // logger.LogInformation("Для группы {groupId}, шаблонов для обновления где nextRun!=рассчетному {newNextRun} найдено {count} шт.", group.Id, nextRun, templatesToUpdate.Count);
-
- // if (!templatesToUpdate.Any())
- // continue;
-
- // // Обновляем
- // foreach (var template in templatesToUpdate)
- // {
- // template.LastRun = template.NextRun;
- // template.NextRun = nextRun;
- // }
-
- // // Коммитим изменения для этой группы
- // if (await templateService.CommitAsync(new HistoryInitiator { InitiatorComment = "Обновлён NextRun", InitiatorParrComponentId = ParrComponentsEnum.NextRun }))
- // logger.LogInformation($"Обновлены значения полей NextRun для шаблонов группы: {group.Id} с выключенным автораспределением, " +
- // $"refDate: {group.ReferenceDate}. Обновлен nextRun: {nextRun} для шаблонов {templatesToUpdate.Count} шт.");
- // else
- // {
- // logger.LogError($"Ошибка при обновлении значений полей NextRun: {nextRun}, для шаблонов {templatesToUpdate.Count} шт., группы {group.Id} с выключенным автораспределением, refDate: {group.ReferenceDate} ");
- // }
- //}
-
- }
-
-
- ///
- /// Обновить ПРОСРОЧЕННЫЕ NextRun для групп у которых включено автораспределение
- ///
- ///
- ///
- ///
- ///
- private async Task UpdateNextRunWithAutodistributeScheduleAsync(ITemplateService templateService, INextRunService nextRunService, IJobGroupService jobGroupService)
- {
- // получаем список всех шаблонов с включенным автораспределением у которых ПРОСРОЧЕН nextRun и они Used
- // обновляем у них NextRun
-
- var templatesForUpdate = await templateService.Get()
- .Where(t => t.StatusTypeId == TemplateStatusTypeEnum.Used && t.Job.Group.IsAutoDistributionEnabled == true && t.NextRun < DateTimeOffset.UtcNow)
- .ToListAsync();
-
- logger.LogInformation("Найдено шаблонов с автораспределением, с просроченным NextRun {count} шт.", templatesForUpdate.Count);
-
- if (!templatesForUpdate.Any())
- return;
-
- foreach (var template in templatesForUpdate)
- {
- var newNextRun = await nextRunService.GetNextRunForTemplateAsync(template.Id, false);
-
- template.LastRun = template.NextRun;
- template.NextRun = newNextRun;
- }
-
- if (await templateService.CommitAsync(new HistoryInitiator { InitiatorComment = "Обновлён NextRun", InitiatorParrComponentId = ParrComponentsEnum.NextRun }))
- {
- logger.LogInformation("Обновлены значения ПРОСРОЧЕННЫХ полей NextRun для шаблонов с ВКЛЮЧЕННЫМ автораспределением, {count} шт.", templatesForUpdate.Count);
- }
- else
- {
- logger.LogError("Ошибка при обновлении ПРОСРОЧЕННЫХ значений полей NextRun, для шаблонов {count} шт., с ВКЛЮЧЕННЫМ автораспределением", templatesForUpdate.Count);
- }
- }
-
- #endregion
+
}
}
diff --git a/PARR.Test/NextRun/NextRunTest.cs b/PARR.Test/NextRun/NextRunTest.cs
index 3913f01b..48137d41 100644
--- a/PARR.Test/NextRun/NextRunTest.cs
+++ b/PARR.Test/NextRun/NextRunTest.cs
@@ -10,7 +10,7 @@ namespace PARR.Test.NextRun
internal class NextRunTest
{
//private readonly ITemplateDistributor templateDistributor;
- private readonly INextRunService nextRunService;
+ //private readonly INextRunService nextRunService;
private readonly ITemplateService templateService;
private readonly IShortcodesService shortcodesService;
//private readonly ITemplateDistributorV2 templateDistributorV2;
@@ -18,7 +18,7 @@ namespace PARR.Test.NextRun
public NextRunTest(
/*ITemplateDistributor templateDistributor, */
- INextRunService nextRunService,
+ //INextRunService nextRunService,
ITemplateService templateService,
IShortcodesService shortcodesService,
//ITemplateDistributorV2 templateDistributorV2,
@@ -26,7 +26,7 @@ namespace PARR.Test.NextRun
)
{
//this.templateDistributor = templateDistributor;
- this.nextRunService = nextRunService;
+ //this.nextRunService = nextRunService;
this.templateService = templateService;
this.shortcodesService = shortcodesService;
//this.templateDistributorV2 = templateDistributorV2;