Add accounts page

This commit is contained in:
2025-11-27 09:37:18 +09:00
parent 28cfe99c78
commit bca845296a
11 changed files with 164 additions and 47 deletions

View File

@ -33,6 +33,7 @@
<RadzenPanelMenuItem Text="Объекты" Icon="business_center"> <RadzenPanelMenuItem Text="Объекты" Icon="business_center">
<RadzenPanelMenuItem Path="/objects/houses" Text="Жилищный фонд" /> <RadzenPanelMenuItem Path="/objects/houses" Text="Жилищный фонд" />
<RadzenPanelMenuItem Path="/objects/supply-contracts" Text="Договора ресурсоснабжения" /> <RadzenPanelMenuItem Path="/objects/supply-contracts" Text="Договора ресурсоснабжения" />
<RadzenPanelMenuItem Path="/objects/accounts" Text="Лицевые счета" />
</RadzenPanelMenuItem> </RadzenPanelMenuItem>
<RadzenPanelMenuItem Text="Справочники" Icon="book_2"> <RadzenPanelMenuItem Text="Справочники" Icon="book_2">
<RadzenPanelMenuItem Path="/registry/common" Text="Общие" /> <RadzenPanelMenuItem Path="/registry/common" Text="Общие" />

View File

@ -0,0 +1,59 @@
@page "/objects/accounts"
@using Hcs.WebApp.Services
@using Microsoft.AspNetCore.Authorization
@using System.Security.Claims
@inherits DataPageBase<Account>
@attribute [Authorize]
@inject AccountService AccountService
<PageTitle>Лицевые счета</PageTitle>
<AuthorizedContent Roles="@($"{AppRole.ADMINISTRATOR_TYPE},{AppRole.OPERATOR_TYPE}")">
<Content>
<RadzenStack>
<RadzenRow AlignItems="AlignItems.Center">
<RadzenColumn Size="12" SizeMD="6">
<RadzenText Text="Лицевые счета" TextStyle="TextStyle.H5" class="rz-m-0" />
</RadzenColumn>
<RadzenColumn Size="12" SizeMD="6">
<RadzenStack Orientation="Orientation.Horizontal" AlignItems="AlignItems.Center" JustifyContent="JustifyContent.End" Gap="0.5rem">
<RadzenButton Icon="upload_file" Text="@parseButtonText" Disabled="@(state != DataPageState.Idle)" Click="@ParseDataAsync" ButtonStyle="ButtonStyle.Primary" />
<RadzenButton Icon="sync" Text="@syncButtonText" Disabled="@(state != DataPageState.Idle)" Click="@SyncDataAsync" ButtonStyle="ButtonStyle.Primary" />
</RadzenStack>
</RadzenColumn>
</RadzenRow>
<RadzenRow>
<RadzenColumn SizeMD="12">
<RadzenDataGrid TItem="Account" Data="@data" IsLoading="@(state != DataPageState.Idle)" AllowFiltering="true" AllowPaging="true" ShowPagingSummary="true" PageSizeOptions=@(new int[] { 5, 10, 20, 30 }) AllowSorting="true">
<Columns>
<RadzenDataGridColumn TItem="Account" Property="@nameof(SupplyContract.Id)" Title="ID" SortOrder="SortOrder.Descending" Resizable="false" Width="100px" MaxWidth="100px" />
<RadzenDataGridColumn TItem="Account" Property="@nameof(SupplyContract.HcsId)" Title="ID ГИС ЖКХ" />
<RadzenDataGridColumn TItem="Account" Property="@nameof(SupplyContract.ThirdPartyId)" Title="ID интеграции" />
<RadzenDataGridColumn TItem="Account" Property="@nameof(SupplyContract.SyncedAt)" Title="Дата синхронизации" />
</Columns>
</RadzenDataGrid>
</RadzenColumn>
</RadzenRow>
</RadzenStack>
</Content>
</AuthorizedContent>
@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<IEnumerable<Account>> GetDataAsync()
{
return AccountService.GetAllAccountsAsync();
}
}

View File

@ -4,7 +4,7 @@
@using Microsoft.AspNetCore.Authorization @using Microsoft.AspNetCore.Authorization
@using System.Security.Claims @using System.Security.Claims
@inherits SyncedPageBase<House> @inherits DataPageBase<House>
@attribute [Authorize] @attribute [Authorize]
@ -21,13 +21,13 @@
</RadzenColumn> </RadzenColumn>
<RadzenColumn Size="12" SizeMD="6"> <RadzenColumn Size="12" SizeMD="6">
<RadzenStack Orientation="Orientation.Horizontal" AlignItems="AlignItems.Center" JustifyContent="JustifyContent.End" Gap="0.5rem"> <RadzenStack Orientation="Orientation.Horizontal" AlignItems="AlignItems.Center" JustifyContent="JustifyContent.End" Gap="0.5rem">
<RadzenButton Icon="upload_file" Text="@parseButtonText" Disabled="@(state != SyncedPageState.Idle)" Click="@ParseDataAsync" ButtonStyle="ButtonStyle.Primary" /> <RadzenButton Icon="upload_file" Text="@parseButtonText" Disabled="@(state != DataPageState.Idle)" Click="@ParseDataAsync" ButtonStyle="ButtonStyle.Primary" />
</RadzenStack> </RadzenStack>
</RadzenColumn> </RadzenColumn>
</RadzenRow> </RadzenRow>
<RadzenRow> <RadzenRow>
<RadzenColumn SizeMD="12"> <RadzenColumn SizeMD="12">
<RadzenDataGrid TItem="House" Data="@data" IsLoading="@(state != SyncedPageState.Idle)" AllowFiltering="true" AllowPaging="true" ShowPagingSummary="true" PageSizeOptions=@(new int[] { 5, 10, 20, 30 }) AllowSorting="true"> <RadzenDataGrid TItem="House" Data="@data" IsLoading="@(state != DataPageState.Idle)" AllowFiltering="true" AllowPaging="true" ShowPagingSummary="true" PageSizeOptions=@(new int[] { 5, 10, 20, 30 }) AllowSorting="true">
<Columns> <Columns>
<RadzenDataGridColumn TItem="House" Property="@nameof(House.Id)" Title="ID" SortOrder="SortOrder.Descending" Resizable="false" Width="100px" MaxWidth="100px" /> <RadzenDataGridColumn TItem="House" Property="@nameof(House.Id)" Title="ID" SortOrder="SortOrder.Descending" Resizable="false" Width="100px" MaxWidth="100px" />
<RadzenDataGridColumn TItem="House" Property="@nameof(House.FiasId)" Title="ID ФИАС" /> <RadzenDataGridColumn TItem="House" Property="@nameof(House.FiasId)" Title="ID ФИАС" />
@ -59,7 +59,9 @@
</AuthorizedContent> </AuthorizedContent>
@code { @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) protected override bool HasPermission(ClaimsPrincipal user)
{ {

View File

@ -4,7 +4,7 @@
@using Microsoft.AspNetCore.Authorization @using Microsoft.AspNetCore.Authorization
@using System.Security.Claims @using System.Security.Claims
@inherits SyncedPageBase<SupplyContract> @inherits DataPageBase<SupplyContract>
@attribute [Authorize] @attribute [Authorize]
@ -21,13 +21,13 @@
</RadzenColumn> </RadzenColumn>
<RadzenColumn Size="12" SizeMD="6"> <RadzenColumn Size="12" SizeMD="6">
<RadzenStack Orientation="Orientation.Horizontal" AlignItems="AlignItems.Center" JustifyContent="JustifyContent.End" Gap="0.5rem"> <RadzenStack Orientation="Orientation.Horizontal" AlignItems="AlignItems.Center" JustifyContent="JustifyContent.End" Gap="0.5rem">
<RadzenButton Icon="sync" Text="@syncButtonText" Disabled="@(state != SyncedPageState.Idle)" Click="@SyncDataAsync" ButtonStyle="ButtonStyle.Primary" /> <RadzenButton Icon="sync" Text="@syncButtonText" Disabled="@(state != DataPageState.Idle)" Click="@SyncDataAsync" ButtonStyle="ButtonStyle.Primary" />
</RadzenStack> </RadzenStack>
</RadzenColumn> </RadzenColumn>
</RadzenRow> </RadzenRow>
<RadzenRow> <RadzenRow>
<RadzenColumn SizeMD="12"> <RadzenColumn SizeMD="12">
<RadzenDataGrid TItem="SupplyContract" Data="@data" IsLoading="@(state != SyncedPageState.Idle)" AllowFiltering="true" AllowPaging="true" ShowPagingSummary="true" PageSizeOptions=@(new int[] { 5, 10, 20, 30 }) AllowSorting="true"> <RadzenDataGrid TItem="SupplyContract" Data="@data" IsLoading="@(state != DataPageState.Idle)" AllowFiltering="true" AllowPaging="true" ShowPagingSummary="true" PageSizeOptions=@(new int[] { 5, 10, 20, 30 }) AllowSorting="true">
<Columns> <Columns>
<RadzenDataGridColumn TItem="SupplyContract" Property="@nameof(SupplyContract.Id)" Title="ID" SortOrder="SortOrder.Descending" Resizable="false" Width="100px" MaxWidth="100px" /> <RadzenDataGridColumn TItem="SupplyContract" Property="@nameof(SupplyContract.Id)" Title="ID" SortOrder="SortOrder.Descending" Resizable="false" Width="100px" MaxWidth="100px" />
<RadzenDataGridColumn TItem="SupplyContract" Property="@nameof(SupplyContract.HcsId)" Title="ID ГИС ЖКХ" /> <RadzenDataGridColumn TItem="SupplyContract" Property="@nameof(SupplyContract.HcsId)" Title="ID ГИС ЖКХ" />
@ -42,7 +42,9 @@
</AuthorizedContent> </AuthorizedContent>
@code { @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) protected override bool HasPermission(ClaimsPrincipal user)
{ {

View File

@ -5,7 +5,7 @@
@using Microsoft.AspNetCore.Authorization @using Microsoft.AspNetCore.Authorization
@using System.Security.Claims @using System.Security.Claims
@inherits SyncedPageBase<Registry> @inherits DataPageBase<Registry>
@attribute [Authorize] @attribute [Authorize]
@ -22,13 +22,13 @@
</RadzenColumn> </RadzenColumn>
<RadzenColumn Size="12" SizeMD="6"> <RadzenColumn Size="12" SizeMD="6">
<RadzenStack Orientation="Orientation.Horizontal" AlignItems="AlignItems.Center" JustifyContent="JustifyContent.End" Gap="0.5rem"> <RadzenStack Orientation="Orientation.Horizontal" AlignItems="AlignItems.Center" JustifyContent="JustifyContent.End" Gap="0.5rem">
<RadzenButton Icon="sync" Text="@syncButtonText" Disabled="@(state != SyncedPageState.Idle)" Click="@SyncDataAsync" ButtonStyle="ButtonStyle.Primary" /> <RadzenButton Icon="sync" Text="@syncButtonText" Disabled="@(state != DataPageState.Idle)" Click="@SyncDataAsync" ButtonStyle="ButtonStyle.Primary" />
</RadzenStack> </RadzenStack>
</RadzenColumn> </RadzenColumn>
</RadzenRow> </RadzenRow>
<RadzenRow> <RadzenRow>
<RadzenColumn SizeMD="12"> <RadzenColumn SizeMD="12">
<RadzenDataGrid TItem="Registry" Data="@data" RowExpand="@RowExpandAsync" IsLoading="@(state != SyncedPageState.Idle)" AllowFiltering="true" AllowPaging="true" ShowPagingSummary="true" PageSizeOptions=@(new int[] { 5, 10, 20, 30 }) AllowSorting="true" ExpandMode="DataGridExpandMode.Single"> <RadzenDataGrid TItem="Registry" Data="@data" RowExpand="@RowExpandAsync" IsLoading="@(state != DataPageState.Idle)" AllowFiltering="true" AllowPaging="true" ShowPagingSummary="true" PageSizeOptions=@(new int[] { 5, 10, 20, 30 }) AllowSorting="true" ExpandMode="DataGridExpandMode.Single">
<Template Context="registry"> <Template Context="registry">
<RadzenDataGrid Data="@registry.Elements" AllowFiltering="true" AllowSorting="true"> <RadzenDataGrid Data="@registry.Elements" AllowFiltering="true" AllowSorting="true">
<Columns> <Columns>
@ -55,7 +55,9 @@
</AuthorizedContent> </AuthorizedContent>
@code { @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) protected override bool HasPermission(ClaimsPrincipal user)
{ {

View File

@ -5,7 +5,7 @@
@using Microsoft.AspNetCore.Authorization @using Microsoft.AspNetCore.Authorization
@using System.Security.Claims @using System.Security.Claims
@inherits SyncedPageBase<Registry> @inherits DataPageBase<Registry>
@attribute [Authorize] @attribute [Authorize]
@ -22,13 +22,13 @@
</RadzenColumn> </RadzenColumn>
<RadzenColumn Size="12" SizeMD="6"> <RadzenColumn Size="12" SizeMD="6">
<RadzenStack Orientation="Orientation.Horizontal" AlignItems="AlignItems.Center" JustifyContent="JustifyContent.End" Gap="0.5rem"> <RadzenStack Orientation="Orientation.Horizontal" AlignItems="AlignItems.Center" JustifyContent="JustifyContent.End" Gap="0.5rem">
<RadzenButton Icon="sync" Text="@syncButtonText" Disabled="@(state != SyncedPageState.Idle)" Click="@SyncDataAsync" ButtonStyle="ButtonStyle.Primary" /> <RadzenButton Icon="sync" Text="@syncButtonText" Disabled="@(state != DataPageState.Idle)" Click="@SyncDataAsync" ButtonStyle="ButtonStyle.Primary" />
</RadzenStack> </RadzenStack>
</RadzenColumn> </RadzenColumn>
</RadzenRow> </RadzenRow>
<RadzenRow> <RadzenRow>
<RadzenColumn SizeMD="12"> <RadzenColumn SizeMD="12">
<RadzenDataGrid TItem="Registry" Data="@data" RowExpand="@RowExpandAsync" IsLoading="@(state != SyncedPageState.Idle)" AllowFiltering="true" AllowPaging="true" ShowPagingSummary="true" PageSizeOptions=@(new int[] { 5, 10, 20, 30 }) AllowSorting="true" ExpandMode="DataGridExpandMode.Single"> <RadzenDataGrid TItem="Registry" Data="@data" RowExpand="@RowExpandAsync" IsLoading="@(state != DataPageState.Idle)" AllowFiltering="true" AllowPaging="true" ShowPagingSummary="true" PageSizeOptions=@(new int[] { 5, 10, 20, 30 }) AllowSorting="true" ExpandMode="DataGridExpandMode.Single">
<Template Context="registry"> <Template Context="registry">
<RadzenDataGrid Data="@registry.Elements" AllowFiltering="true" AllowSorting="true"> <RadzenDataGrid Data="@registry.Elements" AllowFiltering="true" AllowSorting="true">
<Columns> <Columns>
@ -55,7 +55,9 @@
</AuthorizedContent> </AuthorizedContent>
@code { @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) protected override bool HasPermission(ClaimsPrincipal user)
{ {

View File

@ -10,14 +10,18 @@ using System.Security.Claims;
namespace Hcs.WebApp.Components.Shared namespace Hcs.WebApp.Components.Shared
{ {
public abstract class SyncedPageBase<TData> : ComponentBase, IDisposable public abstract class DataPageBase<TData> : ComponentBase, IDisposable
{ {
protected SyncedPageState state; protected DataPageState state;
protected IEnumerable<TData> data; protected IEnumerable<TData> data;
protected string syncButtonText = "..."; protected string syncButtonText = "...";
protected string parseButtonText = "..."; protected string parseButtonText = "...";
protected abstract Campaign.CampaignType CampaignType { get; } private readonly List<Campaign.CampaignType> campaignTypes = [];
protected abstract Campaign.CampaignType? SyncCampaignType { get; }
protected abstract Campaign.CampaignType? ParseCampaignType { get; }
[Inject] [Inject]
private AuthenticationStateProvider AuthenticationStateProvider { get; set; } private AuthenticationStateProvider AuthenticationStateProvider { get; set; }
@ -31,20 +35,34 @@ namespace Hcs.WebApp.Components.Shared
[Inject] [Inject]
protected DialogService DialogService { get; set; } 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) protected override async Task OnAfterRenderAsync(bool firstRender)
{ {
if (firstRender) if (firstRender)
{ {
ChangeState(SyncedPageState.Init); ChangeState(DataPageState.Init);
var finalState = SyncedPageState.Idle; var finalState = DataPageState.Idle;
var state = await AuthenticationStateProvider.GetAuthenticationStateAsync(); var state = await AuthenticationStateProvider.GetAuthenticationStateAsync();
if (HasPermission(state.User)) if (HasPermission(state.User))
{ {
var operationInProgress = await HeadquartersService.HasActiveCampaignAsync(CampaignType); var operationInProgress = await HeadquartersService.HasActiveCampaignsAsync(campaignTypes);
if (operationInProgress) if (operationInProgress)
{ {
finalState = SyncedPageState.SyncWaiting; finalState = DataPageState.DataWaiting;
} }
CampaignManagementState.OnCampaignCreated += OnCampaignCreated; CampaignManagementState.OnCampaignCreated += OnCampaignCreated;
@ -69,29 +87,29 @@ namespace Hcs.WebApp.Components.Shared
protected async Task SyncDataAsync() 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 else
{ {
// TODO: Use user id // TODO: Use user id
var campaign = await HeadquartersService.InitiateCampaignAsync(CampaignType, ""); var campaign = await HeadquartersService.InitiateCampaignAsync(SyncCampaignType!.Value, "");
CampaignManagementState.EnqueueCampaign(campaign); CampaignManagementState.EnqueueCampaign(campaign);
} }
} }
protected async Task ParseDataAsync() 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 else
{ {
@ -112,10 +130,10 @@ namespace Hcs.WebApp.Components.Shared
if (dialogResult != null) if (dialogResult != null)
{ {
ChangeState(SyncedPageState.SyncWaiting); ChangeState(DataPageState.DataWaiting);
// TODO: Use user id // TODO: Use user id
var campaign = await HeadquartersService.InitiateCampaignAsync(CampaignType, "", new CampaignParseArgs() var campaign = await HeadquartersService.InitiateCampaignAsync(ParseCampaignType!.Value, "", new CampaignParseArgs()
{ {
fileToParseId = (int)dialogResult 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; if (this.state == state) return;
@ -138,18 +156,18 @@ namespace Hcs.WebApp.Components.Shared
{ {
switch (state) switch (state)
{ {
case SyncedPageState.Init: case DataPageState.Init:
syncButtonText = "..."; syncButtonText = "...";
parseButtonText = "..."; parseButtonText = "...";
break; break;
case SyncedPageState.Loading: case DataPageState.Loading:
case SyncedPageState.Idle: case DataPageState.Idle:
syncButtonText = "Синхронизировать"; syncButtonText = "Синхронизировать";
parseButtonText = "Спарсить"; parseButtonText = "Спарсить";
break; break;
case SyncedPageState.SyncWaiting: case DataPageState.DataWaiting:
syncButtonText = "Идет синхронизация..."; syncButtonText = "Идет синхронизация...";
parseButtonText = "Идет парсинг..."; parseButtonText = "Идет парсинг...";
break; break;
@ -158,15 +176,15 @@ namespace Hcs.WebApp.Components.Shared
private void OnCampaignCreated(Campaign campaign) 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) private void OnCampaignEnded(int campaignId, Campaign.CampaignType type, DateTime endedAt, string failureReason)
{ {
if (type == CampaignType) if (campaignTypes.Contains(type))
{ {
Task.Run(RefreshData); Task.Run(RefreshData);
} }
@ -174,7 +192,7 @@ namespace Hcs.WebApp.Components.Shared
private async Task RefreshData() private async Task RefreshData()
{ {
await InvokeAsync(() => ChangeState(SyncedPageState.Loading)); await InvokeAsync(() => ChangeState(DataPageState.Loading));
var refreshedData = await GetDataAsync(); var refreshedData = await GetDataAsync();
@ -182,7 +200,7 @@ namespace Hcs.WebApp.Components.Shared
{ {
data = refreshedData; data = refreshedData;
ChangeState(SyncedPageState.Idle); ChangeState(DataPageState.Idle);
}); });
} }
} }

View File

@ -1,10 +1,10 @@
namespace Hcs.WebApp.Components.Shared namespace Hcs.WebApp.Components.Shared
{ {
public enum SyncedPageState public enum DataPageState
{ {
Init, Init,
Loading, Loading,
Idle, Idle,
SyncWaiting DataWaiting
} }
} }

View File

@ -73,6 +73,7 @@ builder.Services.AddScoped<RegistryService>();
builder.Services.AddScoped<HouseService>(); builder.Services.AddScoped<HouseService>();
builder.Services.AddScoped<FileToParseService>(); builder.Services.AddScoped<FileToParseService>();
builder.Services.AddScoped<SupplyContractService>(); builder.Services.AddScoped<SupplyContractService>();
builder.Services.AddScoped<AccountService>();
builder.Services.AddSingleton<CampaignManagementState>(); builder.Services.AddSingleton<CampaignManagementState>();
builder.Services.AddSingleton<OperationExecutionState>(); builder.Services.AddSingleton<OperationExecutionState>();

View File

@ -0,0 +1,30 @@
using EFCore.BulkExtensions;
using Hcs.WebApp.Data.Hcs;
using Microsoft.EntityFrameworkCore;
namespace Hcs.WebApp.Services
{
public class AccountService(IDbContextFactory<HcsDbContext> factory) : HcsServiceBase(factory)
{
public async Task<IEnumerable<Account>> GetAllAccountsAsync()
{
using var context = GetNewContext();
return await context.Accounts.ToListAsync();
}
public async Task UpsertAccounts(HcsDbContext context, IEnumerable<Account> accounts)
{
await context.BulkInsertOrUpdateAsync(accounts, new BulkConfig()
{
PropertiesToExcludeOnUpdate =
[
nameof(SupplyContract.ThirdPartyId)
],
UpdateByProperties =
[
nameof(SupplyContract.HcsId)
]
});
}
}
}

View File

@ -6,10 +6,10 @@ namespace Hcs.WebApp.Services
{ {
public class HeadquartersService(IDbContextFactory<HcsDbContext> factory) : HcsServiceBase(factory) public class HeadquartersService(IDbContextFactory<HcsDbContext> factory) : HcsServiceBase(factory)
{ {
public async Task<bool> HasActiveCampaignAsync(Campaign.CampaignType type) public async Task<bool> HasActiveCampaignsAsync(IEnumerable<Campaign.CampaignType> types)
{ {
using var context = GetNewContext(); 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<IEnumerable<Campaign>> GetCampaignsAsync() public async Task<IEnumerable<Campaign>> GetCampaignsAsync()