Разрешение конфликтов

This commit is contained in:
Olga Nemt 2024-10-07 16:05:13 +05:00
commit ab955176d3
9 changed files with 50 additions and 45 deletions

View File

@ -46,13 +46,13 @@ public class ProcessMapPlanRotorDto : ProcessMapPlanBaseDto
/// <summary> /// <summary>
/// Момент на ВСП, кН*м. Уставка /// Момент на ВСП, кН*м. Уставка
/// </summary> /// </summary>
[Range(0.0, 35.0, ErrorMessage = "Момент на ВСП, кН*м., уставка, должно быть в пределах от 0 до 35.0")] [Range(0.0, 55.0, ErrorMessage = "Момент на ВСП, кН*м., уставка, должно быть в пределах от 0 до 35.0")]
public double TopDriveTorque { get; set; } public double TopDriveTorque { get; set; }
/// <summary> /// <summary>
/// Момент на ВСП, кН*м. Ограничение /// Момент на ВСП, кН*м. Ограничение
/// </summary> /// </summary>
[Range(0.0, 35.0, ErrorMessage = "Момент на ВСП, кН*м., ограничение, должно быть в пределах от 0 до 35.0")] [Range(0.0, 55.0, ErrorMessage = "Момент на ВСП, кН*м., ограничение, должно быть в пределах от 0 до 35.0")]
public double TopDriveTorqueMax { get; set; } public double TopDriveTorqueMax { get; set; }
/// <summary> /// <summary>

View File

@ -15,15 +15,24 @@ public interface ITelemetryDataSaubService : ITelemetryDataService<TelemetryData
/// <summary> /// <summary>
/// Получение телеметрии для РТК статистики /// Получение телеметрии для РТК статистики
/// </summary> /// </summary>
/// <param name="idsTelemetries"></param> /// <param name="idTelemetry"></param>
/// <param name="isBitOnBottom"></param> /// <param name="isBitOnBottom"></param>
/// <param name="geDate"></param> /// <param name="geDate"></param>
/// <param name="leDate"></param> /// <param name="leDate"></param>
/// <param name="take"></param> /// <param name="take"></param>
/// <param name="token"></param> /// <param name="token"></param>
/// <param name="idsFeedRegulators"></param>
/// <returns></returns> /// <returns></returns>
Task<IEnumerable<TelemetryDataSaubDto>> Get(IEnumerable<int> idsTelemetries, bool isBitOnBottom, DateTimeOffset geDate, DateTimeOffset leDate, int take, CancellationToken token, IEnumerable<short>? idsFeedRegulators = null); Task<IEnumerable<TelemetryDataSaubDto>> Get(int idTelemetry, bool isBitOnBottom, DateTimeOffset geDate, DateTimeOffset leDate, int take, CancellationToken token);
/// <summary>
/// Получение минимальных и максимальных глубин скважин на определенную дату для заданных телеметрий
/// </summary>
/// <param name="idsTelemetries"></param>
/// <param name="geDate"></param>
/// <param name="leDate"></param>
/// <param name="token"></param>
/// <returns></returns>
Task<Dictionary<int, (float MinDepth, float MaxDepth)>> GetMinAndMaxWellDepths(IEnumerable<int> idsTelemetries, DateTimeOffset geDate, DateTimeOffset leDate, CancellationToken token);
/// <summary> /// <summary>
/// усредненная статистика по 1м за весь период /// усредненная статистика по 1м за весь период

View File

@ -39,12 +39,12 @@ public class ProcessMapPlanRotor : ProcessMapPlanBase
public double WeightOnBitMax { get; set; } public double WeightOnBitMax { get; set; }
[Column("top_drive_torque"), Comment("Момент на ВСП, кН*м. Уставка")] [Column("top_drive_torque"), Comment("Момент на ВСП, кН*м. Уставка")]
[Range(0.0, 35.0)] [Range(0.0, 55.0)]
[Required] [Required]
public double TopDriveTorque { get; set; } public double TopDriveTorque { get; set; }
[Column("top_drive_torque_max"), Comment("Момент на ВСП, кН*м. Ограничение")] [Column("top_drive_torque_max"), Comment("Момент на ВСП, кН*м. Ограничение")]
[Range(0.0, 35.0)] [Range(0.0, 55.0)]
[Required] [Required]
public double TopDriveTorqueMax { get; set; } public double TopDriveTorqueMax { get; set; }

View File

@ -220,7 +220,7 @@ public class DataSaubStatServiceTest
} }
dataSaubServiceMock dataSaubServiceMock
.Get(Arg.Any<IEnumerable<int>>(), Arg.Any<bool>(), Arg.Any<DateTimeOffset>(), Arg.Any<DateTimeOffset>(), Arg.Any<int>(), Arg.Any<CancellationToken>()) .Get(Arg.Any<int>(), Arg.Any<bool>(), Arg.Any<DateTimeOffset>(), Arg.Any<DateTimeOffset>(), Arg.Any<int>(), Arg.Any<CancellationToken>())
.Returns(telemetryDataSaubDtos); .Returns(telemetryDataSaubDtos);
dataSaubStatService = new DataSaubStatService( dataSaubStatService = new DataSaubStatService(

View File

@ -83,7 +83,7 @@ public class DataSaubStatDrillingQualityService : IDataSaubStatService
{ {
var leDate = DateTimeOffset.UtcNow; var leDate = DateTimeOffset.UtcNow;
var dataSaub = await dataSaubService.Get([idTelemetry], true, geDate, leDate, 100_000, token); var dataSaub = await dataSaubService.Get(idTelemetry, true, geDate, leDate, 100_000, token);
if (!dataSaub.Any()) if (!dataSaub.Any())
return 0; return 0;

View File

@ -78,7 +78,7 @@ public class DataSaubStatService : IDataSaubStatService
var geDate = detectedOperations.First().DateStart; var geDate = detectedOperations.First().DateStart;
var leDate = detectedOperations.OrderByDescending(d => d.DateEnd).First().DateEnd; var leDate = detectedOperations.OrderByDescending(d => d.DateEnd).First().DateEnd;
var dataSaub = await dataSaubService.Get([idTelemetry], true, geDate, leDate, 100_000, token); var dataSaub = await dataSaubService.Get(idTelemetry, true, geDate, leDate, 100_000, token);
if (!dataSaub.Any()) if (!dataSaub.Any())
return 0; return 0;

View File

@ -13,8 +13,6 @@ using System.Linq;
using System.Text.Csv; using System.Text.Csv;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using AsbCloudApp.Data;
using AsbCloudApp.Requests;
namespace AsbCloudInfrastructure.Services.SAUB; namespace AsbCloudInfrastructure.Services.SAUB;
@ -37,46 +35,50 @@ public class TelemetryDataSaubService : TelemetryDataBaseService<TelemetryDataSa
this.telemetryUserService = telemetryUserService; this.telemetryUserService = telemetryUserService;
} }
public async Task<IEnumerable<TelemetryDataSaubDto>> Get( public async Task<IEnumerable<TelemetryDataSaubDto>> Get(int idTelemetry, bool isBitOnBottom, DateTimeOffset geDate, DateTimeOffset leDate, int take, CancellationToken token)
IEnumerable<int> idsTelemetries,
bool isBitOnBottom,
DateTimeOffset geDate,
DateTimeOffset leDate,
int take,
CancellationToken token,
IEnumerable<short>? idsFeedRegulators)
{ {
var offsetDict = new Dictionary<int, TimeSpan>(); var offset = telemetryService.GetTimezone(idTelemetry).Offset;
foreach (var idTelemetry in idsTelemetries)
{
offsetDict.Add(idTelemetry, telemetryService.GetTimezone(idTelemetry).Offset);
}
var geDateUtc = geDate.ToUniversalTime(); var geDateUtc = geDate.ToUniversalTime();
var leDateUtc = leDate.ToUniversalTime(); var leDateUtc = leDate.ToUniversalTime();
var query = db.Set<TelemetryDataSaub>() var query = db.Set<TelemetryDataSaub>()
.Where(t => idsTelemetries.Contains(t.IdTelemetry)) .Where(t => t.IdTelemetry == idTelemetry)
.Where(t => t.DateTime >= geDateUtc) .Where(t => t.DateTime >= geDateUtc)
.Where(t => t.DateTime <= leDateUtc); .Where(t => t.DateTime <= leDateUtc);
if (isBitOnBottom) if (isBitOnBottom)
query = query.Where(t => Math.Abs(t.BitDepth - t.WellDepth) < 0.0001); query = query.Where(t => Math.Abs(t.BitDepth - t.WellDepth) < 0.0001);
if (idsFeedRegulators != null && idsFeedRegulators.Any())
query = query
.Where(t => t.IdFeedRegulator.HasValue)
.Where(t => idsFeedRegulators.Contains(t.IdFeedRegulator!.Value));
query = query query = query
.OrderBy(t => t.DateTime) .OrderBy(t => t.DateTime)
.Take(take); .Take(take);
var entities = await query.ToArrayAsync(token); var entities = await query.ToArrayAsync(token);
var dtos = entities.Select(e => Convert(e, offsetDict.GetValueOrDefault(e.IdTelemetry).TotalHours));
var dtos = entities.Select(e => Convert(e, offset.TotalHours));
return dtos; return dtos;
} }
public async Task<Dictionary<int, (float MinDepth, float MaxDepth)>> GetMinAndMaxWellDepths(IEnumerable<int> idsTelemetries, DateTimeOffset geDate, DateTimeOffset leDate, CancellationToken token)
{
var geDateUtc = geDate.ToUniversalTime();
var leDateUtc = leDate.ToUniversalTime();
var query = db.Set<TelemetryDataSaub>()
.Where(t => idsTelemetries.Contains(t.IdTelemetry))
.Where(t => t.DateTime >= geDateUtc)
.Where(t => t.DateTime <= leDateUtc)
.GroupBy(t => t.IdTelemetry);
var result = await query
.ToDictionaryAsync(t => t.Key, t => (
t.MinBy(x => x.WellDepth)!.WellDepth,
t.MaxBy(x => x.WellDepth)!.WellDepth
));
return result;
}
public async Task<IEnumerable<TelemetryDataSaubStatDto>> GetTelemetryDataStatAsync(int idTelemetry, CancellationToken token) public async Task<IEnumerable<TelemetryDataSaubStatDto>> GetTelemetryDataStatAsync(int idTelemetry, CancellationToken token)
{ {
var timezone = telemetryService.GetTimezone(idTelemetry); var timezone = telemetryService.GetTimezone(idTelemetry);

View File

@ -141,26 +141,20 @@ public class SubsystemService : ISubsystemService
.GetOrDefaultTelemetriesByIdsWells(request.IdsWell) .GetOrDefaultTelemetriesByIdsWells(request.IdsWell)
.ToDictionary(t => t.Id, t => t.IdWell); .ToDictionary(t => t.Id, t => t.IdWell);
var dtNow = DateTimeOffset.UtcNow;
var geDate = request.GeDate ?? SubsystemPlanFactRequest.ValidationMinDate; var geDate = request.GeDate ?? SubsystemPlanFactRequest.ValidationMinDate;
var leDate = request.LeDate ?? DateTimeOffset.UtcNow; var leDate = request.LeDate ?? DateTimeOffset.UtcNow;
var telemetryDataSaub = await telemetryDataSaubService.Get(telemetriesDict.Keys, false, geDate, leDate, 100_000, token); var groupedTelemetryDataSaub = await telemetryDataSaubService.GetMinAndMaxWellDepths(telemetriesDict.Keys, geDate, leDate, token);
var groupedTelemetryDataSaub = telemetryDataSaub
.GroupBy(t => t.IdTelemetry)
.ToDictionary(t => t.Key, t => new
{
IdWell = telemetriesDict.GetValueOrDefault(t.Key)!,
MinDepth = t.MinBy(x => x.WellDepth)!.WellDepth,
MaxDepth = t.MaxBy(x => x.WellDepth)!.WellDepth
});
var result = new List<SubsystemPlanFactStatDto>(); var result = new List<SubsystemPlanFactStatDto>();
foreach (var telemetryDataSaubItem in groupedTelemetryDataSaub) foreach (var telemetryDataSaubItem in groupedTelemetryDataSaub)
{ {
var idWell = telemetriesDict.GetValueOrDefault(telemetryDataSaubItem.Key);
if (!idWell.HasValue)
continue;
var telemetryDataSaubInfo = telemetryDataSaubItem.Value; var telemetryDataSaubInfo = telemetryDataSaubItem.Value;
var requestProcessMapPlan = new ProcessMapPlanBaseRequestWithWell(telemetryDataSaubInfo.IdWell!.Value, telemetryDataSaubInfo.MinDepth, telemetryDataSaubInfo.MaxDepth); var requestProcessMapPlan = new ProcessMapPlanBaseRequestWithWell(idWell.Value, telemetryDataSaubInfo.MinDepth, telemetryDataSaubInfo.MaxDepth);
var processMapPlanSubsystems = await processMapPlanRepository.GetCurrent(requestProcessMapPlan, token); var processMapPlanSubsystems = await processMapPlanRepository.GetCurrent(requestProcessMapPlan, token);
foreach (var processMapPlanSubsystem in processMapPlanSubsystems) foreach (var processMapPlanSubsystem in processMapPlanSubsystems)