feat(api,esppScheduleSync): добавлена логика подстановки часового пояса рабочей группы ответственной за эк в расписании генератора

This commit is contained in:
Mikhail Kuznetsov
2026-01-30 12:29:37 +10:00
parent fddee13fff
commit 9f7111f2e9
2 changed files with 193 additions and 152 deletions

View File

@@ -12,11 +12,10 @@ using PARR.Common.Domain;
using PARR.Constants;
using PARR.DAL.Contracts;
using PARR.DAL.DomainServices.Shortcodes;
using PARR.DAL.DomainServices.Shortcodes.Models;
using PARR.DAL.Models;
using PARR.DAL.NextRunServices;
using PARR.DAL.Services.Interfaces;
using PARR.DAL.TransformServices;
using PARR.DAL.Services.Interfaces.Schedule;
namespace PARR.API.Controllers.V1
{
@@ -32,6 +31,7 @@ namespace PARR.API.Controllers.V1
private readonly IRobotHistoryService robotHistoryService;
private readonly IShortcodesService shortcodesService;
private readonly INextRunService nextRunService;
private readonly IScheduleResponseAreaTimeOffsetService scheduleResponseAreaTimeOffsetService;
public RobotTaskController(
IMapper mapper,
@@ -42,7 +42,8 @@ namespace PARR.API.Controllers.V1
IClientService clientService,
IRobotHistoryService robotHistoryService,
IShortcodesService shortcodesService,
INextRunService nextRunService
INextRunService nextRunService,
IScheduleResponseAreaTimeOffsetService scheduleResponseAreaTimeOffsetService
)
{
this.mapper = mapper;
@@ -54,6 +55,7 @@ namespace PARR.API.Controllers.V1
this.robotHistoryService = robotHistoryService;
this.shortcodesService = shortcodesService;
this.nextRunService = nextRunService;
this.scheduleResponseAreaTimeOffsetService = scheduleResponseAreaTimeOffsetService;
}
@@ -198,38 +200,6 @@ namespace PARR.API.Controllers.V1
{ //RobotTaskTemplateResponse
var robotTaskTemplateResponse = mapper.Map<RobotTaskTemplateResponse>(task);
//TODO Вынести в отдельный метод ShortcodesService
// Построим TemplateForShortcodes из уже загруженного task.Template
//var templateForShortcodes = new TemplateForShortcodes
//{
// Id = task.Template!.Id,
// Index = task.Template.Index,
// JobId = task.Template.JobId,
// UnitId = task.Template.UnitId,
// Job = task.Template.Job == null ? null : new JobForShortcodes
// {
// Group = task.Template.Job.Group == null ? null : new JobGroupForShortcodes
// {
// Id = task.Template.Job.Group.Id,
// GroupingUnitFieldId = task.Template.Job.Group.GroupingUnitFieldId,
// GroupType = task.Template.Job.Group.GroupType == null ? null : new JobGroupTypeForShortcodes
// {
// Code = task.Template.Job.Group.GroupType.Code
// },
// GroupName = task.Template.Job.Group.GroupName
// },
// Tnk = task.Template.Job.Tnk == null ? null : new TnkForShortcodes
// {
// Name = task.Template.Job.Tnk.Name,
// ShortName = task.Template.Job.Tnk.ShortName ?? ""
// },
// WorkName = task.Template.Job.WorkName,
// Name = task.Template.Job.Name
// },
// UnitsInTemplate = task.Template.UnitsInTemplate?.Select(uit => new UnitInTemplateForShortcodes { UnitId = uit.UnitId }).ToList() ?? new List<UnitInTemplateForShortcodes>()
//};
//if (shortcodesService.IsAnyShortcodes(robotTaskTemplateResponse.FullDescription))
robotTaskTemplateResponse.FullDescription = await shortcodesService.ApplyShortcodesAsync(robotTaskTemplateResponse.FullDescription, task.Template!);
//if (shortcodesService.IsAnyShortcodes(robotTaskTemplateResponse.ShortDescription))
@@ -253,39 +223,13 @@ namespace PARR.API.Controllers.V1
//RobotTaskScheduleResponse
var robotTaskScheduleResponse = mapper.Map<RobotTaskScheduleResponse>(task);
//// Построим TemplateForShortcodes из уже загруженного task.Template
//var templateForShortcodes = new TemplateForShortcodes
//{
// Id = task.Template!.Id,
// Index = task.Template.Index,
// JobId = task.Template.JobId,
// UnitId = task.Template.UnitId,
// Job = task.Template.Job == null ? null : new JobForShortcodes
// {
// Group = task.Template.Job.Group == null ? null : new JobGroupForShortcodes
// {
// GroupingUnitFieldId = task.Template.Job.Group.GroupingUnitFieldId,
// GroupType = task.Template.Job.Group.GroupType == null ? null : new JobGroupTypeForShortcodes
// {
// Code = task.Template.Job.Group.GroupType.Code
// },
// GroupName = task.Template.Job.Group.GroupName
// },
// Tnk = task.Template.Job.Tnk == null ? null : new TnkForShortcodes
// {
// Name = task.Template.Job.Tnk.Name,
// ShortName = task.Template.Job.Tnk.ShortName
// },
// WorkName = task.Template.Job.WorkName,
// Name = task.Template.Job.Name
// },
// UnitsInTemplate = task.Template.UnitsInTemplate?.Select(uit => new UnitInTemplateForShortcodes { UnitId = uit.UnitId }).ToList() ?? new List<UnitInTemplateForShortcodes>()
//};
robotTaskScheduleResponse.Timezone = await GetTimezoneForTemplateAsync(task.Template!);
//if (shortcodesService.IsAnyShortcodes(robotTaskScheduleResponse.WorkGroup))
robotTaskScheduleResponse.WorkGroup = await shortcodesService.ApplyShortcodesAsync(robotTaskScheduleResponse.WorkGroup, task.Template!);
robotTaskScheduleResponse.ResponseArea = await shortcodesService.ApplyShortcodesAsync(robotTaskScheduleResponse.ResponseArea, task.Template!);
return Ok(new Response<RobotTaskScheduleResponse>(robotTaskScheduleResponse, true));
}
default:
@@ -387,5 +331,33 @@ namespace PARR.API.Controllers.V1
return true;
}
private async Task<string> GetTimezoneForTemplateAsync(Template template)
{
if (template.Job?.Group?.IsWorkGroupTimezone != true)
return settingsFromDb.ScheduleTimezone;
var responseArea = template.Unit?.BaseFields?.ResponseArea;
if (string.IsNullOrEmpty(responseArea))
{
throw new InvalidOperationException(
$"У шаблона Id={template.Id}, Name='{template.Name}' не задана ResponseArea в Unit.BaseFields, " +
"но включена настройка 'использовать часовой пояс рабочей группы'.");
}
var offsets = await scheduleResponseAreaTimeOffsetService
.Get()
.ToDictionaryAsync(t => t.ResponseArea, t => t.TimeOffset);
if (!offsets.TryGetValue(responseArea, out var offset))
{
throw new InvalidOperationException(
$"Не найдено временное смещение для ResponseArea '{responseArea}' у шаблона Id={template.Id}, Name='{template.Name}'. " +
"Проверьте наличие записи в таблице ScheduleResponseAreaTimeOffset.");
}
return offset;
}
}
}