Содержание


Введение

Имеется HTTP-сервер на .NET Core 5.0, и у него есть база данных PostgreSQL. В базе данных хранятся «снэпшоты», они же «проекты». Снэпшоты адресуются по номерам, номера больше 0. Снэпшот содержит дерево данных со следующей иерархией:

Снэпшоты бывают разных типов.

Снэпшот номер 1 - особенный. В нём лежит «общая база данных», ОБД. По соглашению, этот снэпшот содержит только достоверные данные, которые заверили ответственные лица. Если ствол не найден в базе данных «ген. ресурсов», данные для него нельзя занести в «общую базу данных».

Часть снэпшотов образуют «репозиторий проектов Darcy». Они не видны через веб-интерфейс. Каждый такой снэпшот является хранилищем проекта для десктопной программы Darcy. Десктопная программа Darcy может скачивать их с сервера и закачивать на сервер. В данном документе API для этого не описывается.

Часть снэпшотов являются «кандидатами на добавление в общую базу данных». Они содержат данные, которые предлагается добавить в снэпшот номер 1. Пользователь, имеющий роль *verification имеет право утвердить такого кандидата. В таком случае данные из него заносятся в снэпшот номер 1, а кандидат после этого удаляется из базы данных.

Часть снэпшотов образуют «хранилище оперативных данных». Они используются для данных, которые часто обновляются и заведомо не являются окончательными и надёжными. Зато такие данные можно одной кнопкой отослать из десктопной программы Darcy, и они будут без промедления доступны через веб-интерфейс. Вероятно, свой отдельный снэпшот в «хранилище оперативных данных» будет у каждого ствола. Сейчас номера снэпшотов из «хранилища оперативных данных» имеют номера больше 1000000000, но это может измениться.

TODO:
Среди снэпшотов из «хранилища оперативных данных» выделяются те, что образуют «журнал геонавигации». Каждый снэпшот из «журнал геонавигации» содержит одну модель геонавигации и все данные (кривые, массивы кривых, палитры), на которые она ссылается. Снэпшот в «журнале геонавигации» фиксирует представление, которое геонавигатор имел о ситуации в определённый момент времени и после этого не может быть изменён. Таким образом, пока бурится скважина, геонавигатор многократно (до 150 раз) сохраняет свою рабочую модель геонавигации в базу данных и каждый раз порождает новый снэпшот. Все такие снэпшоты имеют одно имя, но различаются по номерам и дате создания.


Роли

Роли назначаются через Keycloak пользователям, группам пользователей или клиентам. Сейчас сервер использует только две роли - view и verification. Большинство запросов требуют роли view. Запросы на утверждение или отвержение кандидата требуют роли verification. Запрос на добавление датасета в «общую базу данных» пока что требует только роли view, но это неправильно. Роль verification даёт все права, которые даёт роль view. С 19.09.2023 мы не требуем точного совпадения имени роли, достаточно если оно оканчивается на view или verification.


API сервера

Регистр символов везде имеет значение, за исключением имён объектов (месторождений, кустов, скважин, стволов, датасетов, массивов, кривых, палитр, планшетов и моделей геонавигации).

Не рекомендуется использовать запросы, которые указаны с тегом [OBSOLETE] здесь или в swagger. Не рекомендуется использовать запросы, которые не описаны в этом документе. Не рекомендуется использовать поля в JSON, которые не описаны в этом документе. Хотя в этом документе в JSON есть комментарии, в реальных запросах и ответах их использовать нельзя согласно спецификации формата www.json.org.

Результат запросов чаще всего JSON.

Пример ответа при ошибке:

{
  "data": null,
  "statusCode": 401,
  "message": "No login"
}
	

Шаблон ответа при успехе:

{
  "data": (полезные данные),
  "statusCode": 200,
  "message": null
}
	

Запросы для кандидатов


Получение списка кандидатов

GET /Darcy/Projects/Additions

Получить информацию о кандидатах, которые ожидают своего добавления в ОБД.

Ответ при успехе содержит массив сведений о кандидатах. Поля ownerName, ownerFamily и ownerDisplayName содержат то, что пришло из KeyCloak во время последнего подключения автора проекта к серверу.

{
  "data": [
    {
      "projectId":    14,                                    // Идентификатор кандидата
      "projectName": "TEST_NVTK",                            // Имя кандидата
      "ownerId":     "0dc5c95d-9005-4d1b-be2d-f9a9a670859c", // GUID в KeyCloak автора
      "ownerLogin":  "darcy_admin",                          // Логин автора
      "ownerName":   "Администратор",                        // Имя автора
      "ownerFamily": "Darcy",                                // Фамилия автора
      "ownerDisplayName": "",                                // Имя Фамилия Отчество
      
      //  Поля, которые планируется добавить:
      "fieldCount": 1, // Число месторождений
      "leaseCount": 2, // Число кустов
      "wellCount":  3, // Число скважин
      "boreCount":  4, // Число стволов
      "curveCount": 5, // Число кривых
      "plotCount":  6, // Число планшетов
      "fieldName": "", // Имя месторождения или null, если их несколько
      "leaseName": "", // Имя куста или null, если их несколько
      "wellName":  "", // Имя скважины или null, если их несколько
      "boreName":  "", // Имя ствола или null, если их несколько
      
      //  Поля, которые планируется добавить позже:
      "top":    100.0, // Глубина начала записи
      "bottom": 666.0, // Глубина окончания записи
      "types": ["a", "b", "c"] // Список уникальных видов кривых
    }
  ],
  "statusCode": 200,
  "message": null
}
	

Запрос удаления кандидата

DELETE /Darcy/Project/{Candidate}
POST /Darcy/Project/{Candidate}/Delete

Удалить кандидата по его идентификатору.

Запрос DELETE возвращает пустое тело. Запрос POST возвращает JSON следующего вида:

{
  "statusCode": 200,
  "message": null
}
	

Отказ от кандидата

POST /Darcy/Project/{Candidate}/Reject

Вызывается при нажатии кнопки «Отправить на доработку» на карточке кандидата на добавление в ОБД. После этого кандидат необратимо удаляется из базы данных.

При успешном выполнении запрос возвращает следующий JSON.

{
  "statusCode": 200,
  "message": null
}
	

Если пользователь не имеет роли *verification, действие не производится, возвращается код ошибки 403 Forbidden.

{
  "statusCode": 403,
  "message": "User has not verification role"
}
	

Утверждение кандидата

POST /Darcy/Project/{Candidate}/Commit

Вызывается при нажатии кнопки «Утвердить» на карточке кандидата на добавление в ОБД. Данные из кандидата переносятся в «общую базу данных», то есть снэпшот номер 1. После этого кандидат необратимо удаляется из базы данных.

При успешном выполнении запрос возвращает следующий JSON.

{
  "data": null, // Здесь что-то будет
  "statusCode": 200,
  "message": null
}
	

Если пользователь не имеет роли *verification, действие не производится, возвращается код ошибки 403 Forbidden.

{
  "data": null, // Здесь что-то будет
  "statusCode": 403,
  "message": "User has not verification role"
}
	

Запросы для дерева


[OBSOLETE] Получение верхних элементов дерева

GET /Darcy/Project/{Snapshot}/{Version}/TreeTop

Это запрос устарел и его следует заменить на другой.

Получить из дерева данных снэпшота все элементы верхнего уровня. Сейчас это могут быть объекты типов Field или FieldGroup.

Ответ при успехе содержит в поле data массив со свойствами объектов дерева верхнего уровня.

{
  "data": [
    {
      "thing":    0,
      "attr":     0,
      "order":    0,
      "name":    "string",
      "kind":     0,
      "children": true,
      "type_of": "string", // поле есть только у кривых, значение "string" или "double"
      "crid":    "GUID",   // необязательное поле, идентификатор в ген. рес.
      "ownErrors":    [0], // необязательное поле
      "innerErrors":  [0]  // необязательное поле
    }
  ],
  "statusCode": 200,
  "message": null
}
	

[OBSOLETE] Получение детей узла дерева

GET /Darcy/Project/{Snapshot}/{Version}/Children/{Parent}

Это запрос устарел и его следует заменить на другой.

Получить элементы дерева данных снэпшота, непосредственных потомков элемента Parent.

Ответ при успехе содержит в поле data массив со свойствами дочерних объектов.

{
  "data": [
    {
      "thing":    0,
      "attr":     0,
      "order":    0,
      "name":    "string",
      "kind":     0,
      "type":    "string",
      "children": true,
      "type_of": "string", // поле есть только у кривых, значение "string" или "double"
      "crid":    "GUID",   // необязательное поле, идентификатор в ген. рес.
      "ownErrors":    [0], // необязательное поле
      "innerErrors":  [0]  // необязательное поле
    }
  ],
  "statusCode": 200,
  "message": null
}
	

Получение детей узла дерева

GET /Darcy/Project/{Snapshot}/{Version}/Tree/{View}/Children/{Parent}

Получить элементы дерева данных снэпшота, непосредственных потомков элемента Parent.

Ответ при успехе содержит в поле data массив со свойствами дочерних объектов.

{
  "data": [
    {
      "thing":    0,
      "attr":     0,
      "order":    0,
      "name":    "string",
      "kind":     0,
      "type":    "string",
      "children": true,
      "type_of": "string", // поле есть только у кривых, значение "string" или "double"
      "crid":    "GUID",   // необязательное поле, идентификатор в ген. рес.
      "ownErrors":    [0], // необязательное поле
      "innerErrors":  [0]  // необязательное поле
    }
  ],
  "statusCode": 200,
  "message": null
}
	

Получение предков узла дерева

GET /Darcy/Project/{Snapshot}/{Version}/Tree/{View}/Ancestors/{Level}/{Thing}

Получить элементы дерева данных снэпшота, предков элемента Thing. Предки ищутся по дереву в его полном десктопном виде, а не в веб-виде с семействами кривых.

Ответ при успехе содержит в поле data массив со свойствами родительских объектов. Первым в списке идёт непосредственный родитель, последним - предок уровня Level.

{
  "data": [
    {
      "thing": 0,
      "attr":  0,
      "name": "string"
    }
  ],
  "statusCode": 200,
  "message": null
}
	

Получение кривых внутри узла дерева

GET /Darcy/Project/{Snapshot}/{Version}/CurvesIn/{Parent}

Получить всех потомков элемента Parent, которые являются одиночными кривыми или массивами кривых. Кривые внутри массива игнорируются. Поиск внутри семейств кривых не поддерживается.

Ответ при успехе содержит в поле data массив со свойствами дочерних объектов.

{
  "data": [
    {
      "thing": 0,
      "attr":  0,
      "name": "string",
      "kind":  0,
      "type": "string"
    }
  ],
  "statusCode": 200,
  "message": null
}
	

Получение значений кривой

GET /Darcy/Project/{Snapshot}/{Version}/Curve/{Thing}/Values

Получить массив значений указанной кривой. Кривые могут быть числовыми или строковыми. Также возвращается массив числовых значений референсной кривой.

Ответ при успехе содержит значения в одном из массивов fValues или sValues, а другой массив равен null. Отсутствие значения в fValues записывается как null, в sValues как пустая строка.

{
  "fDepth":  [0.0, 1.0],
  "fValues": [0.0, null],
  "sValues": null,
  "statusCode": 200,
  "message": "string"
}

{
  "fDepth":  [0.0, 1.0],
  "fValues": null,
  "sValues": ["string", ""],
  "statusCode": 200,
  "message": "string"
}
	

Получение свойств узла дерева

GET /Darcy/Project/{Snapshot}/{Version}/Properties/{Thing}/Locale/{Language}?Attr={Attr}&CrId={CrId}

Получить для заданного узла дерева набор свойств для показа в PropertyGrid. Свойства разбиты на категории. Если категория свойств всего одна, можно не показывать её заголовок. Большинство свойств нельзя редактировать, но некоторые можно в зависимости от значения поля editor.

Данные для ответа берутся из двух разных баз данных. Ответ при успехе содержит массив категорий свойств, а внутри каждой категории - массив свойств.

{
  "data": [ // категории свойств
    {
      "name": "string",     // имя категории свойств
      "properties": [       // свойства в категории
        "name":   "string", // имя свойства
        "value":  "string", // значение свойства
        "editor": "string", // редактируется ли оно и каким образом
      ]
    }
  ],
  "statusCode": 200,
  "message": null
}
	

Получение имён ошибок

GET /Darcy/Locale/{Language}/ErrorNames

Получить имена ошибок. Эти имена изменяются только при перекомпиляции сервера.

Ответ при успехе содержит в поле data массив с именами ошибок на указанном языке по порядку номеров ошибок, начиная с нуля.

{
  "data": [
    "Имя повторяется",
    "Тип в классификаторе повторяется",
    "Данные не классифицированы",
    "Тип данных не известен классификатору ОБД",
    "Нет единицы измерения"
  ],
  "statusCode": 200,
  "message": null
}
	

Таким образом, ошибка с номером 1 имеет имя "Тип в классификаторе повторяется".


Получение подробной информации об ошибке

GET /Darcy/Project/{Snapshot}/Explanation/{Thing}/{Error}/Locale/{Language}

Получить подробную информацию об ошибке.

Ответ при успехе содержит в поле data массив текстовых строк, которые содержат подробное описание ошибки.

{
  "data": [
    "Первая строка",
    "Вторая строка",
    "Последняя строка"
  ],
  "statusCode": 200,
  "message": null
}
	

Получение классификатора

GET /Darcy/Project/{Snapshot}/{Version}/Classificator

Получить классификатор в формате XML.

Ответ при успехе является XML-файлом. При ошибке возвращаем JSON следующего вида:

{
  "statusCode": 500, // или 400, 401, 404
  "message": "string"
}
	

Получение единиц измерения

GET /Darcy/Project/{Snapshot}/{Version}/Measurer

Получить набор единиц измерения в формате XML.

Ответ при успехе является XML-файлом. При ошибке возвращаем JSON следующего вида:

{
  "statusCode": 500, // или 400, 401, 404
  "message": "string"
}
	

Запросы для палитр


Получение списка палитр

GET /Darcy/Project/{Snapshot}/{Version}/Palettes

Получить список всех палитр в снэпшоте.

При успехе возвращает набор палитр в виде JSON. Палитры в списке отсортированы по именам (в порядке System.StringComparison.CurrentCultureIgnoreCase).

{
  "data": [
    {
      "thing": 14,      // Идентификатор палитры
      "name": "Палитра" // Имя палитры
    }
  ],
  "statusCode": 200,
  "message": null
}
	

При ошибке возвращает JSON следующего вида:

{
  "data": null
  "statusCode": 401,  // Код ошибки
  "message": "string" // Описание ошибки
}
	

Получение палитры по идентификатору

GET /Darcy/Project/{Snapshot}/{Version}/Palette/{Thing}

Получить палитру в виде JSON по её идентификатору thing.

Формат возвращаемых данных такой же, как у запроса палитры по имени.


Получение палитры по имени

GET /Darcy/Project/{Snapshot}/{Version}/PaletteByName?PaletteName={PaletteName}

Получить палитру в виде JSON по её имени.

При ошибке возвращает JSON следующего вида:

{
  "data": null
  "statusCode": 401,  // Код ошибки
  "message": "string" // Описание ошибки
}
	

При успехе возвращает палитру в виде JSON, например:

{​​​​​​​
  "thing":0,           // Идентификатор палитры
  "name":"LITHO_YUNG", // Имя палитры
  "log":false,         // Логарифмический масштаб или линейный
	
  //  N-1 возрастающих значений, которые разбивают числовую прямую
  //  на N полуоткрытых интервалов.
  //  В данном случае эти интервалы будут такие:
  //  (-∞, 0]  (0, 1]  (1, 2.2]  (2.2, 3]  (3, 4]  (4, 5]  (5, +∞)
  "values":[ 0.0, 1.0, 2.2, 3.0, 4.0, 5.0 ],
	
  //  N типов для каждого интервала. Типы интервалов бывают такие:
  //  ● 0, полностью прозрачный
  //  ● 1, одноцветный
  //  ● 2, градиент (на интервалах бесконечной длины не используется)
  //  ● 3, текстура
  "types": [ 3, 3, 3, 3, 3, 3, 1],
	
  //  N подписей для каждого интервала:
  "labels":[ "", "Песчаник", "Аргиллит", "Алевролит", "Плотный", "Уголь", "" ],
	
  //  N текстур для каждого интервала.
  //  Если интервал не текстурный, тогда пустая строка.
  //  Файлы текстур можно получить с сервера из директории patterns, например по адресу
  //  http://192.168.0.47:8080/patterns/Заливка13.png
  //  Читать эти файлы может кто угодно, входить через KeyCloack для этого не нужно.
  "textures":[
    "Заливка13.png",
    "Заливка13.png",
    "Глина_тип1_TL.png",
    "Алеврит_Solver.png",
    "Известняк.png",
    "Соль_Solver.png",
    ""
  ],
	
  //  2*N цветов, по два цвета для каждого интервала, порядок компонент BGRA.
  //  ● Для интервала типа 0 цвета можно игнорировать.
  //  ● Для интервала типа 1 два цвета равны, можно брать любой.
  //  ● Для интервала типа 2 это цвет минимального значения
  //    и цвет максимального значения между которыми цвет линейно интерполируется.
  //  ● Для интервала типа 3 первый цвет соответствует точкам текстуры с цветом [255,255,255,0].
  //    Второй цвет соответствует точкам текстуры с цветом [0,0,0,255].
  //    Если цвет текстуры другой, линейно интерполируем его по каждой компоненте.
  "colors":[
    [  0.0, 255.0, 255.0, 255.0],   [0.0, 0.0, 0.0, 255.0],
    [  0.0, 255.0, 255.0, 255.0],   [0.0, 0.0, 0.0, 255.0],
    [  0.0, 128.0,   0.0, 255.0],   [0.0, 0.0, 0.0, 255.0],
    [213.4, 239.7, 255.0, 255.0],   [0.0, 0.0, 0.0, 255.0],
    [ 55.3, 127.5,   0.0, 255.0],   [0.0, 0.0, 0.0, 255.0],
    [  0.0,   0.0,   0.0, 255.0],   [0.0, 0.0, 0.0, 255.0],
    [  0.0,   0.0,   0.0, 255.0],   [0.0, 0.0, 0.0, 255.0]
  ]
}
	

Получение всех палитр

GET /Darcy/Project/{Snapshot}/{Version}/PaletteModels/{Filter}

Получить список всех палитр в снэпшоте.

При успехе возвращает набор палитр в виде JSON. Палитры в списке отсортированы по именам (в порядке System.StringComparison.CurrentCultureIgnoreCase).

{
  "data": [
    {
	// Модель палитры, см. здесь
    }
  ],
  "statusCode": 200,
  "message": null
}
	

При ошибке возвращает JSON следующего вида:

{
  "data": null
  "statusCode": 401,  // Код ошибки
  "message": "string" // Описание ошибки
}
	

Получение имён текстур для палитр

GET /Darcy/PatternNames

Получить список всех файлов текстур, используемых для палитр. Эти файлы располагаются в директории patterns.

При успехе возвращает JSON следующего вида:

{
  "data": [
    "Альбит.png",  // Список имён файлов.
    "Ангидрит.png" // Файлы не отсортированы.
  ],
  "statusCode": 200,
  "message": null
}
	

При ошибке возвращает JSON следующего вида:

{
  "data": null
  "statusCode": 500,  // Код ошибки
  "message": "string" // Описание ошибки
}
	

Запросы для планшетов


Получение списка всех планшетов

GET /Darcy/Project/{Snapshot}/{Version}/Plots

Получить список всех планшетов в снэпшоте. Только самих планшетов (с положительными идентификаторами). Объекты типа «планшет в стволе» (с отрицательными идентификаторами) игнорируются.

При успехе возвращает набор планшетов в виде JSON:

{
  "data": [
    {
      "project": 1,      // Идентификатор снэпшота
      "thing": 14,       // Идентификатор планшета
      "name": "Планшет", // Имя планшета
      "module": 3,       // Идентификатор модуля
      "user": {          // Кто последним загружал этот планшет
        "id":     "b1efa161-de62-4265-a6a8-e826159eff87",
        "login":  "darcy_admin",
        "name":   "Администратор",
        "family": "Darcy",
        "displayName": ""
      }
    }
  ],
  "statusCode": 200,
  "message": null
}
	

При ошибке возвращает JSON следующего вида:

{
  "data": null
  "statusCode": 401,  // Код ошибки
  "message": "string" // Описание ошибки
}
	

Получение планшетов для ствола

GET /Darcy/Project/{Snapshot}/{Version}/PlotsByBore/{Module}?BoreId={BoreId}

Получить список планшетов в стволе.

При успехе возвращает набор планшетов в виде JSON. Если имеется несколько планшетов для одного модуля, первый из них в списке считается в некотором роде главным.

{
  "data": [
    {
      "project": 1,      // Идентификатор снэпшота
      "thing": 14,       // Идентификатор планшета
      "name": "Планшет", // Имя планшета
      "module": 3,       // Идентификатор модуля
      "user": {          // Кто последним загружал этот планшет
        "id":     "b1efa161-de62-4265-a6a8-e826159eff87",
        "login":  "darcy_admin",
        "name":   "Администратор",
        "family": "Darcy",
        "displayName": ""
      },
      
	// Следующие 3 поля приходят только для смежных планшетов корреляции:
      "well_id": "f9052f9a-9cb0-4db0-8693-62807be6f2a0", // Идентификатор (GUID) скважины в «ген. ресурсах»
      "bore_id": "0cac5c6f-30fa-4f58-97f3-9cd3937ea619", // Идентификатор (GUID) ствола в «ген. ресурсах»
      "title": ["", "", ""] // Имя смежного планшета из трёх частей, из них вторая пишется жирным шрифтом
    }
  ],
  "statusCode": 200,
  "message": null
}
	

Обычно планшеты запрашиваются из снэпшота номер 1, но в связи с появлением «хранилища оперативных данных» будут возвращаться планшеты и из других снэпшотов, поэтому теперь в ответе для каждого планшета указывается свой идентификатор снэпшота.

При ошибке возвращает JSON следующего вида:

{
  "data": null,
  "statusCode": 401,  // Код ошибки
  "message": "string" // Описание ошибки
}
	

Получение модели планшета

GET /Darcy/Project/{Snapshot}/{Version}/Plot/{Thing}

Получить планшет по его идентификатору.

Успешный результат выполнения запроса имеет формат JSON, но только Валера может его понять. При ошибке возвращает JSON следующего вида:

{
  "statusCode": 400,  // Код ошибки
  "message": "string" // Описание ошибки
}
	

Удаление планшета из ствола

POST /Darcy/Project/{Snapshot}/Plot/{Thing}/Delete

Удалить планшет из ствола по его идентификатору. Право на удаление планшета имеют его автор и обладатели роли *verification. Удаление не окончательное, планшет становится просто невидим в стволе и может быть восстановлен.

При успехе возвращает JSON следующего вида:

{
  "statusCode": 200,
  "message": null
}
	

При ошибке возвращает JSON следующего вида:

{
  "statusCode": 400,  // Код ошибки
  "message": "string" // Описание ошибки
}
	

Восстановление планшета, удалённого из ствола

POST /Darcy/Project/{Snapshot}/Plot/{Thing}/Restore

Восстановить планшет, удалённый из ствола по его идентификатору. Право на восстановление планшета имеют его автор и обладатели роли *verification.

При успехе возвращает JSON следующего вида:

{
  "statusCode": 200,
  "message": null
}
	

При ошибке возвращает JSON следующего вида:

{
  "statusCode": 400,  // Код ошибки
  "message": "string" // Описание ошибки
}
	

Удаление модели планшета из ОБД или ХОД

POST /Darcy/Project/{Snapshot}/Plot/{Thing}/Erase

Удалить модель планшета по идентификатору планшета. Планшет должен быть в ОБД или ХОД. Планшеты из кандидатов и песочницы удалить нельзя. Удаление окончательное, планшет восстановить нельзя. Датасеты и другие данные, используемые планшетом, не удаляются.

При успехе возвращает JSON следующего вида:

{
  "statusCode": 200,
  "message": null
}
	

При ошибке возвращает JSON следующего вида:

{
  "statusCode": 400,  // Код ошибки
  "message": "string" // Описание ошибки
}
	

Добавление модели планшета в ОБД или ХОД

POST /Darcy/Project/{Snapshot}/AddPlot?Name={Name}&Bore={Bore}&Module={Module}

Добавить модель планшета в ОБД или ХОД, где уже есть планшет. Планшеты в кандидаты и песочницу добавить нельзя. В теле POST-запроса находится модель нового планшета в формате JSON. Датасеты и другие данные, используемые планшетом, не добавляются в ХОД.

При успехе возвращает JSON следующего вида:

{
  "data": {
    "newPlot":2222  // Идентификатор thing нового планшета
  },
  "statusCode": 200,
  "message": null
}
	

При ошибке возвращает JSON следующего вида:

{
  "statusCode": 400,  // Код ошибки
  "message": "string" // Описание ошибки
}
	

Замена модели планшета в ОБД или ХОД

POST /Darcy/Project/{Snapshot}/Plot/{Thing}/Replace?Name={Name}&Bore={Bore}

Заменить модель планшета в ОБД или ХОД на новую. Планшеты в кандидатах и песочнице заменять нельзя. В теле POST-запроса находится новая модель планшета в формате JSON. Датасеты и другие данные, используемые планшетом, не добавляются в ХОД. Поэтому новый планшет может показывать только те данные, которые показывал старый. Новый планшет остаётся в том же стволе и модуле, что и старый.

При успехе возвращает JSON следующего вида:

{
  "data": {
    "oldPlot":1111, // Идентификатор thing старого планшета
    "newPlot":2222  // Идентификатор thing нового планшета
  },
  "statusCode": 200,
  "message": null
}
	

При ошибке возвращает JSON следующего вида:

{
  "statusCode": 400,  // Код ошибки
  "message": "string" // Описание ошибки
}
	

Переименование планшета в ОБД или ХОД

POST /Darcy/Project/{Snapshot}/Plot/{Thing}/Rename?Name={Name}

Переименование планшет в ОБД или ХОД. Планшеты в кандидатах и песочнице переименовывать нельзя.

При успехе возвращает JSON следующего вида:

{
  "statusCode": 200,
  "message": null
}
	

При ошибке возвращает JSON следующего вида:

{
  "statusCode": 400,  // Код ошибки
  "message": "string" // Описание ошибки
}
	

Получение значений кривой в виде double[]

GET /Darcy/Project/{Snapshot}/{Version}/Curve/double?DatasetUID={DatasetUID}&CurveName={CurveName}&By={By}

Получить массив значений указанной числовой кривой в виде массива double, двоичные данные.

Ответ при успехе содержит значения кривой в виде double[]. Отсутствие значения записывается как NaN.

При ошибке запрос возвращает JSON следующего вида:

{
  "statusCode": 500,
  "message": "string"
}
	

Получение значений референсной кривой в виде double[]

GET /Darcy/Project/{Snapshot}/{Version}/Depth/double?DatasetUID={DatasetUID}

Получить массив значений референсной кривой указанного датасета в виде массива double, двоичные данные. Для этого запроса не нужно знать имя референсной кривой.

Ответ при успехе содержит значения кривой в виде double[].

При ошибке запрос возвращает JSON следующего вида:

{
  "statusCode": 500,
  "message": "string"
}
	

Получение значений кривой в виде JSON

GET /Darcy/Project/{Snapshot}/{Version}/Curve/json?DatasetUID={DatasetUID}&CurveName={CurveName}&By={By}

Получить массив значений указанной кривой в виде JSON. Кривые могут быть числовыми или строковыми.

При успехе запрос возвращает JSON-массив значений. Значения числовой кривой - это числа или null. Значения строковой кривой - это только строки.

При ошибке запрос возвращает JSON следующего вида:

{
  "statusCode": 500,
  "message": "string"
}
	

Получение значений референсной кривой в виде JSON

GET /Darcy/Project/{Snapshot}/{Version}/Depth/json?DatasetUID={DatasetUID}

Получить массив значений референсной кривой указанного датасета в виде JSON. Для этого запроса не нужно знать имя референсной кривой.

При успехе запрос возвращает JSON-массив числовых значений.

При ошибке запрос возвращает JSON следующего вида:

{
  "statusCode": 500,
  "message": "string"
}
	

Получение значений кривой с именами зон в виде JSON

GET /Darcy/Project/{Snapshot}/{Version}/ZoneName/json?DatasetUID={DatasetUID}

Получить массив значений кривой с именами зон из указанного датасета зон в виде JSON. Для этого запроса не нужно знать имя кривой с именами зон.

При успехе запрос возвращает JSON-массив строковых значений.

При ошибке запрос возвращает JSON следующего вида:

{
  "statusCode": 500,
  "message": "string"
}
	

Получение значений преобразованной кривой в виде double[]

GET /Darcy/Project/{Snapshot}/{Version}/Distorted/{Method}/{ReferenceType}/{Gap}/double?DatasetUID={DatasetUID}&CurveName={CurveName}&By={By}

Получить массив значений преобразованной числовой кривой в виде массива double, двоичные данные. Преобразование нужно для перехода к другой референсной кривой из индексного датасета.

Ответ при успехе содержит значения кривой в виде double[]. Отсутствие значения записывается как NaN.

При ошибке запрос возвращает JSON следующего вида:

{
  "statusCode": 500,
  "message": "string"
}
	

Получение значений преобразованной референсной кривой в виде double[]

GET /Darcy/Project/{Snapshot}/{Version}/Distorted/{Method}/{ReferenceType}/{Gap}/Depth/double?DatasetUID={DatasetUID}

Получить массив значений преобразованной референсной кривой в виде массива double, двоичные данные. Преобразование нужно для перехода к другой референсной кривой из индексного датасета. Для этого запроса не нужно знать имя референсной кривой.

Ответ при успехе содержит значения кривой в виде double[]. Отсутствие значения записывается как NaN.

При ошибке запрос возвращает JSON следующего вида:

{
  "statusCode": 500,
  "message": "string"
}
	

Получение значений преобразованной кривой в виде JSON

GET /Darcy/Project/{Snapshot}/{Version}/Distorted/{Method}/{ReferenceType}/{Gap}/json?DatasetUID={DatasetUID}&CurveName={CurveName}&By={By}

Получить массив значений преобразованной кривой в виде JSON. Преобразование нужно для перехода к другой референсной кривой из индексного датасета.

При успехе запрос возвращает JSON-массив значений. Значения числовой кривой - это числа или null. Значения строковой кривой - это только строки.

При ошибке запрос возвращает JSON следующего вида:

{
  "statusCode": 500,
  "message": "string"
}
	

Получение значений преобразованной референсной кривой в виде JSON

GET /Darcy/Project/{Snapshot}/{Version}/Distorted/{Method}/{ReferenceType}/{Gap}/Depth/json?DatasetUID={DatasetUID}

Получить массив значений преобразованной референсной кривой в виде JSON. Преобразование нужно для перехода к другой референсной кривой из индексного датасета. Для этого запроса не нужно знать имя референсной кривой.

При успехе запрос возвращает JSON-массив числовых значений.

При ошибке запрос возвращает JSON следующего вида:

{
  "statusCode": 500,
  "message": "string"
}
	

Получение значений нескольких кривых в виде JSON

POST /Darcy/Project/{Snapshot}/{Version}/Curves/json

Получить одним запросом несколько кривых (числовых или строковых) в формате JSON.

Если это возможно, лучше вместо этого запроса использовать следующий запрос, а то этот какой-то нестандартный получился.

Набор требуемых кривых передаётся через тело POST-запроса в формате JSON. Пример для запроса четырёх кривых:

{
  "curves": [  // Массив описателей для каждой кривой.
    {
      "type": "Curve", // "Curve", "Depth" или "ZoneName".
      "uid":  "FLWBD", // UID датасета, как моделях в планшетов и геонавигаций.
      "name": "DX"     // Имя кривой.
    },
    {
	// Значение по умолчанию "type": "Curve" можно опустить.
      "uid":  "FLWBD", // UID датасета.
      "name": "SS"     // Имя кривой.
    },
    {
      "type": "Depth", // Это запрос референсной кривой.
      "uid":  "FLWBD"  // UID датасета.
	// Если type:"Depth", то имя кривой не нужно.
    },
    {
      "type": "ZoneName", // Это запрос кривой с именами зон.
      "uid":  "FLWBD"     // UID датасета.
	// Если type:"ZoneName", то имя кривой не нужно.
    }
  ]
}
	

Результат запроса приходит в формате JSON и содержит массив объектов, для каждой запрошенной кривой один объект. Кривые в ответе идут в том же порядке, что и в запросе. Если кривая была не найдена, соответствующий ей объект в ответе содержит описание ошибки. Пример ответа на приведённый выше запрос:

{
  "data": [ // Для каждой кривой один объект
    { // Успешно прочитанная числовая кривая:
      "uid":     "FLWBD",            // UID датасета, как моделях в планшетов и геонавигаций.
      "name":    "DX",               // Имя кривой.
      "fValues": [ 0.0, null, 2.0 ], // Числовые значения кривой, каждое значение число или null.
      "sValues": null,               // Значения строковой кривой, для числовой кривой здесь null.
      "error":   null                // Строковое сообщение об ошибке или null, если кривая успешно прочитана.
    },
    { // Успешно прочитанная строковая кривая:
      "uid":     "FLWBD",            // UID датасета.
      "name":    "SS",               // Имя кривой.
      "fValues": null,               // Числовые значения кривой, для строковой кривой здесь null.
      "sValues": ["A", "B"],         // Значения строковой кривой, для числовой кривой здесь null.
      "error":   null                // Строковое сообщение об ошибке или null, если кривая успешно прочитана.
    },
    { // Успешно прочитанная числовая кривая:
      "uid":     "FLWBD",            // UID датасета.
      "name":    null,               // Имя кривой, взятое из запроса.
      "fValues": [ 0.0, 1.0, 2.0 ],  // Числовые значения кривой, каждое значение число или null.
      "sValues": null,               // Значения строковой кривой, для числовой кривой здесь null.
      "error":   null                // Строковое сообщение об ошибке или null, если кривая успешно прочитана.
    },
    { // Кривая, которую не удалось прочитать:
      "uid":     "FLWBD",            // UID датасета.
      "name":    null,               // Имя кривой, взятое из запроса.
      "fValues": null,               // Числовые значения кривой не найдены, поэтому null.
      "sValues": null,               // Строковые значения кривой не найдены, поэтому null.
      "error":   "Curve not found"   // Сообщение об ошибке.
    },
  ],
  "statusCode": 200,
  "message": null
}
	

При ошибке, которая относится не к отдельной кривой, а к запросу в целом, возвращает JSON следующего вида:

{
  "data": null
  "statusCode": 401,  // Код ошибки
  "message": "string" // Описание ошибки
}
	

Даже если не удалось прочитать ни одной кривой, запрос возвращает код 200. А вот если не найден сам снэпшот, тогда возвращается код 404 и "data":null.


Получение значений нескольких кривых из одного датасета в виде JSON

POST /Darcy/Project/{Snapshot}/{Version}/DatasetCurves/json

Получить одним запросом несколько кривых (числовых или строковых) из одного датасета в формате JSON.

Набор требуемых кривых передаётся через тело POST-запроса в формате JSON. Датасет определяется одним из двух способов: через поле thing или через поля bore_id и dataset. Два примера для запроса четырёх кривых:

{
  "bore_id": "0cac5c6f-30fa-4f58-97f3-9cd3937ea619", // Идентификатор (GUID) ствола в «ген. ресурсах»
  "dataset": "Имя датасета",
  "thing": 0, // Идентификатор датасета в ОБД или ХОД, ноль или не указан, значит не используется.
  
  "curves": [  // Массив описателей для каждой кривой.
    {
      "by": "depth", // Ищется референсная кривая.
      "name": "MD"   // Для by:depth значение поля "name" не учитывается.
    },
    {
      "by": "zonename", // Ищется кривая с именами зон.
      "name": "NAME"    // Для by:zonename значение поля "name" не учитывается.
    },
    {
      "by": "name",  // Кривая ищется по имени без учёта регистра символов.
      "name": "XXXX" // Имя кривой.
    },
    {
      "by": "classificator", // Кривая ищется сначала по имени, затем по классификатору.
      "name": "Z"            // Предпочтительное имя кривой.
    }
  ]
}

{
  "bore_id": "00000000-0000-0000-0000-000000000000", // Нулевой или не указан, значит не используется.
  "dataset": "", // Имя датасета пустое или не указано, значит не используется.
  "thing": 666, // Идентификатор датасета в ОБД или ХОД.
  
  "curves": [  // Массив описателей для каждой кривой.
    { "by": "depth"        , "name": "MD"   },
    { "by": "classificator", "name": "INCL" },
    { "by": "classificator", "name": "AZIM" },
    { "by": "classificator", "name": "TVD"  }
  ]
}
	

Результат запроса приходит в формате JSON и содержит массив объектов, для каждой запрошенной кривой один объект. Кривые в ответе идут в том же порядке, что и в запросе. Если кривая была не найдена, соответствующий ей объект в ответе содержит описание ошибки. Пример ответа на приведённый выше запрос:

{
  "data": {
    "bore_id": "0cac5c6f-30fa-4f58-97f3-9cd3937ea619", // Идентификатор (GUID) ствола в «ген. ресурсах»
    "dataset": "Имя датасета",
    "thing": 14, // Идентификатор датасета в ОБД или ХОД.
    
    "curves": [ // Для каждой кривой один объект
      { // Успешно прочитанная числовая референсная кривая:
        "name":    "MD",               // Запрошенное имя кривой.
        "found":   "DEPTH",            // Имя найденной кривой, не всегда совпадает с запрошенным.
        "fValues": [ 0.0, 1.0, 2.0 ],  // Числовые значения кривой, каждое значение число или null.
        "sValues": null,               // Значения строковой кривой, для числовой кривой здесь null.
        "error":   null                // Строковое сообщение об ошибке или null, если кривая успешно прочитана.
      },
      { // Успешно прочитанная строковая кривая, найденная по имени:
        "name":    "NAME",             // Запрошенное имя кривой.
        "found":   "ZONE_NAME",        // Имя найденной кривой, не всегда совпадает с запрошенным.
        "fValues": null,               // Числовые значения кривой, для строковой кривой здесь null.
        "sValues": ["AA", "BB", ""],   // Значения строковой кривой, для числовой кривой здесь null.
        "error":   null                // Строковое сообщение об ошибке или null, если кривая успешно прочитана.
      },
      { // Кривая, которую не удалось прочитать:
        "name":    "XXXX",             // Запрошенное имя кривой.
        "found":   null,               // Имя найденной кривой, не всегда совпадает с запрошенным.
        "name":    null,               // Имя кривой, взятое из запроса.
        "fValues": null,               // Числовые значения кривой не найдены, поэтому null.
        "sValues": null,               // Строковые значения кривой не найдены, поэтому null.
        "error":   "Curve not found"   // Сообщение об ошибке.
      },
      { // Успешно прочитанная числовая кривая, найденная по классификатору:
        "name":    "Z",                // Запрошенное имя кривой.
        "found":   "TVDSS",            // Имя найденной кривой, не всегда совпадает с запрошенным.
        "fValues": [ 0.0, null, 2.0 ], // Числовые значения кривой, каждое значение число или null.
        "sValues": null,               // Значения строковой кривой, для числовой кривой здесь null.
        "error":   null                // Строковое сообщение об ошибке или null, если кривая успешно прочитана.
      },
    ]
  },
  "statusCode": 200,
  "message": null
}
	

При ошибке, которая относится не к отдельной кривой, а к запросу в целом, возвращает JSON следующего вида:

{
  "data": null
  "statusCode": 401,  // Код ошибки
  "message": "string" // Описание ошибки
}
	

Даже если не удалось прочитать ни одной кривой, запрос возвращает код 200. А вот если не найден сам снэпшот, тогда возвращается код 404 и "data":null.


Получение списка картинок керна

GET /Darcy/Project/{Snapshot}/{Version}/KernPictures?DatasetUID={DatasetUID}

Получить список картинок керна в виде JSON из датасета керна.

Ответ при успехе содержит массив описателей картинок керна.

{
  "data": [
      {
        "thing"  :363,    // идентификатор картинки керна
        "small"  :"jpeg", // формат маленькой картинки, сейчас всегда jpeg
        "big"    :"png",  // формат большой картинки: jpeg, png, bmp или tiff
        "top"    :3455.1, // глубина верхнего края керна
        "bottom" :3465.9, // глубина нижнего края керна
        "start"  :0.0,    // начало фрагмента картинки
        "stop"   :1.0     // конец фрагмента картинки
      }
    ],
  "statusCode": 200,
  "message": null
}
	

Поля start и stop определяют, какой фрагмент картинки (по высоте) следует отрисовывать. Считаем, что 0 - это нижний край, 1 - верхний край картинки. Если start больше чем stop, фрагмент картинки надо перевернуть.


Получение списка картинок керна для преобразованной референсной кривой

GET /Darcy/Project/{Snapshot}/{Version}/Distorted/{Method}/{ReferenceType}/{Gap}/KernPictures?DatasetUID={DatasetUID}

Получить список картинок керна в виде JSON из датасета керна. При этом top и bottom нужно возвращать для преобразованной референсной кривой.

Ответ при успехе содержит массив описателей картинок керна.

{
  "data": [
      {
        "thing"  :363,    // идентификатор картинки керна
        "small"  :"jpeg", // формат маленькой картинки, сейчас всегда jpeg
        "big"    :"png",  // формат большой картинки: jpeg, png, bmp или tiff
        "top"    :3455.1, // глубина верхнего края керна по преобразованному датасету
        "bottom" :3465.9, // глубина нижнего края керна по преобразованному датасету
        "start"  :0.0,    // начало фрагмента картинки
        "stop"   :1.0     // конец фрагмента картинки
      }
    ],
  "statusCode": 200,
  "message": null
}
	

Поля start и stop определяют, какой фрагмент картинки (по высоте) следует отрисовывать. Считаем, что 0 - это нижний край, 1 - верхний край картинки. Если start больше чем stop, фрагмент картинки надо перевернуть.


Получение картинки керна

GET /Darcy/Project/{Snapshot}/{Version}/Kern/{Thing}/{FileName}

Получить картинку керна в виде файла.

При успехе запрос возвращает файл с картинкой керна.

При ошибке запрос возвращает JSON следующего вида:

{
  "statusCode": 500,
  "message": "string"
}
	

Получение доступных уровней детализации для массива кривых

GET /Darcy/Project/{Snapshot}/{Version}/TileSet/{Smooth}/{ScaleX}?DatasetUID={DatasetUID}&ArrayName={ArrayName}

Для изображения массива кривых на планшете узнать, какие доступны уровни детализации. Если данные не были подготовлены, рассчитывает их, это может продолжаться довольно долго. Тогда запрос вернёт код 202, это означает, что нужно подождать и повторить запрос.

При ошибке запрос возвращает JSON следующего вида:

{
  "statusCode": 500,
  "message": "string"
}
	

При успехе запрос возвращает JSON следующего вида:

{
  "statusCode": 200,
  "message": null,
  "data": {
    "tileset": 34,   // идентификатор набора картинок
    "tileX":   64,   // ширина тайла в пикселах
    "tileY":  512,   // высота тайла в пикселах
    "levelsX":  2,   // число доступных уровней по оси X
    "levelsY":  4,   // число доступных уровней по оси Y
    "left":     0,   // предел по X слева
    "right":  360,   // предел по X справа
    "top":    111.0, // предел по глубине сверху
    "bottom": 777.0  // предел по глубине снизу
  }
}
	

Значения tileset понадобятся при последующих запросах каждого тайла.

Размеры одного тайла tileX:64 и tileY:512 сейчас всегда одинаковые, но в принципе могут когда-нибудь измениться.

Информацию о доступных уровнях детализации следует понимать так. levelsX:2 означает, что по оси X доступны два уровня детализации 0 и 1. levelsY:4 означает, что по оси Y доступны четыре уровня детализации 0, 1, 2 и 3. Изображение массива на уровне детализации (0, 0) состоит всегда из одного тайла. Изображение массива на уровне детализации (levelX, levelY) состоит из (1 << levelX) тайлов в ширину и (1 << levelY) тайлов в высоту. В пикселах его размер составит (64 << levelX) пикселов в ширину и (512 << levelY) пикселов в высоту.


Получение доступных уровней детализации для преобразованного массива кривых

GET /Darcy/Project/{Snapshot}/{Version}/TileSet/{Smooth}/{ScaleX}/Distorted/{Method}/{ReferenceType}/{Gap}?DatasetUID={DatasetUID}&ArrayName={ArrayName}&Synt={Synt}

Этот запрос отличается от предыдущего только тем, что массив преобразуется для перехода к другой референсной кривой из индексного датасета. Для этого добавляются три параметра преобразования:


Получение тайла для массива кривых

GET /Darcy/TileSet/{TileSet}/Level/{LevelX}/{LevelY}/Tile/{IndexX}/{IndexY}

Получить один тайл для изображения массива кривых на планшете. Тайл это не картинка, а бинарный файл специального формата. Он состоит из двух частей - массива пикселей и таблицы пересчёта из byte во float. Массив пикселей содержит по одному байту на каждый пиксель тайла. Нулевой байт всегда обозначает отсутствие значения (NaN), остальные байты пересчитываются во float по таблице пересчёта.

Таблица пересчёта - это массив float[256]. Нулевой элемент таблицы пересчёта содержит не float.NaN, как можно было бы ожидать, а номер от 0 до 255 последнего используемого элемента в таблице. Все элементы таблицы с индексами больше этого номера не используются, потому что байтов с такими значениями в массиве пикселей нет. Используемые значения в таблице пересчёта всегда упорядочены по возрастанию.

Сейчас используется тайл размером 64*512 пикселей, поэтому при успехе данный запрос возвращает 32 килобайта пикселей и 1 килобайт таблицы пересчёта, итого 33 килобайта данных. MIME-тип данных в этом случае "application/octet-stream".

При ошибке запрос возвращает JSON следующего вида:

{
  "statusCode": 500,
  "message": "string"
}
	

Получение датасета контактов

GET /Darcy/Project/{Snapshot}/{Version}/Contacts?ContactDatasetUID={ContactDatasetUID}

Получить датасет контактов в виде JSON.

Результат выполнения этого запроса имеет тот же вид, что и результат запроса преобразованного датасета контактов, только у каждого контакта в полях value и tvdss значения всегда совпадают.


Получение преобразованного датасета контактов

GET /Darcy/Project/{Snapshot}/{Version}/Distorted/{Method}/{ReferenceType}/{Gap}/Contacts?ContactDatasetUID={ContactDatasetUID}&BoreUID={BoreUID}

Получить преобразованный датасет контактов в виде JSON. Преобразование нужно для перехода к другой референсной кривой из индексного датасета.

При успехе запрос возвращает JSON следующего вида:

{
  "statusCode": 200,
  "message": null,
  "data": {
    "name": "Имя датасета контактов",
    "items": [ // Массив контактов
      {
        "name": "Имя контакта",
        "tvdss": -2305.1, // Исходная TVDSS контакта
        "depth": 3628.07, // Пересчитанная глубина
        "type": 1,
        "line": 4,
        "width": 1,
        "argb": [ 255, 255, 0, 0 ]
      }
    ]
  }
}
	

При ошибке запрос возвращает JSON следующего вида:

{
  "statusCode": 500,
  "message": "string"
}
	

Получение преобразованных точек пересечения поверхностей и фактических траекторий

POST /Darcy/Project/{Snapshot}/{Version}/PlotSurfaces/Distorted/{Method}/{ReferenceType}/{Gap}

Получить в виде JSON все точки пересечения стволов и поверхностей, изображённых на планшете, преобразованные к указанной глубине. Преобразование нужно для перехода к другой референсной кривой из индексного датасета.

{
  "bores":[
    "Самбургское НГКМ\u0001U74\u00027401\u0003Ствол\u0004",
    "Самбургское НГКМ\u0001U74\u00027402\u0003Ствол\u0004",
    "Самбургское НГКМ\u0001U74\u00027403\u0003Ствол\u0004"
  ],
  "surfaces": [
    "Самбургское НГКМ\u0001Surface1\u0015",
    "Самбургское НГКМ\u0001Surface2\u0015"
  ]
}
	

При успехе запрос возвращает JSON следующего вида:

{
  "statusCode": 200,
  "message": null,
  "data": {
    "bores": {
      "Самбургское НГКМ\u0001U74\u00027401\u0003Ствол\u0004": [ // UID ствола в качестве ключа
        {
          "surface": "Самбургское НГКМ\u0001Marker_1-For7401\u0015", // UID поверхности
          "md":    [ 3148.0098049051057 ], // Массив значений MD
          "depth": [ 3148.0098049051057 ]  // Массив значений преобразованной глубины
        }
      ]
    }
  }
}
	

При ошибке запрос возвращает JSON следующего вида:

{
  "statusCode": 500,
  "message": "string"
}
	

Запросы для геонавигации


Получение списка моделей геонавигации по стволу

GET /Darcy/Project/{Snapshot}/{Version}/Geonavigations/ByBore/{Thing}
GET /Darcy/Project/{Snapshot}/{Version}/Geonavigations/ByBoreUID?BoreUID={BoreUID}
GET /Darcy/Project/{Snapshot}/{Version}/Geonavigations/ByBoreId?BoreId={BoreId}

Получить список всех моделей геонавигации в снэпшоте, в которых упомянут заданный ствол.

При успехе возвращает набор моделей геонавигации в виде JSON:

{
  "data": [
    {
      "project": 1,      // Идентификатор снэпшота
      "thing": 14,       // Идентификатор геонавигации в снэпшоте
      "name": "Геонав1", // Имя модели геонавигации
	"created": 637610055843413987, // [OBSOLETE] Время создания модели в Дарси
      "changed": 637610055843413987  // Время последнего изменения модели в Дарси
      "user": {          // Кто загружал эту геонавигацию
        "id":     "b1efa161-de62-4265-a6a8-e826159eff87",
        "login":  "darcy_admin",
        "name":   "Администратор",
        "family": "Darcy",
        "displayName": ""
      }
    }
  ],
  "statusCode": 200,
  "message": null
}
	

При ошибке возвращает JSON следующего вида:

{
  "data": null
  "statusCode": 401,  // Код ошибки
  "message": "string" // Описание ошибки
}
	

Получение модели геонавигации

GET /Darcy/Project/{Snapshot}/{Version}/Geonavigation/{Thing}

Получить модель геонавигации по её идентификатору.

Успешный результат выполнения запроса имеет формат JSON, подробности мне неизвестны. При ошибке возвращает JSON следующего вида:

{
  "statusCode": 400,  // Код ошибки
  "message": "string" // Описание ошибки
}
	

Удаление геонавигации

POST /Darcy/Project/{Snapshot}/Geonavigation/{Thing}/Delete

Удалить геонавигацию по его идентификатору. Право на удаление геонавигации имеют его автор и обладатели роли *verification. Удаление не окончательное, геонавигация становится просто невидима в стволе.

При успехе возвращает JSON следующего вида:

{
  "statusCode": 200,
  "message": null
}
	

При ошибке возвращает JSON следующего вида:

{
  "statusCode": 400,  // Код ошибки
  "message": "string" // Описание ошибки
}
	

Восстановление удалённой геонавигации

POST /Darcy/Project/{Snapshot}/Geonavigation/{Thing}/Restore

Восстановить удалённую геонавигацию по его идентификатору. Право на восстановление геонавигации имеют её автор и обладатели роли *verification.

При успехе возвращает JSON следующего вида:

{
  "statusCode": 200,
  "message": null
}
	

При ошибке возвращает JSON следующего вида:

{
  "statusCode": 400,  // Код ошибки
  "message": "string" // Описание ошибки
}
	

Получение многих траекторий

POST /Darcy/Project/{Snapshot}/{Version}/Trajectories

Получить траектории для заданного набора стволов. Поиск кривых идёт сначала по имени, потом по типу в классификаторе. Поэтому имя полученной кривой может отличаться от запрошенного имени. Если кривой THL нет в базе данных, она рассчитывается исходя из DX и DY.

Тело запроса содержит JSON следующего вида:

{
  "bores": [ // массив идентификаторов стволов
    "5471f6a2-9f7c-4b4e-b36f-742bc99b5baa", // из поля id таблицы bores
    "7844c290-7bd1-4b93-9adc-c1e39bf0d585"  // базы данных «ген. ресурсов»
  ],
  "datasets": [ 76909 ], // массив идентификаторов датасетов траекторий
  "curves": ["MD", "DX", "DY", "THL", "TVDSS"], // массив имён кривых
  "fact": true, // нужны фактические траектории (индексные датасеты)
  "plan": true, // нужны плановые траектории
  "planLast": false, // нужна последняя по времени плановая траектория в каждом стволе
  "proto": true, // нужны траектории-прототипы
  "method": 0, // метод расчёта
  "limit": 1.0 // допустимое отклонение
}
	

Один из массивов bores или datasets должен быть пустым или null, а другой не пуст. Если оба массива пусты, запрос возвращает ошибку. Если оба массива не пусты, поведение не определено. [OBSOLETE] Массив datasets предполагается выбросить, его никто не использует.

Поле method может принимать пока следующие значения:

Ответ при успехе содержит набор стволов, в каждом из которых набор траекторий, а в каждой траектории набор кривых. Какие-то из запрошенных кривых могут отсутствовать. Какие-то из запрошенных стволов могут отсутствовать, если в них нет траекторий. Стволы в ответе могут быть не в том порядке, как в запросе. Если в ответе присутствует фактическая траектория, она всегда идёт первой.

{
  "data": [ // массив стволов
    {       // ствол
      "id": "5471f6a2-9f7c-4b4e-b36f-742bc99b5baa", // идентификатор ствола bores.id 
      "name": "BORE", // имя ствола
      
      "datasets": [ // массив датасетов траектории
        {           // датасет траектории
          "thing": 111333, // идентификатор датасета траектории в базе данных Дарси
          "name": "Index", // имя датасета траектории
          "kind": 9,       // тип датасета траектории
          
          "curves": [ // массив кривых
            {         // кривая
              "curve": "MD",   // имя кривой, которая была запрошена
              "name": "DEPTH", // имя кривой, которая была найдена
	// Если кривая THL была рассчитана, придёт "curve":"THL", "name":"",
              "count": 4       // число значений кривой в базе данных
              "values": [0.0, 1.0, null, 3.0] // массив значений кривой
	// Отсутствующие значения обозначаются как null.
	// Длина массива values может быть не равна count.
            }
          ]
        }
      ]
    }
  ],
  "statusCode": 200,
  "message": null
}
	

При ошибке возвращает JSON следующего вида:

{
  "data": null
  "statusCode": 401,  // Код ошибки
  "message": "string" // Описание ошибки
}
	

Получение многих конструкций скважины

POST /Darcy/Project/{Snapshot}/{Version}/WellConstructions

Получить датасеты конструкции скважины для заданного набора стволов.

Тело запроса содержит JSON следующего вида:

{
  "bores": [ // массив идентификаторов стволов
    "5471f6a2-9f7c-4b4e-b36f-742bc99b5baa", // из поля id таблицы bores
    "7844c290-7bd1-4b93-9adc-c1e39bf0d585"  // базы данных «ген. ресурсов»
  ],
  "fact": true, // нужны фактические конструкции
  "plan": true  // нужны плановые конструкции
}
	

Ответ при успехе содержит набор стволов, в каждом из которых набор датасетов, а в каждом датасете набор кривых. Какие-то из запрошенных стволов могут отсутствовать, если в них нет датасетов конструкции скважины. Стволы в ответе могут быть не в том порядке, как в запросе.

{
  "data": [ // массив стволов
    {       // ствол
      "id": "5471f6a2-9f7c-4b4e-b36f-742bc99b5baa", // идентификатор ствола bores.id
      "name": "BORE", // имя ствола
      
      "datasets": [ // массив датасетов конструкции скважины
        {           // датасет
          "thing": 111333, // идентификатор датасета в базе данных Дарси
          "name": "Index", // имя датасета конструкции скважины
          "kind": 5,       // тип датасета
          
          "curves": [ // массив кривых
            {         // кривая
              "curve": "DEPTH",// пока не используется и равно полю name
              "name": "DEPTH", // имя кривой
              "count": 4       // число значений кривой в базе данных
              
	// У каждой кривой есть либо числовые значения, либо строковые.
              "values": [0.0, 1.0, null, 3.0], // массив числовых значений кривой или null
	// Отсутствующие значения обозначаются как null.
              "sValues": ["a", "b", "", "cd"] // массив строковых значений кривой или null
	// Отсутствующие значения обозначаются как "".
            }
          ]
        }
      ]
    }
  ],
  "statusCode": 200,
  "message": null
}
	

При ошибке возвращает JSON следующего вида:

{
  "data": null
  "statusCode": 401,  // Код ошибки
  "message": "string" // Описание ошибки
}
	

Получение информации о картинке-подложке

GET /Darcy/Project/{Snapshot}/{Version}/Image/json?ImageUID={ImageUID}

Получить информацию о картинке-подложке для геонавигации.

При успехе возвращает информацию о картинке в формате JSON, пример:

{
  "data": {
    "format" : 0, // Unknown = 0, BMP = 1, JPEG = 2, PNG = 3, TIFF = 4
    "left"   : -2282,
    "right"  : 5994,
    "top"    : -505,
    "bottom" : 4104,
    "opacity": 0.5,
    "invertX": false
  },
  "statusCode": 200,
  "message": null
}
	

При ошибке возвращает JSON следующего вида:

{
  "data": null,
  "statusCode": 401,  // Код ошибки
  "message": "string" // Описание ошибки
}
	

Получение файла картинки-подложки

GET /Darcy/Project/{Snapshot}/{Version}/Image/file?ImageUID={ImageUID}

Получить файл картинки-подложки для геонавигации.

При успехе возвращает файл в формате PNG, JPEG, TIFF или BMP.

При ошибке возвращает JSON следующего вида:

{
  "data": null,
  "statusCode": 401,  // Код ошибки
  "message": "string" // Описание ошибки
}
	

Получение списка картинок-подложек в стволе

GET /Darcy/Project/{Snapshot}/{Version}/Images?BoreUID={BoreUID}

Получить список картинок-подложек для геонавигации в стволе.

При успехе возвращает JSON следующего вида:

{
  "data": [ // Список картинок
    { "uid": "Идентификатор картинки 1" },
    { "uid": "Идентификатор картинки 2" },
    { "uid": "Идентификатор картинки N" }
  ],
  "statusCode": 200,
  "message": null
}
	

При ошибке возвращает JSON следующего вида:

{
  "data": null
  "statusCode": 401,  // Код ошибки
  "message": "string" // Описание ошибки
}
	

Поиск синтетического датасета в ХОД

GET /Darcy/Project/{Snapshot}/{Version}/Synthetic

Найти синтетический датасет в ХОД геонавигации. Мы определяем, что датасет синтетический по его имени, которое автоматически генерируется определённым образом в программе Дарси. Существенно используется то, что в одном ХОД может содержаться не более одной модели геонавигации. А в одной модели геонавигации только один синтетический датасет.

При успехе возвращает JSON следующего вида:

{
  "data": {
    "boreId": "44653abb-ed4b-4764-8521-0dee2790f2fa", // Идентификатор ствола в ген. ресурсах
    "name": "Имя датасета",
    "thing": 14 // Идентификатор датасета в ХОД
  },
  "statusCode": 200,
  "message": null
}
	

Отсутствие подходящего синтетического датасета возвращается как ошибка 404. При ошибке возвращает JSON следующего вида:

{
  "data": null
  "statusCode": 401,  // Код ошибки
  "message": "string" // Описание ошибки
}
	

Перечисление имён маркеров в геонавигации

GET /Geonavigation/{Thing}/Markers

Перечислить маркера в модели геонавигации в ХОД.

При успехе возвращает JSON следующего вида:

{
  "data": [ // Массив маркеров
    {
      "name": "Имя маркера"
    }
  ],
  "statusCode": 200,
  "message": null
}
	

Если маркеров нет, это не ошибка, в data возвращает пустой массив. При ошибке возвращает JSON следующего вида:

{
  "data": null
  "statusCode": 401,  // Код ошибки
  "message": "string" // Описание ошибки
}
	

Получение координат маркеров в геонавигации

GET /Geonavigation/{Thing}/MarkersCoords?MarkerNames={MarkerNames}
POST /Geonavigation/{Thing}/MarkersCoords

Получить координаты THL и TVDSS для указанных маркеров в модели геонавигации в ХОД. GET-запрос может быть непригоден, если имён слишком много, зато он удобнее для отладки. В работе предпочтительнее POST-запрос.

Для POST-запроса имена маркеров передаются в теле запроса в формате JSON:

	{ "names": [ "имя1", "имя2", "имя3"] }
	

При успехе возвращает JSON следующего вида:

{
  "statusCode": 200,
  "message": null,
  "data": {
    "thl": [ 100.0, 200.0 ], // Координата X, общая для всех
    "faultY": [ 0.0, 100.0 ] // Величина сдвига, только если Period=0
    "markers": [ // Массив маркеров
      {
        "id": "11", // Идентификатор маркера, хотя может он не нужен
        "name": "Marker11", // Имя маркера
        "tvdss": [ 1000.0, 2000.0 ] // Координата Y для этого маркера
      }
    ]
  }
}
	

Если маркеров нет, это не ошибка, в data возвращает пустой массив. При ошибке возвращает JSON следующего вида:

{
  "data": null
  "statusCode": 401,  // Код ошибки
  "message": "string" // Описание ошибки
}
	

Запросы для плагина к Petrel


Получение дерева для плагина к Petrel

GET /Darcy/PpTree

Получение дерева данных из ОБД для плагина к Petrel. Дерево содержит датасеты только некоторых типов: Normal, Points, Interval, Index, Markers, Trajectory, TrajectoryPrototype, а остальные не видны. В датасете референсная кривая всегда идёт первой. Дерево не содержит кривых внутри массива кривых.

Дерево содержит геонавигации из ХОД, но не содержит лежащие в них маркеры. Для получения маркеров понадобится отдельный запрос, поскольку это ресурсоёмкая операция.

Каждый элемент дерева может иметь следующие поля:

Дерево имеет следующие уровни:

Для скважин, у которых нет месторождения и/или куста в ОБД и в Дарси имеются фиктивное месторождение по имени "NA" и фиктивные кусты по имени "NA", которых нет в ген. ресурсах.

Ответ имеет формат JSON. При успехе:

{
  "statusCode": 200,
  "message": null
  "message_ru": null,
  "stack": null,
  "data": {
    "thing": 1,
    "attr": 1, // Проект
    "kind": 0,
    "name": "",
    "items": [
      {
        "thing": 0,
        "crid": "f83170b7-b576-48c1-8cd7-761166800c71",
        "attr": 59, // Организация
        "kind": 0,
        "name": "ННТЦ", // имя организации
        "items":[ ... ] // массив лицензионных участков
      },
    ]
  }
 }
	

Пример ответа при ошибке:

{
  "statusCode": 500,
  "message": "Bad luck"
}
	

Чтение датасета

GET /Darcy/Dataset/{Thing}

Прочитать датасет со всеми его значениями кривых, включая кривые в составе массивов. Результат возвращается в формате JSON.

Ответ имеет формат JSON. При успехе:

{
  "statusCode": 200,
  "message": null,
  "data" : {
    "Project": 1, // Идентификатор снэпшота. Для «общей базы данных» равен 1.
    "BoreId": "", // Идентификатор ствола в базе данных «ген. ресурсов».
    "FieldName":   "", // Имя месторождения.
    "LeaseName":   "", // Имя куста.
    "WellName":    "", // Имя скважины.
    "BoreName":    "", // Имя ствола.
    "DatasetName": "", // Имя датасета.
    "Attributes": {    // Атрибуты датасета.
      "имя1": "значение1",
      "имя2": "значение2"
    },
    "Kind":        0, // Вид датасета.
    "KindData":    0, // Вид данных, enum DataSetKindData.
    "Curves": [ // Одиночные кривые.
      {         // Референсная кривая всегда идёт первой.
        "Name": "имя", // Имя кривой, уникальное в пределах датасета, не пустое.
        "Values": [ 1.0, 2.0, 3.0 ], // Значения числовой кривой, отсутствие значения передаётся как null.
	// Длина массива должна быть больше 0.
	// Для строковой кривой Values == null.
                                   
        "StringValues": [ "s", "" ], // Значения строковой кривой, отсутствие значения передаётся как "".
	// Длина массива должна быть больше 0.
	// Для числовой кривой StringValues == null.
        
        "Description" : "", // Описание кривой, не null.
        "Family" :      "", // Семейство в классификаторе, не null.
        "DataType" :    "", // Тип в классификаторе, не null.
        "Kind":          0, // Вид кривой.
        "Units" :       ""  // Единица измерения, не null.
      },
      {
	// ...следующая одиночная кривая...
      }
    ],
    "CurveArrays": [ // Массивы кривых.
      {
        "Name": "", // Имя массива кривых.
        "Description" : "", // Описание массива кривой, не null.
        "Family" :      "", // Семейство в классификаторе, не null.
        "DataType" :    "", // Тип в классификаторе, не null.
        "KindCurve":     0, // Вид каждой кривой в составе массива.
        "KindArray":     0, // Вид массива кривых, пока всегда 0.
        "Units" :       ""  // Единица измерения, не null.
        "Curves": [ // Кривые в составе массива.
          {         // Кривая.
            "Name": "имя", // Имя кривой, уникальное в пределах датасета, не пустое.
            "Values": [ 1.0, 2.0, 3.0 ], // Значения числовой кривой, отсутствие значения передаётся как null.
	// Длина массива должна быть больше 0.
	// Для строковой кривой Values == null.
                                       
            "StringValues": [ "s", "" ]  // Значения строковой кривой, отсутствие значения передаётся как "".
	// Длина массива должна быть больше 0.
	// Для числовой кривой StringValues == null.
          },
          {
	// ...следующая кривая в составе массива...
          }
        ]
      }
    ]
  }
}
	

Пример ответа при ошибке:

{
  "statusCode": 404,
  "message": "Dataset not found"
}
	

Добавление датасета

POST /Darcy/Dataset

Добавить датасет в указанный снэпшот. Если снэпшот добавляется в «общую базу данных», то в базе данных «ген. ресурсов» должен существовать соответствующий ствол.

Датасет - это прямоугольная таблица, её колонки называются "кривые". Кривые бывают двух видов - числовые и строковые. Значения числовых кривых имеют тип double, значения строковых кривых имеют тип string. Значение может отсутствовать, тогда для числовых кривых туда записывается NaN (если кривая хранится в двоичном виде) или null (когда кривая передаётся как JSON). Отсутствие значения для строковой кривой - это тоже самое, что пустая строка, null не допускается. Первая колонка имеет специальный смысл - это референсная кривая. Она всегда числовая, в ней не может быть отсутствующих значений и значения всегда возрастают. Чаще всего она интерпретируется как глубина по стволу или время. Кривые бывают нескольких видов, которые перечислены в enum CurveKind. Датасеты бывают нескольких видов, которые перечислены в enum DataSetKind.

Кроме обычных кривых, датасет может также содержать в себе массивы кривых. Массив кривых имеет имя и содержит внутри себя упорядоченный набор обычных кривых. Имена кривых и массивов кривых должны быть уникальны в пределах датасета. У кривых в одном массиве должны совпадать значения полей Family, DataType, Kind и Units.

Датасет передаётся через тело POST-запроса в формате JSON. Формат данных такой:

{
  "Project": 1, // Идентификатор снэпшота. Для «общей базы данных» равен 1.
  
  "BoreId": "", // Идентификатор ствола в базе данных «ген. ресурсов», внутренний.
	// Если он не null, ствол ищется по нему.
	// [OBSOLETE] Иначе ищем по именам FieldName, LeaseName, WellName, BoreName.
  "FieldName":   "", // [OBSOLETE] Имя месторождения.
  "LeaseName":   "", // [OBSOLETE] Имя куста.
  "WellName":    "", // [OBSOLETE] Имя скважины.
  "BoreName":    "", // [OBSOLETE] Имя ствола.
  
  "DatasetName": "", // Имя датасета.
  
  "Attributes": {    // Атрибуты датасета.
    "имя1": "значение1",
    "имя2": "значение2"
  },
  "Kind":        0, // Вид датасета.
  "KindData":    0, // Вид данных, enum DataSetKindData, можно пока писать 0.
  "Replace": false, // Что делать, если датасет с таким именем уже был,
	// перезаписать его или вернуть ошибку.
  "AsUser": "guid", // Необязательное поле, ид. пользователя от имени которого пишем.
                                            
  "Curves": [ // Одиночные кривые.
    {         // Референсная кривая всегда идёт первой.
      "Name": "имя", // Имя кривой, уникальное в пределах датасета, не пустое.
      "Values": [ 1.0, 2.0, 3.0 ], // Значения числовой кривой, отсутствие значения передаётся как null.
	// Длина массива должна быть больше 0.
	// Для строковой кривой Values == null.
                                   
      "StringValues": [ "s", "" ], // Значения строковой кривой, отсутствие значения передаётся как "".
	// Длина массива должна быть больше 0.
	// Для числовой кривой StringValues == null.
      
      "Description" : "", // Описание кривой, не null.
      "Family" :      "", // Семейство в классификаторе, не null.
      "DataType" :    "", // Тип в классификаторе, не null.
      "Kind":          0, // Вид кривой.
      "Units" :       ""  // Единица измерения, не null.
    },
    {
	// ...следующая одиночная кривая...
    }
  ],
  "CurveArrays": [ // Массивы кривых.
    {
      "Name": "", // Имя массива кривых.
      "Description" : "", // Описание массива кривой, не null.
      "Family" :      "", // Семейство в классификаторе, не null.
      "DataType" :    "", // Тип в классификаторе, не null.
      "KindCurve":     0, // Вид каждой кривой в составе массива.
      "KindArray":     0, // Вид массива кривых, пока всегда 0.
      "Units" :       ""  // Единица измерения, не null.
      "Curves": [ // Кривые в составе массива.
        {         // Кривая.
          "Name": "имя", // Имя кривой, уникальное в пределах датасета, не пустое.
          "Values": [ 1.0, 2.0, 3.0 ], // Значения числовой кривой, отсутствие значения передаётся как null.
	// Длина массива должна быть больше 0.
	// Для строковой кривой Values == null.
                                       
          "StringValues": [ "s", "" ]  // Значения строковой кривой, отсутствие значения передаётся как "".
	// Длина массива должна быть больше 0.
	// Для числовой кривой StringValues == null.
        },
        {
	// ...следующая кривая в составе массива...
        }
      ]
    }
  ]
}
	

Ответ имеет формат JSON. При успехе:

{
  "Exists": false, // Датасет с таким именем уже был.
  "statusCode": 200,
  "message": null,
  "message_ru": null,
  "errorCode": null,
  "ErrorAttributes": {}
}
	

Пример ответа при ошибке:

{
  "Exists": true, // Датасет с таким именем уже был.
  "statusCode": 500,  // HTTP статус
  "message": "Curves[1].Values.Length != Count", // Описание ошибки на английском языке
  "message_ru": "Количество отсчетов в кривой 'TVDSS' не совпадает с количеством отсчетов в референсной кривой.", // Описание ошибки на русском языке
  "errorCode": "DS22" // Код ошибки
  "ErrorAttributes": // Словарь ключ-значение с дополнительной информацией по ошибке 
  {
    "Curves.Name": "TVDSS"
  } 
}
	

Возможные коды ошибок/результата:

Возможные ключи в словаре дополнительной информации:

Будет возможность добавления датасета через Rabbit. Для этого вышеописанный JSON в кодировке UTF-8 передаётся в очередь по имени add-dataset. Нет возможности узнать, удалось добавление или произошла ошибка. Пока это всё не отлажено.


Создание карточки

POST /Darcy/PpCard/Create?Name={Name}

Создать пустую невидимую карточку, которая содержит данные для добавления в ОБД. Вообще, последовательность действий такая:

  1. Плагин к Petrel создаёт пустую невидимую карточку и получает её идентификатор.
  2. Плагин к Petrel добавляет в карточку датасеты.
  3. Плагин к Petrel публикует карточку.
  4. Пользователь с ролью *verification одобряет карточку через веб-интерфейс, данные из карточки добавляются в ОБД, карточка уничтожается.
    Или же он отвергает карточку и она просто уничтожается.

Ответ имеет формат JSON. При успехе:

{
  "project": 14, // Идентификатор проекта
  "name": "Имя карточки", // Имя карточки
  "statusCode": 200,
  "message": null
}
	

Пример ответа при ошибке:

{
  "project": 0,
  "name": "",
  "statusCode": 500,
  "message": "Can not publish project"
}
	

Публикация карточки

POST /Darcy/PpCard/{Snapshot}/Show

Опубликовать карточку, чтобы она стала видна пользователям с ролью *verification. После опубликования в карточку уже нельзя добавлять датасеты.

Ответ имеет формат JSON. При успехе:

{
  "statusCode": 200,
  "message": null
}
	

Пример ответа при ошибке:

{
  "statusCode": 500,
  "message": "Can not publish project"
}
	

Прочее


Получение датасетов некоторого вида из ствола

GET /Darcy/Project/{Snapshot}/{Version}/Bore/{Thing}/Datasets/Kind/{Kind}
GET /Darcy/Project/{Snapshot}/{Version}/BoreById/Datasets/Kind/{Kind}?BoreId={BoreId}

Получить для заданного ствола массив датасетов указанного типа.

Ответ при успехе содержит несортированный массив датасетов.

{
  "data": [
    {
      "thing": 0,       // внутренний идентификатор датасета
      "name": "string", // имя датасета
      "kind": 9,        // тип датасета
      "uid": "string"   // идентификатор датасета DatasetUID
    }
  ],
  "statusCode": 200,
  "message": null
}
	

Получение датасетов по формуле из ствола

POST /Darcy/Project/{Snapshot}/{Version}/BoreById/Datasets/Find?BoreId={BoreId}

Получить для заданного ствола массив датасетов, удовлетворяющих условию, заданному формулой.

Пример тела POST-запроса для поиска датасетов, у которых значение атрибута "CREATION_METHOD" равно "EXCEL"

{ "where": ["==", ["attr", "CREATION_METHOD"], "EXCEL"] }

Пример тела POST-запроса для поиска датасетов траекторий трёх видов. Хотя это более эффективно сделать другим запросом с параметром Kind равным -2.

{ "where": ["or", ["==", ["kind"], 6], ["==", ["kind"], 9], ["==", ["kind"], 15]] }

Язык выражения в поле where позволяет использовать числовые, булевы и строковые значения и null как константы. Массивы используются для записи функций, первый элемент любого массива это имя функции, последующие элементы массива это аргументы. Имеются следующие функции:

ФункцияТипОписание
Функции работающие с датасетом
"name" () → string Имя датасета
"kind" () → long Тип датасета как целое число
"changed" () → long Время изменения датасета, DateTime.UtcNow.Ticks
"attr" string → string Получить значение атрибута датасета по его имени
Операторы сравнения
"==" number number → bool Равенство для чисел
string string → bool Равенство для строк
"==^" string string → bool Равенство для строк, без учёта регистра символов
"!=" number number → bool Неравенство для чисел
string string → bool Неравенство для строк
"!=^" string string → bool Неравенство для строк, без учёта регистра символов
"<" number number → bool Оператор «меньше» для чисел
string string → bool Оператор «меньше» для строк
"<^" string string → bool Оператор «меньше» для строк, без учёта регистра символов
"<=" number number → bool Оператор «меньше или равно» для чисел
string string → bool Оператор «меньше или равно» для строк
"<=^" string string → bool Оператор «меньше или равно» для строк, без учёта регистра символов
">" number number → bool Оператор «больше» для чисел
string string → bool Оператор «больше» для строк
">^" string string → bool Оператор «больше» для строк, без учёта регистра символов
">=" number number → bool Оператор «больше или равно» для чисел
string string → bool Оператор «больше или равно» для строк
">=^" string string → bool Оператор «больше или равно» для строк, без учёта регистра символов
Прочие операторы
"not" bool → bool Логическое «НЕ»
"-" number → number Унарный минус
number number → number Вычитание
"if" bool any any → any Аналог тернарного оператора ?:, ленивый
Функции с любым числом аргументов больше 0
"and" bool+ → bool Ленивое логическое «И» для любого количества bool
"or" bool+ → bool Ленивое логическое «ИЛИ» для любого количества bool
"*" number+ → number Умножение любого количества чисел.
"+" number+ → number Сложение любого количества чисел.
string+ → string Конкатенация любого количества строк.
Функции для работы со строками
"contains" string string → bool Содержит ли первая строка вторую
"contains^" string string → bool Содержит ли первая строка вторую, без учёта регистра символов
"isSynthetic" string → bool Является ли строка именем синтетического датасета

При любой ошибке выражение возвращает значение null, которое используется как undefined в JavaScript или NaN в вычислениях с double. Если любой аргумент функции null, функция возвращает null, за исключением ленивых "and", "or" и "if", которые не всегда вычисляют все свои аргументы.

Ответ при успехе содержит несортированный массив датасетов.

{
  "data": [
    {
      "thing": 0,       // внутренний идентификатор датасета
      "name": "string", // имя датасета
      "kind": 9,        // тип датасета
      "uid": "string",  // идентификатор датасета DatasetUID
      "user": "guid",   // идентификатор пользователя или нулевой GUID
      "changed": 638295627915198200 // время последнего изменения, System.DateTime.UtcNow.Ticks
    }
  ],
  "statusCode": 200,
  "message": null
}
	

Получение истории выгрузок

GET /Darcy/UploadHistory?Organization={Organization}&LicArea={LicArea}&FromTime={FromTime}&ToTime={ToTime}

Получить историю выгрузок планшетов и геонавигаций в ОБД и ХОД за указанный период времени. Это нужно для задач IIFA-918, IIFA-1154.

При ошибке возвращает JSON следующего вида:

{
  "data": null
  "statusCode": 401,  // Код ошибки
  "message": "string" // Описание ошибки
}
	

Ответ при успехе содержит массив записей, каждая из которых соответствует одной выгрузке планшета или геонавигации. Порядок сортировки пока не определён. Набор полей определён приблизительно, вероятно его следует сократить.

{
  "data": [
    {
      "snapshot":   1,
      "thing":      0, // внутренний идентификатор ствола
      "modul":      3, // к какому модулю относится планшет, для геонавигации стоит 7
      "when":       637867209440215209, // когда выгрузил
      "userId":    "23f8b3fe-8c01-46ca-836e-5edc1035799f", // кто выгрузил
      "orgId":     "44653abb-ed4b-4764-8521-0dee2790f2fa", // идентификатор организации, может быть "00000000-0000-0000-0000-000000000000"
      "licAreaId": "c5a887e9-31e9-4826-884a-de9e64156e6c", // идентификатор лиц.участка, может быть "00000000-0000-0000-0000-000000000000"
      "fieldId":    11180, // идентификатор месторождения, может быть 0
      "wellId":    "d965b925-a2a9-4f49-abaf-0055fc3ad155",
      "boreId":    "ba1cd63f-e334-4f83-91ed-aa78edf0fa7d",
      "exists":     true, // выгрузку ещё не стёрли
      "hod":        true, // лежит в ХОД или в ОБД
      "name":      "Новый планшет",    // имя планшета или геонавигации
      "field":     "Самбургское НГКМ", // имя месторождения, может быть "NA"
      "lease":     "U06",    // имя куста, может быть "NA"
      "well":      "U0601",  // имя скважины
      "bore":      "BH2",    // имя ствола
      "login":     "evshkunov", // кто выгрузил? известно кто
      "displayName": "Шкунов Евгений Викторович", // вот кто выгрузил
      "efpr":       14.880666 // эффективная проходка в процентах или -1, если она не определена
    }
  ],
  "statusCode": 200,
  "message": null
}
	

Удаление датасетов

POST /Darcy/DeleteDatasets?Thing={Thing}&Thing={Thing}

Удалить датасеты по их идентификаторам thing из ОБД или ХОД. Это нужно для задачи IIFA-5609. Пользователь с ролью, оканчивающейся на verification, может удалить любой датасет. Пользователь с ролью, оканчивающейся на view, может удалить датасет, который он создал.

Ответ имеет формат JSON. При успехе:

{
  "statusCode": 200,
  "message": null
}
	

Пример ответа при ошибке:

{
  "statusCode": 404,
  "message": "Can not delete datasets: node=666 not found"
}
	

Получение усреднённых датасетов

POST /Darcy/AverageDatasets?BoreId={BoreId}&Excel={Excel}

Получить и записать в базу данных усредненный датасет план-факт.

При ошибке возвращает JSON следующего вида:

{
  "data": null
  "statusCode": 401,  // HTTP статус
  "message": "string", // Описание ошибки на английском языке
  "message_ru": "string", // Описание ошибки на русском языке
  "errorCode": "string" // Код ошибки
}
	

Ответ при успехе содержит плановые и фактические кривые усредненного датасета, а также лог, поясняющий ход процесса поиска данных и построентя датасета.

{
  "data":
  {
    "fact": // Фактическая часть усредненного датасета
    {
      "curves":  // Массив кривых
      [
        {
          "name": "Top", // Имя кривой
          "fValues": // Числовые значения кривой
          [
            640.67,
            829.34,
            875.76,
            889.29,
            892.56
          ],
          "sValues": null // Строковые значения кривой
        },
        {
          "name": "Name", // Имя кривой
          "fValues": null, // Числовые значения кривой
          "sValues": // Строковые значения кривой
          [
            "C3",
            "Top_kuzn",
            "MFS_Kuznets_shale",
            "PK1_1",
            "PK1_2"
          ]
        }
      ]
    },
      "plan": // Плановая часть усредненного датасета
      {
        "curves":  // Массив кривых
        [
	...
	// Формат содержимого аналогичен секции разделу фактических кривых
        ]
      },
      "factlog": // Лог о ходе построения усредненного датасета
      [
        {
          "level": "INFO", // Тип сообщения
          "message_en": "Bore found in cap/gen resources", // Текст сообщения на английском языке
          "message_ru": "Ствол найден в кап.ген ресурсах" // Текст сообщения на русском языке
        },
      ],
  },
  "statusCode": 200
  "message": null,
  "message_ru": null,
  "errorCode": null
}	
	

Смысл некоторых полей в JSON

statusCode

Код статуса HTTP дублируется в поле statusCode. Это целое число, при успехе всегда 200. При ошибке чаще всего используются значения 400, 401, 403, 500.

errorCode

Поле errorCode для некоторых модулей может содержать строку с кодом ошибки.

message

Поле message содержит строку с информацией об ошибке или null, если ошибок нет. Текст сообщения предназначен для разработчиков, а не для пользователей, поэтому он на английском.

message_en

Поле message_en текст сообщения лога на английском языке.

message_ru

Поле message_ru содержит строку с информацией на русском языке об ошибке или null, если ошибок нет. Также может использоваться в качестве сообщения лога.

level

Поле level содержит строку с информацией о типе сообщения лога:

data

При ошибке поле data содержит null. В случае успеха в нём возвращаются полезные данные, для каждого типа запроса формат свой.

thing

Каждый объект внутри снэпшота имеет уникальный идентификатор thing, тип int64, не равный 0. Объект с идентификатором 1 всегда имеет тип Project. Внутренние идентификаторы thing не совпадают с идентификаторами месторождений, кустов, скважин и стволов из базы данных «ген. ресурсов».

Отрицательные значения идентификаторов thing используются для семейств кривых и для планшетов в стволе. Это фиктивные объекты, которые введены главным образом для того, чтобы у них был уникальный идентификатор в дереве веб-Дарси.

attr

Каждый объект внутри снэпшота имеет тип, который записан как идентификатор attr, тип int32, больше 0. Вот список типов объектов, которые сейчас могут встречаться:

attr В исходниках на C# Название типа объекта Возможные потомки Иконка
1 Project Проект Месторождения и группы месторождений НЕТ
2 FieldGroup Группа месторождений Месторождения и группы месторождений
3 Field Месторождение Кусты и группы кустов, папка поверхностей в cubestore
4 LeaseGroup Группа кустов Кусты и группы кустов
5 Lease Куст Скважины и группы скважин
6 WellGroup Группа скважин Скважины и группы скважин
7 Well Скважина Стволы и группы стволов
8 BoreGroup Группа стволов Стволы и группы стволов
9 Bore Ствол Датасеты и группы датасетов, стереограммы и группы стереограмм
10 DatasetGroup Группа датасетов Датасеты и группы датасетов
11 Dataset Датасет Кривые, группы кривых и массивы кривых , , , ?, , ?, , ?, ,
12 CurveGroup Группа кривых (и массивов кривых) Кривые, группы кривых и массивы кривых
13 ArrayCurve Массив кривых Кривые
14 Curve Кривая (одиночная или в составе массива) НЕТ , , ,
16 PlotGroup Группа планшетов Планшеты и группы планшетов
17 Plot Планшет НЕТ
18 XplotGroup Группа кросс-плотов Кросс-плоты и группы кросс-плотов
19 Xplot Кросс-плот НЕТ
24 Family Семейство кривых Кривые и массивы кривых ?
25 WorkflowGroup Группа Workflow Модули Workflow и группы Workflow
26 Workflow Модуль Workflow НЕТ
27 StereogramGroup Группа стереограмм Стереограммы и группы стереограмм
28 Stereogram Стереограмма НЕТ ?
29 HistogramGroup Группа гистограмм Гистограммы и группы гистограмм
30 Histogram Гистограмма НЕТ
37 SurfaceGroup Группа поверхностей Поверхности и группы поверхностей
38 Surface Поверхность в ОБД/ХОД НЕТ
Следующие значения используются только в запросе PpTree
59 Organization Организация Лицензионные участки ?
61 LicenseArea Лицензионный участок Месторождения ?
44 Geonavigation Модель геонавигации Маркеры в геонавигации ?
135 SurfaceFolderInCubeStore Папка поверхностей в cubestore Поверхности в пласте в cubestore
136 SurfaceLayerInCubeStore Поверхности в пласте в cubestore Типы поверхностей в cubestore
137 SurfaceTypeInCubeStore Тип поверхностей в cubestore Поверхности в cubestore
138 SurfaceInCubeStore Поверхность в cubestore НЕТ
139 CubeFolderInCubeStore Папка кубов в cubestore НЕТ
140 CubeInCubeStore Куб в cubestore НЕТ
141 CubePropertyInCubeStore Свойство куба в cubestore НЕТ
142 PolygonFolderInCubeStore Папка полигонов в cubestore НЕТ
143 PolygonInCubeStore Полигон в cubestore НЕТ

Список будет расширяться.

order

Дети одного объекта в дереве должны сортироваться сначала по значению поля order типа int32, а при равных значениях order сортироваться по имени.

Сейчас используются следующие схемы сортировки:

  1. Чаще всего все значения поля order равны -1, значит объекты сортируются по именам.
  2. Кривые внутри массива кривых все имеют различные значения поля order, образующие последовательность 0, 1, 2, 3,... и сортируются только по этим значениям без учёта имён.
  3. В датасете всегда есть специальная «референсная кривая», чаще всего это глубина вдоль ствола скважины в метрах, она всегда идёт первой в списке и имеет значение -2 в поле order. Все остальные объекты в датасете имеют значение -1 в поле order и сортируются по именам.
  4. Чтобы планшеты в стволе находились внизу, для них значения поля order равны 0.

type

Для кривой или массива кривых поле type содержит тип кривой в классификаторе, это строка. Для прочих объектов поле пока не используется и содержит значение "".

children

Могут ли быть у данного узла потомки в дереве. Если false, потомков точно нет. Если true, они могут быть, а могут и не быть.

ownErrors

Номера собственных ошибок узла, найденных при проверке снэпшота. Если ошибок нет, поле не посылается. Чтобы преобразовать эти имена в читаемые строки, нужно использовать список, возвращаемый запросом имён ошибок.

innerErrors

Номера ошибок потомков узла, найденных при проверке снэпшота. Если в потомках ошибок нет, поле не посылается. Каждый номер присутствует не более одного раза, даже если много потомков имеют одинаковые ошибки. Чтобы преобразовать эти номера в читаемые строки для tooltip-ов, нужно использовать список, возвращаемый запросом имён ошибок. Чтобы получить более подробную информацию о каждой ошибке, следует сделать запрос подробной информации об ошибке.

kind

Датасеты разных видов по-разному изображаются на планшетах и имеют разные иконки в дереве данных снэпшота. Для датасетов поле kind имеет одно из следующих значений:

enum DataSetKind {
  Normal               =  0, //  Обычный
  Points               =  1, //  Точечный
  Interval             =  2, //  Интервальный
  Matching             =  3, // Увязка
  Zone                 =  4, //  Датасет зон
  WellConstructionPlan =  5, // Конструкция скважины, плановая
  Index                =  6, //  Индексный (фактическая траектория)
  Kern                 =  7, // Керн
  Markers              =  8, //  Маркеры
  Trajectory           =  9, //  Траектория (плановая траектория)
  ImageInterpretation  = 10, // Интерпретация имиджей
  Targets              = 11, // Цели
  GeonavigationLog     = 12, // Журнал геонавигации
  Inversion            = 13, // Датасет инверсий
  WellConstructionFact = 14, // Конструкция скважины, фактическая
  TrajectoryPrototype  = 15, // Траектория-прототип
  KNBK                 = 16, // Компоновка нижней части бурильной колонны
}
	

Кривые разных видов по-разному изображаются на планшетах и имеют разные иконки в дереве данных снэпшота. Для кривых поле kind имеет одно из следующих значений:

enum CurveKind {
  Curve    = 0, //  Сплошная кривая
  Points   = 1, //  Точечная кривая
  Interval = 2, //  Интервальная кривая
  Text     = 3  //  Текстовая кривая
}
	

Для прочих объектов поле пока не используется и содержит значение 0.

module

Планшеты и геонавигации относятся к одному из следующих модулей:

enum EWebModule {
  NoModule      = 0, // Модуль не указан
  Corellations  = 3, // Модуль корреляции
  Petrophysics  = 4, // Модуль петрофизики
  Geomechanics  = 5, // Модуль геомеханики
  Geonavigation = 7, // Модуль геонавигации
  Ajoining    = 103, // Смежный планшет в модуле корреляции
  AllModules   = -1  // Значение для запроса всех планшетов в стволе
}
	

editor

Определяет, может ли свойство в PropertyGrid редактироваться и как оно выглядит. Поле editor имеет одно из следующих значений:

""
Свойство отображается в виде строки, которую нельзя редактировать. Большинство свойств таковы.
"name"
Свойство отображается в виде строки, которую можно редактировать.
"bool"
Свойство отображается в виде галочки, которую нельзя редактировать. (См. в Darcy, например, свойство кривой «Скрытая») В поле value передаётся строковое значение "0" или "1".
"family"
Свойство отображается в виде combobox, который содержит семейства из классификатора. (См. в Darcy свойство кривой «Семейство»)
"type"
Свойство отображается в виде combobox, который содержит виды кривых из классификатора, только те, которые относятся к выбранному семейству. (См. в Darcy свойство кривой «Вид»)
"unit"
Свойство отображается в виде combobox, который содержит единицы измерения, только те, которые относятся к выбранным семейству и виду. (См. в Darcy свойство кривой «Единица измерения»)