feat(esppOrderLoader): логика получение данных

This commit is contained in:
Mikhail Trubnikov
2023-10-23 13:50:43 +10:00
parent 017d2c9d71
commit ea77bd43de
17 changed files with 2694 additions and 20 deletions

View File

@@ -109,7 +109,8 @@ namespace PARR.DAL.Context
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 = "MSK" }, 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() }
); );
}); });
@@ -324,7 +325,7 @@ namespace PARR.DAL.Context
modelBuilder.Entity<AgentHistoryLevel>(f => modelBuilder.Entity<AgentHistoryLevel>(f =>
{ {
f.HasData( f.HasData(
new { Id = (int)AgentHistoryLevelEnum.Start, Name = AgentHistoryLevelEnum.Start.ToString(), Description= "Агент начал выполнять задание" }, new { Id = (int)AgentHistoryLevelEnum.Start, Name = AgentHistoryLevelEnum.Start.ToString(), Description = "Агент начал выполнять задание" },
new { Id = (int)AgentHistoryLevelEnum.End, Name = AgentHistoryLevelEnum.End.ToString(), Description = "Агент завершил выполнение задания" } new { Id = (int)AgentHistoryLevelEnum.End, Name = AgentHistoryLevelEnum.End.ToString(), Description = "Агент завершил выполнение задания" }
); );
}); });

View File

@@ -53,5 +53,10 @@
/// </summary> /// </summary>
public string ScheduleRepeatRange { get; set; } = string.Empty; public string ScheduleRepeatRange { get; set; } = string.Empty;
/// <summary>
/// Промежуток времени для поиска нарядов в ЕСПП
/// </summary>
public TimeSpan OrderSearchDeltaDate { get; set; }
} }
} }

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,28 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace PARR.DAL.Migrations
{
/// <inheritdoc />
public partial class TblSettingsOrderSearchDeltaDate : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.InsertData(
table: "Settings",
columns: new[] { "Name", "Description", "Value" },
values: new object[] { "OrderSearchDeltaDate", "Промежуток времени для поиска нарядов в ЕСПП", "01:30:00" });
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DeleteData(
table: "Settings",
keyColumn: "Name",
keyValue: "OrderSearchDeltaDate");
}
}
}

View File

@@ -1954,6 +1954,12 @@ namespace PARR.DAL.Migrations
Name = "ScheduleRepeatRange", Name = "ScheduleRepeatRange",
Description = "Расписание регламентной работы - Диапазн повторов", Description = "Расписание регламентной работы - Диапазн повторов",
Value = "Отсутствует дата завершения" Value = "Отсутствует дата завершения"
},
new
{
Name = "OrderSearchDeltaDate",
Description = "Промежуток времени для поиска нарядов в ЕСПП",
Value = "01:30:00"
}); });
}); });

View File

@@ -19,7 +19,7 @@ namespace PARR.EsppApi
this.espp = espp; this.espp = espp;
} }
public async Task<EsppResultBase<IEnumerable<EsppOrder>>> FindOrdersByPrefixAsync(FindOrdersQuery query) public async Task<EsppResultBase<IEnumerable<EsppOrder>>> FindOrdersAsync(FindOrdersQuery query)
{ {
logger.LogInformation("Привет!"); logger.LogInformation("Привет!");

View File

@@ -6,9 +6,9 @@ namespace PARR.EsppApi
public interface IEsppApiService public interface IEsppApiService
{ {
/// <summary> /// <summary>
/// Найти наряды в ЕСПП по префиксу /// Найти наряды в ЕСПП
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
Task<EsppResultBase<IEnumerable<EsppOrder>>> FindOrdersByPrefixAsync(FindOrdersQuery query); Task<EsppResultBase<IEnumerable<EsppOrder>>> FindOrdersAsync(FindOrdersQuery query);
} }
} }

View File

@@ -5,5 +5,8 @@
/// </summary> /// </summary>
public class EsppOrder public class EsppOrder
{ {
public string Number { get; set; } = string.Empty;
public string? WorkGroup { get; set; }
} }
} }

View File

@@ -1,7 +1,20 @@
namespace PARR.EsppApi.Models.Query namespace PARR.EsppApi.Models.Query
{ {
/// <summary>
/// Фильтр запроса в ЕСПП на поиск объектов
/// </summary>
public class FindOrdersQuery public class FindOrdersQuery
{ {
//todo: тут поля для запроса списка нарядов из еспп //todo: тут поля для запроса списка нарядов из еспп
/// <summary>
/// Краткое описание, содержит значение
/// </summary>
public string? ShortDescriptionContains { get; set; }
/// <summary>
/// Дата - "ПО"
/// </summary>
public DateTime? DateEnd { get; set; }
} }
} }

View File

@@ -0,0 +1,80 @@
using Microsoft.Extensions.Logging;
using PARR.DAL.Contracts;
using PARR.EsppApi;
using PARR.EsppApi.Models.Query;
using PARR.EsppOrderLoader.Settings;
namespace PARR.EsppOrderLoader
{
internal class EsppOrderLoader : IEsppOrderLoader
{
private readonly WorkerSettings settings;
private readonly ILogger<EsppOrderLoader> logger;
private readonly IEsppApiService esppApiService;
private readonly SettingsFromDb settingsFromDb;
public EsppOrderLoader(
WorkerSettings settings,
ILogger<EsppOrderLoader> logger,
IEsppApiService esppApiService,
SettingsFromDb settingsFromDb
)
{
this.settings = settings;
this.logger = logger;
this.esppApiService = esppApiService;
this.settingsFromDb = settingsFromDb;
}
public async Task StartAsync()
{
logger.LogInformation("Запуск сервиса загрузки нарядов из ЕСПП.");
var nextStart = DateTime.Now;
while (true)
{
if (nextStart.Hour == DateTime.Now.Hour && nextStart.Minute == DateTime.Now.Minute)
{
logger.LogInformation("Загрузка списка нарядов из ЕСПП.");
await DownloadOrdersAsync();
nextStart = DateTime.Now.Add(settings.RepeatEvery);
logger.LogInformation($"Следующая дата загрузки: {nextStart}");
}
// Каждую минуту
await Task.Delay(60 * 1000);
}
}
// получаю список из ЕСПП по фильтрам
// В цикле проверяю каждый наряд, есть ли он в БД + по имени ищу есть ли такой шаблон
// Если наряда такого нет в БД и есть шаблон, добавляю в БД
// если в бд не добавляю, пишу в лог, что нет такого шаблона, в бд не добавляю
private async Task DownloadOrdersAsync()
{
var searchQuery = new FindOrdersQuery { ShortDescriptionContains = settingsFromDb.TemplatePrefixName, DateEnd = DateTime.Now.Add(settingsFromDb.OrderSearchDeltaDate) };
var downloadResult = await esppApiService.FindOrdersAsync(searchQuery);
if (!downloadResult.IsSuccess)
{
logger.LogError(downloadResult.Exception, "Ошибка загрузки списка нарядов из ЕСПП");
return;
}
logger.LogInformation($"Получено нарядов из ЕСПП: {downloadResult.Data?.Count()}");
if (downloadResult.Data == null)
return;
foreach (var item in downloadResult.Data)
{
//todo:
}
}
}
}

View File

@@ -0,0 +1,7 @@
namespace PARR.EsppOrderLoader
{
public interface IEsppOrderLoader
{
Task StartAsync();
}
}

View File

@@ -3,6 +3,7 @@ using Microsoft.Extensions.DependencyInjection;
using PARR.BLL; using PARR.BLL;
using PARR.DAL; using PARR.DAL;
using PARR.EsppApi; using PARR.EsppApi;
using PARR.EsppOrderLoader.Settings;
namespace PARR.EsppOrderLoader namespace PARR.EsppOrderLoader
{ {
@@ -14,14 +15,11 @@ namespace PARR.EsppOrderLoader
services.InstallDalServices(configuration); services.InstallDalServices(configuration);
services.InstallEsppApiServices(configuration); services.InstallEsppApiServices(configuration);
// settings var settings = new WorkerSettings();
//SettingsFromDb configuration configuration.GetSection(nameof(WorkerSettings)).Bind(settings);
//var settingsFromDb = new SettingsFromDb(); services.AddSingleton(settings);
//configuration.GetSection(nameof(SettingsFromDb)).Bind(settingsFromDb);
//services.AddSingleton(settingsFromDb);
//add other services services.AddTransient<IEsppOrderLoader, EsppOrderLoader>();
//services.AddTransient<IEsppApiService, EsppApiService>();
} }
public static IConfigurationBuilder AddEsppOrderLoaderConfigurations(this IConfigurationBuilder builder, IServiceCollection services) public static IConfigurationBuilder AddEsppOrderLoaderConfigurations(this IConfigurationBuilder builder, IServiceCollection services)

View File

@@ -0,0 +1,7 @@
namespace PARR.EsppOrderLoader.Settings
{
internal class WorkerSettings
{
public TimeSpan RepeatEvery { get; set; }
}
}

View File

@@ -1,22 +1,27 @@
using PARR.EsppOrderLoader;
namespace PARR.EsppOrderLoaderWorker namespace PARR.EsppOrderLoaderWorker
{ {
public class Worker : BackgroundService public class Worker : BackgroundService
{ {
private readonly ILogger<Worker> _logger; private readonly ILogger<Worker> _logger;
private readonly IEsppOrderLoader esppOrderLoader;
public Worker(ILogger<Worker> logger) public Worker(ILogger<Worker> logger, IEsppOrderLoader esppOrderLoader)
{ {
_logger = logger; _logger = logger;
this.esppOrderLoader = esppOrderLoader;
} }
protected override async Task ExecuteAsync(CancellationToken stoppingToken) protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{ {
_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now); await esppOrderLoader.StartAsync();
//while (!stoppingToken.IsCancellationRequested) //_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
//{ ////while (!stoppingToken.IsCancellationRequested)
// _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now); ////{
// await Task.Delay(1000, stoppingToken); //// _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
//} //// await Task.Delay(1000, stoppingToken);
////}
} }
} }
} }

View File

@@ -25,5 +25,8 @@
} }
} }
] ]
},
"WorkerSettings": {
"RepeatEvery": "1:00:00"
} }
} }

View File

@@ -29,7 +29,7 @@ namespace PARR.Test
private async Task TestEsppApi() private async Task TestEsppApi()
{ {
// var orders = await esppApiService.FindOrdersByPrefixAsync("ПАРР__"); // var orders = await esppApiService.FindOrdersByPrefixAsync("ПАРР__");
var result = await esppApiService.FindOrdersByPrefixAsync(new FindOrdersQuery { }); var result = await esppApiService.FindOrdersAsync(new FindOrdersQuery { });
if (result.IsSuccess) if (result.IsSuccess)
{ {

View File

@@ -14,6 +14,7 @@
<None Include="docker-compose.espp-order-manager.yml" /> <None Include="docker-compose.espp-order-manager.yml" />
<None Include="docker-compose.espp-template-sync.yml" /> <None Include="docker-compose.espp-template-sync.yml" />
<None Include="docker-compose.generator-templates.yml" /> <None Include="docker-compose.generator-templates.yml" />
<None Include="docker-compose.master.yml" />
<None Include="docker-compose.yml" /> <None Include="docker-compose.yml" />
<None Include=".dockerignore" /> <None Include=".dockerignore" />
<None Include="stack.yml" /> <None Include="stack.yml" />