forked from ddrilling/AsbCloudServer
- в контроллер наработки подсистем добавлен валидатор согласно постановки задачи
- изменения алгоритма наработки подсистем САУБ
This commit is contained in:
parent
c6a49056bd
commit
0e4c2c9eb3
@ -108,19 +108,63 @@ namespace AsbCloudInfrastructure.Services.Subsystems
|
||||
}
|
||||
private static async Task<IEnumerable<SubsystemOperationTime>> OperationTimeSaubAsync(int idTelemetry, DateTimeOffset begin, IAsbCloudDbContext db, CancellationToken token)
|
||||
{
|
||||
static int? GetSubsytemId(short mode)
|
||||
static bool isSubsytemAkb(short? mode)
|
||||
{
|
||||
if (mode is null)
|
||||
return false;
|
||||
if (mode == 1 | mode == 3)
|
||||
return 1;
|
||||
|
||||
return null;
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool IsSubsystemMse(short state)
|
||||
static bool IsSubsystemMse(short? state)
|
||||
{
|
||||
if (state is null)
|
||||
return false;
|
||||
if ((state & 1) > 0)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
static List<SubsystemOperationTime> getSubsystemOperationTimes (List<DataRow> dataRows, Predicate<DataRow> satisfyCondition, int idSubsystem, int idTelemetry)
|
||||
{
|
||||
if (dataRows is null)
|
||||
return new List<SubsystemOperationTime>();
|
||||
if (dataRows.Count < 2)
|
||||
return new List<SubsystemOperationTime>();
|
||||
var listSubsystemOperationTime = new List<SubsystemOperationTime>();
|
||||
var foundSubsystem = satisfyCondition(dataRows[0]);
|
||||
var dateStart = dataRows[0].Date;
|
||||
var depthStart = dataRows[0].Depth;
|
||||
|
||||
for (int i = 1; i<dataRows.Count; i++)
|
||||
{
|
||||
var dateEnd = dataRows[i].Date;
|
||||
var depthEnd = dataRows[i].Depth;
|
||||
var currentSatisfy = satisfyCondition(dataRows[i]);
|
||||
var endSubsystem = !currentSatisfy;
|
||||
if (foundSubsystem && endSubsystem)
|
||||
{
|
||||
var operationTimeItem = new SubsystemOperationTime()
|
||||
{
|
||||
IdTelemetry = idTelemetry,
|
||||
IdSubsystem = idSubsystem,
|
||||
DateStart = dateStart,
|
||||
DateEnd = dateEnd,
|
||||
DepthStart = depthStart,
|
||||
DepthEnd = depthEnd
|
||||
};
|
||||
listSubsystemOperationTime.Add(operationTimeItem);
|
||||
foundSubsystem = false;
|
||||
}
|
||||
if (currentSatisfy && !foundSubsystem)
|
||||
{
|
||||
dateStart = dateEnd;
|
||||
foundSubsystem = true;
|
||||
depthStart = depthEnd;
|
||||
}
|
||||
}
|
||||
return listSubsystemOperationTime;
|
||||
}
|
||||
|
||||
var query =
|
||||
@ -149,47 +193,96 @@ namespace AsbCloudInfrastructure.Services.Subsystems
|
||||
|
||||
using var result = await command.ExecuteReaderAsync(token);
|
||||
|
||||
var subsystemOperationTime = new List<SubsystemOperationTime>(32);
|
||||
|
||||
if (result.Read())
|
||||
var subsystemOperationTime = new List<SubsystemOperationTime>();
|
||||
var dataRowList = new List<DataRow>();
|
||||
while (result.Read())
|
||||
{
|
||||
var mode = result.GetFieldValue<short>(1);
|
||||
//var mseState = result.GetFieldValue<short>(3);
|
||||
var idSubsystem = GetSubsytemId(mode);
|
||||
var foundSubsystem = idSubsystem.HasValue;
|
||||
var dateStart = result.GetFieldValue<DateTimeOffset>(0);
|
||||
var depthStart = result.GetFieldValue<float>(2);
|
||||
|
||||
while (result.Read())
|
||||
var dateRowItem = new DataRow()
|
||||
{
|
||||
var dateEnd = result.GetFieldValue<DateTimeOffset>(0);
|
||||
var depthEnd = result.GetFieldValue<float>(2);
|
||||
var currentMode = result.GetFieldValue<short>(1);
|
||||
var currentSubsystemAkb = GetSubsytemId(currentMode);
|
||||
var endSubsystemAkb = !currentSubsystemAkb.HasValue;
|
||||
if (foundSubsystem && endSubsystemAkb)
|
||||
{
|
||||
var operationTimeItem = new SubsystemOperationTime()
|
||||
{
|
||||
IdTelemetry = idTelemetry,
|
||||
IdSubsystem = idSubsystem.Value,
|
||||
DateStart = dateStart,
|
||||
DateEnd = dateEnd,
|
||||
DepthStart = depthStart,
|
||||
DepthEnd = depthEnd
|
||||
};
|
||||
subsystemOperationTime.Add(operationTimeItem);
|
||||
foundSubsystem = false;
|
||||
}
|
||||
if (currentSubsystemAkb.HasValue && !foundSubsystem)
|
||||
{
|
||||
idSubsystem = currentSubsystemAkb;
|
||||
dateStart = dateEnd;
|
||||
foundSubsystem = true;
|
||||
depthStart = depthEnd;
|
||||
}
|
||||
}
|
||||
Date = result.GetFieldValue<DateTimeOffset>(0),
|
||||
Mode = result.GetFieldValue<short?>(1),
|
||||
Depth = result.GetFieldValue<float?>(2),
|
||||
State = result.GetFieldValue<short?>(3)
|
||||
};
|
||||
dataRowList.Add(dateRowItem);
|
||||
}
|
||||
|
||||
var akbOperationTimes = getSubsystemOperationTimes(dataRowList, d => isSubsytemAkb(d.Mode), idSubsytemAkb, idTelemetry);
|
||||
var mseOperationTimes = getSubsystemOperationTimes(dataRowList, d => IsSubsystemMse(d.State), idSubsytemMse, idTelemetry);
|
||||
subsystemOperationTime.AddRange(akbOperationTimes);
|
||||
subsystemOperationTime.AddRange(mseOperationTimes);
|
||||
|
||||
|
||||
|
||||
|
||||
//if (result.Read())
|
||||
//{
|
||||
//short? mode = result.GetFieldValue<short?>(1);
|
||||
//var idSubsystem = GetSubsytemId(mode);
|
||||
//var foundSubsystem = idSubsystem.HasValue;
|
||||
//var dateStart = result.GetFieldValue<DateTimeOffset>(0);
|
||||
//var depthStart = result.GetFieldValue<float>(2);
|
||||
////MSE Subsystem
|
||||
//short? mseState = result.GetFieldValue<short?>(3);
|
||||
//var dateStartMse = result.GetFieldValue<DateTimeOffset>(0);
|
||||
//var depthStartMse = result.GetFieldValue<float>(2);
|
||||
//var subsystemMse = IsSubsystemMse(mseState);
|
||||
|
||||
//while (result.Read())
|
||||
//{
|
||||
// var dateEnd = result.GetFieldValue<DateTimeOffset>(0);
|
||||
// var depthEnd = result.GetFieldValue<float>(2);
|
||||
// var currentMode = result.GetFieldValue<short?>(1);
|
||||
// var currentSubsystemAkb = GetSubsytemId(currentMode);
|
||||
// var endSubsystemAkb = !currentSubsystemAkb.HasValue;
|
||||
// //MSE
|
||||
// //var dateEndMse = result.GetFieldValue<DateTimeOffset>(0);
|
||||
// //var depthEndMse = result.GetFieldValue<float>(2);
|
||||
// short? currentState = result.GetFieldValue<short?>(3);
|
||||
// var endSubsystemMse = !IsSubsystemMse(currentState);
|
||||
// if (foundSubsystem && endSubsystemAkb)
|
||||
// {
|
||||
// var operationTimeItem = new SubsystemOperationTime()
|
||||
// {
|
||||
// IdTelemetry = idTelemetry,
|
||||
// IdSubsystem = idSubsystem.Value,
|
||||
// DateStart = dateStart,
|
||||
// DateEnd = dateEnd,
|
||||
// DepthStart = depthStart,
|
||||
// DepthEnd = depthEnd
|
||||
// };
|
||||
// subsystemOperationTime.Add(operationTimeItem);
|
||||
// foundSubsystem = false;
|
||||
// }
|
||||
// if (currentSubsystemAkb.HasValue && !foundSubsystem)
|
||||
// {
|
||||
// idSubsystem = currentSubsystemAkb;
|
||||
// dateStart = dateEnd;
|
||||
// foundSubsystem = true;
|
||||
// depthStart = depthEnd;
|
||||
// }
|
||||
// if (subsystemMse && endSubsystemMse)
|
||||
// {
|
||||
// var operationTimeItemMse = new SubsystemOperationTime()
|
||||
// {
|
||||
// IdTelemetry = idTelemetry,
|
||||
// IdSubsystem = 2,
|
||||
// DateStart = dateStartMse,
|
||||
// DateEnd = dateEnd,
|
||||
// DepthStart = depthStartMse,
|
||||
// DepthEnd = depthEnd
|
||||
// };
|
||||
// subsystemOperationTime.Add(operationTimeItemMse);
|
||||
// subsystemMse = false;
|
||||
// }
|
||||
// if (currentState.HasValue && !subsystemMse)
|
||||
// {
|
||||
// dateStartMse = dateEnd;
|
||||
// subsystemMse = true;
|
||||
// depthStartMse = depthEnd;
|
||||
// }
|
||||
//}
|
||||
//}
|
||||
return subsystemOperationTime;
|
||||
}
|
||||
|
||||
@ -280,5 +373,14 @@ namespace AsbCloudInfrastructure.Services.Subsystems
|
||||
return subsystemOperationTime;
|
||||
}
|
||||
}
|
||||
|
||||
internal class DataRow
|
||||
{
|
||||
public DateTimeOffset Date { get; set; }
|
||||
public short? Mode { get; set; }
|
||||
public float? Depth { get; set; }
|
||||
public short? State { get; set; }
|
||||
}
|
||||
|
||||
#nullable disable
|
||||
}
|
||||
|
@ -8,6 +8,8 @@ using Microsoft.AspNetCore.Mvc;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using AsbCloudInfrastructure;
|
||||
using System;
|
||||
|
||||
namespace AsbCloudWebApi.Controllers.Subsystems
|
||||
{
|
||||
@ -37,6 +39,8 @@ namespace AsbCloudWebApi.Controllers.Subsystems
|
||||
{
|
||||
if (!await UserHasAccesToWellAsync(request.IdWell, token))
|
||||
return Forbid();
|
||||
if (!await TimeRequestValidate(request, token))
|
||||
return BadRequest();
|
||||
var subsystemResult = await subsystemOperationTimeService.GetStatAsync(request, token);
|
||||
return Ok(subsystemResult);
|
||||
}
|
||||
@ -67,6 +71,9 @@ namespace AsbCloudWebApi.Controllers.Subsystems
|
||||
{
|
||||
if (!await UserHasAccesToWellAsync(request.IdWell, token))
|
||||
return Forbid();
|
||||
if (!await TimeRequestValidate(request, token))
|
||||
return BadRequest();
|
||||
|
||||
var result = await subsystemOperationTimeService.GetOperationTimeAsync(request, token);
|
||||
return Ok(result);
|
||||
}
|
||||
@ -99,5 +106,20 @@ namespace AsbCloudWebApi.Controllers.Subsystems
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
protected async Task<bool> TimeRequestValidate(SubsystemOperationTimeRequest request, CancellationToken token)
|
||||
{
|
||||
var well = await wellService.GetOrDefaultAsync(request.IdWell, token);
|
||||
if (well is not null)
|
||||
{
|
||||
var ltDate = (DateTimeOffset)request.LtDate;
|
||||
var utcDateRequest = ltDate.ToRemoteDateTime(well.Timezone.Hours);
|
||||
var DateNow = ((DateTimeOffset)DateTime.Now).ToRemoteDateTime(well.Timezone.Hours);
|
||||
if (utcDateRequest.AddHours(2)<DateNow)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user