Протокол обмена с SelenaVision по REST API

  1. SelenaVision имеет REST-сервер, доступный по HTTP из локальной сети с ЛИС/МИС учреждения. IP и порт можно выбрать. ЛИС/МИС выступает в роли клиента, анализатор запросов в ЛИС/МИС не делает.
  2. ЛИС/МИС посылает POST-запрос с вложенным заданием для анализатора. В запросе - идентификатор и административные данные по пациенту, и идентификатор образца (баркод пробирки). Анализатор получает задание и начинает ожидать образец.
  3. Анализатор выполняет задание, и когда сервис SelenaVision видит, что анализатор создал необходимое количество снимков по образцу, сервис забирает из базы Sciendox сырые данные по образцу. На этом моменте действия пользователей или интеграции не требуются.
  4. Пользователи работают в SelenaVision с загруженными данными, подготавливают отчет для отправки в ЛИС, нажимают "отправить в ЛИС"
  5. ЛИС/МИС через GET-запрос запрашивает у SelenaVision отчеты, помеченные как готовые к отправке, получают отчеты и ссылки на снимки.
  6. (опционально) ЛИС/МИС посылает GET-запрос по идентификатору фото из п.5, SelenaVision отдает jpg.
sequenceDiagram ЛИС->>SelenaVision: POST http://10.0.0.5:7090/samples/ SelenaVision->>Sciendox: SQL queries ЛИС->>SelenaVision: GET http://10.0.0.5:7090/api/patient-cases?populate[case_images]&filters ЛИС-->>SelenaVision: GET http://10.0.0.5:7090/uploads/H_20250120124939_82b4a4e81c_a8e59e2c0b.jpg

Пример тела запроса POST http://10.0.0.5:7090/samples/

{
    "name": "Иванов Иван",
    "sex": "Мужской",
    "age": 33,
    "dept": 2,
    "bed_no": "палата5",
    "outpatient_no": "номпациента123", // идентификатор пациента в ЛИС/МИС
    "sample": "кал",
    "sample_no": "242423", // штрихкод образца
    "diagnosis": "входящий диагноз",
    "remark": "примечание",
    "apply_date": "2024-04-25T13:45:30",
    "color": 8, // код цвета образца
    "hard": 200, // код консистенции образца
    "mucus": 24, // код слизи в образце
    "blood": 30, // код крови в образце
    "jj_sign": 1, // нужно ли делать микроскопию (0 - нет, 1 - да)
    "JtJTest1": 15, // нужно ли делать FOB-тест (0 - нет, 15 -да)
    "JtJTest4": 79 // нужно ли делать HP-тест (0 - нет, 79 - да)
}

Справочники для color, hard, mucus, blood

{
            "color": {
                "8": "коричневый",
                "9": "желтовато-коричневый",
                "10": "темно-коричневый",
                "11": "светло-желтый",
                "12": "ахоличный (беловато-серый)",
                "13": "серовато-желтый",
                "14": "серый",
                "15": "красный",
                "16": "зеленый",
                "206": "черный"
            },
            "hard": {
                "200": "твердая",
                "201": "мягкая",
                "202": "плотная",
                "203": "мазевидная",
                "204": "пенистая",
                "205": "водянистая"
            },
            "mucus": {
                "23": "Отрицательный",
                "24": "+",
                "25": "++",
                "26": "+++",
                "27": "++++"
            },
            "blood": {
                "28": "Отрицательный",
                "29": "+",
                "30": "++",
                "31": "+++",
                "32": "++++"
            },

        }

Пример запроса GET http://10.0.0.5:7090/api/patient-cases

Полный запрос:

GET: http://10.0.0.5:7090/api/patient-cases?populate[case_images][populate][0]=imageFile&filters[sent_to_lis_datetime][$gt]=0&filters[createdAt][$gte]=2024-03-01T00:00:00&filters[createdAt][$lte]=2024-03-01T23:59:59

Подробнее про части запроса:

  • populate[case_images][populate][0]=imageFile - запросить сразу со ссылками на изображения и разметкой
  • filters[sent_to_lis_datetime][$gt]=0 - вернуть только те случаи, которые были помечены, как готовые к отправке в ЛИС
  • filters[createdAt][$gte]=2024-03-01T00:00:00&filters[createdAt][$lte]=2024-03-01T23:59:59 - вернуть только те случаи, которые были созданы между 00:00 и 23:59 1 марта 2024 года

Auth: "Bearer 6ff007a783e6b638127..." (запросы получения данных закрыты доступом по токену. Токен выдается специалиставми "Авроры" и действует бессрочно.)

Пример результата

{
    "data": [
        {
            "id": 4,
            "documentId": "ukthxcpq06m64kw4gn9ijyuy",
            "title": "22556", // номер случая
            "createdAt": "2025-02-27T02:37:29.761Z", // дата создания в SelenaVision
            "updatedAt": "2025-04-09T09:18:19.837Z",
            "publishedAt": "2025-04-09T09:18:19.824Z",
            "description": "",
            "diag_pk": null, // Переваримая клетчатка
            "diag_npk": "0.96", // Непереваримая клетчатка
            "foreign_id": null,
            "sent_to_lis_datetime": "2025-02-26T21:30:00.000Z", // Дата готовности отправки в ЛИС
            "diag_mvb": "0.8", // Мышечные волокна без исчерченности
            "diag_mvi": "0.24", // Мышечные волокна с исчерченностью
            "diag_leico": null, // Лейкоциты
            "diag_eritro": null, // Эритроциты
            "macro_blood": "отсутствует", // Макро - кровь
            "macro_hard": "плотная", // Макро - консистенция
            "macro_mucus": "отсутствует", // Макро - слизь
            "macro_color": "темно-коричневый", // Макро - цвет
            "diag_zhir_k": null, // Капли жира
            "diag_zhir_g": "0.04", // Глыбки жира
            "diag_zhir_i": "0", // Иглы жира
            "diag_epitel": null, // Клетки цилиндрического эпителия
            "diag_tripel": null, // Трипельфосфаты
            "diag_oksalat": null, // Оксалаты кальция
            "diag_sharko": null, // Кристаллы Шарко-Лейдена
            "diag_drozzhi_s": "0.04", // Дрожжевые клетки - споры
            "diag_drozzhi_m": "0.04",
            "macro_test_hp": null, // Результат HP
            "macro_test_fob": null, // Результат FOB
            "admin_barcode": "22556",
            "diag_pilca": null, // Пыльца
            "case_images": [ // Массив с изображениями по случаю
                {
                    "id": 67,
                    "documentId": "rrf553mrnpuruatwydrpdfff",
                    "createdAt": "2025-02-27T02:37:48.012Z",
                    "updatedAt": "2025-02-28T12:32:22.666Z",
                    "publishedAt": "2025-02-28T12:32:22.663Z",
                    "imageMLAnnotation": "{\"predictions\":[{\"class_name\":\"НК\",\"class_id\":2,\"proba\":0.8349862694740295,\"x\":[372.5,370,365,360,357.5,355,352.5,...", // Разметка в векторном виде
                    "imageDescription": null,
                    "macroType": null,
                    "viewed": true,
                    "imageFile": {
                        "id": 67,
                        "documentId": "d97lxtegodthtfv9g0tv3e43",
                        "name": "H_20250120124939_82b4a4e81c.jpg",
                        "alternativeText": null,
                        "caption": null,
                        "width": 1600,
                        "height": 1200,
                        "formats": { // форматы с разной степенью сжатия
                            "large": {
                                "ext": ".jpg",
                                "url": "/uploads/large_H_20250120124939_82b4a4e81c_a8e59e2c0b.jpg",
                                "hash": "large_H_20250120124939_82b4a4e81c_a8e59e2c0b",
                                "mime": "image/jpeg",
                                "name": "large_H_20250120124939_82b4a4e81c.jpg",
                                "path": null,
                                "size": 108.5,
                                "width": 1000,
                                "height": 750,
                                "sizeInBytes": 108496
                            },
                            "small": {
                                "ext": ".jpg",
                                ...
                            },
                            "medium": {
                                "ext": ".jpg",
                                ...
                            },
                            "thumbnail": {
                                "ext": ".jpg",
                                ...
                            }
                        },
                        "hash": "H_20250120124939_82b4a4e81c_a8e59e2c0b",
                        "ext": ".jpg",
                        "mime": "image/jpeg",
                        "size": 182.63,
                        "url": "/uploads/H_20250120124939_82b4a4e81c_a8e59e2c0b.jpg", // ссылка на оригинал
                        "previewUrl": null,
                        "provider": "local",
                        "provider_metadata": null,
                        "createdAt": "2025-02-27T02:37:40.247Z",
                        "updatedAt": "2025-02-27T02:37:40.247Z",
                        "publishedAt": "2025-02-27T02:37:40.247Z"
                    }
                },
                {
                    "id": 68, // следующий снимок в случае
                    ...
                }
            ] // конец массива снимков
        },
        {
          "id": 5, // следующий случай
          ... // поля следующего случая
        },
       ...
  ] // конец массива "data"      
}

Группы полей:

  • admin_XXX - административные поля
  • macro_XXX - макроскопические свойства
  • diag_XXX - микроскопия, общая копрограмма
  • parasite_XXX - паразиты

Таблица со справочником объектов