diff --git a/AsbCloudApp/Data/Subsystems/SubsystemStatisticsDto.cs b/AsbCloudApp/Data/Subsystems/SubsystemStatDto.cs
similarity index 96%
rename from AsbCloudApp/Data/Subsystems/SubsystemStatisticsDto.cs
rename to AsbCloudApp/Data/Subsystems/SubsystemStatDto.cs
index 5f2c7e77..4ef6d98d 100644
--- a/AsbCloudApp/Data/Subsystems/SubsystemStatisticsDto.cs
+++ b/AsbCloudApp/Data/Subsystems/SubsystemStatDto.cs
@@ -9,7 +9,7 @@ namespace AsbCloudApp.Data.Subsystems
///
/// Статистика подсистемы
///
- public class SubsystemStatisticsDto
+ public class SubsystemStatDto
{
///
diff --git a/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs b/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs
index f6ff4b0e..d03f8114 100644
--- a/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs
+++ b/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs
@@ -12,7 +12,7 @@ namespace AsbCloudApp.Services.Subsystems
public interface ISubsystemOperationTimeService
{
Task> GetSubsystemAsync(int idWell, CancellationToken token);
- Task> GetStatAsync(SubsystemOperationTimeRequest request, CancellationToken token);
+ Task> GetStatAsync(SubsystemOperationTimeRequest request, CancellationToken token);
Task DeleteAsync(SubsystemOperationTimeRequest request, CancellationToken token);
Task> GetOperationTimeAsync(SubsystemOperationTimeRequest request, CancellationToken token);
diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs
index 3e98c630..b7a3cd8e 100644
--- a/AsbCloudInfrastructure/DependencyInjection.cs
+++ b/AsbCloudInfrastructure/DependencyInjection.cs
@@ -2,6 +2,7 @@
using AsbCloudApp.Data.SAUB;
using AsbCloudApp.Data.Subsystems;
using AsbCloudApp.Services;
+using AsbCloudApp.Services.Subsystems;
using AsbCloudDb.Model;
using AsbCloudDb.Model.Subsystems;
using AsbCloudInfrastructure.Repository;
@@ -87,7 +88,7 @@ namespace AsbCloudInfrastructure
services.AddScoped();
services.AddHostedService();
- //services.AddHostedService();
+ services.AddHostedService();
services.AddSingleton(new WitsInfoService());
services.AddSingleton(new CacheDb());
services.AddSingleton(new InstantDataRepository());
@@ -118,10 +119,11 @@ namespace AsbCloudInfrastructure
services.AddTransient();
services.AddTransient();
services.AddTransient();
- services.AddTransient();
+ services.AddTransient();
services.AddTransient();
services.AddTransient();
services.AddTransient();
+ //services.AddTransient();
// admin crud services:
services.AddTransient, CrudServiceBase>(s =>
diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs
index ae97e8b7..809f63eb 100644
--- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs
+++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs
@@ -87,11 +87,17 @@ namespace AsbCloudInfrastructure.Services.Subsystems
foreach (var item in JounedlastDetectedDates)
{
var stopwatch = Stopwatch.StartNew();
- var newOperations = await OperationTimeSaubAsync(item.IdTelemetry, item.LastDate ?? DateTimeOffset.MinValue, db, token);
+ var newOperationsSaub = await OperationTimeSaubAsync(item.IdTelemetry, item.LastDate ?? DateTimeOffset.MinValue, db, token);
+ var newOperationsSpin = await OperationTimeSpinAsync(item.IdTelemetry, item.LastDate ?? DateTimeOffset.MinValue, db, token);
stopwatch.Stop();
- if (newOperations.Any())
+ if (newOperationsSaub.Any())
{
- db.SubsystemOperationTimes.AddRange(newOperations);
+ db.SubsystemOperationTimes.AddRange(newOperationsSaub);
+ affected += await db.SaveChangesAsync(token);
+ }
+ if (newOperationsSpin.Any())
+ {
+ db.SubsystemOperationTimes.AddRange(newOperationsSpin);
affected += await db.SaveChangesAsync(token);
}
}
@@ -109,19 +115,18 @@ namespace AsbCloudInfrastructure.Services.Subsystems
Mode = d.Mode,
Depth = d.WellDepth
})
- .OrderBy(d => d.DateTime);
+ .OrderBy(d => d.DateTime);
var take = 4 * 86_400; // 4 дня
- var startDate = begin;
- var resultSubsystemOperationTime = new List();
+ var startDate = begin;
var firstItem = query.FirstOrDefault();
if (firstItem is null)
return null;
short? mode = firstItem.Mode;
DateTimeOffset dateBegin = firstItem.DateTime;
float? depthStart = firstItem.Depth;
- while (true)
- {
+ var resultSubsystemOperationTime = new List();
+
var data = await query
.Where(d => d.DateTime > startDate)
.Take(take)
@@ -134,6 +139,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems
{
IdTelemetry = idTelemetry,
DateStart = dateBegin,
+ IdSubsystem = (int)data[i - 1].Mode,
DateEnd = data[i - 1].DateTime,
DepthStart = depthStart,
DepthEnd = data[i - 1].Depth
@@ -146,67 +152,64 @@ namespace AsbCloudInfrastructure.Services.Subsystems
}
}
startDate = data.Last().DateTime;
- }
+
return resultSubsystemOperationTime;
}
- //private static async Task> OperationTimeSpinAsync(int idTelemetry, DateTimeOffset begin, IAsbCloudDbContext db, CancellationToken token)
- //{
- // var query = db.TelemetryDataSpin
- // .AsNoTracking()
- // .Where(d => d.IdTelemetry == idTelemetry)
- // .Select(d => new OperationTimeData
- // {
- // DateTime = d.DateTime,
- // Mode = d.Mode
- // // Depth = d.d
- // })
- // .OrderBy(d => d.DateTime);
- // var take = 4 * 86_400; // 4 дня
- // var startDate = begin;
- // var operationTime = new List();
- // const int minOperationLength = 5;
- // const int maxDetectorsInterpolationFrameLength = 30;
- // const int gap = maxDetectorsInterpolationFrameLength + minOperationLength;
+ private static async Task> OperationTimeSpinAsync(int idTelemetry, DateTimeOffset begin, IAsbCloudDbContext db, CancellationToken token)
+ {
+ var query = db.TelemetryDataSpin
+ .AsNoTracking()
+ .Where(d => d.IdTelemetry == idTelemetry)
+ .Select(d => new OperationTimeData
+ {
+ DateTime = d.DateTime,
+ Mode = d.Mode,
+ Depth = db.TelemetryDataSaub.Where(t => t.DateTime == d.DateTime & t.IdTelemetry ==idTelemetry)
+ .GroupBy(t => t.IdTelemetry)
+ .Select(group => group.Min(t => t.WellDepth))
+ .FirstOrDefault()
+ })
+ .OrderBy(d => d.DateTime);
- // while (true)
- // {
- // var data = await query
- // .Where(d => d.DateTime > startDate)
- // .Take(take)
- // .ToArrayAsync(token);
+ var take = 4 * 86_400; // 4 дня
+ var startDate = begin;
+ var firstItem = query.FirstOrDefault();
+ if (firstItem is null)
+ return null;
+ short? mode = firstItem.Mode;
+ DateTimeOffset dateBegin = firstItem.DateTime;
+ float? depthStart = firstItem.Depth;
+ var resultSubsystemOperationTime = new List();
+ var data = await query
+ .Where(d => d.DateTime > startDate)
+ .Take(take)
+ .ToArrayAsync(token);
+
+ for (int i = 1; i <= data.Length; i++)
+ {
+ if (data[i].Mode != mode)
+ {
+ var operationTimeItem = new SubsystemOperationTime()
+ {
+ IdTelemetry = idTelemetry,
+ DateStart = dateBegin,
+ IdSubsystem = (int)data[i - 1].Mode,
+ DateEnd = data[i - 1].DateTime,
+ DepthStart = depthStart,
+ DepthEnd = data[i - 1].Depth
- // if (data.Length < gap)
- // break;
+ };
+ resultSubsystemOperationTime.Add(operationTimeItem);
+ mode = data[i].Mode;
+ dateBegin = data[i].DateTime;
+ depthStart = data[i].Depth;
+ }
+ }
+ startDate = data.Last().DateTime;
- // short? modeCount = data[0].Mode;
- // DateTimeOffset dateBegin = data[0].DateTime;
- // float? depthStart = data[0].Depth;
- // for (int i = 1; i <= data.Length; i++)
- // {
- // if (data[i].Mode != modeCount)
- // {
- // var operationTimeItem = new SubsystemOperationTime()
- // {
- // IdTelemetry = idTelemetry,
- // DateStart = dateBegin,
- // DateEnd = data[i - 1].DateTime,
- // DepthStart = depthStart,
- // DepthEnd = data[i - 1].Depth
-
- // };
- // operationTime.Add(operationTimeItem);
- // modeCount = data[i].Mode;
- // dateBegin = data[i].DateTime;
- // depthStart = data[i].Depth;
- // }
- // }
- // }
- // var depths = db.TelemetryDataSaub.Where(t => true/*by date*/)
- // .GroupBy(t => t.IdTelemetry)
- // .Select(group => group.Min(t => t.WellDepth));
- // return operationTime;
- //}
+ return resultSubsystemOperationTime;
+ }
}
}
diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs
index fb39fded..5e37104c 100644
--- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs
+++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs
@@ -90,7 +90,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems
- public async Task?> GetStatAsync(SubsystemOperationTimeRequest request, CancellationToken token)
+ public async Task?> GetStatAsync(SubsystemOperationTimeRequest request, CancellationToken token)
{
var data = await GetOperationTimeAsync(request, token);
var statList = CalcStat(data, request);
@@ -116,9 +116,9 @@ namespace AsbCloudInfrastructure.Services.Subsystems
return itemsToTrim;
}
- private IEnumerable CalcStat(IEnumerable groupedData, SubsystemOperationTimeRequest request)
+ private IEnumerable CalcStat(IEnumerable groupedData, SubsystemOperationTimeRequest request)
{
- var result = new List();
+ var result = new List();
var periodGroupTotal = groupedData
.GroupBy(x => x.IdSubsystem)
.Sum(g => g.Sum(o=> (o.DateEnd - o.DateStart).TotalHours));
@@ -129,7 +129,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems
var periodRequest = item.Where(o => o.DateStart==request.GtDate & o.DateEnd == request.LtDate)
.Sum(o => (o.DateEnd - o.DateStart).TotalHours);
int idSubsystem = item.First().IdSubsystem;
- var subsystemStat = new SubsystemStatisticsDto()
+ var subsystemStat = new SubsystemStatDto()
{
IdSubsystem = idSubsystem,
Subsystem = subsystemService.GetOrDefault(idSubsystem)?.Name ?? "unknown",
diff --git a/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs b/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs
index b10b21d2..f7763e58 100644
--- a/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs
+++ b/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs
@@ -10,38 +10,28 @@ using System.Threading;
using System.Threading.Tasks;
namespace AsbCloudWebApi.Controllers.Subsystems
-{
-
-
+{
///
/// Наработка подсистем
///
[Route("api/[controller]")]
[ApiController]
[Authorize]
-
public class SubsystemOperationTimeController : ControllerBase
{
private readonly ISubsystemOperationTimeService subsystemOperationTimeService;
- private readonly IWellService wellService;
-
- public SubsystemOperationTimeController(ISubsystemOperationTimeService subsystemOperationTimeService, IWellService wellService)
+ public SubsystemOperationTimeController(ISubsystemOperationTimeService subsystemOperationTimeService)
{
- this.subsystemOperationTimeService = subsystemOperationTimeService;
- this.wellService = wellService;
+ this.subsystemOperationTimeService = subsystemOperationTimeService;
}
///
/// получить статистику
///
[HttpGet("stat")]
- [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)]
- public async Task GetStatisticsAsync(CancellationToken token = default)
+ [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)]
+ public async Task GetStatAsync([FromQuery] SubsystemOperationTimeRequest request, CancellationToken token = default)
{
- var subsystemResult = new List()
- {
-
- };
-
+ var subsystemResult = await subsystemOperationTimeService.GetStatAsync(request, token);
return Ok(subsystemResult);
}
@@ -52,8 +42,14 @@ namespace AsbCloudWebApi.Controllers.Subsystems
[ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)]
public async Task GetSubsystemAsync([FromQuery] int idWell, CancellationToken token = default)
{
+ if (idWell != null)
+ {
+ var resultIdWell = await subsystemOperationTimeService.GetSubsystemAsync(idWell, token);
+ return Ok(resultIdWell);
+ }
var result = await subsystemOperationTimeService.GetSubsystemAsync(idWell, token);
return Ok(result);
+
}
///
@@ -64,8 +60,7 @@ namespace AsbCloudWebApi.Controllers.Subsystems
public async Task GetOperationTimeAsync(
[FromQuery] SubsystemOperationTimeRequest request,
CancellationToken token = default)
- {
-
+ {
var result = await subsystemOperationTimeService.GetOperationTimeAsync(request, token);
return Ok(result);
}