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.ScheduleTimezone), Description = "Расписание регламентной работы - В каком часовом поясе", Value = "MSK" },
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 =>
{
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 = "Агент завершил выполнение задания" }
);
});

View File

@@ -53,5 +53,10 @@
/// </summary>
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",
Description = "Расписание регламентной работы - Диапазн повторов",
Value = "Отсутствует дата завершения"
},
new
{
Name = "OrderSearchDeltaDate",
Description = "Промежуток времени для поиска нарядов в ЕСПП",
Value = "01:30:00"
});
});

View File

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

View File

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

View File

@@ -5,5 +5,8 @@
/// </summary>
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
{
/// <summary>
/// Фильтр запроса в ЕСПП на поиск объектов
/// </summary>
public class FindOrdersQuery
{
//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.DAL;
using PARR.EsppApi;
using PARR.EsppOrderLoader.Settings;
namespace PARR.EsppOrderLoader
{
@@ -14,14 +15,11 @@ namespace PARR.EsppOrderLoader
services.InstallDalServices(configuration);
services.InstallEsppApiServices(configuration);
// settings
//SettingsFromDb configuration
//var settingsFromDb = new SettingsFromDb();
//configuration.GetSection(nameof(SettingsFromDb)).Bind(settingsFromDb);
//services.AddSingleton(settingsFromDb);
var settings = new WorkerSettings();
configuration.GetSection(nameof(WorkerSettings)).Bind(settings);
services.AddSingleton(settings);
//add other services
//services.AddTransient<IEsppApiService, EsppApiService>();
services.AddTransient<IEsppOrderLoader, EsppOrderLoader>();
}
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
{
public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger;
private readonly IEsppOrderLoader esppOrderLoader;
public Worker(ILogger<Worker> logger)
public Worker(ILogger<Worker> logger, IEsppOrderLoader esppOrderLoader)
{
_logger = logger;
this.esppOrderLoader = esppOrderLoader;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
//while (!stoppingToken.IsCancellationRequested)
//{
// _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
// await Task.Delay(1000, stoppingToken);
//}
await esppOrderLoader.StartAsync();
//_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
////while (!stoppingToken.IsCancellationRequested)
////{
//// _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()
{
// var orders = await esppApiService.FindOrdersByPrefixAsync("ПАРР__");
var result = await esppApiService.FindOrdersByPrefixAsync(new FindOrdersQuery { });
var result = await esppApiService.FindOrdersAsync(new FindOrdersQuery { });
if (result.IsSuccess)
{

View File

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