forked from ddrilling/AsbCloudServer
113 lines
4.2 KiB
C#
113 lines
4.2 KiB
C#
using Microsoft.EntityFrameworkCore;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.ComponentModel.DataAnnotations;
|
||
using System.ComponentModel.DataAnnotations.Schema;
|
||
using System.Text.Json.Serialization;
|
||
|
||
namespace AsbCloudDb.Model
|
||
{
|
||
[Table("t_detected_operation"), Comment("автоматически определенные операции по телеметрии")]
|
||
public class DetectedOperation
|
||
{
|
||
[Key]
|
||
[Column("id")]
|
||
public int Id { get; set; }
|
||
|
||
[Column("id_telemetry")]
|
||
public int IdTelemetry { get; set; }
|
||
|
||
[Column("id_category"), Comment("Id категории операции")]
|
||
public int IdCategory { get; set; }
|
||
|
||
[Column("id_user"), Comment("Id пользователя по телеметрии на момент начала операции")]
|
||
public int IdUsersAtStart { get; set; }
|
||
|
||
[Column("date_start", TypeName = "timestamp with time zone"), Comment("Дата начала операции")]
|
||
public DateTimeOffset DateStart { get; set; }
|
||
|
||
[Column("date_end", TypeName = "timestamp with time zone"), Comment("Дата начала операции")]
|
||
public DateTimeOffset DateEnd { get; set; }
|
||
|
||
[NotMapped]
|
||
public double DurationMinutes => (DateEnd - DateStart).TotalMinutes;
|
||
|
||
[Column("depth_start"), Comment("Глубина на начало операции, м")]
|
||
public double DepthStart { get; set; }
|
||
|
||
[Column("depth_end"), Comment("Глубина после завершения операции, м")]
|
||
public double DepthEnd { get; set; }
|
||
|
||
[Column("value"), Comment("Ключевой показатель операции")]
|
||
public double Value { get; set; }
|
||
|
||
[Column("enabled_subsystems"), Comment("флаги аключенных подсистем")]
|
||
public int EnabledSubsystems { get; set; }
|
||
|
||
[Column("extra_data", TypeName = "jsonb"), Comment("доп. инфо по операции")]
|
||
public IDictionary<string, object> ExtraData { get; set; } = null!;
|
||
|
||
[JsonIgnore]
|
||
[ForeignKey(nameof(IdTelemetry))]
|
||
public virtual Telemetry Telemetry { get; set; } = null!;
|
||
|
||
[JsonIgnore]
|
||
[ForeignKey(nameof(IdCategory))]
|
||
public virtual WellOperationCategory OperationCategory { get; set; } = null!;
|
||
|
||
public override string ToString()
|
||
=> $"{IdCategory}\t{DateStart:G}\t{DateEnd:G}\t{DurationMinutes:#0.#}\t{DepthStart:#0.#}\t{DepthEnd:#0.#}";
|
||
|
||
/// <summary>
|
||
/// Флаги аключенных подсистем
|
||
/// </summary>
|
||
[Flags]
|
||
public enum EnabledSubsystemsFlags
|
||
{
|
||
/// <summary>
|
||
/// Автоподача долота
|
||
/// </summary>
|
||
AutoRotor = 1 << 0,
|
||
/// <summary>
|
||
/// БУРЕНИЕ В СЛАЙДЕ
|
||
/// </summary>
|
||
AutoSlide = 1 << 1,
|
||
/// <summary>
|
||
/// ПРОРАБОТКА
|
||
/// </summary>
|
||
AutoConditionig = 1 << 2,
|
||
/// <summary>
|
||
/// СПУСК СПО
|
||
/// </summary>
|
||
AutoSinking = 1 << 3,
|
||
/// <summary>
|
||
/// ПОДЪЕМ СПО
|
||
/// </summary>
|
||
AutoLifting = 1 << 4,
|
||
/// <summary>
|
||
/// ПОДЪЕМ С ПРОРАБОТКОЙ
|
||
/// </summary>
|
||
AutoLiftingWithConditionig = 1 << 5,
|
||
/// <summary>
|
||
/// блокировка
|
||
/// </summary>
|
||
AutoBlocknig = 1 << 6,
|
||
}
|
||
|
||
/// <summary>
|
||
/// Есть ли флаг подсистемы у операции
|
||
/// </summary>
|
||
/// <param name="flag"></param>
|
||
/// <returns></returns>
|
||
public bool HasSubsystemFlag(EnabledSubsystemsFlags flag)
|
||
=> HasSubsystemFlag((int)flag);
|
||
|
||
/// <summary>
|
||
/// Есть ли флаг/флаги подсистемы у операции
|
||
/// </summary>
|
||
/// <param name="flags"></param>
|
||
/// <returns></returns>
|
||
public bool HasSubsystemFlag(int flags)
|
||
=> (EnabledSubsystems & flags) > 0;
|
||
}
|
||
} |