forked from ddrilling/AsbCloudServer
112 lines
4.4 KiB
C#
112 lines
4.4 KiB
C#
using AsbCloudApp.Data;
|
|
using AsbCloudApp.Services;
|
|
using AsbCloudDb.Model;
|
|
using AsbCloudInfrastructure.Services.Cache;
|
|
using Mapster;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace AsbCloudInfrastructure.Services
|
|
{
|
|
public class WellService : IWellService
|
|
{
|
|
private readonly IAsbCloudDbContext db;
|
|
private readonly ITelemetryService telemetryService;
|
|
private readonly CacheTable<RelationCompanyWell> cacheRelationCompaniesWells;
|
|
private readonly CacheTable<Well> cacheWells;
|
|
|
|
public WellService(IAsbCloudDbContext db, ITelemetryService telemetryService, CacheDb cacheDb)
|
|
{
|
|
this.db = db;
|
|
this.telemetryService = telemetryService;
|
|
cacheRelationCompaniesWells = cacheDb.GetCachedTable<RelationCompanyWell>((AsbCloudDbContext)db);
|
|
cacheWells = cacheDb.GetCachedTable<Well>((AsbCloudDbContext)db);
|
|
}
|
|
|
|
public async Task<IEnumerable<WellDto>> GetTransmittingWellsAsync(int idCompany,
|
|
CancellationToken token) =>
|
|
await telemetryService.GetTransmittingWellsAsync(idCompany, token);
|
|
|
|
public async Task<IEnumerable<WellDto>> GetWellsByCompanyAsync(int idCompany, CancellationToken token)
|
|
{
|
|
var wells = await db.GetWellsForCompany(idCompany).ToListAsync(token);
|
|
return wells.Select(w => new WellDto
|
|
{
|
|
Id = w.Id,
|
|
Caption = w.Caption,
|
|
Cluster = w.Cluster.Caption,
|
|
Deposit = w.Cluster.Deposit.Caption,
|
|
});
|
|
}
|
|
|
|
public async Task<int?> UpdateWellAsync(int idWell, WellUpdateParamsDto dto,
|
|
CancellationToken token = default)
|
|
{
|
|
if (dto.IdWellType is < 1 or > 2)
|
|
throw new ArgumentException("Тип секции указан неправильно.");
|
|
|
|
if (dto.State is < 0 or > 2)
|
|
throw new ArgumentException("Текущее состояние работы скважины" +
|
|
"указано неправильно.");
|
|
var well = await db.Wells
|
|
.FirstOrDefaultAsync(w => w.Id == idWell, token)
|
|
.ConfigureAwait(false);
|
|
|
|
if (well is null)
|
|
return null;
|
|
|
|
well.Caption = dto.Caption;
|
|
well.Latitude = dto.Latitude;
|
|
well.Longitude = dto.Longitude;
|
|
well.IdWellType = dto.IdWellType;
|
|
well.State = dto.State;
|
|
|
|
db.Wells.Update(well);
|
|
|
|
return await db.SaveChangesAsync(token);
|
|
}
|
|
|
|
public bool IsCompanyInvolvedInWell(int idCompany, int idWell)
|
|
=> cacheRelationCompaniesWells.Contains(r => r.IdWell == idWell && r.IdCompany == idCompany);
|
|
|
|
public async Task<bool> IsCompanyInvolvedInWellAsync(int idCompany, int idWell, CancellationToken token)
|
|
=> await cacheRelationCompaniesWells.ContainsAsync(r => r.IdWell == idWell &&
|
|
r.IdCompany == idCompany, token).ConfigureAwait(false);
|
|
|
|
public async Task<WellDto> GetAsync(int idWell, CancellationToken token)
|
|
{
|
|
var entity = await db.Wells
|
|
.Include(w => w.Cluster)
|
|
.ThenInclude(c => c.Deposit)
|
|
.FirstOrDefaultAsync(w => w.Id == idWell, token)
|
|
.ConfigureAwait(false);
|
|
|
|
var dto = entity.Adapt<WellDto>();
|
|
dto.Cluster = entity.Cluster?.Caption;
|
|
dto.Deposit = entity.Cluster?.Deposit?.Caption;
|
|
return dto;
|
|
}
|
|
public async Task<string> GetWellCaptionByIdAsync(int idWell, CancellationToken token)
|
|
{
|
|
var entity = await cacheWells.FirstOrDefaultAsync(w => w.Id == idWell, token).ConfigureAwait(false);
|
|
var dto = entity.Adapt<WellDto>();
|
|
return dto.Caption;
|
|
}
|
|
|
|
public async Task<IEnumerable<CompanyDto>> GetCompaniesAsync(int idWell, CancellationToken token)
|
|
{
|
|
var well = await db.Wells
|
|
.Include(w => w.RelationCompaniesWells)
|
|
.ThenInclude(r => r.Company)
|
|
.FirstOrDefaultAsync(w => w.Id == idWell, token)
|
|
.ConfigureAwait(false);
|
|
var companies = well.RelationCompaniesWells.Select(r => r.Company);
|
|
return companies.Adapt<CompanyDto>();
|
|
}
|
|
}
|
|
}
|