Merge branch 'dev' into feature/refactoring-daily-report-form

This commit is contained in:
Olga Nemt 2023-03-06 16:33:58 +05:00
commit 52a6b92824
14 changed files with 14789 additions and 29 deletions

View File

@ -51,5 +51,10 @@ namespace AsbCloudApp.Data
/// компании участвующие в строительстве скважины /// компании участвующие в строительстве скважины
/// </summary> /// </summary>
public IEnumerable<CompanyDto> Companies { get; set; } = Enumerable.Empty<CompanyDto>(); public IEnumerable<CompanyDto> Companies { get; set; } = Enumerable.Empty<CompanyDto>();
/// <summary>
/// Отставание от ГГД, дней
/// </summary>
public double TvdLagDays { get; set; } = 0;
} }
} }

View File

@ -23,7 +23,7 @@ namespace AsbCloudApp.Data
/// <summary> /// <summary>
/// Название типа скважины /// Название типа скважины
/// </summary> /// </summary>
public string WellType { get; set; } = null!; public string? WellType { get; set; }
/// <summary> /// <summary>
/// ID типа скважины /// ID типа скважины

View File

@ -19,11 +19,11 @@ namespace AsbCloudApp.Data
/// <summary> /// <summary>
/// Название куста /// Название куста
/// </summary> /// </summary>
public string Cluster { get; set; } = null!; public string? Cluster { get; set; }
/// <summary> /// <summary>
/// Название месторождения /// Название месторождения
/// </summary> /// </summary>
public string Deposit { get; set; } = null!; public string? Deposit { get; set; }
} }
} }

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,142 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace AsbCloudDb.Migrations
{
public partial class add_new_OperationCategory : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.InsertData(
table: "t_well_operation_category",
columns: new[] { "id", "id_parent", "key_value_name", "key_value_units", "name" },
values: new object[,]
{
{ 5082, 4000, "dT", "мин", "Сборка устройства ориентирования КО" },
{ 5083, 4003, "dT", "мин", "Проработка принудительная" },
{ 5084, 4005, "dT", "мин", "Шаблонировка подъем БИ, продувка" },
{ 5085, 4005, "dT", "мин", "Спуск бурильного инструмента со сборкой с мостков" },
{ 5086, 4005, "dT", "мин", "Подъем БИ с выбросом на мостки" },
{ 5087, 4005, "dT", "мин", "Спуск БИ со сборкой с мостков" },
{ 5088, 4005, "dT", "мин", "Сборка и спуск ТБТ" },
{ 5089, 4005, "dT", "мин", "Спуск КО на транспотрной колонне" },
{ 5090, 4008, "dT", "мин", "Отворот допускной трубы" },
{ 5091, 4008, "dT", "мин", "Активация подвески, опрессовка" },
{ 5092, 4008, "dT", "мин", "Монтаж, опрессовка ФА" },
{ 5093, 4008, "dT", "мин", "Сборка хвостовика 114мм (согласно схеме)" },
{ 5094, 4008, "dT", "мин", "ПЗР к спуску УЭЦН" },
{ 5095, 4008, "dT", "мин", "Активация подвески (потайной колонны, хвостовика)" },
{ 5096, 4008, "dT", "мин", "Шаблонирование перед спуском" },
{ 5097, 4012, "dT", "мин", "Промывка - перевод скважины на новый раствор" },
{ 5098, 4013, "dT", "мин", "Сборка БИ с мостков на подсвечник" },
{ 5099, 4013, "dT", "мин", "Подготовка ствола скважины. Перезапись ГК в интервале установки КО." },
{ 5100, 4013, "dT", "мин", "Смена рабочего переводника ВСП" },
{ 5101, 4014, "dT", "мин", "Ремонт" }
});
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DeleteData(
table: "t_well_operation_category",
keyColumn: "id",
keyValue: 5082);
migrationBuilder.DeleteData(
table: "t_well_operation_category",
keyColumn: "id",
keyValue: 5083);
migrationBuilder.DeleteData(
table: "t_well_operation_category",
keyColumn: "id",
keyValue: 5084);
migrationBuilder.DeleteData(
table: "t_well_operation_category",
keyColumn: "id",
keyValue: 5085);
migrationBuilder.DeleteData(
table: "t_well_operation_category",
keyColumn: "id",
keyValue: 5086);
migrationBuilder.DeleteData(
table: "t_well_operation_category",
keyColumn: "id",
keyValue: 5087);
migrationBuilder.DeleteData(
table: "t_well_operation_category",
keyColumn: "id",
keyValue: 5088);
migrationBuilder.DeleteData(
table: "t_well_operation_category",
keyColumn: "id",
keyValue: 5089);
migrationBuilder.DeleteData(
table: "t_well_operation_category",
keyColumn: "id",
keyValue: 5090);
migrationBuilder.DeleteData(
table: "t_well_operation_category",
keyColumn: "id",
keyValue: 5091);
migrationBuilder.DeleteData(
table: "t_well_operation_category",
keyColumn: "id",
keyValue: 5092);
migrationBuilder.DeleteData(
table: "t_well_operation_category",
keyColumn: "id",
keyValue: 5093);
migrationBuilder.DeleteData(
table: "t_well_operation_category",
keyColumn: "id",
keyValue: 5094);
migrationBuilder.DeleteData(
table: "t_well_operation_category",
keyColumn: "id",
keyValue: 5095);
migrationBuilder.DeleteData(
table: "t_well_operation_category",
keyColumn: "id",
keyValue: 5096);
migrationBuilder.DeleteData(
table: "t_well_operation_category",
keyColumn: "id",
keyValue: 5097);
migrationBuilder.DeleteData(
table: "t_well_operation_category",
keyColumn: "id",
keyValue: 5098);
migrationBuilder.DeleteData(
table: "t_well_operation_category",
keyColumn: "id",
keyValue: 5099);
migrationBuilder.DeleteData(
table: "t_well_operation_category",
keyColumn: "id",
keyValue: 5100);
migrationBuilder.DeleteData(
table: "t_well_operation_category",
keyColumn: "id",
keyValue: 5101);
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,43 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace AsbCloudDb.Migrations
{
public partial class rename_OperationCategory_Rotor_Slide : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.UpdateData(
table: "t_well_operation_category",
keyColumn: "id",
keyValue: 5002,
column: "name",
value: "Бурение слайдом");
migrationBuilder.UpdateData(
table: "t_well_operation_category",
keyColumn: "id",
keyValue: 5003,
column: "name",
value: "Бурение ротором");
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.UpdateData(
table: "t_well_operation_category",
keyColumn: "id",
keyValue: 5002,
column: "name",
value: "Направленно (СЛАЙД)");
migrationBuilder.UpdateData(
table: "t_well_operation_category",
keyColumn: "id",
keyValue: 5003,
column: "name",
value: "Ротором (РУС)");
}
}
}

View File

@ -4695,7 +4695,7 @@ namespace AsbCloudDb.Migrations
IdParent = 4001, IdParent = 4001,
KeyValueName = "МСП", KeyValueName = "МСП",
KeyValueUnits = "м/ч", KeyValueUnits = "м/ч",
Name = "Направленно (СЛАЙД)" Name = "Бурение слайдом"
}, },
new new
{ {
@ -4703,7 +4703,7 @@ namespace AsbCloudDb.Migrations
IdParent = 4001, IdParent = 4001,
KeyValueName = "МСП", KeyValueName = "МСП",
KeyValueUnits = "м/ч", KeyValueUnits = "м/ч",
Name = "Ротором (РУС)" Name = "Бурение ротором"
}, },
new new
{ {
@ -5312,6 +5312,166 @@ namespace AsbCloudDb.Migrations
KeyValueName = "dT", KeyValueName = "dT",
KeyValueUnits = "мин", KeyValueUnits = "мин",
Name = "Ревизия КНБК/инструмента/ЗТС" Name = "Ревизия КНБК/инструмента/ЗТС"
},
new
{
Id = 5082,
IdParent = 4000,
KeyValueName = "dT",
KeyValueUnits = "мин",
Name = "Сборка устройства ориентирования КО"
},
new
{
Id = 5083,
IdParent = 4003,
KeyValueName = "dT",
KeyValueUnits = "мин",
Name = "Проработка принудительная"
},
new
{
Id = 5084,
IdParent = 4005,
KeyValueName = "dT",
KeyValueUnits = "мин",
Name = "Шаблонировка подъем БИ, продувка"
},
new
{
Id = 5085,
IdParent = 4005,
KeyValueName = "dT",
KeyValueUnits = "мин",
Name = "Спуск бурильного инструмента со сборкой с мостков"
},
new
{
Id = 5086,
IdParent = 4005,
KeyValueName = "dT",
KeyValueUnits = "мин",
Name = "Подъем БИ с выбросом на мостки"
},
new
{
Id = 5087,
IdParent = 4005,
KeyValueName = "dT",
KeyValueUnits = "мин",
Name = "Спуск БИ со сборкой с мостков"
},
new
{
Id = 5088,
IdParent = 4005,
KeyValueName = "dT",
KeyValueUnits = "мин",
Name = "Сборка и спуск ТБТ"
},
new
{
Id = 5089,
IdParent = 4005,
KeyValueName = "dT",
KeyValueUnits = "мин",
Name = "Спуск КО на транспотрной колонне"
},
new
{
Id = 5090,
IdParent = 4008,
KeyValueName = "dT",
KeyValueUnits = "мин",
Name = "Отворот допускной трубы"
},
new
{
Id = 5091,
IdParent = 4008,
KeyValueName = "dT",
KeyValueUnits = "мин",
Name = "Активация подвески, опрессовка"
},
new
{
Id = 5092,
IdParent = 4008,
KeyValueName = "dT",
KeyValueUnits = "мин",
Name = "Монтаж, опрессовка ФА"
},
new
{
Id = 5093,
IdParent = 4008,
KeyValueName = "dT",
KeyValueUnits = "мин",
Name = "Сборка хвостовика 114мм (согласно схеме)"
},
new
{
Id = 5094,
IdParent = 4008,
KeyValueName = "dT",
KeyValueUnits = "мин",
Name = "ПЗР к спуску УЭЦН"
},
new
{
Id = 5095,
IdParent = 4008,
KeyValueName = "dT",
KeyValueUnits = "мин",
Name = "Активация подвески (потайной колонны, хвостовика)"
},
new
{
Id = 5096,
IdParent = 4008,
KeyValueName = "dT",
KeyValueUnits = "мин",
Name = "Шаблонирование перед спуском"
},
new
{
Id = 5097,
IdParent = 4012,
KeyValueName = "dT",
KeyValueUnits = "мин",
Name = "Промывка - перевод скважины на новый раствор"
},
new
{
Id = 5098,
IdParent = 4013,
KeyValueName = "dT",
KeyValueUnits = "мин",
Name = "Сборка БИ с мостков на подсвечник"
},
new
{
Id = 5099,
IdParent = 4013,
KeyValueName = "dT",
KeyValueUnits = "мин",
Name = "Подготовка ствола скважины. Перезапись ГК в интервале установки КО."
},
new
{
Id = 5100,
IdParent = 4013,
KeyValueName = "dT",
KeyValueUnits = "мин",
Name = "Смена рабочего переводника ВСП"
},
new
{
Id = 5101,
IdParent = 4014,
KeyValueName = "dT",
KeyValueUnits = "мин",
Name = "Ремонт"
}); });
}); });

View File

@ -35,8 +35,8 @@
//переименованные категории с новым ИД //переименованные категории с новым ИД
new () {Id = WellOperationCategory.IdBhaDisassembly, IdParent = 4000, Name = "Разборка КНБК", KeyValueName = "dT", KeyValueUnits = "мин" }, new () {Id = WellOperationCategory.IdBhaDisassembly, IdParent = 4000, Name = "Разборка КНБК", KeyValueName = "dT", KeyValueUnits = "мин" },
new () {Id = WellOperationCategory.IdBhaAssembly, IdParent = 4000, Name = "Сборка КНБК", KeyValueName = "dT", KeyValueUnits = "мин" }, new () {Id = WellOperationCategory.IdBhaAssembly, IdParent = 4000, Name = "Сборка КНБК", KeyValueName = "dT", KeyValueUnits = "мин" },
new () {Id = WellOperationCategory.IdSlide, IdParent = 4001, Name = "Направленно (СЛАЙД)", KeyValueName = "МСП", KeyValueUnits = "м/ч" }, new () {Id = WellOperationCategory.IdSlide, IdParent = 4001, Name = "Бурение слайдом", KeyValueName = "МСП", KeyValueUnits = "м/ч" },
new () {Id = WellOperationCategory.IdRotor, IdParent = 4001, Name = "Ротором (РУС)", KeyValueName = "МСП", KeyValueUnits = "м/ч" }, new () {Id = WellOperationCategory.IdRotor, IdParent = 4001, Name = "Бурение ротором", KeyValueName = "МСП", KeyValueUnits = "м/ч" },
new () {Id = WellOperationCategory.IdStaticSurveying, IdParent = 4002, Name = "Замер ЗТС (запись MWD)", KeyValueName = "dT", KeyValueUnits = "мин" }, new () {Id = WellOperationCategory.IdStaticSurveying, IdParent = 4002, Name = "Замер ЗТС (запись MWD)", KeyValueName = "dT", KeyValueUnits = "мин" },
new () {Id = WellOperationCategory.IdFlashingBeforeConnection, IdParent = 4003, Name = "Промывка перед наращиванием", KeyValueName = "dT", KeyValueUnits = "мин" }, new () {Id = WellOperationCategory.IdFlashingBeforeConnection, IdParent = 4003, Name = "Промывка перед наращиванием", KeyValueName = "dT", KeyValueUnits = "мин" },
new () {Id = 5006, IdParent = 4003, Name = "Проработка во время бурения", KeyValueName = "dT", KeyValueUnits = "мин" }, new () {Id = 5006, IdParent = 4003, Name = "Проработка во время бурения", KeyValueName = "dT", KeyValueUnits = "мин" },
@ -112,7 +112,27 @@
new () {Id = 5076, IdParent = 4017, Name = "НПВ / прочее", KeyValueName = "dT", KeyValueUnits = "мин" }, new () {Id = 5076, IdParent = 4017, Name = "НПВ / прочее", KeyValueName = "dT", KeyValueUnits = "мин" },
new () {Id = 5077, IdParent = 4017, Name = "Обработка раствора (несоответствие параметров)", KeyValueName = "dT", KeyValueUnits = "мин" }, new () {Id = 5077, IdParent = 4017, Name = "Обработка раствора (несоответствие параметров)", KeyValueName = "dT", KeyValueUnits = "мин" },
new () {Id = 5078, IdParent = 4017, Name = "подъем ОК", KeyValueName = "dT", KeyValueUnits = "мин" }, new () {Id = 5078, IdParent = 4017, Name = "подъем ОК", KeyValueName = "dT", KeyValueUnits = "мин" },
new () {Id = 5079, IdParent = 4017, Name = "Ревизия КНБК/инструмента/ЗТС", KeyValueName = "dT", KeyValueUnits = "мин" }, new () {Id = 5079, IdParent = 4017, Name = "Ревизия КНБК/инструмента/ЗТС", KeyValueName = "dT", KeyValueUnits = "мин" },
new () {Id = 5082, IdParent = 4000, Name = "Сборка устройства ориентирования КО", KeyValueName = "dT", KeyValueUnits = "мин" },
new () {Id = 5083, IdParent = 4003, Name = "Проработка принудительная", KeyValueName = "dT", KeyValueUnits = "мин" },
new () {Id = 5084, IdParent = 4005, Name = "Шаблонировка подъем БИ, продувка", KeyValueName = "dT", KeyValueUnits = "мин" },
new () {Id = 5085, IdParent = 4005, Name = "Спуск бурильного инструмента со сборкой с мостков", KeyValueName = "dT", KeyValueUnits = "мин" },
new () {Id = 5086, IdParent = 4005, Name = "Подъем БИ с выбросом на мостки", KeyValueName = "dT", KeyValueUnits = "мин" },
new () {Id = 5087, IdParent = 4005, Name = "Спуск БИ со сборкой с мостков", KeyValueName = "dT", KeyValueUnits = "мин" },
new () {Id = 5088, IdParent = 4005, Name = "Сборка и спуск ТБТ", KeyValueName = "dT", KeyValueUnits = "мин" },
new () {Id = 5089, IdParent = 4005, Name = "Спуск КО на транспотрной колонне", KeyValueName = "dT", KeyValueUnits = "мин" },
new () {Id = 5090, IdParent = 4008, Name = "Отворот допускной трубы", KeyValueName = "dT", KeyValueUnits = "мин" },
new () {Id = 5091, IdParent = 4008, Name = "Активация подвески, опрессовка", KeyValueName = "dT", KeyValueUnits = "мин" },
new () {Id = 5092, IdParent = 4008, Name = "Монтаж, опрессовка ФА", KeyValueName = "dT", KeyValueUnits = "мин" },
new () {Id = 5093, IdParent = 4008, Name = "Сборка хвостовика 114мм (согласно схеме)", KeyValueName = "dT", KeyValueUnits = "мин" },
new () {Id = 5094, IdParent = 4008, Name = "ПЗР к спуску УЭЦН", KeyValueName = "dT", KeyValueUnits = "мин" },
new () {Id = 5095, IdParent = 4008, Name = "Активация подвески (потайной колонны, хвостовика)", KeyValueName = "dT", KeyValueUnits = "мин" },
new () {Id = 5096, IdParent = 4008, Name = "Шаблонирование перед спуском", KeyValueName = "dT", KeyValueUnits = "мин" },
new () {Id = 5097, IdParent = 4012, Name = "Промывка - перевод скважины на новый раствор", KeyValueName = "dT", KeyValueUnits = "мин" },
new () {Id = 5098, IdParent = 4013, Name = "Сборка БИ с мостков на подсвечник", KeyValueName = "dT", KeyValueUnits = "мин" },
new () {Id = 5099, IdParent = 4013, Name = "Подготовка ствола скважины. Перезапись ГК в интервале установки КО.", KeyValueName = "dT", KeyValueUnits = "мин" },
new () {Id = 5100, IdParent = 4013, Name = "Смена рабочего переводника ВСП", KeyValueName = "dT", KeyValueUnits = "мин" },
new () {Id = 5101, IdParent = 4014, Name = "Ремонт", KeyValueName = "dT", KeyValueUnits = "мин" },
}; };
} }
} }

View File

@ -33,11 +33,11 @@ namespace AsbCloudDb.Model
/// </summary> /// </summary>
public const int IdBhaAssembly = 5001; public const int IdBhaAssembly = 5001;
/// <summary> /// <summary>
/// Направленно (СЛАЙД) /// Бурение слайдом
/// </summary> /// </summary>
public const int IdSlide = 5002; public const int IdSlide = 5002;
/// <summary> /// <summary>
/// Ротором (РУС) /// Бурение ротором
/// </summary> /// </summary>
public const int IdRotor = 5003; public const int IdRotor = 5003;
/// <summary> /// <summary>
@ -110,6 +110,7 @@ namespace AsbCloudDb.Model
5077, 5077,
5078, 5078,
5079, 5079,
5101,
4014, 4014,
4015, 4015,

View File

@ -88,7 +88,6 @@ namespace AsbCloudInfrastructure.Services
WellMapInfo = activeWells.Select(well => { WellMapInfo = activeWells.Select(well => {
var wellMapInfo = well.Adapt<WellMapInfoWithComanies>(); var wellMapInfo = well.Adapt<WellMapInfoWithComanies>();
// From teltemetryTracker
var wellLastTelemetryInfo = lastTelemetryInfo.FirstOrDefault(t => t.IdTelemetry == well.IdTelemetry); var wellLastTelemetryInfo = lastTelemetryInfo.FirstOrDefault(t => t.IdTelemetry == well.IdTelemetry);
var wellOperationsStat = operationsStat.FirstOrDefault(s => s.Id == well.Id); var wellOperationsStat = operationsStat.FirstOrDefault(s => s.Id == well.Id);
@ -138,7 +137,7 @@ namespace AsbCloudInfrastructure.Services
wellMapInfo.SaubUsage = wellSubsystemStat?.SubsystemAKB?.KUsage ?? 0d; wellMapInfo.SaubUsage = wellSubsystemStat?.SubsystemAKB?.KUsage ?? 0d;
wellMapInfo.SpinUsage = wellSubsystemStat?.SubsystemSpinMaster?.KUsage ?? 0d; wellMapInfo.SpinUsage = wellSubsystemStat?.SubsystemSpinMaster?.KUsage ?? 0d;
wellMapInfo.TvdLagPercent = 0;// From WellOperationService? wellMapInfo.TvdLagPercent = wellOperationsStat?.TvdLagDays ?? 0d;
wellMapInfo.IdsCompanies = well.Companies.Select(c => c.Id); wellMapInfo.IdsCompanies = well.Companies.Select(c => c.Id);
return wellMapInfo; return wellMapInfo;
}).ToArray(); }).ToArray();

View File

@ -7,6 +7,7 @@ using Microsoft.Extensions.Caching.Memory;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Numerics;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -158,10 +159,39 @@ namespace AsbCloudInfrastructure.Services.WellOperationService
var timezoneOffsetH = wellService.GetTimezone(well.Id).Hours; var timezoneOffsetH = wellService.GetTimezone(well.Id).Hours;
statWellDto.Sections = CalcSectionsStats(wellOperations, timezoneOffsetH); statWellDto.Sections = CalcSectionsStats(wellOperations, timezoneOffsetH);
statWellDto.Total = GetStatTotal(wellOperations, well.IdState, timezoneOffsetH); statWellDto.Total = GetStatTotal(wellOperations, well.IdState, timezoneOffsetH);
statWellDto.TvdLagDays = CalcTvdLagDays(wellOperations);
return statWellDto; return statWellDto;
} }
private double CalcTvdLagDays(IOrderedEnumerable<WellOperation> wellOperations)
{
var operationsOrdered = wellOperations
.OrderBy(o => o.DateStart);
var factOperations = operationsOrdered
.Where(o => o.IdType == WellOperation.IdOperationTypeFact);
var lastCorrespondingFactOperation = factOperations
.LastOrDefault(o => o.IdPlan is not null);
if (lastCorrespondingFactOperation is null)
return 0d;
var lastFactOperation = factOperations.LastOrDefault();
var remainingPlanOperations = operationsOrdered
.Where(o => o.IdType == WellOperation.IdOperationTypePlan)
.Where(o => o.DateStart > lastCorrespondingFactOperation.OperationPlan.DateStart);
var durationRemain = remainingPlanOperations.Sum(o => o.DurationHours);
var factEnd = lastFactOperation.DateStart.AddHours(durationRemain + lastFactOperation.DurationHours);
var planEnd = lastCorrespondingFactOperation.DateStart.AddHours(durationRemain + lastCorrespondingFactOperation.DurationHours);
var lagDays = (planEnd - factEnd).TotalDays;
return lagDays;
}
private IEnumerable<StatSectionDto> CalcSectionsStats(IEnumerable<WellOperation> operations, double timezoneOffsetH) private IEnumerable<StatSectionDto> CalcSectionsStats(IEnumerable<WellOperation> operations, double timezoneOffsetH)
{ {
var sectionTypeIds = operations var sectionTypeIds = operations

View File

@ -1,17 +1 @@
<!DOCTYPE html> <!doctype html><html lang="ru"><head><meta charset="utf-8"/><link rel="icon" href="/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="white"/><meta name="theme-color" media="(prefers-color-scheme: light)" content="white"/><meta name="theme-color" media="(prefers-color-scheme: dark)" content="black"/><meta name="description" content="Онлайн мониторинг процесса бурения в реальном времени в офисе заказчика"/><title>DDrilling</title><script defer="defer" src="/runtime~main.c3ae59b7.js"></script><script defer="defer" src="/vendors.bbbfa475.js"></script><script defer="defer" src="/main.8a4b3f43.js"></script></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
<html lang="ru">
<head>
<meta charset="utf-8" />
<link rel="icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="white" />
<meta name="theme-color" media="(prefers-color-scheme: light)" content="white" />
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="black" />
<meta name="description" content="Онлайн мониторинг процесса бурения в реальном времени в офисе заказчика" />
<title>DDrilling</title>
<script defer src="/runtime~main.5cad8e9a.js"></script><script defer src="/vendors.0c60e3f8.js"></script><script defer src="/main.3e1e062c.js"></script><link href="/main.e200693d.css" rel="stylesheet"></head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root"></div>
</body>
</html>