From a91dd6d03470d6b4e1ff121fbf6d8a55ca577172 Mon Sep 17 00:00:00 2001 From: "HOME-LAPTOP\\kshkulev" Date: Mon, 3 Nov 2025 19:11:57 +0900 Subject: [PATCH] Notify clients when campaign ends --- .../CampaignManagementService.cs | 8 +++++++ .../CampaignManagementState.cs | 10 +++++++++ .../CampaignManagers/IManager.cs | 6 ++++- .../CampaignManagers/ManagerBase.cs | 2 ++ .../Components/Pages/Registry/Common.razor | 22 +++++++++++++++++++ 5 files changed, 47 insertions(+), 1 deletion(-) diff --git a/Hcs.WebApp/BackgroundServices/CampaignManagementService.cs b/Hcs.WebApp/BackgroundServices/CampaignManagementService.cs index 6aac2ed..22bd00b 100644 --- a/Hcs.WebApp/BackgroundServices/CampaignManagementService.cs +++ b/Hcs.WebApp/BackgroundServices/CampaignManagementService.cs @@ -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(); 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); diff --git a/Hcs.WebApp/BackgroundServices/CampaignManagementState.cs b/Hcs.WebApp/BackgroundServices/CampaignManagementState.cs index 8e494ac..46f3bfb 100644 --- a/Hcs.WebApp/BackgroundServices/CampaignManagementState.cs +++ b/Hcs.WebApp/BackgroundServices/CampaignManagementState.cs @@ -8,6 +8,7 @@ namespace Hcs.WebApp.BackgroundServices private readonly ConcurrentQueue campaigns = new(); public event Action OnCampaignCreated; + public event Action 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 { } + } } } diff --git a/Hcs.WebApp/BackgroundServices/CampaignManagers/IManager.cs b/Hcs.WebApp/BackgroundServices/CampaignManagers/IManager.cs index 20a55d6..724aab6 100644 --- a/Hcs.WebApp/BackgroundServices/CampaignManagers/IManager.cs +++ b/Hcs.WebApp/BackgroundServices/CampaignManagers/IManager.cs @@ -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(); diff --git a/Hcs.WebApp/BackgroundServices/CampaignManagers/ManagerBase.cs b/Hcs.WebApp/BackgroundServices/CampaignManagers/ManagerBase.cs index e11b52d..a1533bd 100644 --- a/Hcs.WebApp/BackgroundServices/CampaignManagers/ManagerBase.cs +++ b/Hcs.WebApp/BackgroundServices/CampaignManagers/ManagerBase.cs @@ -18,6 +18,8 @@ namespace Hcs.WebApp.BackgroundServices.CampaignManagers protected HeadquartersService HeadquartersService => headquartersService ??= scope.ServiceProvider.GetRequiredService(); + public Campaign Campaign => campaign; + public IManager.ManagerState State { get; protected set; } = IManager.ManagerState.Created; public abstract Task ProcessAsync(); diff --git a/Hcs.WebApp/Components/Pages/Registry/Common.razor b/Hcs.WebApp/Components/Pages/Registry/Common.razor index 53aa351..05669b2 100644 --- a/Hcs.WebApp/Components/Pages/Registry/Common.razor +++ b/Hcs.WebApp/Components/Pages/Registry/Common.razor @@ -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; } }