Start operation implementation
This commit is contained in:
17
Hcs.WebApp/BackgroundServices/OperationExecutionService.cs
Normal file
17
Hcs.WebApp/BackgroundServices/OperationExecutionService.cs
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
namespace Hcs.WebApp.BackgroundServices
|
||||||
|
{
|
||||||
|
public class OperationExecutionService(OperationExecutionState state) : BackgroundService
|
||||||
|
{
|
||||||
|
private readonly OperationExecutionState state = state;
|
||||||
|
|
||||||
|
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
|
||||||
|
{
|
||||||
|
while (!stoppingToken.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
await Task.Delay(10000, stoppingToken);
|
||||||
|
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
27
Hcs.WebApp/BackgroundServices/OperationExecutionState.cs
Normal file
27
Hcs.WebApp/BackgroundServices/OperationExecutionState.cs
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
using Hcs.WebApp.Data.Hcs;
|
||||||
|
using System.Collections.Concurrent;
|
||||||
|
|
||||||
|
namespace Hcs.WebApp.BackgroundServices
|
||||||
|
{
|
||||||
|
public class OperationExecutionState
|
||||||
|
{
|
||||||
|
private readonly ConcurrentQueue<Operation> operations = new();
|
||||||
|
|
||||||
|
public event Action<Operation> OnOperationStarted;
|
||||||
|
|
||||||
|
public void EnqueueOperation(Operation operation)
|
||||||
|
{
|
||||||
|
operations.Enqueue(operation);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool TryDequeueOperation(out Operation operation)
|
||||||
|
{
|
||||||
|
return operations.TryDequeue(out operation);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void InvokeOnOperationStarted(Operation operation)
|
||||||
|
{
|
||||||
|
OnOperationStarted?.Invoke(operation);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,18 +1,22 @@
|
|||||||
@page "/registry/common"
|
@page "/registry/common"
|
||||||
|
|
||||||
@using System.IdentityModel.Claims
|
@using System.IdentityModel.Claims
|
||||||
|
@using Hcs.WebApp.BackgroundServices
|
||||||
@using Hcs.WebApp.Components.Dialogs
|
@using Hcs.WebApp.Components.Dialogs
|
||||||
@using Hcs.WebApp.Services
|
@using Hcs.WebApp.Services
|
||||||
@using Microsoft.AspNetCore.Authorization
|
@using Microsoft.AspNetCore.Authorization
|
||||||
@using Microsoft.AspNetCore.Identity
|
@using Microsoft.AspNetCore.Identity
|
||||||
@using Microsoft.EntityFrameworkCore
|
@using Microsoft.EntityFrameworkCore
|
||||||
|
|
||||||
|
@implements IDisposable
|
||||||
|
|
||||||
@attribute [Authorize]
|
@attribute [Authorize]
|
||||||
|
|
||||||
@inject AuthenticationStateProvider AuthenticationStateProvider
|
@inject AuthenticationStateProvider AuthenticationStateProvider
|
||||||
@inject OperationService OperationService
|
@inject OperationService OperationService
|
||||||
@inject RegistryService RegistryService
|
@inject RegistryService RegistryService
|
||||||
@inject DialogService DialogService
|
@inject DialogService DialogService
|
||||||
|
@inject OperationExecutionState OperationExecutionState
|
||||||
|
|
||||||
<PageTitle>Общие справочники подсистемы НСИ</PageTitle>
|
<PageTitle>Общие справочники подсистемы НСИ</PageTitle>
|
||||||
|
|
||||||
@ -74,7 +78,6 @@
|
|||||||
if (firstRender)
|
if (firstRender)
|
||||||
{
|
{
|
||||||
ChangeState(CommonPageState.Init);
|
ChangeState(CommonPageState.Init);
|
||||||
StateHasChanged();
|
|
||||||
|
|
||||||
var finalState = CommonPageState.Idle;
|
var finalState = CommonPageState.Idle;
|
||||||
var state = await AuthenticationStateProvider.GetAuthenticationStateAsync();
|
var state = await AuthenticationStateProvider.GetAuthenticationStateAsync();
|
||||||
@ -89,16 +92,29 @@
|
|||||||
{
|
{
|
||||||
registries = await RegistryService.GetAllRegistries(true);
|
registries = await RegistryService.GetAllRegistries(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
OperationExecutionState.OnOperationStarted += OnOperationStarted;
|
||||||
}
|
}
|
||||||
|
|
||||||
ChangeState(finalState);
|
ChangeState(finalState);
|
||||||
StateHasChanged();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async Task SyncRegistries()
|
async Task SyncRegistries()
|
||||||
{
|
{
|
||||||
// TODO
|
if (state == CommonPageState.OperationWaiting) return;
|
||||||
|
|
||||||
|
ChangeState(CommonPageState.OperationWaiting);
|
||||||
|
|
||||||
|
if (await OperationService.HasActiveOperation(Operation.OperationType.Nsi_15_7_0_1_ExportAllRegistryElements))
|
||||||
|
{
|
||||||
|
ChangeState(CommonPageState.Idle);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var operation = await OperationService.InitiateOperation(Operation.OperationType.Nsi_15_7_0_1_ExportAllRegistryElements, "");
|
||||||
|
OperationExecutionState.EnqueueOperation(operation);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async Task ViewRegistry(Registry userWithRole)
|
async Task ViewRegistry(Registry userWithRole)
|
||||||
@ -118,9 +134,12 @@
|
|||||||
|
|
||||||
void ChangeState(CommonPageState state)
|
void ChangeState(CommonPageState state)
|
||||||
{
|
{
|
||||||
|
if (this.state == state) return;
|
||||||
|
|
||||||
this.state = state;
|
this.state = state;
|
||||||
|
|
||||||
SetSyncText();
|
SetSyncText();
|
||||||
|
StateHasChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetSyncText()
|
void SetSyncText()
|
||||||
@ -141,4 +160,17 @@
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OnOperationStarted(Operation operation)
|
||||||
|
{
|
||||||
|
if (operation.Type == Operation.OperationType.Nsi_15_7_0_1_ExportAllRegistryElements)
|
||||||
|
{
|
||||||
|
InvokeAsync(() => ChangeState(CommonPageState.OperationWaiting));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
OperationExecutionState.OnOperationStarted -= OnOperationStarted;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,3 +1,4 @@
|
|||||||
|
using Hcs.WebApp.BackgroundServices;
|
||||||
using Hcs.WebApp.Components;
|
using Hcs.WebApp.Components;
|
||||||
using Hcs.WebApp.Components.Shared;
|
using Hcs.WebApp.Components.Shared;
|
||||||
using Hcs.WebApp.Data.Hcs;
|
using Hcs.WebApp.Data.Hcs;
|
||||||
@ -60,6 +61,9 @@ builder.Services.AddScoped<UsersService>();
|
|||||||
builder.Services.AddScoped<OperationService>();
|
builder.Services.AddScoped<OperationService>();
|
||||||
builder.Services.AddScoped<RegistryService>();
|
builder.Services.AddScoped<RegistryService>();
|
||||||
|
|
||||||
|
builder.Services.AddSingleton<OperationExecutionState>();
|
||||||
|
builder.Services.AddHostedService<OperationExecutionService>();
|
||||||
|
|
||||||
var activator = new RadzenComponentActivator();
|
var activator = new RadzenComponentActivator();
|
||||||
activator.Override(typeof(RadzenDataGrid<>), typeof(LocalizedRadzenDataGrid<>));
|
activator.Override(typeof(RadzenDataGrid<>), typeof(LocalizedRadzenDataGrid<>));
|
||||||
builder.Services.AddSingleton<IComponentActivator>(activator);
|
builder.Services.AddSingleton<IComponentActivator>(activator);
|
||||||
|
|||||||
@ -12,5 +12,19 @@ namespace Hcs.WebApp.Services
|
|||||||
using var context = factory.CreateDbContext();
|
using var context = factory.CreateDbContext();
|
||||||
return await context.Operations.AnyAsync(x => x.Type == type && !x.EndedAt.HasValue);
|
return await context.Operations.AnyAsync(x => x.Type == type && !x.EndedAt.HasValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<Operation> InitiateOperation(Operation.OperationType type, string initiatorId)
|
||||||
|
{
|
||||||
|
using var context = factory.CreateDbContext();
|
||||||
|
var operation = new Operation()
|
||||||
|
{
|
||||||
|
Type = type,
|
||||||
|
InitiatorId = initiatorId,
|
||||||
|
StartedAt = DateTime.UtcNow
|
||||||
|
};
|
||||||
|
await context.Operations.AddAsync(operation);
|
||||||
|
await context.SaveChangesAsync();
|
||||||
|
return operation;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user