From 3ccccd2467e429e490983a5fbaa7aecdcedb490b Mon Sep 17 00:00:00 2001 From: "HOME-LAPTOP\\kshkulev" Date: Mon, 24 Nov 2025 14:56:09 +0900 Subject: [PATCH] Add supply contract export results --- .../DataParsers/DataParserFactory.cs | 3 +- ...pplyResourceContractDataGetter_15_7_0_1.cs | 77 +++++++++++++++++++ .../ResultGetters/ResultGetterFactory.cs | 2 + Hcs.WebApp/Services/HeadquartersService.cs | 11 +++ Hcs.WebApp/Services/SupplyContractService.cs | 3 +- 5 files changed, 93 insertions(+), 3 deletions(-) create mode 100644 Hcs.WebApp/BackgroundServices/ResultGetters/HouseManagement/ExportSupplyResourceContractDataGetter_15_7_0_1.cs diff --git a/Hcs.WebApp/BackgroundServices/DataParsers/DataParserFactory.cs b/Hcs.WebApp/BackgroundServices/DataParsers/DataParserFactory.cs index b88676b..43ac011 100644 --- a/Hcs.WebApp/BackgroundServices/DataParsers/DataParserFactory.cs +++ b/Hcs.WebApp/BackgroundServices/DataParsers/DataParserFactory.cs @@ -11,7 +11,8 @@ namespace Hcs.WebApp.BackgroundServices.DataParsers Operation.OperationType.ParseHousesData_15_7_0_1 => new HousesDataParser_15_7_0_1(scope, operation, webHostEnvironment), Operation.OperationType.NsiCommon_ExportNsiItem_15_7_0_1 or - Operation.OperationType.Nsi_ExportNsiItem_15_7_0_1 => throw new ArgumentException($"Нельзя использовать операцию с типом {operation.Type} для парсинга") + Operation.OperationType.Nsi_ExportNsiItem_15_7_0_1 or + Operation.OperationType.HouseManagement_ExportSupplyResourceContractData_15_7_0_1 => throw new ArgumentException($"Нельзя использовать операцию с типом {operation.Type} для парсинга") }; } } diff --git a/Hcs.WebApp/BackgroundServices/ResultGetters/HouseManagement/ExportSupplyResourceContractDataGetter_15_7_0_1.cs b/Hcs.WebApp/BackgroundServices/ResultGetters/HouseManagement/ExportSupplyResourceContractDataGetter_15_7_0_1.cs new file mode 100644 index 0000000..8281493 --- /dev/null +++ b/Hcs.WebApp/BackgroundServices/ResultGetters/HouseManagement/ExportSupplyResourceContractDataGetter_15_7_0_1.cs @@ -0,0 +1,77 @@ +using Hcs.Broker; +using Hcs.WebApp.Data.Hcs; +using Hcs.WebApp.Services; +using Microsoft.EntityFrameworkCore; + +namespace Hcs.WebApp.BackgroundServices.ResultGetters.HouseManagement +{ + public class ExportSupplyResourceContractDataGetter_15_7_0_1(IClient client, IServiceScope scope, Operation operation) : ResultGetterBase(client, scope, operation) + { + public override async Task GetAsync() + { + var result = await client.HouseManagement.GetExportSupplyResourceContractDataResultAsync(operation.MessageGuid!); + if (!result.Ready) + { + return new ResultGetterResponse() + { + success = false + }; + } + + if (result.Success) + { + DateTime endedAt = default; + + var headquartersService = scope.ServiceProvider.GetRequiredService(); + var supplyContractService = scope.ServiceProvider.GetRequiredService(); + + using var context = headquartersService.GetNewContext(); + var executionStrategy = context.Database.CreateExecutionStrategy(); + await executionStrategy.ExecuteAsync(async () => + { + using var transaction = await context.Database.BeginTransactionAsync(); + try + { + var contracts = new List(); + foreach (var entry in result.Results) + { + contracts.Add(new SupplyContract() + { + HcsId = Guid.Parse(entry.ContractGUID), + SyncedAt = DateTime.UtcNow, + LastSyncOperationId = operation.Id + }); + } + + await supplyContractService.UpsertSupplyContracts(context, contracts); + + endedAt = DateTime.UtcNow; + await headquartersService.SetOperationEndedAsync(context, operation.Id, endedAt); + + if (!string.IsNullOrEmpty(result.NextResultsGuid)) + { + var operations = await headquartersService.InitiateOperationsAsync(context, 1, operation.CampaignId, Operation.OperationType.HouseManagement_ExportSupplyResourceContractData_15_7_0_1); + await headquartersService.SetOperationExportGuidAsync(context, operations.First().Id, result.NextResultsGuid); + } + + await transaction.CommitAsync(); + } + catch + { + await transaction.RollbackAsync(); + + throw; + } + }); + + return new ResultGetterResponse() + { + success = true, + endedAt = endedAt + }; + } + + throw Failure(result.ErrorMessage); + } + } +} diff --git a/Hcs.WebApp/BackgroundServices/ResultGetters/ResultGetterFactory.cs b/Hcs.WebApp/BackgroundServices/ResultGetters/ResultGetterFactory.cs index 15b4513..e6e5386 100644 --- a/Hcs.WebApp/BackgroundServices/ResultGetters/ResultGetterFactory.cs +++ b/Hcs.WebApp/BackgroundServices/ResultGetters/ResultGetterFactory.cs @@ -1,4 +1,5 @@ using Hcs.Broker; +using Hcs.WebApp.BackgroundServices.ResultGetters.HouseManagement; using Hcs.WebApp.BackgroundServices.ResultGetters.Nsi; using Hcs.WebApp.BackgroundServices.ResultGetters.NsiCommon; using Hcs.WebApp.Data.Hcs; @@ -13,6 +14,7 @@ namespace Hcs.WebApp.BackgroundServices.ResultGetters { Operation.OperationType.Nsi_ExportNsiItem_15_7_0_1 => new ExportDataProviderNsiItemGetter_15_7_0_1(client, scope, operation), Operation.OperationType.NsiCommon_ExportNsiItem_15_7_0_1 => new ExportNsiItemGetter_15_7_0_1(client, scope, operation), + Operation.OperationType.HouseManagement_ExportSupplyResourceContractData_15_7_0_1 => new ExportSupplyResourceContractDataGetter_15_7_0_1(client, scope, operation), Operation.OperationType.ParseHousesData_15_7_0_1 => throw new ArgumentException($"Нельзя использовать операцию с типом {operation.Type} для получения результата с ГИС ЖКХ") }; diff --git a/Hcs.WebApp/Services/HeadquartersService.cs b/Hcs.WebApp/Services/HeadquartersService.cs index 110ba24..65344b4 100644 --- a/Hcs.WebApp/Services/HeadquartersService.cs +++ b/Hcs.WebApp/Services/HeadquartersService.cs @@ -196,6 +196,17 @@ namespace Hcs.WebApp.Services } } + public async Task SetOperationExportGuidAsync(HcsDbContext context, int operationId, string exportGuid) + { + var operation = await context.Operations.FirstOrDefaultAsync(x => x.Id == operationId); + if (operation != null) + { + operation.ExportGuid = exportGuid; + + await context.SaveChangesAsync(); + } + } + public async Task UpdateCampaignStepAndProgressAsync(Campaign campaign) { using var context = GetNewContext(); diff --git a/Hcs.WebApp/Services/SupplyContractService.cs b/Hcs.WebApp/Services/SupplyContractService.cs index 161aaba..8c2a222 100644 --- a/Hcs.WebApp/Services/SupplyContractService.cs +++ b/Hcs.WebApp/Services/SupplyContractService.cs @@ -12,9 +12,8 @@ namespace Hcs.WebApp.Services return await context.SupplyContracts.ToListAsync(); } - public async Task UpsertSupplyContracts(IEnumerable supplyContracts) + public async Task UpsertSupplyContracts(HcsDbContext context, IEnumerable supplyContracts) { - using var context = GetNewContext(); await context.BulkInsertOrUpdateAsync(supplyContracts, new BulkConfig() { PropertiesToExcludeOnUpdate =