diff --git a/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs b/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs
new file mode 100644
index 00000000..2b62f171
--- /dev/null
+++ b/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs
@@ -0,0 +1,32 @@
+using System.Collections.Generic;
+namespace AsbCloudApp.Data.Subsystems
+{
+#nullable enable
+ ///
+ /// Статистика наработки подсистем по активным скважинам
+ ///
+ public class SubsystemActiveWellStatDto
+ {
+ ///
+ /// Активная скважина
+ ///
+ public WellDto Well { get; set; }
+ ///
+ /// Наработки подсистемы АКБ
+ ///
+ public SubsystemStatDto? SubsystemAKB { get; set; }
+ ///
+ /// Наработки подсистемы МСЕ
+ ///
+ public SubsystemStatDto? SubsystemMSE { get; set; }
+ ///
+ /// Наработки подсистемы СПИН
+ ///
+ public SubsystemStatDto? SubsystemSpinMaster { get; set; }
+ ///
+ /// Наработки подсистемы ТОРК
+ ///
+ public SubsystemStatDto? SubsystemTorqueMaster { get; set; }
+ }
+#nullable disable
+}
\ No newline at end of file
diff --git a/AsbCloudApp/Data/UserDto.cs b/AsbCloudApp/Data/UserDto.cs
index 15cc5408..ed065f60 100644
--- a/AsbCloudApp/Data/UserDto.cs
+++ b/AsbCloudApp/Data/UserDto.cs
@@ -58,5 +58,25 @@
/// DTO компании
///
public CompanyDto Company { get; set; }
+
+ ///
+ /// Получение отображаемого имени
+ ///
+ ///
+ public string MakeDisplayName()
+ {
+ if (string.IsNullOrEmpty(Surname))
+ return Login;
+
+ var s = Surname;
+ if (!string.IsNullOrEmpty(Name))
+ {
+ s += $"{Name[0]}.";
+ if (!string.IsNullOrEmpty(Patronymic))
+ s += $" {Patronymic[0]}.";
+ }
+
+ return s;
+ }
}
}
diff --git a/AsbCloudApp/Services/IUserService.cs b/AsbCloudApp/Repositories/IUserRepository.cs
similarity index 81%
rename from AsbCloudApp/Services/IUserService.cs
rename to AsbCloudApp/Repositories/IUserRepository.cs
index 34f12212..4f6b0fac 100644
--- a/AsbCloudApp/Services/IUserService.cs
+++ b/AsbCloudApp/Repositories/IUserRepository.cs
@@ -1,18 +1,14 @@
using AsbCloudApp.Data;
+using AsbCloudApp.Services;
using System.Collections.Generic;
-namespace AsbCloudApp.Services
+namespace AsbCloudApp.Repositories
{
///
- /// Сервис пользователей
+ /// Репозиторий пользователей
///
- public interface IUserService : ICrudService
+ public interface IUserRepository : ICrudService
{
- ///
- /// Сервис ролей
- ///
- IUserRoleService RoleService { get; }
-
///
/// Получить список всех прав пользователя (включая наследование групп)
///
diff --git a/AsbCloudApp/Services/IUserRoleService.cs b/AsbCloudApp/Repositories/IUserRoleRepository.cs
similarity index 83%
rename from AsbCloudApp/Services/IUserRoleService.cs
rename to AsbCloudApp/Repositories/IUserRoleRepository.cs
index b9341c9d..a2c25704 100644
--- a/AsbCloudApp/Services/IUserRoleService.cs
+++ b/AsbCloudApp/Repositories/IUserRoleRepository.cs
@@ -1,16 +1,17 @@
using AsbCloudApp.Data;
+using AsbCloudApp.Services;
using System.Collections.Generic;
-using System.Threading;
using System.Threading.Tasks;
+using System.Threading;
-namespace AsbCloudApp.Services
+namespace AsbCloudApp.Repositories
{
+#nullable enable
///
- /// Репозиторий ролей пользователя
+ /// Разрешения на доступ к данным
///
- public interface IUserRoleService : ICrudService
+ public interface IUserRoleRepository : ICrudService
{
- // todo: переименовать
///
/// получить dto по названиям
///
@@ -35,4 +36,5 @@ namespace AsbCloudApp.Services
///
bool HasPermission(IEnumerable rolesIds, string permissionName);
}
-}
\ No newline at end of file
+#nullable disable
+}
diff --git a/AsbCloudApp/Services/IDetectedOperationService.cs b/AsbCloudApp/Services/IDetectedOperationService.cs
index 14a05665..8418557c 100644
--- a/AsbCloudApp/Services/IDetectedOperationService.cs
+++ b/AsbCloudApp/Services/IDetectedOperationService.cs
@@ -1,6 +1,7 @@
using AsbCloudApp.Data;
using AsbCloudApp.Data.DetectedOperation;
using AsbCloudApp.Requests;
+using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;
@@ -39,6 +40,16 @@ namespace AsbCloudApp.Services
///
Task?> GetOperationsAsync(DetectedOperationRequest request, CancellationToken token);
+ ///
+ /// Получить интервалы глубин по всем скважинам
+ ///
+ /// список ИД телеметрий активных скважин
+ ///
+ ///
+ ///
+ /// кортеж - ид телеметрии, интервалы глубины забоя (ротор,слайд)
+ Task> GetDepthIntervalAllOperationsAsync(IEnumerable telemetryIds,DateTimeOffset gtDate, DateTimeOffset ltDate, CancellationToken token);
+
///
/// Удалить операции
///
diff --git a/AsbCloudApp/Services/IWellFinalDocumentsService.cs b/AsbCloudApp/Services/IWellFinalDocumentsService.cs
index 7b910c74..4da098ce 100644
--- a/AsbCloudApp/Services/IWellFinalDocumentsService.cs
+++ b/AsbCloudApp/Services/IWellFinalDocumentsService.cs
@@ -50,7 +50,8 @@ namespace AsbCloudApp.Services
///
/// Сохранение файла
///
- ///
+ ///
+ ///
///
///
///
diff --git a/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs b/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs
index 62ade194..91b78023 100644
--- a/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs
+++ b/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs
@@ -46,7 +46,16 @@ namespace AsbCloudApp.Services.Subsystems
///
///
///
- Task GetDateRangeOperationTimeAsync(SubsystemOperationTimeRequest request, CancellationToken token);
+ Task GetDateRangeOperationTimeAsync(SubsystemOperationTimeRequest request, CancellationToken token);
+ ///
+ /// Получение статистики по наработке подсистем по активным скважинам
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ Task> GetStatByActiveWells(int idCompany, DateTime? gtDate, DateTime? ltDate, CancellationToken token);
}
#nullable disable
}
diff --git a/AsbCloudDb/Model/IAsbCloudDbContext.cs b/AsbCloudDb/Model/IAsbCloudDbContext.cs
index 42642377..5bab3c21 100644
--- a/AsbCloudDb/Model/IAsbCloudDbContext.cs
+++ b/AsbCloudDb/Model/IAsbCloudDbContext.cs
@@ -28,6 +28,7 @@ namespace AsbCloudDb.Model
DbSet RelationDrillingProgramPartUsers { get; }
DbSet RelationUserRolePermissions { get; }
DbSet RelationUserUserRoles { get; }
+ DbSet RelationUserRoleUserRoles { get; }
DbSet ReportProperties { get; }
DbSet Subsystems { get; }
DbSet SubsystemOperationTimes { get; }
diff --git a/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj b/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj
index b38c4f87..622173cc 100644
--- a/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj
+++ b/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj
@@ -9,6 +9,8 @@
+
+
@@ -16,7 +18,10 @@
-
+
+ PreserveNewest
+
+
PreserveNewest
@@ -43,7 +48,6 @@
-
diff --git a/AsbCloudInfrastructure/CommonLibs/AsbSaubReport.dll b/AsbCloudInfrastructure/CommonLibs/AsbSaubReport.dll
index b7ad78ab..d4617aeb 100644
Binary files a/AsbCloudInfrastructure/CommonLibs/AsbSaubReport.dll and b/AsbCloudInfrastructure/CommonLibs/AsbSaubReport.dll differ
diff --git a/AsbCloudInfrastructure/CommonLibs/AsbSaubReportPdf.dll b/AsbCloudInfrastructure/CommonLibs/AsbSaubReportPdf.dll
index 5b578d9f..05fe81d6 100644
Binary files a/AsbCloudInfrastructure/CommonLibs/AsbSaubReportPdf.dll and b/AsbCloudInfrastructure/CommonLibs/AsbSaubReportPdf.dll differ
diff --git a/AsbCloudInfrastructure/CommonLibs/Readme.md b/AsbCloudInfrastructure/CommonLibs/Readme.md
new file mode 100644
index 00000000..64cb4b4c
--- /dev/null
+++ b/AsbCloudInfrastructure/CommonLibs/Readme.md
@@ -0,0 +1,2 @@
+# Библиотека формирования рапортов в формате PDF.
+Для брендирования положить рядом с библиотекой файл logo_720x404.png
\ No newline at end of file
diff --git a/AsbCloudInfrastructure/CommonLibs/logo_720x404.png b/AsbCloudInfrastructure/CommonLibs/logo_720x404.png
new file mode 100644
index 00000000..90b02fb8
Binary files /dev/null and b/AsbCloudInfrastructure/CommonLibs/logo_720x404.png differ
diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs
index 48d759fc..a9e521ca 100644
--- a/AsbCloudInfrastructure/DependencyInjection.cs
+++ b/AsbCloudInfrastructure/DependencyInjection.cs
@@ -120,16 +120,12 @@ namespace AsbCloudInfrastructure
services.AddTransient();
services.AddTransient();
services.AddTransient();
- services.AddTransient();
- services.AddTransient();
services.AddTransient();
services.AddTransient();
services.AddTransient();
services.AddTransient();
services.AddTransient();
services.AddTransient();
- //services.AddTransient();
-
services.AddTransient();
services.AddTransient();
services.AddTransient, CrudWellRelatedServiceBase>();
@@ -165,6 +161,8 @@ namespace AsbCloudInfrastructure
services.AddTransient();
services.AddTransient();
services.AddTransient();
+ services.AddTransient();
+ services.AddTransient();
// Subsystem service
services.AddTransient, CrudCacheServiceBase>();
services.AddTransient();
diff --git a/AsbCloudInfrastructure/EfCache/EfCacheExtensions.cs b/AsbCloudInfrastructure/EfCache/EfCacheExtensions.cs
index e9f17c32..0a93c70c 100644
--- a/AsbCloudInfrastructure/EfCache/EfCacheExtensions.cs
+++ b/AsbCloudInfrastructure/EfCache/EfCacheExtensions.cs
@@ -21,6 +21,82 @@ namespace AsbCloudInfrastructure.EfCache
private static readonly TimeSpan minCacheTime = TimeSpan.FromSeconds(2);
private static readonly TimeSpan defaultObsolescence = TimeSpan.FromMinutes(4);
+ private class YieldConvertedData : IEnumerable
+ {
+ private struct ConvertedData
+ {
+ public TEntity? Entity;
+ public TModel? Model;
+ }
+
+ ConvertedData[] data;
+ public Func convert { get; }
+
+ public YieldConvertedData(TEntity[] entities, Func convert)
+ {
+ data = (entities.Select(x => new ConvertedData {
+ Entity = x,
+ Model = default }))
+ .ToArray();
+ this.convert = convert;
+ }
+
+ class YieldConvertedDataEnumerator : IEnumerator
+ {
+ private readonly ConvertedData[] data;
+ private readonly Func convert;
+ private int position = -1;
+
+ public YieldConvertedDataEnumerator(ConvertedData[] data, Func convert)
+ {
+ this.data = data;
+ this.convert = convert;
+ }
+
+ public TModel Current
+ {
+ get
+ {
+ if (data[position].Entity is TEntity entity)
+ {
+ var dto = convert(entity);
+ data[position].Entity = default;
+ data[position].Model = dto;
+ }
+ return data[position].Model!;
+ }
+ }
+
+ object IEnumerator.Current => Current!;
+
+ public void Dispose()
+ {
+ }
+
+ public bool MoveNext()
+ {
+ position++;
+ return (position < data.Length);
+ }
+
+ public void Reset()
+ {
+ position = -1;
+ }
+ }
+
+ public IEnumerator GetEnumerator()
+ {
+ var result = new YieldConvertedDataEnumerator(data, convert);
+ return result;
+ }
+
+ IEnumerator IEnumerable.GetEnumerator()
+ {
+ throw new NotImplementedException();
+ }
+ }
+
private class CacheItem
{
internal IEnumerable? Data;
@@ -45,14 +121,10 @@ namespace AsbCloudInfrastructure.EfCache
{
try
{
- var convertedData = typedEntityData.Select(convert).ToList();
+ var convertedData = new YieldConvertedData(typedEntityData.ToArray(), convert);
Data = convertedData;
return convertedData;
}
- catch
- {
- throw;
- }
finally
{
semaphore.Release();
@@ -67,7 +139,7 @@ namespace AsbCloudInfrastructure.EfCache
else
{
semaphore.Release();
- throw new TimeoutException("EfCacheL2.GetOrAddCache. Can't wait too long while converting cache data");
+ throw new TimeoutException("EfCacheL2.GetData. Can't wait too long while converting cache data");
}
}
}
@@ -77,7 +149,7 @@ namespace AsbCloudInfrastructure.EfCache
}
}
- private static CacheItem GetOrAddCache(string tag, Func valueFactory, TimeSpan obsolete)
+ private static CacheItem GetOrAddCache(string tag, Func