добавлен отдельный файл для TrajectoryDto, добавлен интерфейс ITrajectoryRepository и его реализация для плановой и фактической траектории

This commit is contained in:
Olga Nemt 2023-05-11 11:50:45 +05:00
parent 2201b6582d
commit 37399f74a7
7 changed files with 72 additions and 59 deletions

View File

@ -0,0 +1,13 @@
namespace AsbCloudApp.Data
{
/// <summary>
/// Формирование визуализации траектории 3D
/// </summary>
/// <param name="WellboreDepth">Глубина ствола</param>
/// <param name="ZenithAngle">Зенитный угол</param>
/// <param name="AzimuthGeo">Азимут географиеский</param>
public record TrajectoryDto(
double WellboreDepth,
double ZenithAngle,
double AzimuthGeo);
}

View File

@ -10,7 +10,7 @@ namespace AsbCloudApp.Repositories
/// CRUD для работы с фактической траекторией из клиента /// CRUD для работы с фактической траекторией из клиента
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
public interface IFactualTrajectoryRepository public interface IFactualTrajectoryRepository : ITrajectoryRepository
{ {
/// <summary> /// <summary>
/// Получить все добавленные по скважине координаты фактической траектории /// Получить все добавленные по скважине координаты фактической траектории

View File

@ -9,7 +9,7 @@ namespace AsbCloudApp.Repositories
/// CRUD для работы с плановой траекторией из клиента /// CRUD для работы с плановой траекторией из клиента
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
public interface IPlannedTrajectoryRepository public interface IPlannedTrajectoryRepository : ITrajectoryRepository
{ {
/// <summary> /// <summary>
/// Получить все добавленные по скважине координаты плановой траектории /// Получить все добавленные по скважине координаты плановой траектории

View File

@ -0,0 +1,24 @@
using AsbCloudApp.Data;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace AsbCloudApp.Repositories
{
/// <summary>
/// Репозиторий по работе с траекторией
/// </summary>
public interface ITrajectoryRepository
{
/// <summary>
/// Получение траектории для 3D-визуализации
/// </summary>
/// <param name="idWell">ключ скважины</param>
/// <param name="token"></param>
/// <returns></returns>
Task<TrajectoryDto[]> GetTrajectoryAsync(int idWell, CancellationToken token);
}
}

View File

@ -1,8 +1,10 @@
using AsbCloudApp.Data.WITS; using AsbCloudApp.Data;
using AsbCloudApp.Data.WITS;
using AsbCloudApp.Exceptions; using AsbCloudApp.Exceptions;
using AsbCloudApp.Repositories; using AsbCloudApp.Repositories;
using AsbCloudApp.Services; using AsbCloudApp.Services;
using AsbCloudDb.Model; using AsbCloudDb.Model;
using Mapster;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@ -34,14 +36,16 @@ namespace AsbCloudInfrastructure.Repository
.OrderBy(e => e.Deptsvym) .OrderBy(e => e.Deptsvym)
.ToListAsync(token); .ToListAsync(token);
var result = entities var result = entities
.Select(r => new Record7Dto() .Select(r => r.Adapt<Record7Dto>());
{
IdTelemetry = r.IdTelemetry,
Deptsvym = r.Deptsvym,
Svyinc = r.Svyinc,
Svyazc = r.Svyazc
});
return result; return result;
} }
public async Task<TrajectoryDto[]> GetTrajectoryAsync(int idWell, CancellationToken token)
{
return (await GetAsync(idWell, token))
.Where(coord => coord.Deptsvym != null && coord.Svyinc != null && coord.Svyazc != null)
.Select(coord => new TrajectoryDto(coord.Deptsvym!.Value, coord.Svyinc!.Value, coord.Svyazc!.Value))
.ToArray();
}
} }
} }

View File

@ -115,6 +115,13 @@ namespace AsbCloudInfrastructure.Repository
entity.UpdateDate = DateTime.Now.ToUtcDateTimeOffset(offsetHours); entity.UpdateDate = DateTime.Now.ToUtcDateTimeOffset(offsetHours);
return entity; return entity;
} }
public async Task<TrajectoryDto[]> GetTrajectoryAsync(int idWell, CancellationToken token)
{
return (await GetAsync(idWell, token))
.Select(coord => new TrajectoryDto(coord.WellboreDepth, coord.ZenithAngle, coord.AzimuthGeo))
.ToArray();
}
} }
} }

View File

@ -33,12 +33,8 @@ namespace AsbCloudInfrastructure.Services.Trajectory
{ {
var result = new PlanFactBase<IEnumerable<TrajectoryVisualizationDto>>(); var result = new PlanFactBase<IEnumerable<TrajectoryVisualizationDto>>();
var geoPlanCoordinates = (await plannedRepository.GetAsync(idWell, token)) var geoPlanCoordinates = await plannedRepository.GetTrajectoryAsync(idWell, token);
.Select(coord => new TrajectoryDto(coord.WellboreDepth, coord.ZenithAngle, coord.AzimuthGeo)) var geoFactCoordinates = await factualRepository.GetTrajectoryAsync(idWell, token);
.ToArray();
var geoFactCoordinates = (await factualRepository.GetAsync(idWell, token))
.Select(coord => new TrajectoryDto(coord.Deptsvym, coord.Svyinc, coord.Svyazc))
.ToArray();
result.Plan = GetTrajectoryVisualisation(geoPlanCoordinates); result.Plan = GetTrajectoryVisualisation(geoPlanCoordinates);
result.Fact = GetTrajectoryVisualisation(geoFactCoordinates); result.Fact = GetTrajectoryVisualisation(geoFactCoordinates);
@ -61,56 +57,25 @@ namespace AsbCloudInfrastructure.Services.Trajectory
{ {
var intervalGeoParams = geoCoordinates[i - 1]; var intervalGeoParams = geoCoordinates[i - 1];
var deltaWellLength = geoCoordinates[i].WellboreDepth - intervalGeoParams.WellboreDepth; var deltaWellLength = geoCoordinates[i].WellboreDepth - intervalGeoParams.WellboreDepth;
var projectionLengthToXYSurface = deltaWellLength * Math.Sin(intervalGeoParams.ZenithAngle * Math.PI / 180);
if (intervalGeoParams.ZenithAngle != null && intervalGeoParams.AzimuthGeo != null && deltaWellLength != null) { var dz = deltaWellLength * Math.Cos(intervalGeoParams.ZenithAngle * Math.PI / 180);
var dx = projectionLengthToXYSurface * Math.Sin(intervalGeoParams.AzimuthGeo * Math.PI / 180);
var projectionLengthToXYSurface = deltaWellLength.Value * Math.Sin(intervalGeoParams.ZenithAngle.Value * Math.PI / 180); var dy = projectionLengthToXYSurface * Math.Cos(intervalGeoParams.AzimuthGeo * Math.PI / 180);
var dz = deltaWellLength.Value * Math.Cos(intervalGeoParams.ZenithAngle.Value * Math.PI / 180); var preCoordinates = cartesianCoordinates[i - 1];
var dx = projectionLengthToXYSurface * Math.Sin(intervalGeoParams.AzimuthGeo.Value * Math.PI / 180); var coordinates = new TrajectoryVisualizationDto
var dy = projectionLengthToXYSurface * Math.Cos(intervalGeoParams.AzimuthGeo.Value * Math.PI / 180); {
Z = preCoordinates.Z + dz,
X = preCoordinates.X + dx,
Y = preCoordinates.Y + dy,
};
var preCoordinates = cartesianCoordinates[i - 1]; cartesianCoordinates.Add(coordinates);
var coordinates = new TrajectoryVisualizationDto
{
Z = preCoordinates.Z + dz,
X = preCoordinates.X + dx,
Y = preCoordinates.Y + dy,
};
cartesianCoordinates.Add(coordinates);
}
} }
return cartesianCoordinates; return cartesianCoordinates;
} }
} }
/// <summary>
/// Класс для формирования визуализации траектории 3D
/// </summary>
internal class TrajectoryDto
{
/// <summary>
/// Глубина ствола
/// </summary>
public double? WellboreDepth { get; }
/// <summary>
/// Зенитный угол
/// </summary>
public double? ZenithAngle { get; }
/// <summary>
/// Азимут географиеский
/// </summary>
public double? AzimuthGeo { get; }
public TrajectoryDto(double? wellboreDepth, double? zenithAngle, double? azimuthGeo)
{
WellboreDepth = wellboreDepth;
ZenithAngle = zenithAngle;
AzimuthGeo = azimuthGeo;
}
}
} }