forked from ddrilling/AsbCloudServer
CS2-1: Добавлена возможность получения диапазона дат архива
This commit is contained in:
parent
335792ae94
commit
abbc461330
@ -8,4 +8,8 @@
|
||||
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\AsbCloudDb\AsbCloudDb.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
@ -9,5 +9,6 @@ namespace AsbCloudApp.Services
|
||||
IEnumerable<DataSaubBaseDto> Get(int wellId, DateTime dateBegin = default, double intervalSec = 600d, int approxPointsCount = 1024);
|
||||
|
||||
void UpdateData(string uid, IEnumerable<DataSaubBaseDto> dtos);
|
||||
DatesRangeDto GetDataDatesRange(int wellId);
|
||||
}
|
||||
}
|
@ -1,4 +1,5 @@
|
||||
using AsbCloudApp.Data;
|
||||
using AsbCloudDb.Model;
|
||||
|
||||
namespace AsbCloudApp.Services
|
||||
{
|
||||
@ -7,5 +8,6 @@ namespace AsbCloudApp.Services
|
||||
int? GetWellIdByTelemetryUid(string uid);
|
||||
int GetOrCreateTemetryIdByUid(string uid);
|
||||
void UpdateInfo(string uid, TelemetryInfoDto info);
|
||||
Telemetry GetTelemetryByWellId(int wellId);
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,5 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
@ -194,6 +195,23 @@ namespace AsbCloudDb.Model
|
||||
.Include(e => e.Customer)
|
||||
.Where(e => e.Login == login);
|
||||
|
||||
public (DateTime From, DateTime To) GetDatesRange<T>(DbSet<T> dbSet, int idTelemetry) where T : class, IIdTelemetryDate
|
||||
{
|
||||
var datesRange = (from m in dbSet
|
||||
where m.IdTelemetry == idTelemetry
|
||||
group m by m.IdTelemetry into g
|
||||
select new
|
||||
{
|
||||
From = g.Min(d => d.Date),
|
||||
To = g.Max(d => d.Date)
|
||||
}).FirstOrDefault();
|
||||
|
||||
if (datesRange is null)
|
||||
return (From: DateTime.MinValue, To: DateTime.MaxValue);
|
||||
|
||||
return (From: datesRange.From, To: datesRange.To);
|
||||
}
|
||||
|
||||
public async Task<int> CreatePartitionAsync<TEntity>(string propertyName, int id, CancellationToken token = default)
|
||||
where TEntity : class
|
||||
{
|
||||
|
@ -9,7 +9,7 @@ using System.Text.Json.Serialization;
|
||||
namespace AsbCloudDb.Model
|
||||
{
|
||||
[Table("t_data_saub_base"), Comment("набор основных данных по SAUB")]
|
||||
public partial class DataSaubBase : IId
|
||||
public partial class DataSaubBase : IId, IIdTelemetryDate
|
||||
{
|
||||
[Key]
|
||||
[Column("id")]
|
||||
|
@ -1,4 +1,5 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
@ -25,6 +26,7 @@ namespace AsbCloudDb.Model
|
||||
|
||||
IQueryable<Well> GetWellsByCustomer(int idCustomer);
|
||||
IQueryable<User> GetUsersByLogin(string login);
|
||||
(DateTime From, DateTime To) GetDatesRange<T>(DbSet<T> dbSet, int idTelemetry) where T : class, IIdTelemetryDate;
|
||||
Task<int> CreatePartitionAsync<TEntity>(string propertyName, int id, CancellationToken token = default) where TEntity : class;
|
||||
}
|
||||
}
|
10
AsbCloudDb/Model/IIdTelemetryDate.cs
Normal file
10
AsbCloudDb/Model/IIdTelemetryDate.cs
Normal file
@ -0,0 +1,10 @@
|
||||
using System;
|
||||
|
||||
namespace AsbCloudDb.Model
|
||||
{
|
||||
public interface IIdTelemetryDate
|
||||
{
|
||||
int IdTelemetry { get; set; }
|
||||
DateTime Date { get; set; }
|
||||
}
|
||||
}
|
@ -8,14 +8,14 @@ using System.ComponentModel.DataAnnotations.Schema;
|
||||
namespace AsbCloudDb.Model
|
||||
{
|
||||
[Table("t_message"), Comment("Сообщения на буровых")]
|
||||
public partial class Message : IId
|
||||
public partial class Message : IId, IIdTelemetryDate
|
||||
{
|
||||
[Key]
|
||||
[Column("id")]
|
||||
public int Id { get; set; }
|
||||
|
||||
[Column("id_telemetry")]
|
||||
public int? IdTelemetry { get; set; }
|
||||
public int IdTelemetry { get; set; }
|
||||
|
||||
[Column("id_event")]
|
||||
public int IdEvent { get; set; }
|
||||
|
@ -96,5 +96,15 @@ namespace AsbCloudInfrastructure.Services
|
||||
db.SaveChanges();
|
||||
}
|
||||
|
||||
public DatesRangeDto GetDataDatesRange(int wellId)
|
||||
{
|
||||
var telemetry = telemetryService.GetTelemetryByWellId(wellId);
|
||||
if (telemetry is null)
|
||||
return null;
|
||||
|
||||
var result = db.GetDatesRange<DataSaubBase>(db.DataSaubBases, telemetry.Id);
|
||||
|
||||
return new DatesRangeDto { From = result.From, To = result.To};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -31,22 +31,9 @@ namespace AsbCloudInfrastructure.Services
|
||||
cacheWells = cacheDb.GetCachedTable<Well>((AsbCloudDbContext)db);
|
||||
}
|
||||
|
||||
private Telemetry GetTelemetryByWellId(int wellId)
|
||||
{
|
||||
var well = cacheWells.FirstOrDefault(w => w.Id == wellId);
|
||||
if (well is null)
|
||||
return null;
|
||||
|
||||
var telemetry = cacheTelemetry.FirstOrDefault(t => t.Id == well.Id);
|
||||
if (telemetry is null)
|
||||
return null;
|
||||
|
||||
return telemetry;
|
||||
}
|
||||
|
||||
public PaginationContainer<MessageDto> GetMessages(int wellId, IEnumerable<int> categoryids = default, DateTime begin = default, DateTime end = default, int skip = 0, int take = 32)
|
||||
{
|
||||
var telemetry = GetTelemetryByWellId(wellId);
|
||||
var telemetry = telemetryService.GetTelemetryByWellId(wellId);
|
||||
if (telemetry is null)
|
||||
return null;
|
||||
|
||||
@ -117,19 +104,13 @@ namespace AsbCloudInfrastructure.Services
|
||||
|
||||
public DatesRangeDto GetMessagesDatesRange(int wellId)
|
||||
{
|
||||
var telemetry = GetTelemetryByWellId(wellId);
|
||||
var telemetry = telemetryService.GetTelemetryByWellId(wellId);
|
||||
if (telemetry is null)
|
||||
return null;
|
||||
|
||||
var messagesDatesRange = (from m in db.Messages
|
||||
where m.IdTelemetry == telemetry.Id
|
||||
group m by m.IdTelemetry into g
|
||||
select new DatesRangeDto {
|
||||
From = g.Min(d => d.Date),
|
||||
To = g.Max(d => d.Date)
|
||||
}).FirstOrDefault();
|
||||
var result = db.GetDatesRange<Message>(db.Messages, telemetry.Id);
|
||||
|
||||
return messagesDatesRange ?? new DatesRangeDto { From = DateTime.MinValue, To = DateTime.MaxValue};
|
||||
return new DatesRangeDto { From = result.From, To = result.To };
|
||||
}
|
||||
|
||||
public void Insert(string uid, IEnumerable<TelemetryMessageDto> dtos)
|
||||
|
@ -10,13 +10,13 @@ namespace AsbCloudInfrastructure.Services
|
||||
{
|
||||
private readonly IMapper mapper;
|
||||
private readonly ICacheTable<Telemetry> cacheTelemetry;
|
||||
private readonly ICacheTable<Well> cacheWell;
|
||||
private readonly ICacheTable<Well> cacheWells;
|
||||
|
||||
public TelemetryService(IAsbCloudDbContext db, CacheDb cacheDb, MapperConfiguration mapperConfiguration)
|
||||
{
|
||||
mapper = mapperConfiguration.CreateMapper();
|
||||
cacheTelemetry = cacheDb.GetCachedTable<Telemetry>((AsbCloudDbContext)db);
|
||||
cacheWell = cacheDb.GetCachedTable<Well>((AsbCloudDbContext)db);
|
||||
cacheWells = cacheDb.GetCachedTable<Well>((AsbCloudDbContext)db);
|
||||
}
|
||||
|
||||
public int GetOrCreateTemetryIdByUid(string uid)
|
||||
@ -32,13 +32,26 @@ namespace AsbCloudInfrastructure.Services
|
||||
cacheTelemetry.Upsert(telemetry);
|
||||
}
|
||||
|
||||
public Telemetry GetTelemetryByWellId(int wellId)
|
||||
{
|
||||
var well = cacheWells.FirstOrDefault(w => w.Id == wellId);
|
||||
if (well is null)
|
||||
return null;
|
||||
|
||||
var telemetry = cacheTelemetry.FirstOrDefault(t => t.Id == well.Id);
|
||||
if (telemetry is null)
|
||||
return null;
|
||||
|
||||
return telemetry;
|
||||
}
|
||||
|
||||
private Well GetWellByTelemetryUid(string uid)
|
||||
{
|
||||
var tele = cacheTelemetry.FirstOrDefault(t => t.RemoteUid == uid, RefreshMode.IfResultEmpty);
|
||||
if (tele is null)
|
||||
return null;
|
||||
|
||||
return cacheWell.FirstOrDefault(w => w?.IdTelemetry == tele.Id);
|
||||
return cacheWells.FirstOrDefault(w => w?.IdTelemetry == tele.Id);
|
||||
}
|
||||
|
||||
private Telemetry GetOrCreateTelemetryByUid(string uid)
|
||||
|
@ -16,10 +16,12 @@ namespace AsbCloudWebApi.Controllers
|
||||
public class DataController : ControllerBase
|
||||
{
|
||||
private readonly IDataService telemetryDataService;
|
||||
private readonly IWellService wellService;
|
||||
|
||||
public DataController(IDataService telemetryDataService)
|
||||
public DataController(IDataService telemetryDataService, IWellService wellService)
|
||||
{
|
||||
this.telemetryDataService = telemetryDataService;
|
||||
this.wellService = wellService;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -41,5 +43,25 @@ namespace AsbCloudWebApi.Controllers
|
||||
var content = telemetryDataService.Get(wellId, begin, intervalSec, approxPointsCount);
|
||||
return Ok(content);
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
[Route("{wellId}/dataDatesRange")]
|
||||
[ProducesResponseType(typeof(DatesRangeDto), (int)System.Net.HttpStatusCode.OK)]
|
||||
public IActionResult GetDataDatesRange(int wellId)
|
||||
{
|
||||
int? idCustomer = User.GetCustomerId();
|
||||
|
||||
if (idCustomer is null)
|
||||
return BadRequest();
|
||||
|
||||
bool isCustomerOwnsWell = wellService.CheckWellOwnership((int)idCustomer, wellId);
|
||||
|
||||
if (!isCustomerOwnsWell)
|
||||
return Forbid();
|
||||
|
||||
DatesRangeDto dataDatesRange = telemetryDataService.GetDataDatesRange(wellId);
|
||||
|
||||
return Ok(dataDatesRange);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user