5. GraphQL - демо-данные
Данный раздел содержит полный набор GraphQL-запросов для создания целостной демо-базы данных медицинской информационной системы. Эти данные будут использоваться в дальнейшем для тестирования React-приложения, которое мы будем разрабатывать в следующих разделах курса.
Инструкции по выполнению
- Выполняйте запросы строго по порядку - каждый этап зависит от предыдущих
- Всего 6 запросов - максимально упрощенный процесс
- Выполняйте проверочные запросы после каждого этапа для контроля создания данных
- При ошибках - проверьте корректность синтаксиса и наличие зависимых сущностей
Предварительная очистка базы данных
В предыдущем разделе по основам GraphQL мы выполняли большое количество запросов. Для успешного создания демо-данных медицинской клиники в этом разделе критически важно очистить базу данных от существующих данных перед выполнением соответствующих запросов. Для проверки, какие данные сейчас содержатся в базе данных, выполните следующий запрос:
query FinalDemoDataIntegrityCheck {
# Подсчет всех созданных сущностей
doctorTypesCount: searchDoctorType { count }
officeTypesCount: searchOfficeType { count }
personsCount: searchPerson { count }
doctorsCount: searchDoctor { count }
customersCount: searchCustomer { count }
clinicsCount: searchClinic { count }
officesCount: searchClinicOffice { count }
clinicDoctorsCount: searchClinicDoctor { count }
clinicCustomersCount: searchClinicCustomer { count }
clinicSchedulesCount: searchClinicSchedule { count }
doctorSchedulesCount: searchDoctorSchedule { count }
appointmentsCount: searchDoctorAppointment { count }
contactsCount: searchCustomerContact { count }
# Проверка связей
doctorTypes: searchDoctorType {
elems { id name }
}
officeTypes: searchOfficeType {
elems { id name }
}
}
Данный запрос вернёт информацию о количестве экземпляров каждого типа сущностей в базе данных. Далее вам необходимо будет выполнить соответствующие запросы для получения id соответствующих сущностей и их последующего удаления. Вся необходимая информация для подготовки запросов на удаление была предоставлена в предыдущем разделе, при необходимости обратитесь к нему.
К выполнению запросов данного раздела можно будет приступать лишь когда запрос выше будет возвращаться нулевое количество для всех типов сущностей!
Система идентификаторов
По умолчанию в DataSpace CE для генерации идентификаторов сущностей используется алгоритм SNOWFLAKE. Этот алгоритм генерирует уникальные идентификаторы на основе времени и порядкового номера. При этом, если необходимо создать связанный набор демо-данных, возникает необходимость ручного сохранения идентификаторов некоторых сущностей для использования их в запросах создания других сущностей. Чтобы избежать этого, в модели медицинской клиники данного курса для всех сущностей указан (в файле model.xml) механизм создания id AUTO_ON_EMPTY, который позволяет создавать идентификаторы сущностей вручную, при этом если при создании он не будет указываться, то будет создаваться автоматически.
Для простоты и удобства создания демо-данных в этом разделе мы будем использовать систему идентификаторов, которая будет использоваться для всех сущностей. В дальнейшем к ней можно обращаться при подготовке своих запросов и их тестировании.
- Врачи:
doctor-1,doctor-2,doctor-3,doctor-4 - Пациенты:
customer-1,customer-2,customer-3,customer-4 - Персоны врачей:
person-doctor-1доperson-doctor-4 - Персоны пациентов:
person-customer-1доperson-customer-4 - Клиники:
clinic-1,clinic-2,clinic-3 - Кабинеты:
office-1,office-2,office-3,office-4 - Связи:
clinic-doctor-1доclinic-doctor-4,clinic-customer-1доclinic-customer-4 - Расписания:
clinic-schedule-1доclinic-schedule-3,doctor-schedule-1доdoctor-schedule-4 - Записи:
appointment-1доappointment-5 - Контакты:
customer-contact-1доcustomer-contact-4
1. Создание справочников (типы врачей и типы кабинетов)
Справочники не зависят от других сущностей и создаются первыми
mutation CreateAllDictionaries {
dictionaryPacket {
# Типы врачей
therapist: updateOrCreateDoctorType(
input: {
id: "therapist"
name: "Терапевт"
descr: "Врач общей практики"
}
) {
created
returning { id name descr }
}
surgeon: updateOrCreateDoctorType(
input: {
id: "surgeon"
name: "Хирург"
descr: "Врач-специалист по хирургическим операциям"
}
) {
created
returning { id name descr }
}
pediatrician: updateOrCreateDoctorType(
input: {
id: "pediatrician"
name: "Педиатр"
descr: "Врач-специалист по детским болезням"
}
) {
created
returning { id name descr }
}
cardiologist: updateOrCreateDoctorType(
input: {
id: "cardiologist"
name: "Кардиолог"
descr: "Врач-специалист по сердечно-сосудистым заболеваниям"
}
) {
created
returning { id name descr }
}
# Типы кабинетов
consultation: updateOrCreateOfficeType(
input: {
id: "office-type-consultation"
name: "Консультационный кабинет"
}
) {
created
returning { id name }
}
procedure: updateOrCreateOfficeType(
input: {
id: "office-type-procedure"
name: "Процедурный кабинет"
}
) {
created
returning { id name }
}
surgery: updateOrCreateOfficeType(
input: {
id: "office-type-surgery"
name: "Операционная"
}
) {
created
returning { id name }
}
}
}
✅ Проверка создания справочников
query CheckDictionaries {
doctorTypes: searchDoctorType {
elems { id name descr }
}
officeTypes: searchOfficeType {
elems { id name }
}
}
Ожидаемый результат: 4 типа врачей + 3 типа кабинетов
2. Создание персон
mutation CreateAllPersons {
# Персоны врачей - по одной в пакете
p1: packet(idempotencePacketId: "persons-doctors-001") {
person1: createPerson(input: {
id: "person-doctor-1"
firstName: "Анна"
lastName: "Петрова"
birthDate: "1980-05-15"
sex: FEMALE
}) {
id firstName lastName sex birthDate
}
}
p2: packet(idempotencePacketId: "persons-doctors-002") {
person2: createPerson(input: {
id: "person-doctor-2"
firstName: "Михаил"
lastName: "Сидоров"
birthDate: "1975-09-22"
sex: MALE
}) {
id firstName lastName sex birthDate
}
}
p3: packet(idempotencePacketId: "persons-doctors-003") {
person3: createPerson(input: {
id: "person-doctor-3"
firstName: "Елена"
lastName: "Козлова"
birthDate: "1985-03-10"
sex: FEMALE
}) {
id firstName lastName sex birthDate
}
}
p4: packet(idempotencePacketId: "persons-doctors-004") {
person4: createPerson(input: {
id: "person-doctor-4"
firstName: "Владимир"
lastName: "Николаев"
birthDate: "1970-01-08"
sex: MALE
}) {
id firstName lastName sex birthDate
}
}
# Персоны пациентов - по одной в пакете
p5: packet(idempotencePacketId: "persons-customers-001") {
person1: createPerson(input: {
id: "person-customer-1"
firstName: "Иван"
lastName: "Иванов"
birthDate: "1990-12-01"
sex: MALE
}) {
id firstName lastName sex birthDate
}
}
p6: packet(idempotencePacketId: "persons-customers-002") {
person2: createPerson(input: {
id: "person-customer-2"
firstName: "Мария"
lastName: "Смирнова"
birthDate: "1985-07-15"
sex: FEMALE
}) {
id firstName lastName sex birthDate
}
}
p7: packet(idempotencePacketId: "persons-customers-003") {
person3: createPerson(input: {
id: "person-customer-3"
firstName: "Алексей"
lastName: "Волков"
birthDate: "1995-04-20"
sex: MALE
}) {
id firstName lastName sex birthDate
}
}
p8: packet(idempotencePacketId: "persons-customers-004") {
person4: createPerson(input: {
id: "person-customer-4"
firstName: "Татьяна"
lastName: "Федорова"
birthDate: "1988-11-25"
sex: FEMALE
}) {
id firstName lastName sex birthDate
}
}
}
✅ Проверка создания персон
query CheckPersons {
searchPerson {
elems {
id firstName lastName sex birthDate
}
}
}
Ожидаемый результат: 8 персон (4 врача + 4 пациента)
3. Врачи, пациенты, контакты пациентов
mutation CreateMedicalEntities {
# Врачи - по одному в пакете
p1: packet(idempotencePacketId: "doctors-001") {
doctor1: createDoctor(input: {
id: "doctor-1"
doctorType: "therapist"
person: { entityId: "person-doctor-1" }
}) {
id doctorType { id name } person { entityId }
}
}
p2: packet(idempotencePacketId: "doctors-002") {
doctor2: createDoctor(input: {
id: "doctor-2"
doctorType: "surgeon"
person: { entityId: "person-doctor-2" }
}) {
id doctorType { id name } person { entityId }
}
}
p3: packet(idempotencePacketId: "doctors-003") {
doctor3: createDoctor(input: {
id: "doctor-3"
doctorType: "pediatrician"
person: { entityId: "person-doctor-3" }
}) {
id doctorType { id name } person { entityId }
}
}
p4: packet(idempotencePacketId: "doctors-004") {
doctor4: createDoctor(input: {
id: "doctor-4"
doctorType: "cardiologist"
person: { entityId: "person-doctor-4" }
}) {
id doctorType { id name } person { entityId }
}
}
# Пациенты - по одному в пакете
p5: packet(idempotencePacketId: "customers-001") {
customer1: createCustomer(input: {
id: "customer-1"
insuranceNum: "1234567890"
person: { entityId: "person-customer-1" }
}) {
id insuranceNum person { entityId }
}
}
p6: packet(idempotencePacketId: "customers-002") {
customer2: createCustomer(input: {
id: "customer-2"
insuranceNum: "0987654321"
person: { entityId: "person-customer-2" }
}) {
id insuranceNum person { entityId }
}
}
p7: packet(idempotencePacketId: "customers-003") {
customer3: createCustomer(input: {
id: "customer-3"
insuranceNum: "1122334455"
person: { entityId: "person-customer-3" }
}) {
id insuranceNum person { entityId }
}
}
p8: packet(idempotencePacketId: "customers-004") {
customer4: createCustomer(input: {
id: "customer-4"
insuranceNum: "5544332211"
person: { entityId: "person-customer-4" }
}) {
id insuranceNum person { entityId }
}
}
# Контакты пациентов - по одному в пакете
p9: packet(idempotencePacketId: "contacts-001") {
contact1: createCustomerContact(input: {
id: "customer-contact-1"
contactInfo: "+7 (495) 123-45-67"
customer: "customer-1"
}) {
id contactInfo customer { id }
}
}
p10: packet(idempotencePacketId: "contacts-002") {
contact2: createCustomerContact(input: {
id: "customer-contact-2"
contactInfo: "+7 (495) 987-65-43"
customer: "customer-2"
}) {
id contactInfo customer { id }
}
}
p11: packet(idempotencePacketId: "contacts-003") {
contact3: createCustomerContact(input: {
id: "customer-contact-3"
contactInfo: "+7 (495) 111-22-33"
customer: "customer-3"
}) {
id contactInfo customer { id }
}
}
p12: packet(idempotencePacketId: "contacts-004") {
contact4: createCustomerContact(input: {
id: "customer-contact-4"
contactInfo: "+7 (495) 444-55-66"
customer: "customer-4"
}) {
id contactInfo customer { id }
}
}
}
✅ Проверка создания медицинских сущностей
query CheckMedicalEntities {
doctors: searchDoctor {
elems {
id
doctorType { name }
person { entity { firstName lastName } }
}
}
customers: searchCustomer {
elems {
id insuranceNum
person { entity { firstName lastName } }
}
}
contacts: searchCustomerContact {
elems {
id contactInfo
customer { id }
}
}
}
Ожидаемый результат: 4 врача + 4 пациента + 4 контакта
4. Клиники и кабинеты
mutation CreateClinicsAndOffices {
# Клиники - по одной в пакете
p1: packet(idempotencePacketId: "clinics-001") {
clinic1: createClinic(input: {
id: "clinic-1"
name: "Городская поликлиника №1"
address: {
city: "Москва"
street: "ул. Ленина"
flatNo: "15"
}
}) {
id name address { city street flatNo }
}
}
p2: packet(idempotencePacketId: "clinics-002") {
clinic2: createClinic(input: {
id: "clinic-2"
name: "Медицинский центр 'Здоровье'"
address: {
city: "Москва"
street: "пр. Мира"
flatNo: "32"
}
}) {
id name address { city street flatNo }
}
}
p3: packet(idempotencePacketId: "clinics-003") {
clinic3: createClinic(input: {
id: "clinic-3"
name: "Детская городская больница"
address: {
city: "Москва"
street: "ул. Садовая"
flatNo: "8"
}
}) {
id name address { city street flatNo }
}
}
# Кабинеты - по одному в пакете
p4: packet(idempotencePacketId: "offices-001") {
office1: createClinicOffice(input: {
id: "office-1"
officeNum: "101"
officeType: "office-type-consultation"
clinic: { entityId: "clinic-1" }
}) {
id officeNum officeType { name } clinic { entityId }
}
}
p5: packet(idempotencePacketId: "offices-002") {
office2: createClinicOffice(input: {
id: "office-2"
officeNum: "102"
officeType: "office-type-procedure"
clinic: { entityId: "clinic-1" }
}) {
id officeNum officeType { name } clinic { entityId }
}
}
p6: packet(idempotencePacketId: "offices-003") {
office3: createClinicOffice(input: {
id: "office-3"
officeNum: "201"
officeType: "office-type-surgery"
clinic: { entityId: "clinic-2" }
}) {
id officeNum officeType { name } clinic { entityId }
}
}
p7: packet(idempotencePacketId: "offices-004") {
office4: createClinicOffice(input: {
id: "office-4"
officeNum: "301"
officeType: "office-type-consultation"
clinic: { entityId: "clinic-3" }
}) {
id officeNum officeType { name } clinic { entityId }
}
}
}
✅ Проверка создания клиник и кабинетов
query CheckClinicsAndOffices {
clinics: searchClinic {
elems {
id name address { city street flatNo }
}
}
offices: searchClinicOffice {
elems {
id officeNum
officeType { name }
clinic { entity { name } }
}
}
}
Ожидаемый результат: 3 клиники + 4 кабинета
5. Связи врач-клиника и пациент-клиника, расписания клиник
mutation CreateConnectionsAndClinicSchedules {
# Связи врач-клиника - по одной в пакете
p1: packet(idempotencePacketId: "clinic-doctors-001") {
connection1: createClinicDoctor(input: {
id: "clinic-doctor-1"
clinic: { entityId: "clinic-1" }
doctor: { entityId: "doctor-1" }
}) {
id clinic { entityId } doctor { entityId }
}
}
p2: packet(idempotencePacketId: "clinic-doctors-002") {
connection2: createClinicDoctor(input: {
id: "clinic-doctor-2"
clinic: { entityId: "clinic-2" }
doctor: { entityId: "doctor-2" }
}) {
id clinic { entityId } doctor { entityId }
}
}
p3: packet(idempotencePacketId: "clinic-doctors-003") {
connection3: createClinicDoctor(input: {
id: "clinic-doctor-3"
clinic: { entityId: "clinic-3" }
doctor: { entityId: "doctor-3" }
}) {
id clinic { entityId } doctor { entityId }
}
}
p4: packet(idempotencePacketId: "clinic-doctors-004") {
connection4: createClinicDoctor(input: {
id: "clinic-doctor-4"
clinic: { entityId: "clinic-1" }
doctor: { entityId: "doctor-4" }
}) {
id clinic { entityId } doctor { entityId }
}
}
# Связи пациент-клиника - по одной в пакете
p5: packet(idempotencePacketId: "clinic-customers-001") {
connection1: createClinicCustomer(input: {
id: "clinic-customer-1"
clinic: { entityId: "clinic-1" }
customer: { entityId: "customer-1" }
}) {
id clinic { entityId } customer { entityId }
}
}
p6: packet(idempotencePacketId: "clinic-customers-002") {
connection2: createClinicCustomer(input: {
id: "clinic-customer-2"
clinic: { entityId: "clinic-2" }
customer: { entityId: "customer-2" }
}) {
id clinic { entityId } customer { entityId }
}
}
p7: packet(idempotencePacketId: "clinic-customers-003") {
connection3: createClinicCustomer(input: {
id: "clinic-customer-3"
clinic: { entityId: "clinic-3" }
customer: { entityId: "customer-3" }
}) {
id clinic { entityId } customer { entityId }
}
}
p8: packet(idempotencePacketId: "clinic-customers-004") {
connection4: createClinicCustomer(input: {
id: "clinic-customer-4"
clinic: { entityId: "clinic-1" }
customer: { entityId: "customer-4" }
}) {
id clinic { entityId } customer { entityId }
}
}
# Расписания клиник - по одному в пакете
p9: packet(idempotencePacketId: "clinic-schedules-001") {
schedule1: createClinicSchedule(input: {
id: "clinic-schedule-1"
clinic: { entityId: "clinic-1" }
}) {
id clinic { entityId }
}
}
p10: packet(idempotencePacketId: "clinic-schedules-002") {
schedule2: createClinicSchedule(input: {
id: "clinic-schedule-2"
clinic: { entityId: "clinic-2" }
}) {
id clinic { entityId }
}
}
p11: packet(idempotencePacketId: "clinic-schedules-003") {
schedule3: createClinicSchedule(input: {
id: "clinic-schedule-3"
clinic: { entityId: "clinic-3" }
}) {
id clinic { entityId }
}
}
}
✅ Проверка создания связей и расписаний клиник
query CheckConnectionsAndClinicSchedules {
clinicDoctors: searchClinicDoctor {
elems {
id
clinic { entity { name } }
doctor { entity { doctorType { name } } }
}
}
clinicCustomers: searchClinicCustomer {
elems {
id
clinic { entity { name } }
customer { entity { insuranceNum } }
}
}
clinicSchedules: searchClinicSchedule {
elems {
id clinic { entity { name } }
}
}
}
Ожидаемый результат: 4 связи врач-клиника + 4 связи пациент-клиника + 3 расписания клиник
6. Расписания врачей и записи на прием
Финальный запрос - создаем расписания врачей и записи на прием
mutation CreateDoctorSchedulesAndAppointments {
# Расписания врачей - 10 расписаний, по одному в пакете
# Расписания на 15 января 2026
p1: packet(idempotencePacketId: "doctor-schedules-001") {
schedule1: createDoctorSchedule(input: {
id: "doctor-schedule-1"
clinicSchedule: "clinic-schedule-1"
clinicDoctor: { entityId: "clinic-doctor-1" }
clinicOffice: { entityId: "office-1" }
beginDate: "2026-01-15T09:00:00Z"
endDate: "2026-01-15T17:00:00Z"
}) {
id beginDate endDate clinicDoctor { entityId } clinicOffice { entityId }
}
}
p2: packet(idempotencePacketId: "doctor-schedules-002") {
schedule2: createDoctorSchedule(input: {
id: "doctor-schedule-2"
clinicSchedule: "clinic-schedule-2"
clinicDoctor: { entityId: "clinic-doctor-2" }
clinicOffice: { entityId: "office-3" }
beginDate: "2026-01-15T08:00:00Z"
endDate: "2026-01-15T16:00:00Z"
}) {
id beginDate endDate clinicDoctor { entityId } clinicOffice { entityId }
}
}
p3: packet(idempotencePacketId: "doctor-schedules-003") {
schedule3: createDoctorSchedule(input: {
id: "doctor-schedule-3"
clinicSchedule: "clinic-schedule-3"
clinicDoctor: { entityId: "clinic-doctor-3" }
clinicOffice: { entityId: "office-4" }
beginDate: "2026-01-15T09:00:00Z"
endDate: "2026-01-15T18:00:00Z"
}) {
id beginDate endDate clinicDoctor { entityId } clinicOffice { entityId }
}
}
p4: packet(idempotencePacketId: "doctor-schedules-004") {
schedule4: createDoctorSchedule(input: {
id: "doctor-schedule-4"
clinicSchedule: "clinic-schedule-1"
clinicDoctor: { entityId: "clinic-doctor-4" }
clinicOffice: { entityId: "office-2" }
beginDate: "2026-01-15T10:00:00Z"
endDate: "2026-01-15T18:00:00Z"
}) {
id beginDate endDate clinicDoctor { entityId } clinicOffice { entityId }
}
}
# Расписания на 16 января 2026
p5: packet(idempotencePacketId: "doctor-schedules-005") {
schedule5: createDoctorSchedule(input: {
id: "doctor-schedule-5"
clinicSchedule: "clinic-schedule-1"
clinicDoctor: { entityId: "clinic-doctor-1" }
clinicOffice: { entityId: "office-1" }
beginDate: "2026-01-16T08:30:00Z"
endDate: "2026-01-16T16:30:00Z"
}) {
id beginDate endDate clinicDoctor { entityId } clinicOffice { entityId }
}
}
p6: packet(idempotencePacketId: "doctor-schedules-006") {
schedule6: createDoctorSchedule(input: {
id: "doctor-schedule-6"
clinicSchedule: "clinic-schedule-2"
clinicDoctor: { entityId: "clinic-doctor-2" }
clinicOffice: { entityId: "office-3" }
beginDate: "2026-01-16T09:00:00Z"
endDate: "2026-01-16T17:00:00Z"
}) {
id beginDate endDate clinicDoctor { entityId } clinicOffice { entityId }
}
}
p7: packet(idempotencePacketId: "doctor-schedules-007") {
schedule7: createDoctorSchedule(input: {
id: "doctor-schedule-7"
clinicSchedule: "clinic-schedule-3"
clinicDoctor: { entityId: "clinic-doctor-3" }
clinicOffice: { entityId: "office-4" }
beginDate: "2026-01-16T08:00:00Z"
endDate: "2026-01-16T17:30:00Z"
}) {
id beginDate endDate clinicDoctor { entityId } clinicOffice { entityId }
}
}
p8: packet(idempotencePacketId: "doctor-schedules-008") {
schedule8: createDoctorSchedule(input: {
id: "doctor-schedule-8"
clinicSchedule: "clinic-schedule-1"
clinicDoctor: { entityId: "clinic-doctor-4" }
clinicOffice: { entityId: "office-2" }
beginDate: "2026-01-16T11:00:00Z"
endDate: "2026-01-16T19:00:00Z"
}) {
id beginDate endDate clinicDoctor { entityId } clinicOffice { entityId }
}
}
# Расписания на 17 января 2026
p9: packet(idempotencePacketId: "doctor-schedules-009") {
schedule9: createDoctorSchedule(input: {
id: "doctor-schedule-9"
clinicSchedule: "clinic-schedule-2"
clinicDoctor: { entityId: "clinic-doctor-1" }
clinicOffice: { entityId: "office-3" }
beginDate: "2026-01-17T09:00:00Z"
endDate: "2026-01-17T15:00:00Z"
}) {
id beginDate endDate clinicDoctor { entityId } clinicOffice { entityId }
}
}
p10: packet(idempotencePacketId: "doctor-schedules-010") {
schedule10: createDoctorSchedule(input: {
id: "doctor-schedule-10"
clinicSchedule: "clinic-schedule-3"
clinicDoctor: { entityId: "clinic-doctor-2" }
clinicOffice: { entityId: "office-4" }
beginDate: "2026-01-17T10:00:00Z"
endDate: "2026-01-17T18:00:00Z"
}) {
id beginDate endDate clinicDoctor { entityId } clinicOffice { entityId }
}
}
# Записи на прием - 10 записей, по одной в пакете
p11: packet(idempotencePacketId: "appointments-001") {
appointment1: createDoctorAppointment(input: {
id: "appointment-1"
descr: "Плановый профилактический осмотр"
doctorSchedule: "doctor-schedule-1"
clinicCustomer: { entityId: "clinic-customer-1" }
beginDate: "2026-01-15T10:00:00Z"
endDate: "2026-01-15T10:30:00Z"
}) {
id descr beginDate endDate clinicCustomer { entityId }
}
}
p12: packet(idempotencePacketId: "appointments-002") {
appointment2: createDoctorAppointment(input: {
id: "appointment-2"
descr: "Консультация по поводу планируемой операции"
doctorSchedule: "doctor-schedule-2"
clinicCustomer: { entityId: "clinic-customer-2" }
beginDate: "2026-01-15T11:00:00Z"
endDate: "2026-01-15T11:45:00Z"
}) {
id descr beginDate endDate clinicCustomer { entityId }
}
}
p13: packet(idempotencePacketId: "appointments-003") {
appointment3: createDoctorAppointment(input: {
id: "appointment-3"
descr: "Диспансеризация ребенка"
doctorSchedule: "doctor-schedule-3"
clinicCustomer: { entityId: "clinic-customer-3" }
beginDate: "2026-01-15T14:00:00Z"
endDate: "2026-01-15T14:30:00Z"
}) {
id descr beginDate endDate clinicCustomer { entityId }
}
}
p14: packet(idempotencePacketId: "appointments-004") {
appointment4: createDoctorAppointment(input: {
id: "appointment-4"
descr: "Обследование сердечно-сосудистой системы"
doctorSchedule: "doctor-schedule-4"
clinicCustomer: { entityId: "clinic-customer-4" }
beginDate: "2026-01-15T15:00:00Z"
endDate: "2026-01-15T15:45:00Z"
}) {
id descr beginDate endDate clinicCustomer { entityId }
}
}
p15: packet(idempotencePacketId: "appointments-005") {
appointment5: createDoctorAppointment(input: {
id: "appointment-5"
descr: "Повторная консультация по результатам анализов"
doctorSchedule: "doctor-schedule-1"
clinicCustomer: { entityId: "clinic-customer-1" }
beginDate: "2026-01-15T16:00:00Z"
endDate: "2026-01-15T16:30:00Z"
}) {
id descr beginDate endDate clinicCustomer { entityId }
}
}
p16: packet(idempotencePacketId: "appointments-006") {
appointment6: createDoctorAppointment(input: {
id: "appointment-6"
descr: "Вакцинация против гриппа"
doctorSchedule: "doctor-schedule-5"
clinicCustomer: { entityId: "clinic-customer-2" }
beginDate: "2026-01-16T09:00:00Z"
endDate: "2026-01-16T09:15:00Z"
}) {
id descr beginDate endDate clinicCustomer { entityId }
}
}
p17: packet(idempotencePacketId: "appointments-007") {
appointment7: createDoctorAppointment(input: {
id: "appointment-7"
descr: "Предоперационное обследование"
doctorSchedule: "doctor-schedule-6"
clinicCustomer: { entityId: "clinic-customer-3" }
beginDate: "2026-01-16T10:30:00Z"
endDate: "2026-01-16T11:30:00Z"
}) {
id descr beginDate endDate clinicCustomer { entityId }
}
}
p18: packet(idempotencePacketId: "appointments-008") {
appointment8: createDoctorAppointment(input: {
id: "appointment-8"
descr: "Осмотр после болезни"
doctorSchedule: "doctor-schedule-7"
clinicCustomer: { entityId: "clinic-customer-4" }
beginDate: "2026-01-16T14:00:00Z"
endDate: "2026-01-16T14:30:00Z"
}) {
id descr beginDate endDate clinicCustomer { entityId }
}
}
p19: packet(idempotencePacketId: "appointments-009") {
appointment9: createDoctorAppointment(input: {
id: "appointment-9"
descr: "Кардиологическое обследование с ЭКГ"
doctorSchedule: "doctor-schedule-8"
clinicCustomer: { entityId: "clinic-customer-1" }
beginDate: "2026-01-16T16:00:00Z"
endDate: "2026-01-16T17:00:00Z"
}) {
id descr beginDate endDate clinicCustomer { entityId }
}
}
p20: packet(idempotencePacketId: "appointments-010") {
appointment10: createDoctorAppointment(input: {
id: "appointment-10"
descr: "Контрольный осмотр после лечения"
doctorSchedule: "doctor-schedule-9"
clinicCustomer: { entityId: "clinic-customer-2" }
beginDate: "2026-01-17T11:00:00Z"
endDate: "2026-01-17T11:30:00Z"
}) {
id descr beginDate endDate clinicCustomer { entityId }
}
}
}
✅ Проверка создания расписаний и записей
query CheckDoctorSchedulesAndAppointments {
doctorSchedules: searchDoctorSchedule {
elems {
id beginDate endDate
clinicDoctor {
entity {
doctor {
entity {
doctorType { name }
person { entity { firstName lastName } }
}
}
}
}
clinicOffice {
entity {
officeNum
officeType { name }
}
}
}
}
appointments: searchDoctorAppointment {
elems {
id descr beginDate endDate
doctorSchedule {
clinicDoctor {
entity {
doctor {
entity {
doctorType { name }
person { entity { firstName lastName } }
}
}
}
}
}
clinicCustomer {
entity {
customer {
entity {
person { entity { firstName lastName } }
}
}
}
}
}
}
}
Ожидаемый результат: 10 расписаний врачей + 10 записей на прием
📋 Описание структуры демо-данных расписаний врачей и записей на прием
📅 Расписания врачей (10 единиц)
Временное распределение:
-
15 января 2026: 4 расписания (утренние и дневные смены)
doctor-schedule-1: Терапевт в кабинете 101 (09:00-17:00)doctor-schedule-2: Хирург в операционной 201 (08:00-16:00)doctor-schedule-3: Педиатр в кабинете 301 (09:00-18:00)doctor-schedule-4: Кардиолог в процедурном кабинете 102 (10:00-18:00)
-
16 января 2026: 4 расписания (разнообразные смены)
doctor-schedule-5: Терапевт в кабинете 101 (08:30-16:30)doctor-schedule-6: Хирург в операционной 201 (09:00-17:00)doctor-schedule-7: Педиатр в кабинете 301 (08:00-17:30)doctor-schedule-8: Кардиолог в процедурном кабинете 102 (11:00-19:00)
-
17 января 2026: 2 расписания (дневные смены)
doctor-schedule-9: Терапевт в операционной 201 (09:00-15:00)doctor-schedule-10: Хирург в кабинете 301 (10:00-18:00)
Врачебная нагрузка:
- Терапевт (Анна Петрова): 3 расписания на разные дни
- Хирург (Михаил Сидоров): 3 расписания
- Педиатр (Елена Козлова): 2 расписания
- Кардиолог (Владимир Николаев): 2 расписания
Использование кабинетов:
- Консультационные кабинеты (101, 301): 5 расписаний
- Процедурный кабинет (102): 2 расписания
- Операционная (201): 3 расписания
🏥 Записи на прием (10 единиц)
15 января 2026 (5 записей):
appointment-1: Профилактический осмотр у терапевта (10:00-10:30)appointment-2: Консультация у хирурга (11:00-11:45)appointment-3: Диспансеризация ребенка у педиатра (14:00-14:30)appointment-4: Кардиологическое обследование (15:00-15:45)appointment-5: Повторная консультация у терапевта (16:00-16:30)
16 января 2026 (4 записей):
appointment-6: Вакцинация у терапевта (09:00-09:15)appointment-7: Предоперационное обследование у хирурга (10:30-11:30)appointment-8: Осмотр после болезни у педиатра (14:00-14:30)appointment-9: ЭКГ у кардиолога (16:00-17:00)
17 января 2026 (1 запись):
appointment-10: Контрольный осмотр у терапевта (11:00-11:30)
Медицинские сценарии:
- Профилактика: Плановые осмотры, диспансеризация, вакцинация
- Специализированная помощь: Кардиологические обследования, предоперационная подготовка
- Последующее наблюдение: Контрольные осмотры, консультации по результатам анализов
- Экстренная помощь: Осмотры после болезни
Временные интервалы:
- Короткие (15 мин): Вакцинация
- Стандартные (30 мин): Плановые осмотры, контрольные визиты
- Длительные (45-60 мин): Специализированные обследования, консультации
Распределение пациентов:
- Иван Иванов (customer-1): 3 записи (профилактика, повторная консультация, ЭКГ)
- Мария Смирнова (customer-2): 3 записи (хирургическая консультация, вакцинация, контрольный осмотр)
- Алексей Волков (customer-3): 2 записи (диспансеризация, предоперационное обследование)
- Татьяна Федорова (customer-4): 2 записи (кардиологическое обследование, осмотр после болезни)
Реалистичность данных:
- Разные длительности приемов в зависимости от типа услуги
- Специализация кабинетов под определенные виды деятельности
- Повторные обращения пациентов
- Междисциплинарное взаимодействие (пациенты посещают врачей разных специальностей)
- Логичное распределение нагрузки по дням недели
Данная информация может быть использована для изучения структуры данных и их взаимосвязей, а также возможностей GraphQL для работы с данными.
🔍 Финальная комплексная проверка целостности созданных демо-данных
query FinalDemoDataIntegrityCheck {
# Подсчет всех созданных сущностей
doctorTypesCount: searchDoctorType { count }
officeTypesCount: searchOfficeType { count }
personsCount: searchPerson { count }
doctorsCount: searchDoctor { count }
customersCount: searchCustomer { count }
clinicsCount: searchClinic { count }
officesCount: searchClinicOffice { count }
clinicDoctorsCount: searchClinicDoctor { count }
clinicCustomersCount: searchClinicCustomer { count }
clinicSchedulesCount: searchClinicSchedule { count }
doctorSchedulesCount: searchDoctorSchedule { count }
appointmentsCount: searchDoctorAppointment { count }
contactsCount: searchCustomerContact { count }
# Проверка связей
doctorTypes: searchDoctorType {
elems { id name }
}
officeTypes: searchOfficeType {
elems { id name }
}
}
Ожидаемые результаты проверки целостности:
| Сущность | Количество | Запрос | Описание |
|---|---|---|---|
| DoctorType | 4 | 1 | терапевт, хирург, педиатр, кардиолог |
| OfficeType | 3 | 1 | консультационный, процедурный, операционная |
| Person | 8 | 2 | 4 врача + 4 пациента |
| Doctor | 4 | 3 | по одному каждого типа |
| Customer | 4 | 3 | пациенты с уникальными страховками |
| CustomerContact | 4 | 3 | контактные данные пациентов |
| Clinic | 3 | 4 | поликлиника, мед.центр, детская больница |
| ClinicOffice | 4 | 4 | кабинеты разных типов |
| ClinicDoctor | 4 | 5 | привязки врачей к клиникам |
| ClinicCustomer | 4 | 5 | привязки пациентов к клиникам |
| ClinicSchedule | 3 | 5 | общие расписания клиник |
| DoctorSchedule | 10 | 6 | индивидуальные расписания врачей |
| DoctorAppointment | 10 | 6 | записи на прием |
Заключение
В рамках данного раздела была создана полноценная демо-база данных медицинской информационной системы, состоящая из 13 типов сущностей и 67 записей. Процесс создания был структурирован в 6 последовательных этапов, что обеспечило корректное формирование всех связей между данными.
Особенности созданного набора данных
Структурная целостность:
- Создана реалистичная модель медицинского учреждения с 3 клиниками, 4 врачами разных специальностей и 4 пациентами
- Установлены все необходимые связи между сущностями (врач-клиника, пациент-клиника, расписания)
- Реализованы временные связи с реалистичными расписаниями и записями на прием
Практическая применимость:
- Данные покрывают основные медицинские сценарии: профилактические осмотры, специализированную помощь, контрольные визиты
- Временные интервалы соответствуют реальной практике (от 15 минут для вакцинации до 60 минут для сложных обследований)
- Демонстрируется работа с различными типами кабинетов и специализацией врачей
Техническая эффективность:
- Использование пакетов (packet) и идемпотентности предотвращает дублирование данных
- GraphQL-мутации оптимизированы для минимизации количества запросов
Дальнейшее использование демо-данных
Созданные демо-данные станут основой для изучения и практического освоения всех последующих разделов курса. Все последующие примеры и практические задания в курсе будут ссылаться на созданные идентификаторы (doctor-1, customer-1, clinic-1 и т.д.), поэтому пожалуйста сохраните созданные данные для дальнейшей работы.
