From 8221a5d3094c987488fb78e1f2d8478264c7face Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Fri, 15 Dec 2023 13:41:29 +0500 Subject: [PATCH] TelemetryService Add GetTelemetriesInfoByLastData(). Remote software versions --- AsbCloudApp/Services/ITelemetryService.cs | 4 ++ .../Services/SAUB/TelemetryService.cs | 37 +++++++++++++++++++ .../SAUB/TelemetryWithSoftwareVersionsDto.cs | 13 +++++++ .../Controllers/SAUB/TelemetryController.cs | 15 ++++++++ 4 files changed, 69 insertions(+) create mode 100644 AsbCloudInfrastructure/Services/SAUB/TelemetryWithSoftwareVersionsDto.cs diff --git a/AsbCloudApp/Services/ITelemetryService.cs b/AsbCloudApp/Services/ITelemetryService.cs index 5416baf7..576086e6 100644 --- a/AsbCloudApp/Services/ITelemetryService.cs +++ b/AsbCloudApp/Services/ITelemetryService.cs @@ -1,5 +1,8 @@ using AsbCloudApp.Data; using AsbCloudApp.Data.SAUB; +using System; +using System.Collections.Generic; +using System.IO; using System.Threading; using System.Threading.Tasks; @@ -67,5 +70,6 @@ namespace AsbCloudApp.Services /// /// Task MergeAsync(int from, int to, CancellationToken token); + Task GetTelemetriesInfoByLastData(DateTimeOffset from, CancellationToken token); } } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/SAUB/TelemetryService.cs b/AsbCloudInfrastructure/Services/SAUB/TelemetryService.cs index a084e687..c0675221 100644 --- a/AsbCloudInfrastructure/Services/SAUB/TelemetryService.cs +++ b/AsbCloudInfrastructure/Services/SAUB/TelemetryService.cs @@ -9,7 +9,9 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Caching.Memory; using System; using System.Collections.Generic; +using System.IO; using System.Linq; +using System.Text.Csv; using System.Threading; using System.Threading.Tasks; @@ -153,6 +155,41 @@ namespace AsbCloudInfrastructure.Services.SAUB return telemetry; } + public async Task GetTelemetriesInfoByLastData(DateTimeOffset from, CancellationToken token) + { + var fromUtc = from.UtcDateTime; + var query = db.TelemetryDataSaub + .Where(i => i.DateTime >= fromUtc) + .GroupBy(i => i.IdTelemetry) + .Select(i => new + { + i.First().Telemetry, + LastDate = i.Max(i => i.DateTime) + }); + + var data = await query.ToArrayAsync(token); + + var infos = data.Select(i => new TelemetryWithSoftwareVersionsDto( + i.Telemetry.Id, + i.Telemetry.RemoteUid, + i.LastDate, + i.Telemetry.Info.Deposit, + i.Telemetry.Info.Cluster, + i.Telemetry.Info.Well, + i.Telemetry.Info.HmiVersion, + i.Telemetry.Info.SaubPlcVersion, + i.Telemetry.Info.SpinPlcVersion) + ); + var stream = new MemoryStream(); + if (!data.Any()) + return stream; + + var serializer = new CsvSerializer(); + serializer.Serialize(infos, stream); + stream.Seek(0, SeekOrigin.Begin); + return stream; + } + public async Task MergeAsync(int from, int to, CancellationToken token) { if (from == to) diff --git a/AsbCloudInfrastructure/Services/SAUB/TelemetryWithSoftwareVersionsDto.cs b/AsbCloudInfrastructure/Services/SAUB/TelemetryWithSoftwareVersionsDto.cs new file mode 100644 index 00000000..024e534b --- /dev/null +++ b/AsbCloudInfrastructure/Services/SAUB/TelemetryWithSoftwareVersionsDto.cs @@ -0,0 +1,13 @@ +using System; + +namespace AsbCloudInfrastructure.Services.SAUB; + +internal record TelemetryWithSoftwareVersionsDto(int Id, + string RemoteUid, + DateTimeOffset LastData, + string Deposit, + string Cluster, + string Well, + string? HmiVersion, + string? SaubPlcVersion, + string? SpinPlcVersion); diff --git a/AsbCloudWebApi/Controllers/SAUB/TelemetryController.cs b/AsbCloudWebApi/Controllers/SAUB/TelemetryController.cs index a70cc72f..815f2acc 100644 --- a/AsbCloudWebApi/Controllers/SAUB/TelemetryController.cs +++ b/AsbCloudWebApi/Controllers/SAUB/TelemetryController.cs @@ -3,7 +3,9 @@ using AsbCloudApp.Services; using AsbCloudWebApi.SignalR; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.SignalR; +using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -37,6 +39,19 @@ namespace AsbCloudWebApi.Controllers.SAUB this.telemetryHubContext = telemetryHubContext; } + /// + /// Информация о версиях ПО по телеметриям, данные от которых приходили не позднее From + /// + /// + [HttpGet("Active")] + [ProducesResponseType(typeof(PhysicalFileResult), (int)System.Net.HttpStatusCode.OK)] + public async Task GetTelemetriesInfoByLastData(CancellationToken token) + { + var from = DateTimeOffset.UtcNow.AddDays(-1); + var stream = await telemetryService.GetTelemetriesInfoByLastData(from, token); + return File(stream, "text/csv", $"Software versions by active telemetries from {from :yy-MM-dd hh-mm}.csv"); + } + /// /// Принимает общую информацию по скважине ///