Notify clients when campaign ends

This commit is contained in:
2025-11-03 19:11:57 +09:00
parent ae4d30d27b
commit a91dd6d034
5 changed files with 47 additions and 1 deletions

View File

@ -1,4 +1,5 @@
using Hcs.WebApp.BackgroundServices.CampaignManagers;
using Hcs.WebApp.Data.Hcs;
using Hcs.WebApp.Services;
namespace Hcs.WebApp.BackgroundServices
@ -42,6 +43,8 @@ namespace Hcs.WebApp.BackgroundServices
using var scope = scopeFactory.CreateScope();
var headquartersService = scope.ServiceProvider.GetRequiredService<HeadquartersService>();
await headquartersService.SetCampaignEndedWithFailAsync(campaign.Id, "Не удалось найти подходящий менеджер кампании");
campaignManagementState.InvokeOnCampaignEnded(campaign);
}
}
@ -55,6 +58,11 @@ namespace Hcs.WebApp.BackgroundServices
{
await manager.EndWithFailAsync(e);
}
if (manager.State == IManager.ManagerState.Ended)
{
campaignManagementState.InvokeOnCampaignEnded(manager.Campaign);
}
}
managers.RemoveAll(x => x.State == IManager.ManagerState.Ended);

View File

@ -8,6 +8,7 @@ namespace Hcs.WebApp.BackgroundServices
private readonly ConcurrentQueue<Campaign> campaigns = new();
public event Action<Campaign> OnCampaignCreated;
public event Action<Campaign> OnCampaignEnded;
public void EnqueueCampaign(Campaign campaign)
{
@ -20,5 +21,14 @@ namespace Hcs.WebApp.BackgroundServices
{
return campaigns.TryDequeue(out campaign);
}
public void InvokeOnCampaignEnded(Campaign campaign)
{
try
{
OnCampaignEnded?.Invoke(campaign);
}
catch { }
}
}
}

View File

@ -1,4 +1,6 @@
namespace Hcs.WebApp.BackgroundServices.CampaignManagers
using Hcs.WebApp.Data.Hcs;
namespace Hcs.WebApp.BackgroundServices.CampaignManagers
{
public interface IManager
{
@ -9,6 +11,8 @@
Ended
}
public Campaign Campaign { get; }
public ManagerState State { get; }
Task ProcessAsync();

View File

@ -18,6 +18,8 @@ namespace Hcs.WebApp.BackgroundServices.CampaignManagers
protected HeadquartersService HeadquartersService => headquartersService ??= scope.ServiceProvider.GetRequiredService<HeadquartersService>();
public Campaign Campaign => campaign;
public IManager.ManagerState State { get; protected set; } = IManager.ManagerState.Created;
public abstract Task ProcessAsync();

View File

@ -90,6 +90,7 @@
}
CampaignManagementState.OnCampaignCreated += OnCampaignCreated;
CampaignManagementState.OnCampaignEnded += OnCampaignEnded;
registries = await RegistryService.GetAllRegistriesAsync(true);
}
@ -168,8 +169,29 @@
}
}
void OnCampaignEnded(Campaign campaign)
{
if (campaign.Type == Campaign.CampaignType.ExportCommonRegistryElements_15_7_0_1)
{
InvokeAsync(() => Task.Run(RefreshRegistries));
}
}
async Task RefreshRegistries()
{
ChangeState(CommonPageState.Loading);
registries = await RegistryService.GetAllRegistriesAsync(true);
if (state != CommonPageState.OperationWaiting)
{
ChangeState(CommonPageState.Idle);
}
}
public void Dispose()
{
CampaignManagementState.OnCampaignCreated -= OnCampaignCreated;
CampaignManagementState.OnCampaignEnded -= OnCampaignEnded;
}
}