Merge branch 'next-run-timezone' into dev

This commit is contained in:
Mikhail Trubnikov
2026-02-03 16:24:09 +10:00
36 changed files with 13010 additions and 290 deletions

View File

@@ -5,10 +5,11 @@ using PARR.BLL.Helpers;
using PARR.BLL.Services.Interfaces;
using PARR.Constants;
using PARR.DAL.Contracts;
using PARR.DAL.DomainServices.Shortcodes;
using PARR.DAL.Models;
using PARR.DAL.NextRunServices;
using PARR.DAL.Services.Interfaces;
using PARR.DAL.Services.Interfaces.Schedule;
using PARR.DAL.TransformServices;
using PARR.EsppScheduleSync.Domain;
using PARR.EsppScheduleSync.Settings;
using PARR.EsppSync;
@@ -23,8 +24,9 @@ namespace PARR.EsppScheduleSync
private readonly ISyncService<EsppObjectSchedule> syncService;
private readonly SettingsFromDb settingsFromDb;
private readonly IServiceProvider serviceProvider;
private readonly IScheduleResponseAreaTimeOffsetService scheduleResponseAreaTimeOffsetService;
private string noneExcludeCalendarEsppValue;
private Dictionary<string, string> responseAreaTimeOffsetDict;
//private Dictionary<string, string> responseAreaTimeOffsetDict;
public ScheduleSyncher(
@@ -33,7 +35,8 @@ namespace PARR.EsppScheduleSync
IMqService mqService,
ISyncService<EsppObjectSchedule> syncService,
SettingsFromDb settingsFromDb,
IServiceProvider serviceProvider
IServiceProvider serviceProvider,
IScheduleResponseAreaTimeOffsetService scheduleResponseAreaTimeOffsetService
)
{
this.logger = logger;
@@ -42,8 +45,8 @@ namespace PARR.EsppScheduleSync
this.syncService = syncService;
this.settingsFromDb = settingsFromDb;
this.serviceProvider = serviceProvider;
this.responseAreaTimeOffsetDict = new Dictionary<string, string>();
this.scheduleResponseAreaTimeOffsetService = scheduleResponseAreaTimeOffsetService;
//this.responseAreaTimeOffsetDict = new Dictionary<string, string>();
this.noneExcludeCalendarEsppValue = string.Empty;
if (globalSettings.MqSettings == null)
@@ -63,8 +66,8 @@ namespace PARR.EsppScheduleSync
if (string.IsNullOrEmpty(noneExcludeCalendarEsppValue))
await GetNoneExcludeCalendarEsppValueAsync();
if (responseAreaTimeOffsetDict.Count == 0)
await GetResponseAreaTimeOffsetsAsync();
//if (responseAreaTimeOffsetDict.Count == 0)
// await GetResponseAreaTimeOffsetsAsync();
var isConnected = await mqService.InitConsumerAsync(globalSettings!.MqSettings!, SyncScheduleAsync);
@@ -74,13 +77,13 @@ namespace PARR.EsppScheduleSync
logger.LogInformation("Запущена проверка очереди {QueueName}.", globalSettings.MqSettings!.QueueName);
}
private async Task GetResponseAreaTimeOffsetsAsync()
{
using var scope = serviceProvider.CreateScope();
var service = scope.ServiceProvider.GetRequiredService<IScheduleResponseAreaTimeOffsetService>();
//private async Task GetResponseAreaTimeOffsetsAsync()
//{
// using var scope = serviceProvider.CreateScope();
// var service = scope.ServiceProvider.GetRequiredService<IScheduleResponseAreaTimeOffsetService>();
responseAreaTimeOffsetDict = await service.Get().ToDictionaryAsync(t => t.ResponseArea, t => t.TimeOffset);
}
// responseAreaTimeOffsetDict = await service.Get().ToDictionaryAsync(t => t.ResponseArea, t => t.TimeOffset);
//}
private async Task GetNoneExcludeCalendarEsppValueAsync()
{
@@ -251,15 +254,23 @@ namespace PARR.EsppScheduleSync
private EsppObjectSchedule ConvertDbObjToEsppObj(Template template)
{
//дефолтное значение, изменится в сервисе nextRunModifierService
var nextRunByAccountRobotTimeZone = DateTimeOffset.MinValue;
var nextRunWithTimeZone = DateTimeOffset.MinValue;
// дефолтное значение, изменится в ApplyShortcodesAsync
var responseArea = "%ЗО_РГ%";
using (var scope = serviceProvider.CreateScope())
{
var nextRunModifierService = scope.ServiceProvider.GetService<INextRunModifierService>();
if (nextRunModifierService == null)
throw new Exception($"Не найден сервис: {nameof(INextRunModifierService)}");
//var nextRunModifierService = scope.ServiceProvider.GetService<INextRunModifierService>();
//if (nextRunModifierService == null)
// throw new Exception($"Не найден сервис: {nameof(INextRunModifierService)}");
nextRunByAccountRobotTimeZone = nextRunModifierService.GetNextRunByAccountRobotTimeZone(template.NextRun);
//nextRunWithTimeZone = nextRunModifierService.GetNextRunByAccountRobotTimeZone(template.NextRun);
var nextRunService = scope.ServiceProvider.GetRequiredService<INextRunService>();
var shortcodeService = scope.ServiceProvider.GetRequiredService<IShortcodesService>();
responseArea = shortcodeService.ApplyShortcodesAsync(template.Job!.ResponseAreaMask, template).GetAwaiter().GetResult();
nextRunWithTimeZone = nextRunService.GetNextRunWithTimezoneEsppAndResponseArea(template.NextRun, template.Job?.Group?.IsResponseAreaTimezone, responseArea);
}
var esppObjectFromDb = new EsppObjectSchedule
@@ -278,9 +289,9 @@ namespace PARR.EsppScheduleSync
//Scheduled = EsppScheduleHelpers.GetNextRun(template.NextRun),
//Scheduled = EsppScheduleHelpers.GetNextRun(nextRunModifierService.GetNextRunByAccountRobotTimeZone(template.NextRun)),
//BasisTime = EsppScheduleHelpers.GetGenerationTime(nextRunModifierService.GetNextRunByAccountRobotTimeZone(template.NextRun)),
Scheduled = EsppScheduleHelpers.GetNextRun(nextRunByAccountRobotTimeZone),
BasisTime = EsppScheduleHelpers.GetGenerationTime(nextRunByAccountRobotTimeZone),
Timezone = GetTimezone(template),
Scheduled = EsppScheduleHelpers.GetNextRun(nextRunWithTimeZone),
BasisTime = EsppScheduleHelpers.GetGenerationTime(nextRunWithTimeZone),
Timezone = GetTimezone(template, responseArea),
//Мы решили, что для всех расписаний "Отсутствует дата завершения", если что-то поменяется, тут нужно переделать
TerminationType = settingsFromDb.ScheduleRepeatRange == "Отсутствует дата завершения" ? "forever" : "",
CompleteAfter = ""
@@ -290,29 +301,34 @@ namespace PARR.EsppScheduleSync
return ClearOptionalFields(esppObjectFromDb);
}
private string GetTimezone(Template template)
private string GetTimezone(Template template, string responseArea)
{
if (template.Job?.Group?.IsWorkGroupTimezone != true)
return settingsFromDb.ScheduleTimezone;
//if (template.Job?.Group?.IsWorkGroupTimezone != true)
// return settingsFromDb.ScheduleTimezone;
var responseArea = template.Unit?.BaseFields?.ResponseArea;
if (template.Job?.Group?.IsResponseAreaTimezone != true)
return scheduleResponseAreaTimeOffsetService.GetDefault.EsppValue;
if (string.IsNullOrEmpty(responseArea))
{
throw new InvalidOperationException(
$"У шаблона Id={template.Id}, Name='{template.Name}' не задана ResponseArea в Unit.BaseFields, " +
"но включена настройка 'использовать часовой пояс рабочей группы'.");
}
//var responseArea = template.Unit?.BaseFields?.ResponseArea;
if (!responseAreaTimeOffsetDict.TryGetValue(responseArea, out var offset))
{
throw new InvalidOperationException(
$"Не найдено временное смещение для ResponseArea '{responseArea}' у шаблона Id={template.Id}, Name='{template.Name}'. " +
"Проверьте наличие записи в таблице ScheduleResponseAreaTimeOffset.");
}
//if (string.IsNullOrEmpty(responseArea))
//{
// throw new InvalidOperationException(
// $"У шаблона Id={template.Id}, Name='{template.Name}' не задана ResponseArea в Unit.BaseFields, " +
// "но включена настройка 'использовать часовой пояс рабочей группы'.");
//}
return offset;
//if (!responseAreaTimeOffsetDict.TryGetValue(responseArea, out var offset))
//{
// throw new InvalidOperationException(
// $"Не найдено временное смещение для ResponseArea '{responseArea}' у шаблона Id={template.Id}, Name='{template.Name}'. " +
// "Проверьте наличие записи в таблице ScheduleResponseAreaTimeOffset.");
//}
//return offset;
return scheduleResponseAreaTimeOffsetService.GetByResponseAreaOrDefault(responseArea).EsppValue;
}