CS2-53: Added basics of WellOperation controller, service, model and dto

This commit is contained in:
KharchenkoVV 2021-08-13 17:25:06 +05:00
parent 1956eafb32
commit bc1bcb2ee2
14 changed files with 201 additions and 106 deletions

View File

@ -1,18 +1,27 @@
namespace AsbCloudApp.Data
using System;
namespace AsbCloudApp.Data
{
public class WellOperationDto : IId
{
public int Id { get; set; }
public int IdWell { get; set; }
public int IdSection { get; set; }
public string Caption { get; set; }
public int IdCategory { get; set; }
public string Description { get; set; }
public string CategoryName { get; set; }
public double CasingSection { get; set; }
public string Type { get; set; }
public double WellDepth { get; set; }
public string WellDepth { get; set; }
public DateTime StartDate { get; set; }
public double Duration { get; set; }
public string Data { get; set; }
public string Comment { get; set; }
}
}

View File

@ -0,0 +1,13 @@
using System.Threading;
using System.Threading.Tasks;
using AsbCloudApp.Data;
namespace AsbCloudApp.Services
{
public interface IWellOperationService
{
Task<PaginationContainer<WellOperationDto>> GetAllByWellIdAsync(int idWell,
int skip = 0, int take = 32, CancellationToken token = default);
}
}

View File

@ -27,14 +27,13 @@ namespace AsbCloudDb.Model
public virtual DbSet<TelemetryEvent> TelemetryEvents { get; set; }
public virtual DbSet<TelemetryMessage> TelemetryMessages { get; set; }
public virtual DbSet<TelemetryUser> TelemetryUsers { get; set; }
public virtual DbSet<Operation> TelemetryOperations { get; set; }
public virtual DbSet<OperationCategory> TelemetryOperations { get; set; }
public virtual DbSet<TelemetryAnalysis> TelemetryAnalysis { get; set; }
public virtual DbSet<WellSection> WellSections { get; set; }
public virtual DbSet<WellSectionType> WellSectionTypes { get; set; }
public virtual DbSet<WellOperation> WellOperations { get; set; }
public virtual DbSet<WellType> WellTypes { get; set; }
public virtual DbSet<LastData> LastData { get; set; }
public virtual DbSet<TvdData> TvdData { get; set; }
//var options = new DbContextOptionsBuilder<AsbCloudDbContext>()
// .UseNpgsql("Host=localhost;Database=postgres;Username=postgres;Password=q;Persist Security Info=True")
@ -164,10 +163,10 @@ namespace AsbCloudDb.Model
.HasConstraintName("t_relation_company_well_t_company_id_fk");
});
modelBuilder.Entity<TvdData>(entity =>
modelBuilder.Entity<WellOperation>(entity =>
{
entity.HasIndex(d => d.Depth);
entity.HasIndex(d => d.Date);
entity.HasIndex(d => d.WellDepth);
entity.HasIndex(d => d.StartDate);
});
FillData(modelBuilder);
@ -205,26 +204,26 @@ namespace AsbCloudDb.Model
});
});
modelBuilder.Entity<Operation>(entity =>
modelBuilder.Entity<OperationCategory>(entity =>
{
entity.HasData(new List<Operation> {
new Operation {Id = 1, OperationType = 0, Name = "Невозможно определить операцию"},
new Operation {Id = 2, OperationType = 0, Name = "Роторное бурение" },
new Operation {Id = 3, OperationType = 0, Name = "Слайдирование" },
new Operation {Id = 4, OperationType = 0, Name = "Подъем с проработкой" },
new Operation {Id = 5, OperationType = 0, Name = "Спуск с проработкой" },
new Operation {Id = 6, OperationType = 0, Name = "Подъем с промывкой" },
new Operation {Id = 7, OperationType = 0, Name = "Спуск с промывкой" },
new Operation {Id = 8, OperationType = 0, Name = "Спуск в скважину" },
new Operation {Id = 9, OperationType = 0, Name = "Спуск с вращением" },
new Operation {Id = 10, OperationType = 0, Name = "Подъем из скважины" },
new Operation {Id = 11, OperationType = 0, Name = "Подъем с вращением" },
new Operation {Id = 12, OperationType = 0, Name = "Промывка в покое" },
new Operation {Id = 13, OperationType = 0, Name = "Промывка с вращением" },
new Operation {Id = 14, OperationType = 0, Name = "Удержание в клиньях" },
new Operation {Id = 15, OperationType = 0, Name = "Неподвижное состояние" },
new Operation {Id = 16, OperationType = 0, Name = "Вращение без циркуляции" },
new Operation {Id = 17, OperationType = 0, Name = "На поверхности" }
entity.HasData(new List<OperationCategory> {
new OperationCategory {Id = 1, OperationType = 0, Name = "Невозможно определить операцию"},
new OperationCategory {Id = 2, OperationType = 0, Name = "Роторное бурение" },
new OperationCategory {Id = 3, OperationType = 0, Name = "Слайдирование" },
new OperationCategory {Id = 4, OperationType = 0, Name = "Подъем с проработкой" },
new OperationCategory {Id = 5, OperationType = 0, Name = "Спуск с проработкой" },
new OperationCategory {Id = 6, OperationType = 0, Name = "Подъем с промывкой" },
new OperationCategory {Id = 7, OperationType = 0, Name = "Спуск с промывкой" },
new OperationCategory {Id = 8, OperationType = 0, Name = "Спуск в скважину" },
new OperationCategory {Id = 9, OperationType = 0, Name = "Спуск с вращением" },
new OperationCategory {Id = 10, OperationType = 0, Name = "Подъем из скважины" },
new OperationCategory {Id = 11, OperationType = 0, Name = "Подъем с вращением" },
new OperationCategory {Id = 12, OperationType = 0, Name = "Промывка в покое" },
new OperationCategory {Id = 13, OperationType = 0, Name = "Промывка с вращением" },
new OperationCategory {Id = 14, OperationType = 0, Name = "Удержание в клиньях" },
new OperationCategory {Id = 15, OperationType = 0, Name = "Неподвижное состояние" },
new OperationCategory {Id = 16, OperationType = 0, Name = "Вращение без циркуляции" },
new OperationCategory {Id = 17, OperationType = 0, Name = "На поверхности" }
});
});

View File

@ -22,7 +22,7 @@ namespace AsbCloudDb.Model
DbSet<FileCategory> FileCategories { get; set; }
DbSet<Telemetry> Telemetries { get; set; }
DbSet<TelemetryUser> TelemetryUsers { get; set; }
DbSet<Operation> TelemetryOperations { get; set; }
DbSet<OperationCategory> TelemetryOperations { get; set; }
DbSet<TelemetryAnalysis> TelemetryAnalysis { get; set; }
DbSet<Well> Wells { get; set; }
DbSet<WellSection> WellSections { get; set; }
@ -30,7 +30,6 @@ namespace AsbCloudDb.Model
DbSet<WellOperation> WellOperations { get; set; }
DbSet<WellType> WellTypes { get; set; }
DbSet<LastData> LastData { get; set; }
DbSet<TvdData> TvdData { get; set; }
int SaveChanges();
int SaveChanges(bool acceptAllChangesOnSuccess);

View File

@ -6,7 +6,7 @@ using System.ComponentModel.DataAnnotations.Schema;
namespace AsbCloudDb.Model
{
[Table("t_operations"), Comment("Справочник операций на скважине")]
public class Operation
public class OperationCategory
{
[Key]
[Column("id")]

View File

@ -28,8 +28,8 @@ namespace AsbCloudDb.Model
[JsonIgnore]
[ForeignKey(nameof(IdOperation))]
[InverseProperty(nameof(Model.Operation.Analysis))]
public virtual Operation Operation { get; set; }
[InverseProperty(nameof(Model.OperationCategory.Analysis))]
public virtual OperationCategory Operation { get; set; }
[Column("unix_date", TypeName = "bigint"), Comment("Unix timestamp для Linq запросов с вычислением дат")]

View File

@ -1,48 +0,0 @@
using System;
using Microsoft.EntityFrameworkCore;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Text.Json.Serialization;
namespace AsbCloudDb.Model
{
[Table("t_tvd_data"), Comment("Данные для графика глубина-день")]
public class TvdData
{
[Key]
[Column("id")]
public int Id { get; set; }
[Column("id_section"), Comment("Id секции скважины")]
public int IdSection { get; set; }
[Column("id_category"), Comment("Id категории операции")]
public int IdCategory { get; set; }
[Column("type"), Comment("План или Факт")]
public string Type { get; set; }
[Column("depth"), Comment("Глубина, на которой производилась операция")]
public string Depth { get; set; }
[Column("date"), Comment("Дата операции")]
public DateTime Date { get; set; }
[Column("duration_hours"), Comment("Продолжительность в часах")]
public double Duration { get; set; }
[Column("data"), Comment("Данные по операции")]
public string Data { get; set; }
[Column("comment"), Comment("Комментарий")]
public string Comment { get; set; }
[JsonIgnore]
[ForeignKey(nameof(IdSection))]
public virtual WellSection WellSection { get; set; }
[JsonIgnore]
[ForeignKey(nameof(IdCategory))]
public virtual Operation Operation { get; set; }
}
}

View File

@ -1,36 +1,51 @@
using Microsoft.EntityFrameworkCore;
using System;
using Microsoft.EntityFrameworkCore;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Text.Json.Serialization;
#nullable disable
namespace AsbCloudDb.Model
{
[Table("t_well_operation"), Comment("Операции по скважине")]
public class WellOperation: IId, IIdWell
[Table("t_well_operations"), Comment("Данные по операциям на скважине")]
public class WellOperation
{
[Key]
[Column("id")]
public int Id { get; set; }
[Column("id_well")]
[Column("id_well"), Comment("Id скважины")]
public int IdWell { get; set; }
[Column("caption")]
public string Caption { get; set; }
[Column("id_section"), Comment("Id секции скважины")]
public int IdSection { get; set; }
[Column("description")]
public string Description { get; set; }
[Column("id_category"), Comment("Id категории операции")]
public int IdCategory { get; set; }
[Column("casing_section")]
public double CasingSection { get; set; }
[Column("type"), Comment("План или Факт")]
public string Type { get; set; }
[Column("well_depth")]
public double WellDepth { get; set; }
[Column("depth"), Comment("Глубина, на которой производилась операция")]
public string WellDepth { get; set; }
[Column("date"), Comment("Дата начала операции")]
public DateTime StartDate { get; set; }
[Column("duration_hours"), Comment("Продолжительность в часах")]
public double Duration { get; set; }
[Column("data"), Comment("Данные по операции")]
public string Data { get; set; }
[Column("comment"), Comment("Комментарий")]
public string Comment { get; set; }
[JsonIgnore]
[ForeignKey(nameof(IdWell))]
public virtual Well Well { get; set; }
[ForeignKey(nameof(IdSection))]
public virtual WellSection WellSection { get; set; }
[JsonIgnore]
[ForeignKey(nameof(IdCategory))]
public virtual OperationCategory OperationCategory { get; set; }
}
}

View File

@ -37,6 +37,7 @@ namespace AsbCloudInfrastructure
services.AddTransient<ITelemetryAnalyticsService, TelemetryAnalyticsService>();
services.AddTransient<IFileService, FileService>();
services.AddTransient<IWellSectionService, WellSectionService>();
services.AddTransient<IWellOperationService, WellOperationService>();
services.AddTransient<ILastDataService<FluidDataDto>, LastDataService<FluidDataDto, FluidData>>();
services.AddTransient<ILastDataService<MudDiagramDataDto>, LastDataService<MudDiagramDataDto, MudDiagramData>>();

View File

@ -17,9 +17,9 @@ namespace AsbCloudInfrastructure.Services
private readonly IAsbCloudDbContext db;
private readonly ITelemetryService telemetryService;
private readonly ISaubDataCache saubDataCache;
private readonly CacheTable<Operation> cacheOperations;
private readonly CacheTable<OperationCategory> cacheOperations;
private readonly TelemetryOperationDetectorService operationDetectorService;
private readonly IEnumerable<Operation> operations;
private readonly IEnumerable<OperationCategory> operations;
public TelemetryAnalyticsService(IAsbCloudDbContext db, ITelemetryService telemetryService,
ISaubDataCache saubDataCache, CacheDb cacheDb)
@ -27,7 +27,7 @@ namespace AsbCloudInfrastructure.Services
this.db = db;
this.telemetryService = telemetryService;
this.saubDataCache = saubDataCache;
cacheOperations = cacheDb.GetCachedTable<Operation>((AsbCloudDbContext)db);
cacheOperations = cacheDb.GetCachedTable<OperationCategory>((AsbCloudDbContext)db);
operations = cacheOperations.Select(c => true);
operationDetectorService = new TelemetryOperationDetectorService(operations);
}

View File

@ -7,7 +7,7 @@ namespace AsbCloudInfrastructure.Services
public class TelemetryOperationDetector
{
public int Order { get; set; }
public Operation Operation { get; set; }
public OperationCategory Operation { get; set; }
public Func<TelemetryAnalysisDto, bool> Detect { get; set; }
}
}

View File

@ -9,7 +9,7 @@ namespace AsbCloudInfrastructure.Services
{
private readonly IEnumerable<TelemetryOperationDetector> detectors;
public TelemetryOperationDetectorService(IEnumerable<Operation> operations)
public TelemetryOperationDetectorService(IEnumerable<OperationCategory> operations)
{
detectors = new List<TelemetryOperationDetector>()
{
@ -180,8 +180,8 @@ namespace AsbCloudInfrastructure.Services
};
}
public Operation DetectOperation(TelemetryAnalysisDto data) =>
public OperationCategory DetectOperation(TelemetryAnalysisDto data) =>
detectors.OrderBy(d => d.Order).First(o => o.Detect(data)).Operation
?? new Operation { Id = 1, Name = "Невозможно определить операцию" };
?? new OperationCategory { Id = 1, Name = "Невозможно определить операцию" };
}
}

View File

@ -0,0 +1,61 @@
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using AsbCloudApp.Data;
using AsbCloudApp.Services;
using AsbCloudDb.Model;
using AsbCloudInfrastructure.Services.Cache;
using Mapster;
namespace AsbCloudInfrastructure.Services
{
public class WellOperationService : IWellOperationService
{
private readonly IAsbCloudDbContext context;
private readonly DbSet<WellOperation> dbSet;
private readonly CacheTable<OperationCategory> cachedOperationTypes;
public WellOperationService(IAsbCloudDbContext context, Cache.CacheDb cache)
{
this.context = context;
dbSet = context.Set<WellOperation>();
cachedOperationTypes = cache.GetCachedTable<OperationCategory>((DbContext)context);
}
public async Task<PaginationContainer<WellOperationDto>> GetAllByWellIdAsync(int idWell,
int skip = 0, int take = 32, CancellationToken token = default)
{
var query = dbSet
.Include(s => s.WellSection)
.Where(s => s.WellSection.IdWell == idWell)
.AsNoTracking();
var result = new PaginationContainer<WellOperationDto>
{
Skip = skip,
Take = take,
Count = await query.CountAsync(token).ConfigureAwait(false),
};
query = query
.OrderBy(e => e.WellDepth);
if (skip > 0)
query = query.Skip(skip);
query = query.Take(take);
var entities = await query.Take(take).ToListAsync(token).ConfigureAwait(false);
foreach (var item in entities)
{
var dto = item.Adapt<WellOperationDto>();
//dto.SectionType = item.WellSectionType.Caption;
result.Items.Add(dto);
}
return result;
}
}
}

View File

@ -0,0 +1,46 @@
using System.Threading;
using System.Threading.Tasks;
using AsbCloudApp.Data;
using AsbCloudApp.Services;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Authorization;
namespace AsbCloudWebApi.Controllers
{
/// <summary>
/// Контроллер операций на скважине
/// </summary>
[Route("api/wellOperation")]
[ApiController]
[Authorize]
public class WellOperationController : ControllerBase
{
private readonly IWellOperationService operationService;
private readonly IWellService wellService;
public WellOperationController(IWellOperationService operationService, IWellService wellService)
{
this.operationService = operationService;
this.wellService = wellService;
}
[HttpGet]
[ProducesResponseType(typeof(PaginationContainer<WellSectionDto>), (int)System.Net.HttpStatusCode.OK)]
public async Task<IActionResult> GetAllAsync(int idWell, int skip = 0, int take = 32,
CancellationToken token = default)
{
if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false))
return Forbid();
var result = await operationService.GetAllByWellIdAsync(idWell, skip, take, token).ConfigureAwait(false);
return Ok(result);
}
private async Task<bool> CanUserAccessToWellAsync(int idWell, CancellationToken token = default)
{
int? idCompany = User.GetCompanyId();
return idCompany is not null && await wellService.IsCompanyInvolvedInWellAsync((int)idCompany,
idWell, token).ConfigureAwait(false);
}
}
}