383 lines
14 KiB
Python
383 lines
14 KiB
Python
from datetime import datetime
|
||
|
||
from pydantic import BaseModel, Field
|
||
|
||
|
||
class TrustedPersonModel(BaseModel):
|
||
parentSnils: str = Field(
|
||
title='СНИЛС представителя', examples=['156-125-394 57']
|
||
)
|
||
represType: str = Field(
|
||
title='Вид родства (Мать/Отец/Иной родственник/Не родственник)',
|
||
examples=['Мать'],
|
||
)
|
||
fullName: str = Field(
|
||
title='ФИО представителя', examples=['Тестова Тест Тестовна']
|
||
)
|
||
phone: str = Field(
|
||
title='Мобильный телефон представителя',
|
||
examples=['+7 (999) 112-33-21'],
|
||
)
|
||
IsGuardian: bool = Field(title='Флаг Опекун', examples=['true'])
|
||
IsTrustee: bool = Field(title='Флаг Попечитель', examples=['true'])
|
||
status: bool = Field(
|
||
title='Флаг Текущий представитель',
|
||
examples=['false'],
|
||
)
|
||
|
||
|
||
class ProfileModel(BaseModel):
|
||
id: str = Field(
|
||
title='Идентификатор пациента',
|
||
examples=['b62e9f22-a871-4c52-96d6-559c707a716d'],
|
||
)
|
||
SNILS: str = Field(title='СНИЛС', examples=['000-000-600 18'])
|
||
lastName: str = Field(title='Фамилия', examples=['Тестовый'])
|
||
firstName: str = Field(title='Имя', examples=['Пациент'])
|
||
middleName: str = Field(title='Отчество', examples=['Ребенок'])
|
||
birthDate: str = Field(title='Дата рождения', examples=['2024-10-16'])
|
||
gender: str = Field(title='Пол', examples=['М'])
|
||
docType: str = Field(
|
||
title='Тип документа',
|
||
examples=['Свидетельство о рождении, выданное в РФ'],
|
||
)
|
||
docSer: str = Field(title='Серия документа', examples=['III-КБ'])
|
||
docNum: str = Field(title='Номер документа', examples=['999999'])
|
||
# ENP: str = Field(
|
||
# title='Единый номер полиса ОМС (16-ти значный)', # noqa: RUF003
|
||
# examples=['?'],
|
||
# )
|
||
addressReal: str = Field(
|
||
title='Адрес проживания',
|
||
examples=[
|
||
'420000, Татарстан Респ, г.Казань, ул.Магистральная (Большие Клыки), д.1, кв.1' # noqa: E501
|
||
],
|
||
)
|
||
# attachBranchId: str = Field(
|
||
# title='Идентификатор СТП прикреплния',
|
||
# examples=['string'],
|
||
# )
|
||
# attachState: str = Field(
|
||
# title='Номер участка',
|
||
# examples=['99'],
|
||
# )
|
||
trustedPersons: list[TrustedPersonModel] = Field(
|
||
title='Информация о представителе',
|
||
)
|
||
|
||
|
||
class DepartmentAddressModel(BaseModel):
|
||
type: str = Field(
|
||
title='для МО: «Юридический», для филиалов «Фактический»',
|
||
examples=['«Юридический»'],
|
||
)
|
||
display: str = Field(
|
||
title='Адрес строкой',
|
||
examples=['420097, г.Казань, ул.Заслонова, д.5'],
|
||
)
|
||
latitude: float | None = Field(
|
||
title='Широта, при наличии', examples=[55.789], default=None
|
||
)
|
||
longitude: float | None = Field(
|
||
title='Долгота, при наличии', examples=[37.789], default=None
|
||
)
|
||
|
||
|
||
class DepartmentModel(BaseModel):
|
||
id: str = Field(
|
||
title='Идентификатор МО/Филиала',
|
||
examples=['a3677271-3385-4f27-a65d-c3430b7c61c2'],
|
||
)
|
||
OID: str = Field(
|
||
title='OID МО / Филиала', examples=['1.2.643.5.1.13.13.12.2.16.1084']
|
||
)
|
||
parentId: str | None = Field(
|
||
title='Идентификатор вышестоящего подразделения',
|
||
examples=['a3677271-3385-4f27-a65d-c3430b7c61c2'],
|
||
)
|
||
code: str = Field(
|
||
title='Региональный код или код ТФОМС',
|
||
examples=['0000000000'],
|
||
)
|
||
fullname: str = Field(
|
||
title='Полное наименование',
|
||
examples=['ГБУЗС "Тестовая медицинская организация"'],
|
||
)
|
||
shortname: str = Field(
|
||
title='Краткое наименование',
|
||
examples=['ГБУЗС "Тестовая медицинская организация"'],
|
||
)
|
||
type: str = Field(
|
||
title='Тип подразделения (для МО: «Юридический»'
|
||
', для филиалов: Стационар / Поликлиника / ФАП / Амбулатория)',
|
||
examples=['Юридическое лицо'],
|
||
)
|
||
inn: str = Field(title='ИНН', examples=['0000000000'])
|
||
kpp: str = Field(title='КПП', examples=['0000000000'])
|
||
ogrn: str = Field(title='ОГРН', examples=['1149204047816'])
|
||
address: list[DepartmentAddressModel]
|
||
|
||
|
||
class WorkersPositionModel(BaseModel):
|
||
id: str = Field(
|
||
title='Идентификатор сотрудника в связке с должностью',
|
||
examples=['41019'],
|
||
)
|
||
dateBegin: datetime = Field(
|
||
title='Дата приёма на работу', examples=['01.08.2022']
|
||
)
|
||
departmentId: str = Field(
|
||
title='ID ФИЛИАЛА',
|
||
examples=['10ea04ca-339a-4867-aab4-d9a83b7e9098'],
|
||
)
|
||
departmentName: str = Field(
|
||
title='Краткое наименование филиала',
|
||
examples=['Поликлиника'],
|
||
)
|
||
positionName: str = Field(
|
||
title='Тип должности.Наименование (POST_TYPE)',
|
||
examples=['Врач-онколог'],
|
||
)
|
||
positionFedCode: str = Field(
|
||
title='Тип должности.Код (POST_TYPE)',
|
||
examples=['3037'],
|
||
)
|
||
positionRegName: str | None = Field(
|
||
title='ФРМР. Должности медицинского персонала',
|
||
examples=['врач-онколог'],
|
||
)
|
||
positionSpecialityCode: str = Field(
|
||
title='Код специальности по V021',
|
||
examples=['41'],
|
||
)
|
||
positionSpecialityName: str = Field(
|
||
title='Наименование специальности по V021',
|
||
examples=['Онкология'],
|
||
)
|
||
rate: float = Field(
|
||
title='Ставка',
|
||
examples=[0.5],
|
||
)
|
||
|
||
|
||
class WorkersModel(BaseModel):
|
||
id: str = Field(
|
||
title='Идентификатор сотрудника',
|
||
examples=['dc911302-5044-46f4-b935-c6ffd85eb68f'],
|
||
)
|
||
SNILS: str = Field(
|
||
title='СНИЛС',
|
||
examples=['059-486-659 26'],
|
||
)
|
||
firstName: str = Field(title='Имя', examples=['Владимир'])
|
||
lastName: str = Field(title='Фамилия', examples=['Камашев'])
|
||
middleName: str = Field(title='Отчество', examples=['Михайлович'])
|
||
birthDate: datetime = Field(title='Дата рождения', examples=['30.05.1961'])
|
||
positions: list[WorkersPositionModel]
|
||
|
||
|
||
class SpecialityV021Model(BaseModel):
|
||
SpecialityID: str = Field(
|
||
title='Код спциальности по справочнику V021', examples=['1']
|
||
)
|
||
SpecialityName: str = Field(
|
||
title='Наимнование спциальности по справочнику V021',
|
||
examples=['Авиационная и космическая медицина'],
|
||
)
|
||
|
||
|
||
class SpecsV021Model(BaseModel):
|
||
SpecialitiesV021: list[SpecialityV021Model]
|
||
|
||
|
||
class EntryModel(BaseModel):
|
||
DateTime: datetime = Field(
|
||
title='Дата и время записи',
|
||
examples=['2022-08-01T00:00:00.000Z'],
|
||
)
|
||
TicketType: str = Field(title='Тип талона', examples=['Первичный'])
|
||
EntryPlace: str = Field(
|
||
title='Место записи',
|
||
examples=['Регистратура'],
|
||
)
|
||
EntryType: str = Field(
|
||
title='Тип записи', examples=['Запись на прием к врачу']
|
||
)
|
||
Place: str = Field(
|
||
title='Кабинет приёма',
|
||
examples=['6'],
|
||
)
|
||
ResourceName: str = Field(
|
||
title='ФИО врача или наимнование кабинета полностью',
|
||
examples=['Сиразетдинов Рамзис Халафутдинович'],
|
||
)
|
||
Speciality: str = Field(
|
||
title='Специальность',
|
||
examples=['Врач общей практики (семейный врач)'],
|
||
)
|
||
Branch: str = Field(
|
||
title='Подразделение',
|
||
examples=['Главное здание'],
|
||
)
|
||
LpuName: str = Field(
|
||
title='Наименование МО',
|
||
examples=['ГАУЗ Азнакаевская ЦРБ'],
|
||
)
|
||
|
||
|
||
class EntriesModel(BaseModel):
|
||
Entries: list[EntryModel]
|
||
|
||
|
||
class VaccsReportModel(BaseModel):
|
||
content: str = Field(
|
||
title='Содержимое документа в формате .doc '
|
||
'(сжатое методом кодирования Base64)'
|
||
)
|
||
|
||
|
||
class MedExamItemModel(BaseModel):
|
||
AgeGroupName: str = Field(
|
||
title='Наименование возрастной группы',
|
||
examples=['ДВН 1 этап. приказ 404н'],
|
||
)
|
||
# AgeGroupCriteria
|
||
Required: str = Field(
|
||
title='Обязательность',
|
||
examples=['Обязательный/Дополнительный'],
|
||
)
|
||
Type: str = Field(
|
||
title='Тип',
|
||
examples=['Специальность/Услуга'],
|
||
)
|
||
MedicalServiceCode: str = Field(
|
||
title='Код услуги',
|
||
examples=['B04.010.002'],
|
||
)
|
||
MedicalServiceName: str = Field(
|
||
title='Наименрование услуги',
|
||
examples=['Осмотр фельдшером (акушеркой) или врачом акушером'],
|
||
)
|
||
SpecialityName: str = Field(
|
||
title='Специальность',
|
||
examples=['Акушер-гинеколог'],
|
||
)
|
||
|
||
|
||
class MedExamTypeModel(BaseModel):
|
||
Name: str = Field(
|
||
title='Наименование медосмотра',
|
||
examples=['ДВН 1 этап. приказ 404н'],
|
||
)
|
||
Code: str = Field(
|
||
title='Код медосмотра',
|
||
examples=['024'],
|
||
)
|
||
MedExamItems: list[MedExamItemModel]
|
||
|
||
|
||
class MedExamDictModel(BaseModel):
|
||
MedExamTypes: list[MedExamTypeModel]
|
||
|
||
|
||
class ResultModel(BaseModel):
|
||
Resource: str = Field(title='Врач', examples=['Изотова Г.М.'])
|
||
ExaminationId: str = Field(
|
||
title='Идентификатор осмотра',
|
||
examples=['4d8550e6-7ad8-46f7-b874-9b20c673d168'],
|
||
)
|
||
DiagResultId: str = Field(
|
||
title='Идентификатор результата исследования',
|
||
examples=['77312a5f-0498-4656-8215-9cf151ec2a9b'],
|
||
)
|
||
|
||
|
||
class RouteModel(BaseModel):
|
||
Type: str = Field(
|
||
title='Тип',
|
||
examples=['ROUTE_TO_DOCTOR_INSPECTION', 'ROUTE_TO_DIAGNOSTICS'],
|
||
)
|
||
CreationDateTime: datetime = Field(
|
||
title='Дата и время создания', examples=['2025-03-24 14:49']
|
||
)
|
||
Name: str = Field(
|
||
title='Наименование услуги / специальности',
|
||
examples=['Кардиолог [1259]', 'Общий анализ крови [B03.016.002]'],
|
||
)
|
||
EntryPlace: str | None = Field(
|
||
title='Кабинет приёма',
|
||
examples=['Каб.№211 Шайдуллина Г.И. (Кардиолог)', None],
|
||
default=None,
|
||
)
|
||
EntryResName: str | None = Field(
|
||
title='ФИО врача или кабинета полностью',
|
||
examples=['Каб.№211 Шайдуллина Г.И. (Кардиолог)', None],
|
||
default=None,
|
||
)
|
||
ResultExits: str = Field(title='Исполнение', examples=['0', '1'])
|
||
Result: ResultModel | None = Field(
|
||
title='Связка осмотра/услуги с выполнением направления', default=None
|
||
)
|
||
LpuName: str | None = Field(
|
||
title='Наименование МО', examples=['ГАУЗ "ГКБ №7"'], default=None
|
||
)
|
||
|
||
|
||
class RoutesListModel(BaseModel):
|
||
EventID: str = Field(
|
||
title='Идентификатор случая госпитализации',
|
||
examples=['a268e6d7-618c-4b83-97ca-c9dc8b79b55b'],
|
||
)
|
||
EventDate: datetime = Field(
|
||
title='Дата обращения', examples=['2025-03-17']
|
||
)
|
||
LpuName: str = Field(title='Наименование МО', examples=['ГАУЗ "ГКБ №7"'])
|
||
Routes: list[RouteModel] = Field(title='Список направлений')
|
||
|
||
|
||
class SEMDModel(BaseModel):
|
||
SEMDContent: str = Field(
|
||
title='СЭМД (XML сжатый методом шифрования Base64)',
|
||
examples=['77u/PD94bWwgdmVyc2lvbj0iMS...'],
|
||
)
|
||
|
||
|
||
class ExaminationModel(BaseModel):
|
||
ExaminationId: str = Field(
|
||
title='Идентификатор осмотра',
|
||
examples=['f22be2c9-8e68-42d6-851e-fbf4a5e8f657'],
|
||
)
|
||
DateTime: str = Field(
|
||
title='Дата и время создания', examples=['01.08.2025 15:47:15']
|
||
)
|
||
Resource: str = Field(
|
||
title='Врач', examples=['Абдуллина Ирина Владимировна']
|
||
)
|
||
Speciality: str = Field(
|
||
title='Специальность врача', examples=['Акушер-гинеколог']
|
||
)
|
||
ExaminationText: str = Field(
|
||
title='Текст осмотра',
|
||
examples=[
|
||
'<TABLE id=e0f61ef0-8f5e-42c6-95b6-4074715902e6 class=Complaint '
|
||
'style="BORDER-TOP: #ffffff 1px..... </TABLE>'
|
||
],
|
||
)
|
||
Recommendation: str = Field(
|
||
title='Идентификатор результата исследования',
|
||
examples=['рекомендации 1 тест'],
|
||
)
|
||
SEMDs: list[SEMDModel] = Field(title='Список СЭМД')
|
||
|
||
|
||
class HospExaminationsModel(BaseModel):
|
||
EventID: str = Field(
|
||
title='Идентификатор случая госпитализации',
|
||
examples=['2f7d395d-f5fc-4a0e-af2d-855324f6e7f1'],
|
||
)
|
||
EventDate: datetime = Field(
|
||
title='Дата обращения', examples=['2025-08-01']
|
||
)
|
||
LpuName: str = Field(title='Наименование МО', examples=['ГАУЗ "ГКБ №7"'])
|
||
Examinations: list[ExaminationModel] = Field(title='Список осмотров')
|