diff --git a/Hcs.WebApp/Components/Layout/MainLayout.razor b/Hcs.WebApp/Components/Layout/MainLayout.razor
index ab2185c..a871193 100644
--- a/Hcs.WebApp/Components/Layout/MainLayout.razor
+++ b/Hcs.WebApp/Components/Layout/MainLayout.razor
@@ -33,6 +33,7 @@
+
diff --git a/Hcs.WebApp/Components/Pages/Objects/Accounts.razor b/Hcs.WebApp/Components/Pages/Objects/Accounts.razor
new file mode 100644
index 0000000..94272dc
--- /dev/null
+++ b/Hcs.WebApp/Components/Pages/Objects/Accounts.razor
@@ -0,0 +1,59 @@
+@page "/objects/accounts"
+
+@using Hcs.WebApp.Services
+@using Microsoft.AspNetCore.Authorization
+@using System.Security.Claims
+
+@inherits DataPageBase
+
+@attribute [Authorize]
+
+@inject AccountService AccountService
+
+Лицевые счета
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+@code {
+ protected override Campaign.CampaignType? SyncCampaignType => Campaign.CampaignType.ExportSupplyContracts_15_7_0_1;
+
+ protected override Campaign.CampaignType? ParseCampaignType => null;
+
+ protected override bool HasPermission(ClaimsPrincipal user)
+ {
+ return user.IsOperatorOrHigher();
+ }
+
+ protected override Task> GetDataAsync()
+ {
+ return AccountService.GetAllAccountsAsync();
+ }
+}
diff --git a/Hcs.WebApp/Components/Pages/Objects/Houses.razor b/Hcs.WebApp/Components/Pages/Objects/Houses.razor
index fc6e83a..f8103c4 100644
--- a/Hcs.WebApp/Components/Pages/Objects/Houses.razor
+++ b/Hcs.WebApp/Components/Pages/Objects/Houses.razor
@@ -4,7 +4,7 @@
@using Microsoft.AspNetCore.Authorization
@using System.Security.Claims
-@inherits SyncedPageBase
+@inherits DataPageBase
@attribute [Authorize]
@@ -21,13 +21,13 @@
-
+
-
+
@@ -59,7 +59,9 @@
@code {
- protected override Campaign.CampaignType CampaignType => Campaign.CampaignType.ParseHousesData_15_7_0_1;
+ protected override Campaign.CampaignType? SyncCampaignType => null;
+
+ protected override Campaign.CampaignType? ParseCampaignType => Campaign.CampaignType.ParseHousesData_15_7_0_1;
protected override bool HasPermission(ClaimsPrincipal user)
{
diff --git a/Hcs.WebApp/Components/Pages/Objects/SupplyContracts.razor b/Hcs.WebApp/Components/Pages/Objects/SupplyContracts.razor
index 5a20b16..fe4885f 100644
--- a/Hcs.WebApp/Components/Pages/Objects/SupplyContracts.razor
+++ b/Hcs.WebApp/Components/Pages/Objects/SupplyContracts.razor
@@ -4,7 +4,7 @@
@using Microsoft.AspNetCore.Authorization
@using System.Security.Claims
-@inherits SyncedPageBase
+@inherits DataPageBase
@attribute [Authorize]
@@ -21,13 +21,13 @@
-
+
-
+
@@ -42,7 +42,9 @@
@code {
- protected override Campaign.CampaignType CampaignType => Campaign.CampaignType.ExportSupplyContracts_15_7_0_1;
+ protected override Campaign.CampaignType? SyncCampaignType => Campaign.CampaignType.ExportSupplyContracts_15_7_0_1;
+
+ protected override Campaign.CampaignType? ParseCampaignType => null;
protected override bool HasPermission(ClaimsPrincipal user)
{
diff --git a/Hcs.WebApp/Components/Pages/Registry/Common.razor b/Hcs.WebApp/Components/Pages/Registry/Common.razor
index eb9d081..6090676 100644
--- a/Hcs.WebApp/Components/Pages/Registry/Common.razor
+++ b/Hcs.WebApp/Components/Pages/Registry/Common.razor
@@ -5,7 +5,7 @@
@using Microsoft.AspNetCore.Authorization
@using System.Security.Claims
-@inherits SyncedPageBase
+@inherits DataPageBase
@attribute [Authorize]
@@ -22,13 +22,13 @@
-
+
-
+
@@ -55,7 +55,9 @@
@code {
- protected override Campaign.CampaignType CampaignType => Campaign.CampaignType.ExportCommonRegistryElements_15_7_0_1;
+ protected override Campaign.CampaignType? SyncCampaignType => Campaign.CampaignType.ExportCommonRegistryElements_15_7_0_1;
+
+ protected override Campaign.CampaignType? ParseCampaignType => null;
protected override bool HasPermission(ClaimsPrincipal user)
{
diff --git a/Hcs.WebApp/Components/Pages/Registry/Private.razor b/Hcs.WebApp/Components/Pages/Registry/Private.razor
index de1c92b..0ef6274 100644
--- a/Hcs.WebApp/Components/Pages/Registry/Private.razor
+++ b/Hcs.WebApp/Components/Pages/Registry/Private.razor
@@ -5,7 +5,7 @@
@using Microsoft.AspNetCore.Authorization
@using System.Security.Claims
-@inherits SyncedPageBase
+@inherits DataPageBase
@attribute [Authorize]
@@ -22,13 +22,13 @@
-
+
-
+
@@ -55,7 +55,9 @@
@code {
- protected override Campaign.CampaignType CampaignType => Campaign.CampaignType.ExportPrivateRegistryElements_15_7_0_1;
+ protected override Campaign.CampaignType? SyncCampaignType => Campaign.CampaignType.ExportPrivateRegistryElements_15_7_0_1;
+
+ protected override Campaign.CampaignType? ParseCampaignType => null;
protected override bool HasPermission(ClaimsPrincipal user)
{
diff --git a/Hcs.WebApp/Components/Shared/SyncedPageBase.cs b/Hcs.WebApp/Components/Shared/DataPageBase.cs
similarity index 69%
rename from Hcs.WebApp/Components/Shared/SyncedPageBase.cs
rename to Hcs.WebApp/Components/Shared/DataPageBase.cs
index a1a063b..92974b9 100644
--- a/Hcs.WebApp/Components/Shared/SyncedPageBase.cs
+++ b/Hcs.WebApp/Components/Shared/DataPageBase.cs
@@ -10,14 +10,18 @@ using System.Security.Claims;
namespace Hcs.WebApp.Components.Shared
{
- public abstract class SyncedPageBase : ComponentBase, IDisposable
+ public abstract class DataPageBase : ComponentBase, IDisposable
{
- protected SyncedPageState state;
+ protected DataPageState state;
protected IEnumerable data;
protected string syncButtonText = "...";
protected string parseButtonText = "...";
- protected abstract Campaign.CampaignType CampaignType { get; }
+ private readonly List campaignTypes = [];
+
+ protected abstract Campaign.CampaignType? SyncCampaignType { get; }
+
+ protected abstract Campaign.CampaignType? ParseCampaignType { get; }
[Inject]
private AuthenticationStateProvider AuthenticationStateProvider { get; set; }
@@ -31,20 +35,34 @@ namespace Hcs.WebApp.Components.Shared
[Inject]
protected DialogService DialogService { get; set; }
+ protected override void OnInitialized()
+ {
+ campaignTypes.Clear();
+
+ if (SyncCampaignType.HasValue)
+ {
+ campaignTypes.Add(SyncCampaignType.Value);
+ }
+ if (ParseCampaignType.HasValue)
+ {
+ campaignTypes.Add(ParseCampaignType.Value);
+ }
+ }
+
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
- ChangeState(SyncedPageState.Init);
+ ChangeState(DataPageState.Init);
- var finalState = SyncedPageState.Idle;
+ var finalState = DataPageState.Idle;
var state = await AuthenticationStateProvider.GetAuthenticationStateAsync();
if (HasPermission(state.User))
{
- var operationInProgress = await HeadquartersService.HasActiveCampaignAsync(CampaignType);
+ var operationInProgress = await HeadquartersService.HasActiveCampaignsAsync(campaignTypes);
if (operationInProgress)
{
- finalState = SyncedPageState.SyncWaiting;
+ finalState = DataPageState.DataWaiting;
}
CampaignManagementState.OnCampaignCreated += OnCampaignCreated;
@@ -69,29 +87,29 @@ namespace Hcs.WebApp.Components.Shared
protected async Task SyncDataAsync()
{
- if (state == SyncedPageState.SyncWaiting) return;
+ if (state == DataPageState.DataWaiting) return;
- ChangeState(SyncedPageState.SyncWaiting);
+ ChangeState(DataPageState.DataWaiting);
- if (await HeadquartersService.HasActiveCampaignAsync(CampaignType))
+ if (await HeadquartersService.HasActiveCampaignsAsync(campaignTypes))
{
- ChangeState(SyncedPageState.SyncWaiting);
+ ChangeState(DataPageState.DataWaiting);
}
else
{
// TODO: Use user id
- var campaign = await HeadquartersService.InitiateCampaignAsync(CampaignType, "");
+ var campaign = await HeadquartersService.InitiateCampaignAsync(SyncCampaignType!.Value, "");
CampaignManagementState.EnqueueCampaign(campaign);
}
}
protected async Task ParseDataAsync()
{
- if (state == SyncedPageState.SyncWaiting) return;
+ if (state == DataPageState.DataWaiting) return;
- if (await HeadquartersService.HasActiveCampaignAsync(CampaignType))
+ if (await HeadquartersService.HasActiveCampaignsAsync(campaignTypes))
{
- ChangeState(SyncedPageState.SyncWaiting);
+ ChangeState(DataPageState.DataWaiting);
}
else
{
@@ -112,10 +130,10 @@ namespace Hcs.WebApp.Components.Shared
if (dialogResult != null)
{
- ChangeState(SyncedPageState.SyncWaiting);
+ ChangeState(DataPageState.DataWaiting);
// TODO: Use user id
- var campaign = await HeadquartersService.InitiateCampaignAsync(CampaignType, "", new CampaignParseArgs()
+ var campaign = await HeadquartersService.InitiateCampaignAsync(ParseCampaignType!.Value, "", new CampaignParseArgs()
{
fileToParseId = (int)dialogResult
});
@@ -124,7 +142,7 @@ namespace Hcs.WebApp.Components.Shared
}
}
- private void ChangeState(SyncedPageState state)
+ private void ChangeState(DataPageState state)
{
if (this.state == state) return;
@@ -138,18 +156,18 @@ namespace Hcs.WebApp.Components.Shared
{
switch (state)
{
- case SyncedPageState.Init:
+ case DataPageState.Init:
syncButtonText = "...";
parseButtonText = "...";
break;
- case SyncedPageState.Loading:
- case SyncedPageState.Idle:
+ case DataPageState.Loading:
+ case DataPageState.Idle:
syncButtonText = "Синхронизировать";
parseButtonText = "Спарсить";
break;
- case SyncedPageState.SyncWaiting:
+ case DataPageState.DataWaiting:
syncButtonText = "Идет синхронизация...";
parseButtonText = "Идет парсинг...";
break;
@@ -158,15 +176,15 @@ namespace Hcs.WebApp.Components.Shared
private void OnCampaignCreated(Campaign campaign)
{
- if (campaign.Type == CampaignType)
+ if (campaignTypes.Contains(campaign.Type))
{
- InvokeAsync(() => ChangeState(SyncedPageState.SyncWaiting));
+ InvokeAsync(() => ChangeState(DataPageState.DataWaiting));
}
}
private void OnCampaignEnded(int campaignId, Campaign.CampaignType type, DateTime endedAt, string failureReason)
{
- if (type == CampaignType)
+ if (campaignTypes.Contains(type))
{
Task.Run(RefreshData);
}
@@ -174,7 +192,7 @@ namespace Hcs.WebApp.Components.Shared
private async Task RefreshData()
{
- await InvokeAsync(() => ChangeState(SyncedPageState.Loading));
+ await InvokeAsync(() => ChangeState(DataPageState.Loading));
var refreshedData = await GetDataAsync();
@@ -182,7 +200,7 @@ namespace Hcs.WebApp.Components.Shared
{
data = refreshedData;
- ChangeState(SyncedPageState.Idle);
+ ChangeState(DataPageState.Idle);
});
}
}
diff --git a/Hcs.WebApp/Components/Shared/SyncedPageState.cs b/Hcs.WebApp/Components/Shared/DataPageState.cs
similarity index 66%
rename from Hcs.WebApp/Components/Shared/SyncedPageState.cs
rename to Hcs.WebApp/Components/Shared/DataPageState.cs
index 8435744..8111f2f 100644
--- a/Hcs.WebApp/Components/Shared/SyncedPageState.cs
+++ b/Hcs.WebApp/Components/Shared/DataPageState.cs
@@ -1,10 +1,10 @@
namespace Hcs.WebApp.Components.Shared
{
- public enum SyncedPageState
+ public enum DataPageState
{
Init,
Loading,
Idle,
- SyncWaiting
+ DataWaiting
}
}
diff --git a/Hcs.WebApp/Program.cs b/Hcs.WebApp/Program.cs
index c72ce9b..0d78aab 100644
--- a/Hcs.WebApp/Program.cs
+++ b/Hcs.WebApp/Program.cs
@@ -73,6 +73,7 @@ builder.Services.AddScoped();
builder.Services.AddScoped();
builder.Services.AddScoped();
builder.Services.AddScoped();
+builder.Services.AddScoped();
builder.Services.AddSingleton();
builder.Services.AddSingleton();
diff --git a/Hcs.WebApp/Services/AccountService.cs b/Hcs.WebApp/Services/AccountService.cs
new file mode 100644
index 0000000..843c543
--- /dev/null
+++ b/Hcs.WebApp/Services/AccountService.cs
@@ -0,0 +1,30 @@
+using EFCore.BulkExtensions;
+using Hcs.WebApp.Data.Hcs;
+using Microsoft.EntityFrameworkCore;
+
+namespace Hcs.WebApp.Services
+{
+ public class AccountService(IDbContextFactory factory) : HcsServiceBase(factory)
+ {
+ public async Task> GetAllAccountsAsync()
+ {
+ using var context = GetNewContext();
+ return await context.Accounts.ToListAsync();
+ }
+
+ public async Task UpsertAccounts(HcsDbContext context, IEnumerable accounts)
+ {
+ await context.BulkInsertOrUpdateAsync(accounts, new BulkConfig()
+ {
+ PropertiesToExcludeOnUpdate =
+ [
+ nameof(SupplyContract.ThirdPartyId)
+ ],
+ UpdateByProperties =
+ [
+ nameof(SupplyContract.HcsId)
+ ]
+ });
+ }
+ }
+}
diff --git a/Hcs.WebApp/Services/HeadquartersService.cs b/Hcs.WebApp/Services/HeadquartersService.cs
index c862e3c..473248d 100644
--- a/Hcs.WebApp/Services/HeadquartersService.cs
+++ b/Hcs.WebApp/Services/HeadquartersService.cs
@@ -6,10 +6,10 @@ namespace Hcs.WebApp.Services
{
public class HeadquartersService(IDbContextFactory factory) : HcsServiceBase(factory)
{
- public async Task HasActiveCampaignAsync(Campaign.CampaignType type)
+ public async Task HasActiveCampaignsAsync(IEnumerable types)
{
using var context = GetNewContext();
- return await context.Campaigns.AnyAsync(x => x.Type == type && !x.EndedAt.HasValue);
+ return await context.Campaigns.AnyAsync(x => types.Contains(x.Type) && !x.EndedAt.HasValue);
}
public async Task> GetCampaignsAsync()