feat(api, dal): в настройки в БД добавлено поле EsppRobotAccountTimeZoneHour со значением 3, обновлено ScheduleTimezone на MSK. В api в задании роботу по расписаниям, время выдается с учетом таймзоны робота.

This commit is contained in:
Mikhail Trubnikov
2024-08-06 10:52:27 +10:00
parent 0dcda12c01
commit c857accfb9
12 changed files with 3098 additions and 18 deletions

View File

@@ -38,7 +38,7 @@ namespace PARR.API.MappingProfiles
.ForMember(d => d.NextRun, o => o.MapFrom(s => s.NextRun)) .ForMember(d => d.NextRun, o => o.MapFrom(s => s.NextRun))
.ForMember(d => d.LastRun, o => o.MapFrom(s => s.LastRun)) .ForMember(d => d.LastRun, o => o.MapFrom(s => s.LastRun))
.ForMember(d => d.OrderCount, o => o.MapFrom(s => s.Orders.Count())) .ForMember(d => d.OrderCount, o => o.MapFrom(s => s.Orders.Count()))
.ForMember(d=>d.IsAutoDistributionEnabled, o=>o.MapFrom(s=>s.ApplicationsInWork!.IsAutoDistributionEnabled)); .ForMember(d => d.IsAutoDistributionEnabled, o => o.MapFrom(s => s.ApplicationsInWork!.IsAutoDistributionEnabled));
// === Template === // === Template ===
@@ -168,15 +168,11 @@ namespace PARR.API.MappingProfiles
.ForMember(d => d.Exclude, o => o.MapFrom<RobotTaskScheduleExcludeResolver>()) .ForMember(d => d.Exclude, o => o.MapFrom<RobotTaskScheduleExcludeResolver>())
.ForMember(d => d.Timezone, o => o.MapFrom<RobotTaskScheduleTimezoneResolver>()) .ForMember(d => d.Timezone, o => o.MapFrom<RobotTaskScheduleTimezoneResolver>())
.ForMember(d => d.RepeatRange, o => o.MapFrom<RobotTaskScheduleRepeatRangeResolver>()) .ForMember(d => d.RepeatRange, o => o.MapFrom<RobotTaskScheduleRepeatRangeResolver>())
//.ForMember(d => d.GenerationTime, o => o.MapFrom(s => s.Template!.ApplicationsInWork!.ScheduleGenerationTime)) //todo: GenerationTime
//~~~~~~~~~ //.ForMember(d => d.GenerationTime, o => o.MapFrom(s => EsppScheduleHelpers.GetGenerationTime(s.Template!.NextRun)))
//.ForMember(d => d.GenerationTime, o => o.MapFrom(s => EsppScheduleHelpers.GetGenerationTime(s.Template!.ApplicationsInWork!.NextRun))) .ForMember(d => d.GenerationTime, o => o.MapFrom<RobotTaskScheduleGenerationTimeResolver>())
//.ForMember(d => d.NextStart, o => o.MapFrom(s => EsppScheduleHelpers.GetNextRun(s.Template!.ApplicationsInWork!.NextRun))) //.ForMember(d => d.NextStart, o => o.MapFrom(s => EsppScheduleHelpers.GetNextRun(s.Template!.NextRun)))
//~~~~~~~~~ .ForMember(d => d.NextStart, o => o.MapFrom<RobotTaskScheduleNextStartResolver>())
.ForMember(d => d.GenerationTime, o => o.MapFrom(s => EsppScheduleHelpers.GetGenerationTime(s.Template!.NextRun)))
.ForMember(d => d.NextStart, o => o.MapFrom(s => EsppScheduleHelpers.GetNextRun(s.Template!.NextRun)))
//.ForMember(d => d.NextStart, o => o.MapFrom(s => EsppScheduleHelpers.GetFirstStart(s.Template!.ApplicationsInWork!.ScheduleStartDate, s.Template!.ApplicationsInWork!.ScheduleGenerationTime)))
//.ForMember(d => d.NextStart, o => o.MapFrom(s => EsppScheduleHelpers.GetNextScheduleStart(s.Template!.NextScheduleStart)))
.ForMember(d => d.ScheduleType, o => o.MapFrom(s => .ForMember(d => d.ScheduleType, o => o.MapFrom(s =>
s.Template!.ApplicationsInWork!.EsppSchValues!.First()!.EsppSchTypeConfig!.EsppSchTypeSchedule!.Description)) s.Template!.ApplicationsInWork!.EsppSchValues!.First()!.EsppSchTypeConfig!.EsppSchTypeSchedule!.Description))
.ForMember(d => d.ScheduleTypeCode, o => o.MapFrom(s => .ForMember(d => d.ScheduleTypeCode, o => o.MapFrom(s =>

View File

@@ -0,0 +1,28 @@
using AutoMapper;
using PARR.API.Contracts.V1.Responses;
using PARR.BLL.Helpers;
using PARR.DAL.Contracts;
using PARR.DAL.Models;
using PARR.DAL.TransformServices;
namespace PARR.API.MappingProfiles.Resolvers
{
public class RobotTaskScheduleGenerationTimeResolver : IValueResolver<RobotConfiguration, RobotTaskScheduleResponse, string>
{
private readonly SettingsFromDb settingsFromDb;
private readonly INextRunModifierService nextRunModifierService;
public RobotTaskScheduleGenerationTimeResolver(SettingsFromDb settingsFromDb, INextRunModifierService nextRunModifierService)
{
this.settingsFromDb = settingsFromDb;
this.nextRunModifierService = nextRunModifierService;
}
public string Resolve(RobotConfiguration source, RobotTaskScheduleResponse destination, string destMember, ResolutionContext context)
{
var nextRunForRobot = nextRunModifierService.GetNextRunByAccountRobotTimeZone(source.Template!.NextRun);
return EsppScheduleHelpers.GetGenerationTime(nextRunForRobot);
}
}
}

View File

@@ -0,0 +1,28 @@
using AutoMapper;
using PARR.API.Contracts.V1.Responses;
using PARR.BLL.Helpers;
using PARR.DAL.Contracts;
using PARR.DAL.Models;
using PARR.DAL.TransformServices;
namespace PARR.API.MappingProfiles.Resolvers
{
public class RobotTaskScheduleNextStartResolver : IValueResolver<RobotConfiguration, RobotTaskScheduleResponse, string>
{
private readonly SettingsFromDb settingsFromDb;
private readonly INextRunModifierService nextRunModifierService;
public RobotTaskScheduleNextStartResolver(SettingsFromDb settingsFromDb, INextRunModifierService nextRunModifierService)
{
this.settingsFromDb = settingsFromDb;
this.nextRunModifierService = nextRunModifierService;
}
public string Resolve(RobotConfiguration source, RobotTaskScheduleResponse destination, string destMember, ResolutionContext context)
{
var nextRunForRobot = nextRunModifierService.GetNextRunByAccountRobotTimeZone(source.Template!.NextRun);
return EsppScheduleHelpers.GetNextRun(nextRunForRobot);
}
}
}

View File

@@ -3,7 +3,7 @@ using PARR.API.Contracts.V1.Responses;
using PARR.DAL.Contracts; using PARR.DAL.Contracts;
using PARR.DAL.Models; using PARR.DAL.Models;
using PARR.DAL.Services.Interfaces; using PARR.DAL.Services.Interfaces;
using System.Threading.Tasks; using PARR.DAL.TransformServices;
namespace PARR.API.MappingProfiles.Resolvers namespace PARR.API.MappingProfiles.Resolvers
{ {
@@ -11,14 +11,17 @@ namespace PARR.API.MappingProfiles.Resolvers
{ {
private readonly IEsppSchTypeConfigService esppConfigService; private readonly IEsppSchTypeConfigService esppConfigService;
private readonly ILogger<RobotTaskScheduleSchResolver> logger; private readonly ILogger<RobotTaskScheduleSchResolver> logger;
private readonly INextRunModifierService nextRunModifierService;
public RobotTaskScheduleSchResolver( public RobotTaskScheduleSchResolver(
IEsppSchTypeConfigService esppConfigService, IEsppSchTypeConfigService esppConfigService,
ILogger<RobotTaskScheduleSchResolver> logger ILogger<RobotTaskScheduleSchResolver> logger,
INextRunModifierService nextRunModifierService
) )
{ {
this.esppConfigService = esppConfigService; this.esppConfigService = esppConfigService;
this.logger = logger; this.logger = logger;
this.nextRunModifierService = nextRunModifierService;
} }
public List<RobotTaskScheduleSchResponse>? Resolve(RobotConfiguration source, RobotTaskScheduleResponse destination, List<RobotTaskScheduleSchResponse>? destMember, ResolutionContext context) public List<RobotTaskScheduleSchResponse>? Resolve(RobotConfiguration source, RobotTaskScheduleResponse destination, List<RobotTaskScheduleSchResponse>? destMember, ResolutionContext context)
@@ -42,10 +45,13 @@ namespace PARR.API.MappingProfiles.Resolvers
}).OrderBy(t => t.Order).ToList(); }).OrderBy(t => t.Order).ToList();
//Если задача относится к распределенной модели исполнения за период месяц устанавливаем день равный NextRun //Если задача относится к распределенной модели исполнения за период месяц устанавливаем день равный NextRun
if (source.Template!.ApplicationsInWork!.IsAutoDistributionEnabled && if (source.Template!.ApplicationsInWork!.IsAutoDistributionEnabled && schedule.TypeSchedule.Id == (int)EsppSchTypeScheduleEnum.Monthly)
schedule.TypeSchedule.Id == (int)EsppSchTypeScheduleEnum.Monthly) {
response.First().Value = source.Template.NextRun.Day.ToString(); var nextRunForRobot = nextRunModifierService.GetNextRunByAccountRobotTimeZone(source.Template.NextRun);
//response.First().Value = source.Template.NextRun.Day.ToString();
response.First().Value = nextRunForRobot.Day.ToString();
}
return response; return response;
} }

View File

@@ -102,10 +102,11 @@ namespace PARR.DAL.Context
new { Name = nameof(SettingsFromDb.TemplatePrefixName), Description = "Префикс имени шаблона в ЕСПП", Value = "%PREFIX%-ЭИТИ-ПТК-ПАРР" }, new { Name = nameof(SettingsFromDb.TemplatePrefixName), Description = "Префикс имени шаблона в ЕСПП", Value = "%PREFIX%-ЭИТИ-ПТК-ПАРР" },
new { Name = nameof(SettingsFromDb.RobotAttemptsNumber), Description = "Количество попыток выполнения задания роботом", Value = "3" }, new { Name = nameof(SettingsFromDb.RobotAttemptsNumber), Description = "Количество попыток выполнения задания роботом", Value = "3" },
new { Name = nameof(SettingsFromDb.RobotWaitTime), Description = "Время ожидания выполнения роботом задания", Value = "00:15:00" }, new { Name = nameof(SettingsFromDb.RobotWaitTime), Description = "Время ожидания выполнения роботом задания", Value = "00:15:00" },
new { Name = nameof(SettingsFromDb.ScheduleTimezone), Description = "Расписание регламентной работы - В каком часовом поясе", Value = "Greenwich/Universal" }, new { Name = nameof(SettingsFromDb.ScheduleTimezone), Description = "Расписание регламентной работы - В каком часовом поясе", Value = "MSK" },
new { Name = nameof(SettingsFromDb.ScheduleExclude), Description = "Расписание регламентной работы - Тип исключения", Value = "Нет исключений" }, new { Name = nameof(SettingsFromDb.ScheduleExclude), Description = "Расписание регламентной работы - Тип исключения", Value = "Нет исключений" },
new { Name = nameof(SettingsFromDb.ScheduleRepeatRange), Description = "Расписание регламентной работы - Диапазн повторов", Value = "Отсутствует дата завершения" }, new { Name = nameof(SettingsFromDb.ScheduleRepeatRange), Description = "Расписание регламентной работы - Диапазн повторов", Value = "Отсутствует дата завершения" },
new { Name = nameof(SettingsFromDb.OrderSearchDeltaDate), Description = "Промежуток времени для поиска нарядов в ЕСПП", Value = new TimeSpan(1, 30, 0).ToString() } new { Name = nameof(SettingsFromDb.OrderSearchDeltaDate), Description = "Промежуток времени для поиска нарядов в ЕСПП", Value = new TimeSpan(1, 30, 0).ToString() },
new { Name = nameof(SettingsFromDb.EsppRobotAccountTimeZoneHour), Description = "Таймзона УЗ роботов в ЕСПП, в часах (может быть положительная и отрицательная)", Value = "3" }
); );
}); });
#endregion #endregion

View File

@@ -63,6 +63,11 @@
/// </summary> /// </summary>
public TimeSpan OrderSearchDeltaDate { get; set; } public TimeSpan OrderSearchDeltaDate { get; set; }
/// <summary>
/// Таймзона УЗ роботов в ЕСПП, в часах (может быть положительным и отрицательным)
/// </summary>
public int EsppRobotAccountTimeZoneHour { get; set; }
} }
} }

View File

@@ -0,0 +1,42 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace PARR.DAL.Migrations
{
/// <inheritdoc />
public partial class tblSettingsAddEsppRobotAccountTimeZoneHourAndUpdScheduleTimezone : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.UpdateData(
table: "Settings",
keyColumn: "Name",
keyValue: "ScheduleTimezone",
column: "Value",
value: "MSK");
migrationBuilder.InsertData(
table: "Settings",
columns: new[] { "Name", "Description", "Value" },
values: new object[] { "EsppRobotAccountTimeZoneHour", "Таймзона УЗ роботов в ЕСПП, в часах (может быть положительная и отрицательная)", "3" });
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DeleteData(
table: "Settings",
keyColumn: "Name",
keyValue: "EsppRobotAccountTimeZoneHour");
migrationBuilder.UpdateData(
table: "Settings",
keyColumn: "Name",
keyValue: "ScheduleTimezone",
column: "Value",
value: "Greenwich/Universal");
}
}
}

View File

@@ -2100,7 +2100,7 @@ namespace PARR.DAL.Migrations
{ {
Name = "ScheduleTimezone", Name = "ScheduleTimezone",
Description = "Расписание регламентной работы - В каком часовом поясе", Description = "Расписание регламентной работы - В каком часовом поясе",
Value = "Greenwich/Universal" Value = "MSK"
}, },
new new
{ {
@@ -2119,6 +2119,12 @@ namespace PARR.DAL.Migrations
Name = "OrderSearchDeltaDate", Name = "OrderSearchDeltaDate",
Description = "Промежуток времени для поиска нарядов в ЕСПП", Description = "Промежуток времени для поиска нарядов в ЕСПП",
Value = "01:30:00" Value = "01:30:00"
},
new
{
Name = "EsppRobotAccountTimeZoneHour",
Description = "Таймзона УЗ роботов в ЕСПП, в часах (может быть положительная и отрицательная)",
Value = "3"
}); });
}); });

View File

@@ -84,8 +84,11 @@ namespace PARR.DAL
services.AddTransient<IDistributionPeriodService, DistributionPeriodService>(); services.AddTransient<IDistributionPeriodService, DistributionPeriodService>();
services.AddTransient<IEsppSchTypeValueService, EsppSchTypeValueService>(); services.AddTransient<IEsppSchTypeValueService, EsppSchTypeValueService>();
// TransformServices // TransformServices
services.AddTransient<IEsppScheduleTransformService, EsppScheduleTransformService>(); services.AddTransient<IEsppScheduleTransformService, EsppScheduleTransformService>();
services.AddTransient<INextRunModifierService, NextRunModifierService>();
} }
/// <summary> /// <summary>

View File

@@ -0,0 +1,16 @@

namespace PARR.DAL.TransformServices
{
/// <summary>
/// Сервис по изменению NextRun
/// </summary>
public interface INextRunModifierService
{
/// <summary>
/// Получить NextRun с учетом тайм зоны робота ЕСПП
/// </summary>
/// <param name="nextRun"></param>
/// <returns></returns>
DateTimeOffset GetNextRunByAccountRobotTimeZone(DateTimeOffset nextRun);
}
}

View File

@@ -0,0 +1,20 @@
using PARR.DAL.Contracts;
namespace PARR.DAL.TransformServices
{
internal class NextRunModifierService : INextRunModifierService
{
private readonly SettingsFromDb settingsFromDb;
public NextRunModifierService(SettingsFromDb settingsFromDb)
{
this.settingsFromDb = settingsFromDb;
}
public DateTimeOffset GetNextRunByAccountRobotTimeZone(DateTimeOffset nextRun)
{
return nextRun.AddHours(settingsFromDb.EsppRobotAccountTimeZoneHour);
}
}
}