Add operation kind

This commit is contained in:
2025-11-16 17:41:58 +09:00
parent 6abff9cc7e
commit a4055bee7e
10 changed files with 129 additions and 8 deletions

View File

@ -8,6 +8,7 @@ namespace Hcs.WebApp.BackgroundServices
CampaignManagementState campaignManagementState,
OperationExecutionState operationExecutionState,
ResultGetState resultGetState,
DataParsingState dataParsingState,
ManagerFactory managerFactory,
IServiceScopeFactory scopeFactory) : BackgroundService
{
@ -18,6 +19,7 @@ namespace Hcs.WebApp.BackgroundServices
private readonly CampaignManagementState campaignManagementState = campaignManagementState;
private readonly OperationExecutionState operationExecutionState = operationExecutionState;
private readonly ResultGetState resultGetState = resultGetState;
private readonly DataParsingState dataParsingState = dataParsingState;
private readonly ManagerFactory managerFactory = managerFactory;
private readonly IServiceScopeFactory scopeFactory = scopeFactory;
private readonly List<IManager> managers = [];
@ -75,7 +77,7 @@ namespace Hcs.WebApp.BackgroundServices
private async Task WaitForOtherStates()
{
while (!operationExecutionState.Ready || !resultGetState.Ready)
while (!operationExecutionState.Ready || !resultGetState.Ready || !dataParsingState.Ready)
{
await Task.Delay(STATES_WAIT_TIME);
}

View File

@ -9,7 +9,10 @@ namespace Hcs.WebApp.BackgroundServices.DataParsers
{
return operation.Type switch
{
Operation.OperationType.ParseHousesData_15_7_0_1 => new HousesDataParser_15_7_0_1(client, scope, operation)
Operation.OperationType.ParseHousesData_15_7_0_1 => new HousesDataParser_15_7_0_1(client, scope, operation),
Operation.OperationType.NsiCommon_ExportNsiItem_15_7_0_1 or
Operation.OperationType.Nsi_ExportNsiItem_15_7_0_1 => throw new ArgumentException($"Нельзя использовать операцию с типом {operation.Type} для парсинга")
};
}
}

View File

@ -1,6 +1,34 @@
namespace Hcs.WebApp.BackgroundServices
using Hcs.WebApp.BackgroundServices.DataParsers;
using Hcs.WebApp.Services;
namespace Hcs.WebApp.BackgroundServices
{
public class DataParsingService
public class DataParsingService(
DataParsingState state,
DataParserFactory dataParserFactory,
IServiceScopeFactory scopeFactory) : BackgroundService
{
private readonly DataParsingState state = state;
private readonly DataParserFactory dataParserFactory = dataParserFactory;
private readonly IServiceScopeFactory scopeFactory = scopeFactory;
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
await InitializeStateAsync();
}
private async Task InitializeStateAsync()
{
using var scope = scopeFactory.CreateScope();
var headquartersService = scope.ServiceProvider.GetRequiredService<HeadquartersService>();
var operations = await headquartersService.GetResultWaitingOperationsAsync();
foreach (var operation in operations)
{
state.EnqueueOperation(operation);
}
state.Ready = true;
}
}
}

View File

@ -1,6 +1,62 @@
namespace Hcs.WebApp.BackgroundServices
using Hcs.WebApp.Data.Hcs;
using System.Collections.Concurrent;
namespace Hcs.WebApp.BackgroundServices
{
public class DataParsingState
{
private readonly ConcurrentQueue<Operation> operationsInQueue = new();
private readonly HashSet<Operation> operationsInProcess = [];
public bool Ready { get; set; }
public event Action<Operation> OnOperationCreated;
public event OperationStarted OnOperationStarted;
public event OperationEnded OnOperationEnded;
public void EnqueueOperation(Operation operation)
{
operationsInQueue.Enqueue(operation);
OnOperationCreated?.Invoke(operation);
}
public bool TryDequeueOperation(out Operation operation)
{
return operationsInQueue.TryDequeue(out operation);
}
public void SetProcessingOperation(Operation operation)
{
operationsInProcess.Add(operation);
}
public void UnsetProcessingOperation(Operation operation)
{
operationsInProcess.Remove(operation);
}
public bool HasCampaignOperation(int campaignId)
{
return operationsInQueue.Any(x => x.CampaignId == campaignId) || operationsInProcess.Any(x => x.CampaignId == campaignId);
}
public void InvokeOnOperationStarted(int operationId, int campaignId, DateTime startedAt)
{
try
{
OnOperationStarted?.Invoke(operationId, campaignId, startedAt);
}
catch { }
}
public void InvokeOnOperationEnded(int operationId, int campaignId, DateTime endedAt, string failureReason)
{
try
{
OnOperationEnded?.Invoke(operationId, campaignId, endedAt, failureReason);
}
catch { }
}
}
}

View File

@ -9,7 +9,7 @@ namespace Hcs.WebApp.BackgroundServices
public event OperationExecuted OnOperationExecuted;
public event OperationEnded OnOperationEnded;
public EventsAggregator(OperationExecutionState operationExecutionState, ResultGetState resultGetState)
public EventsAggregator(OperationExecutionState operationExecutionState, ResultGetState resultGetState, DataParsingState dataParsingState)
{
operationExecutionState.OnOperationCreated += (a) => OnOperationCreated?.Invoke(a);
operationExecutionState.OnOperationStarted += (a, b, c) => OnOperationStarted?.Invoke(a, b, c);
@ -17,6 +17,10 @@ namespace Hcs.WebApp.BackgroundServices
operationExecutionState.OnOperationEnded += (a, b, c, d) => OnOperationEnded?.Invoke(a, b, c, d);
resultGetState.OnOperationEnded += (a, b, c, d) => OnOperationEnded?.Invoke(a, b, c, d);
dataParsingState.OnOperationCreated += (a) => OnOperationCreated?.Invoke(a);
dataParsingState.OnOperationStarted += (a, b, c) => OnOperationStarted?.Invoke(a, b, c);
dataParsingState.OnOperationEnded += (a, b, c, d) => OnOperationEnded?.Invoke(a, b, c, d);
}
}
}

View File

@ -12,7 +12,9 @@ namespace Hcs.WebApp.BackgroundServices.OperationExecutors
return operation.Type switch
{
Operation.OperationType.Nsi_ExportNsiItem_15_7_0_1 => new ExportDataProviderNsiItemExecutor_15_7_0_1(client, scope, operation),
Operation.OperationType.NsiCommon_ExportNsiItem_15_7_0_1 => new ExportNsiItemExecutor_15_7_0_1(client, scope, operation)
Operation.OperationType.NsiCommon_ExportNsiItem_15_7_0_1 => new ExportNsiItemExecutor_15_7_0_1(client, scope, operation),
Operation.OperationType.ParseHousesData_15_7_0_1 => throw new ArgumentException($"Нельзя использовать операцию с типом {operation.Type} для обращения к ГИС ЖКХ")
};
}
}

View File

@ -12,7 +12,9 @@ namespace Hcs.WebApp.BackgroundServices.ResultGetters
return operation.Type switch
{
Operation.OperationType.Nsi_ExportNsiItem_15_7_0_1 => new ExportDataProviderNsiItemGetter_15_7_0_1(client, scope, operation),
Operation.OperationType.NsiCommon_ExportNsiItem_15_7_0_1 => new ExportNsiItemGetter_15_7_0_1(client, scope, operation)
Operation.OperationType.NsiCommon_ExportNsiItem_15_7_0_1 => new ExportNsiItemGetter_15_7_0_1(client, scope, operation),
Operation.OperationType.ParseHousesData_15_7_0_1 => throw new ArgumentException($"Нельзя использовать операцию с типом {operation.Type} для получения результата с ГИС ЖКХ")
};
}
}