431 lines
46 KiB
TypeScript
431 lines
46 KiB
TypeScript
import 'dotenv/config'
|
||
|
||
type ReviewSeed = { authorName: string; rating: 4 | 5; comment: string; daysAgo: number }
|
||
|
||
const AUTHORS = [
|
||
'Анна К.',
|
||
'Сергей М.',
|
||
'Ольга В.',
|
||
'Дмитрий П.',
|
||
'Елена С.',
|
||
'Ирина Н.',
|
||
'Марина Л.',
|
||
'Павел Р.',
|
||
'Наталья Г.',
|
||
'Алексей Т.',
|
||
'Юлия Ф.',
|
||
'Виктор Б.',
|
||
'Светлана Д.',
|
||
'Андрей К.',
|
||
'Татьяна М.',
|
||
'Роман Ш.',
|
||
'Екатерина З.',
|
||
'Михаил Ч.',
|
||
'Людмила О.',
|
||
'Вадим Ю.',
|
||
]
|
||
|
||
function pick<T>(list: T[], index: number): T {
|
||
return list[index % list.length]
|
||
}
|
||
|
||
function makeReviews(comments: string[], count: number, seed: number): ReviewSeed[] {
|
||
return comments.slice(0, count).map((comment, i) => ({
|
||
authorName: pick(AUTHORS, seed + i * 3),
|
||
rating: i % 3 === 1 ? 4 : 5,
|
||
comment,
|
||
daysAgo: 12 + i * 11 + (seed % 7),
|
||
}))
|
||
}
|
||
|
||
const reviewsBySlug: Record<string, ReviewSeed[]> = {
|
||
'amirkhanyan-mhitar': makeReviews(
|
||
[
|
||
'Попала к Мхитару Грантовичу с впервые возникшими приступами. Назначил ЭЭГ, спокойно объяснил результаты и подобрал терапию. Приступов нет уже несколько месяцев.',
|
||
'Долго искала эпилептолога, который не «сбрасывает» все на стресс. Врач внимательно разобрал дневник приступов и скорректировал дозировку. Стало заметно лучше.',
|
||
'Консультация по эпилепсии прошла без спешки. Объяснил, зачем нужен повторный ЭЭГ-контроль и как вести себя при ауре. Очень человечный подход.',
|
||
'Привела сына-подростка. Мхитар Грантович разговаривал и с ним, и со мной, без запугивания. Назначил обследование и понятную схему наблюдения.',
|
||
'После смены препарата боковые эффекты почти ушли, приступы стали реже. Спасибо за терпение и подробные ответы на все вопросы.',
|
||
'Обращалась с подозрением на фокальную эпилепсию. Диагноз подтвердили, лечение подобрали с первого раза. Рекомендую как эпилептолога.',
|
||
'Чётко, спокойно, по делу. Разобрал снимки МРТ и ЭЭГ, ничего лишнего не назначил. Такое отношение к неврологии встречается редко.',
|
||
'Наблюдаюсь больше полугода. На контрольных приёмах всегда смотрит динамику, а не просто продлевает рецепт. Чувствую себя в надёжных руках.',
|
||
'Очень благодарна за помощь при ночных приступах. Скорректировали терапию, сон нормализовался. Врач высшей категории — это правда.',
|
||
'Приём в КДЦ МОНИКИ: без очереди по записи, консультация содержательная. Отдельно спасибо за памятку, что делать родным во время приступа.',
|
||
'Грамотный эпилептолог. Не пугает «пожизненным диагнозом», а объясняет, как жить и работать с этим. Это очень поддержало.',
|
||
],
|
||
11,
|
||
5,
|
||
),
|
||
'getmanskaya-anna': makeReviews(
|
||
[
|
||
'Ставила брекеты у Анны Андреевны. На каждом этапе объясняет, что происходит с прикусом. Зубы выравниваются быстрее, чем я ожидала.',
|
||
'Долго боялась ортодонтии. Врач показала план на слепках и фото, без давления. Выбрала элайнеры — ношу уже четыре месяца, результат видно.',
|
||
'Исправляли скученность верхней челюсти. Анна Андреевна аккуратно ставит дуги, ничего не «тянет» через боль. Очень довольна.',
|
||
'Консультация по прикусу: всё разложила по полочкам, сказала честно, где можно обойтись без хирургии. Редкое сочетание тактичности и профессионализма.',
|
||
'Ребёнку 14 лет ставили брекет-систему. Врач умеет разговаривать с подростками. Никакого страха перед активациями.',
|
||
'После снятия брекетов дали ретейнер и чёткий график контроля. Улыбка ровная, прикус комфортный. Спасибо ортодонту МОНИКИ.',
|
||
'Пришла с ретенционным периодом после лечения в другой клинике. Исправили перекос, подобрали капу. Чувствуется школа ЦНИИС.',
|
||
'Очень аккуратная работа с элайнерами. На контроле всегда проверяет посадку и гигиену. Рекомендую как ортодонта отделения сложных случаев.',
|
||
],
|
||
8,
|
||
6,
|
||
),
|
||
'dvorina-olga': makeReviews(
|
||
[
|
||
'У мамы 78 лет скачки давления. Ольга Геннадьевна подобрала терапию с учётом возраста, без «охапки» лишних таблеток. Самочувствие стабильное.',
|
||
'Кардиолог, который слушает, а не сразу пишет направление на всё подряд. Сделали ЭКГ и холтер, объяснила каждое изменение.',
|
||
'Наблюдаюсь с гипертонией и аритмией. На приёме спокойно, подробно, с вниманием к сопутствующим болезням. Гериатрический подход чувствуется.',
|
||
'После выписки из стационара пришла на контроль. Врач сверила выписку, скорректировала бета-блокатор. Стало легче подниматься по лестнице.',
|
||
'Обратилась с одышкой. Не списали на возраст, дообследовали сердце. Спасибо за внимательность и понятные рекомендации по нагрузке.',
|
||
'Кандидат наук и это слышно: говорит ясно, без заумных терминов. Папе 82 года — нашла подход с первой минуты.',
|
||
'Долго не могли стабилизировать давление. Ольга Геннадьевна пересмотрела комбинацию препаратов — цифры наконец в норме.',
|
||
'Приём по записи в КДЦ. Осмотрела тщательно, послушала, задала правильные вопросы. Так и должен работать кардиолог.',
|
||
'Ходила с жалобами на перебои. Сняли ЭКГ, дали рекомендации по соли и прогулкам. Без запугивания, но строго по делу.',
|
||
'Очень человечный врач. Мама вышла с приёма спокойная, а не в слезах, как после некоторых консультаций. Лечение работает.',
|
||
'Консультировала по ишемии. Чётко сказала, что срочно, а что можно наблюдать. Такое умение расставить приоритеты дорогого стоит.',
|
||
'Повторный приём через месяц: смотрит динамику, а не копирует прошлые назначения. Профессионал с большой буквы.',
|
||
'Помогли разобраться с отёками ног на фоне сердца. Назначили мочегонные грамотно, объяснили, как контролировать дома.',
|
||
'Рекомендую как кардиолога для пожилых родственников. Терпеливая, компетентная, ничего не упускает.',
|
||
'Пришла с результатами холтера из другой клиники. Пересмотрела запись, не заставила пересдавать. Экономия и времени, и нервов.',
|
||
'После корректировки терапии перестала просыпаться ночью от сердцебиения. Спасибо Ольге Геннадьевне.',
|
||
],
|
||
16,
|
||
7,
|
||
),
|
||
'dzhabrailova-maryam': makeReviews(
|
||
[
|
||
'Удаляла сложный зуб мудрости. Марьям Абуевна предупредила обо всех этапах, удаление прошло быстро и почти без отёка.',
|
||
'Хирургический приём: аккуратно, стерильно, без лишней боли. Швы сняли вовремя, заживление ровное.',
|
||
'Готовили полость рта к протезированию. Удалили два корня, дали чёткие рекомендации. Через неделю уже можно было продолжать лечение.',
|
||
'Боялась стоматолога-хирурга с детства. Здесь объяснили каждый шаг, анестезия сработала сразу. Спасибо за спокойствие.',
|
||
'Резекция кисты у верхушки корня. Операция прошла штатно, контроль через месяц — всё чисто. Молодой врач, а руки уверенные.',
|
||
'Удаление ретинированного зуба. Предупредили про отёк, назначили холод и полоскания. Всё совпало с прогнозом, без сюрпризов.',
|
||
],
|
||
6,
|
||
8,
|
||
),
|
||
'kamynina-olga': makeReviews(
|
||
[
|
||
'Лечила каналы у Ольги Дмитриевны. Работа ювелирная: без боли, с контрольными снимками. Зуб больше не ноет.',
|
||
'Поставили керамическую вкладку после большого кариеса. Цвет попал идеально, край гладкий. Терапевт от отделения сложных случаев — это чувствуется.',
|
||
'Пришла с острой болью. Приняли, сняли воспаление, назначили этапность. Никакого «потерпите до пятницы».',
|
||
'Перелечивание старых каналов. Долго ковырялась честно, но зуб спасли. Очень благодарна за упорство.',
|
||
'Делали реставрацию передних зубов. Выглядят естественно, никто не замечает, что это лечение. Рекомендую.',
|
||
'Спокойный врач, всё комментирует. Для тех, кто нервничает в кресле, это половина успеха. Кариес вылечили за один визит.',
|
||
'Консультация по чувствительности эмали. Не стали сразу сверлить, предложили реминерализацию. Честный подход.',
|
||
'Несколько пломб за курс лечения. Все держатся, край не окрашивается. Качество материалов и работы на уровне.',
|
||
'Ольга Дмитриевна не навязывает лишнего. Посмотрела снимок, сказала, какой зуб подождёт. Такое уважение к пациенту редкость.',
|
||
'После эндодонтии дали временную коронку и план на ортопеда. Всё связано, ничего не «висит» в воздухе.',
|
||
'Очень чисто работает, коффердам, изоляция — как в учебнике. Для терапевта это важно, и здесь это есть.',
|
||
'Лечили глубокий кариес с риском пульпита. Зуб сохранили живым. Спасибо за аккуратность и контроль.',
|
||
],
|
||
12,
|
||
9,
|
||
),
|
||
'kokotov-ivan': makeReviews(
|
||
[
|
||
'Делал РЧА вен у Ивана Юрьевича. Процедура под местной анестезией, в тот же день ушёл своими ногами. Тяжесть в ногах ушла за две недели.',
|
||
'Варикоз беспокоил годы. Сосудистый хирург предложил лазер, а не сразу «большую» операцию. Результат на контрольном УЗИ отличный.',
|
||
'Склеротерапия сосудистых звёздочек. Аккуратно, без сильных синяков. Летом уже в платье без комплексов.',
|
||
'Консультация по отёкам и судорогам. Назначили УЗДГ, объяснил по клапанам простым языком. Не торопил с операцией.',
|
||
'Минифлебэктомия на голени. Швы косметичные, через месяц следов почти нет. Врач первой категории — по делу.',
|
||
'После ковида осталась тяжесть в ногах. Иван Юрьевич подобрал компрессию и схему наблюдения. Стало легче ходить.',
|
||
'Готовили к эндовенозной коагуляции. Всё расписали: чулки, нагрузка, контроль. Никакой паники, чёткий план.',
|
||
'Пришла с тромбофлебитом. Быстро осмотрели, назначили лечение, сказали, когда можно будет думать об эстетике. Грамотно.',
|
||
'Повторный приём после лазера. Вены «закрылись», как и обещали. Отдельно спасибо за честные сроки восстановления.',
|
||
'Консультация сосудистого хирурга в КДЦ: без лишних анализов, только нужное. Такое уважение к времени пациента.',
|
||
'Делали комбинированное лечение: лазер + склеротерапия. Ноги легче, ночью больше не сводит. Рекомендую.',
|
||
'Очень спокойный хирург. Перед процедурой ещё раз показал, что будем делать. Тревога ушла ещё в кабинете.',
|
||
'Работал с рецидивом после операции 10-летней давности. Не сказал «ну вы же уже оперировались», а разобрал заново. Профессионал.',
|
||
],
|
||
13,
|
||
10,
|
||
),
|
||
'korsakova-ekaterina': makeReviews(
|
||
[
|
||
'Лечила кариес у Екатерины Валерьевны. Быстро, безболезненно, пломба не отличается от зуба. Приятный приём.',
|
||
'Пришла с гиперестезией. Назначили покрытие и смену пасты, сверлить не стали. Через две недели зубы перестали ныть на холодное.',
|
||
'Делали чистку и лечение клиновидных дефектов. Врач аккуратная, всё объясняет. Буду ходить только сюда.',
|
||
'Острая боль вечером, попала на приём. Сняли воспаление, поставили временную пломбу, дали план. Спасибо за оперативность.',
|
||
'Несколько визитов по терапевтической санации. Ничего не навязывали, лечили по приоритету. Честный стоматолог.',
|
||
'Пломба на жевательном зубе держится уже год, край ровный. Качество работы видно.',
|
||
'Очень бережно работает с анестезией. Для тех, кто боится уколов, это важно. Лечение прошло спокойно.',
|
||
'Консультация после скола. Предложили реставрацию, а не сразу коронку. Сэкономили и зуб, и бюджет.',
|
||
'Екатерина Валерьевна внимательная: смотрит не один зуб, а всю полость рта. Нашла скрытый кариес на снимке вовремя.',
|
||
],
|
||
9,
|
||
11,
|
||
),
|
||
'kosova-marina': makeReviews(
|
||
[
|
||
'Протезировалась у Марины Михайловны. Коронки сели идеально, прикус привык за пару дней. Опыт 30+ лет чувствуется в каждой мелочи.',
|
||
'Проблемы с ВНЧС и старыми коронками. Врач не просто «поставила новые», а разбиралась с суставом. Щелчки почти ушли.',
|
||
'Мостовидный протез на верхнюю челюсть. Цвет, форма, речь — всё естественно. Кандидат наук и педагог: объясняет, как студентам, только добрее.',
|
||
'Готовили зубы под коронки. Препарирование аккуратное, временные держались до постоянных. Никакой «ямы» между этапами.',
|
||
'Съёмный протез после имплантов не рассматривали — сделали несъёмную конструкцию. Жую нормально, не стесняюсь улыбки.',
|
||
'Консультация по полной реабилитации. Честно сказала, где импланты, а где можно классическое протезирование. Без продаж.',
|
||
'Переделывали работу из другой клиники. Прикус был завышен, болела голова. Здесь всё выверили. Голова прошла.',
|
||
'Очень спокойный ортопед. Для пожилого папы нашли съёмную конструкцию, которой он реально пользуется, а не лежит в стакане.',
|
||
'Виниры на четыре передних. Смотрятся как свои, коллеги не заметили. Эстетика на высоте.',
|
||
'Этап слепков и примерок без спешки. Марина Михайловна сама проверяет каждый контакт. Такое отношение дорогого стоит.',
|
||
'После протезирования дали капу на ночь из‑за гипертонуса. Комплексный подход, не только «поставить коронку».',
|
||
'Рекомендую как ортопеда МОНИКИ. Сложный случай, несколько консультаций — результат того стоил.',
|
||
'Коронка на импланте. Посадка точная, гигиена удобная. Ничего не натирает.',
|
||
'Долгий путь: терапия, потом ортопедия. Врач координировала этапы. В итоге единый план, а не набор разрозненных услуг.',
|
||
],
|
||
14,
|
||
12,
|
||
),
|
||
'kostyukevich-olga': makeReviews(
|
||
[
|
||
'Пришла с изжогой и кашлем. Ольга Игоревна сразу связала гастро и лёгкие, а не отправила по кругу. Назначили лечение ГЭРБ — кашель ушёл.',
|
||
'Терапевт, гастроэнтеролог и пульмонолог в одном лице — это редкость. Разбирает коморбидность, а не лечит «по одному органу».',
|
||
'После ковида оставалась одышка. Грамотно обследовали, исключили серьёзное, дали реабилитационные рекомендации. Стало легче дышать.',
|
||
'Хронический гастрит плюс бронхит каждую осень. Подобрали схему, которая не бьёт по желудку. Первый сезон без обострения.',
|
||
'Консультация по СРК. Без «это всё нервы»: назначили обследования, дневник питания, конкретные препараты. Симптомы снизились.',
|
||
'Астма на фоне рефлюкса. Врач объяснила связь и скорректировала и ингалятор, и гастропротекцию. Ночью сплю.',
|
||
'Очень внимательный доцент. Смотрит анализы целиком, задаёт вопросы, которые другие пропускают. Чувствуешь себя услышанной.',
|
||
'Долго лечили «просто кашель». Здесь нашли связь с постназальным затёком и ЖКТ. Подход клинический, университетский.',
|
||
'Повторный приём: смотрит динамику ФВД и самочувствие, а не только бланк. Так и должен работать терапевт.',
|
||
'Назначили минимум анализов — только нужные. Экономия и здравый смысл. Рекомендую как терапевта КДЦ.',
|
||
'Помогли с лекарственным гастритом после длительных НПВС. Отменили лишнее, желудок успокоился.',
|
||
'Консультация перед операцией: оценили лёгкие и сердце с терапевтической стороны. Спокойно пошли на плановое вмешательство.',
|
||
'Ольга Игоревна не пугает, но и не гладит по голове. Честный разговор про вес, курение и давление. Это сработало.',
|
||
'Пришла с усталостью и тяжестью в правом подреберье. Нашли причину, назначили лечение. Через месяц анализы лучше.',
|
||
'Грамотный пульмонолог: развеяла страх «онкологии» после пятна на флюорографии, направила на уточняющую КТ. Всё доброкачественно.',
|
||
],
|
||
15,
|
||
13,
|
||
),
|
||
'kotova-tatiana': makeReviews(
|
||
[
|
||
'Наблюдаюсь у Татьяны Сергеевны с гипотиреозом. Дозу тироксина подобрали точно, самочувствие ровное, анализы стабильные.',
|
||
'Пришла с подозрением на диабет. Объяснила цифры глюкозы и гликированного без паники, дала понятный план питания.',
|
||
'Эндокринолог, который не сажает сразу на жёсткую диету, а учит, как жить. Вес уходит медленно, но без срывов.',
|
||
'Узел щитовидной железы. Направили на УЗИ и пункцию, всё прокомментировали. Жду контроля спокойно, потому что доверяю.',
|
||
'Гестационный диабет во вторую беременность. Врач на связи по корректировке, без запугивания. Роды прошли хорошо.',
|
||
'После родов расползся ТТГ. Татьяна Сергеевна быстро вывела на норму. Спасибо за внимательность к молодым мамам.',
|
||
'Консультация по остеопорозу и витамину D. Назначения конкретные, контроль через три месяца. Спина меньше ноет.',
|
||
'Синдром поликистоза, циклы сбились. Подобрали терапию, объяснили риски. Через два месяца цикл выровнялся.',
|
||
'Очень спокойный приём. Не торопит, смотрит дневник питания. Для эндокринологии это важнее, чем «волшебная таблетка».',
|
||
'Папе корректировали сахар в 70 лет. Схему упростили, гипогликемий больше нет. Рекомендую.',
|
||
'Повторный приём: смотрит динамику ТТГ и жалобы, а не только цифру. Редкое сочетание.',
|
||
'Помогли разобраться с «гормональным» набором веса. Исключили серьёзное, дали реалистичный план. Уже минус 4 кг.',
|
||
],
|
||
12,
|
||
14,
|
||
),
|
||
'markelova-evgenia': makeReviews(
|
||
[
|
||
'Кардиолог с ревматологическим бэкграундом — это то, что было нужно при системном заболевании и давлении. Смотрит связь, а не отдельно сердце.',
|
||
'Наблюдаюсь с ревматоидным артритом и тахикардией. Евгения Иннокентьевна согласовала кардиотерапию с базисным лечением. Стало спокойнее.',
|
||
'После миокардита пришла на консультацию. Объяснила ограничения по спорту без драмы, но чётко. Холтер в норме.',
|
||
'Грамотный разбор ЭхоКГ. Показала, что значит каждый пункт заключения. Редко кто так тратит время на пациента.',
|
||
'Подозрение на перикардит. Не отмахнулись, дообследовали. Спасибо за бдительность.',
|
||
'Сочетание гипертонии и суставного синдрома. Подобрали препарат, который не усиливает отёки. Суставы и давление оба под контролем.',
|
||
'Кандидат наук, доцент — и это слышно. Говорит структурно, даёт план на полгода, а не «приходите как будет хуже».',
|
||
'Приём в МОНИКИ: внимательный осмотр, аускультация, вопросы про нагрузку. Так и должен выглядеть кардиологический приём.',
|
||
'Маме склеродермия и изменения на ЭКГ. Врач не испугала, наметила контроль. Мы понимаем, за чем следить.',
|
||
'Очень тактичный врач. Не перебивает, даёт договорить. Для хронических пациентов это уже лечение.',
|
||
'Скорректировали терапию после сильной нагрузки на работе. Сердцебиение ушло. Рекомендую как кардиолога.',
|
||
],
|
||
11,
|
||
15,
|
||
),
|
||
'mikaya-mariam': makeReviews(
|
||
[
|
||
'Удаление зуба мудрости у Мариам Зурабиевны прошло спокойно. Отёк умеренный, как предупреждали. Зажило ровно.',
|
||
'Хирургическая санация перед имплантацией. Аккуратно убрали очаги, дали паузу на заживление. План понятный.',
|
||
'Вскрывали десневой абсцесс. Обезболивание сработало сразу, гной ушёл, назначили антибиотик. На следующий день уже легче.',
|
||
'Молодой хирург, но руки уверенные. Не тянет время, говорит, что делает. Это снижает тревогу.',
|
||
'Удаляли ретинированный зуб. Швы аккуратные, контроль через неделю без сюрпризов. Спасибо.',
|
||
'Консультация по кисте. Показала на снимке, объяснила варианты: наблюдать или оперировать. Выбрали операцию, всё прошло штатно.',
|
||
'После удаления сразу дали памятку: холод, еда, когда звонить. Ничего не пришлось гуглить ночью.',
|
||
],
|
||
7,
|
||
16,
|
||
),
|
||
'morozova-natalia': makeReviews(
|
||
[
|
||
'Гастроэнтеролог с огромным стажем. Наталия Александровна за 40 минут разложила мои «непонятные» боли в животе по полочкам.',
|
||
'Хронический панкреатит. Подобрали ферменты и диету без фанатизма. Обострений меньше, ем почти нормально.',
|
||
'Долго лечили Хеликобактер впустую. Здесь схема сработала с первого курса, контроль дыхательным тестом — отрицательный.',
|
||
'Консультация по желчному. Не сразу «резать», а наблюдение и питание. Приступы стали реже.',
|
||
'СРК с диареей. Назначили обследование, исключили воспаление, дали рабочую схему. Могу планировать день.',
|
||
'Очень внимательный к.м.н. Смотрит старые гастроскопии, не заставляет делать всё заново без нужды.',
|
||
'После антибиотиков поплыл желудок. Восстановили слизистую, пробиотики по делу, а не «для галочки».',
|
||
'Гастрит с повышенной кислотностью. Препарат и режим питания объяснили так, что я реально их соблюдаю.',
|
||
'Приём без спешки, вопросы про стул, сон, лекарства. Редкая полнота сбора анамнеза.',
|
||
'Маме 70 лет подобрали мягкую схему при запорах. Без жёстких слабительных каждый день. Спасибо.',
|
||
'Подозрение на целиакию. Направили на правильные анализы до диеты — многие начинают наоборот. Профессионал.',
|
||
'Повторно через три месяца: смотрит дневник питания, корректирует. Это сопровождение, а не разовый приём.',
|
||
'Рефлюкс мучил годы. Здесь подняли изголовье, вес, препарат — и ночью больше не кашляю.',
|
||
'Рекомендую как гастроэнтеролога МОНИКИ. Спокойная, точная, без запугивания онкологией на ровном месте.',
|
||
'Разбор ферментов и УЗИ. Объяснила, что «сладж» ещё не камень. Успокоила и дала контроль.',
|
||
],
|
||
15,
|
||
17,
|
||
),
|
||
'raspopina-natalia': makeReviews(
|
||
[
|
||
'Профессор Распопина — это другой уровень пульмонологии. Разбор бронхиальной астмы занял время, зато схема наконец работает.',
|
||
'Тяжёлая астма, несколько ингаляторов «для галочки». Здесь убрали лишнее, оставили нужное. Приступов меньше.',
|
||
'После пневмонии оставался кашель. КТ, ФВД, конкретный план. Через месяц кашля почти нет.',
|
||
'ХОБЛ у папы. Наталья Автандиловна объяснила ингалятор так, что он его реально начал правильно использовать.',
|
||
'Консультация по длительному кашлю. Не списали на COVID-хвост, нашли причину. Д.м.н. — и это слышно.',
|
||
'Саракоидоз наблюдали «как получится». Здесь дали понятный график контроля. Тревога снизилась.',
|
||
'Очень уважительный приём. Не перебивает, смотрит все снимки. Для профессора это не всегда очевидно, здесь — да.',
|
||
'Подобрали базисную терапию при аллергической астме. Весна прошла без привычного удушья.',
|
||
'Разбор спирометрии по минутам. Впервые поняла свои цифры, а не просто «норма/не норма».',
|
||
'Рекомендации по вакцинации и нагрузке после тяжёлой пневмонии. Чётко, без воды.',
|
||
'Коморбидность: астма плюс сердце. Не лечит лёгкие в вакууме. Это и есть клиника высокого уровня.',
|
||
'Повторный визит: смотрит дневник пикфлоу. Такое сопровождение дорогого стоит.',
|
||
'Направили из области. Приём стоил дороги: схема изменилась, жить стало проще.',
|
||
'Спокойно объяснила, когда нужна КТ, а когда достаточно рентгена. Без лишней лучевой нагрузки.',
|
||
'Кашель курильщика не отмахнули. Мотивация бросить плюс обследование. Начала выходить из зависимости.',
|
||
'Одышка при ходьбе. Исключили тяжёлое, назначили дыхательную гимнастику. Уже легче поднимаюсь.',
|
||
'Благодарна за человеческое отношение и высочайшую компетенцию. Так и должен выглядеть профессор кафедры.',
|
||
],
|
||
17,
|
||
18,
|
||
),
|
||
'fokina-polina': makeReviews(
|
||
[
|
||
'Проверяла зрение и подбирала очки у Полины Александровны. Рецепт точный, глаза меньше устают за компьютером.',
|
||
'Синдром сухого глаза. Назначили схему капель и перерывы в работе. Через две недели резь ушла.',
|
||
'Консультация по миопии. Честно сказала, где лазер не показан, а где можно подождать. Без продаж операций.',
|
||
'Папе подбирали очки после катаракты. Всё измерили спокойно, несколько раз перепроверили. Видит хорошо.',
|
||
'Оптометрия на уровне: не только таблица, но и бинокулярность. Головные боли от неправильных очков прошли.',
|
||
'Пришла с мушками. Осмотрели глазное дно, успокоили, дали красные флаги, когда бежать срочно. Профессионально.',
|
||
'Контактные линзы подобрали с первого раза, посадка комфортная. Объяснили уход без занудства.',
|
||
'Ассистент кафедры — и это чувствуется: структура осмотра, ничего не пропускает. Рекомендую офтальмолога КДЦ.',
|
||
'Ребёнку 16 лет проверка перед учёбой. Врач нашла спазм аккомодации, дала упражнения и капли. Глаза отдохнули.',
|
||
'Повторный приём: сравнила со старым рецептом, объяснила, зачем меняем цилиндр. Стало ясно, за что платим.',
|
||
],
|
||
10,
|
||
19,
|
||
),
|
||
'halzeva-emma': makeReviews(
|
||
[
|
||
'Наблюдаюсь у Эммы Алексеевны несколько лет. Гинеколог внимательный, без лишних процедур, всегда объясняет назначения.',
|
||
'Пришла с нарушениями цикла после стресса. Обследовали точечно, цикл восстановили. Никакого «давайте всё подряд».',
|
||
'Консультация по миоме. Честно сказала, что можно наблюдать, а не сразу оперировать. Спокойствие вернулось.',
|
||
'Подбор контрацепции с учётом вен и давления. Редко кто так смотрит противопоказания. Спасибо за осторожность.',
|
||
'Воспаление пролечили без хронизации. Контрольный приём подтвердил, что всё чисто.',
|
||
'Очень тактичный осмотр. Для тех, кто тревожится на кресле, это важно. Врач с большим стажем — руки лёгкие.',
|
||
'Климактерические жалобы. Подобрали схему, сон и приливы стали лучше. Без страшилок про гормоны.',
|
||
'Планирование беременности: анализы, УЗИ, понятный чек-лист. Пошли готовиться спокойно.',
|
||
'Пап-тест и УЗИ в одном маршруте, без беготни. Организация приёма в КДЦ на уровне.',
|
||
'Рекомендую как гинеколога МОНИКИ. Умеет и выслушать, и принять решение. Редкое сочетание.',
|
||
],
|
||
10,
|
||
20,
|
||
),
|
||
'shtang-olga': makeReviews(
|
||
[
|
||
'Попала в центр боли к Ольге Михайловне с невралгией тройничного нерва. Подобрали терапию, приступы стали реже и мягче.',
|
||
'Миграми мучилась 15 лет. Здесь впервые подобрали профилактику, которая работает. Я просто выдохнула.',
|
||
'Лицевая боль после герпеса. Невролог-алголог — это другой разговор, не «попейте нейромультивит». Боль ушла за недели.',
|
||
'Заведующая отделением принимает сама: без суеты, с разбором всех снимков. Поясничные боли наконец получили диагноз.',
|
||
'Невропатия лицевого нерва. Назначили схему вовремя, асимметрия почти ушла. Спасибо за скорость.',
|
||
'Головные боли напряжения плюс шейный отдел. Не отправили сразу на массаж, а исключили серьёзное. Грамотно.',
|
||
'Кандидат наук и это видно: говорит структурировано, даёт план на месяцы. Я понимаю, что будет дальше.',
|
||
'Боли в лице не могли разобрать три года. Здесь за один приём выстроили гипотезу и обследования. Попала куда надо.',
|
||
'Блокада при корешковом синдроме. Объяснили риски, сделали аккуратно. Нога перестала «гореть».',
|
||
'Очень внимательная к деталям: сон, кофе, осанка, лекарства. Боль — это пазл, и она его собирает.',
|
||
'Повторный приём в центре боли: смотрит дневник приступов. Такое ведение — редкость в обычной поликлинике.',
|
||
'Маме подобрали лечение хронической поясничной боли. Вернулась к прогулкам. Мы очень благодарны.',
|
||
'Вестибулярные жалобы и головная боль. Не свалили на ВСД, обследовали. Причина нашлась, лечение помогает.',
|
||
'Спокойный, собранный врач. В кабинете становится легче ещё до назначений — это тоже про боль.',
|
||
'Рекомендую как невролога МОНИКИ, особенно при лицевых и головных болях. Профильный центр чувствуется.',
|
||
'После коррекции терапии мигрень перестала «выбивать» на дни. Вернулась к работе. Это дорогого стоит.',
|
||
'Консультация по полинейропатии. Назначения понятные, контроль сахара и витаминов. Ноги меньше немеют.',
|
||
'Ольга Михайловна не обещает чудес, но даёт реалистичный прогноз. И он сбывается. Доверие полное.',
|
||
],
|
||
18,
|
||
21,
|
||
),
|
||
}
|
||
|
||
function sqlString(value: string) {
|
||
return `'${value.replace(/'/g, "''")}'`
|
||
}
|
||
|
||
async function main() {
|
||
const { execFileSync } = await import('node:child_process')
|
||
const rows = execFileSync('psql', ['-d', 'moniki', '-t', '-A', '-c', "SELECT slug || E'\\t' || id FROM doctors"], {
|
||
encoding: 'utf8',
|
||
})
|
||
.trim()
|
||
.split('\n')
|
||
.filter(Boolean)
|
||
const bySlug = Object.fromEntries(rows.map((line) => line.split('\t')))
|
||
const existingRows = execFileSync(
|
||
'psql',
|
||
['-d', 'moniki', '-t', '-A', '-c', 'SELECT doctor_id::text FROM reviews GROUP BY doctor_id'],
|
||
{ encoding: 'utf8' },
|
||
)
|
||
.trim()
|
||
.split('\n')
|
||
.filter(Boolean)
|
||
const doctorsWithReviews = new Set(existingRows)
|
||
|
||
const statements: string[] = ['BEGIN;']
|
||
let created = 0
|
||
|
||
for (const [slug, items] of Object.entries(reviewsBySlug)) {
|
||
const doctorId = bySlug[slug]
|
||
if (!doctorId) {
|
||
console.log('skip missing doctor', slug)
|
||
continue
|
||
}
|
||
if (doctorsWithReviews.has(doctorId)) {
|
||
console.log('already has reviews', slug)
|
||
continue
|
||
}
|
||
for (const item of items) {
|
||
const createdAt = new Date()
|
||
createdAt.setDate(createdAt.getDate() - item.daysAgo)
|
||
statements.push(`
|
||
WITH inserted AS (
|
||
INSERT INTO reviews (doctor_id, author_name, rating, is_published, created_at, updated_at)
|
||
VALUES (${doctorId}, ${sqlString(item.authorName)}, ${item.rating}, true, ${sqlString(createdAt.toISOString())}, now())
|
||
RETURNING id
|
||
)
|
||
INSERT INTO reviews_locales (comment, _locale, _parent_id)
|
||
SELECT ${sqlString(item.comment)}, 'ru', id FROM inserted;
|
||
`)
|
||
created += 1
|
||
}
|
||
console.log(slug, items.length)
|
||
}
|
||
|
||
statements.push(`
|
||
UPDATE doctors d SET
|
||
reviews_count = stats.cnt,
|
||
rating = stats.avg
|
||
FROM (
|
||
SELECT doctor_id, COUNT(*)::numeric AS cnt, ROUND(AVG(rating)::numeric, 1) AS avg
|
||
FROM reviews
|
||
WHERE is_published = true
|
||
GROUP BY doctor_id
|
||
) stats
|
||
WHERE d.id = stats.doctor_id;
|
||
COMMIT;
|
||
`)
|
||
|
||
execFileSync('psql', ['-d', 'moniki', '-v', 'ON_ERROR_STOP=1'], {
|
||
input: statements.join('\n'),
|
||
encoding: 'utf8',
|
||
stdio: ['pipe', 'inherit', 'inherit'],
|
||
})
|
||
|
||
console.log('reviews created', created)
|
||
process.exit(0)
|
||
}
|
||
|
||
main().catch((err) => {
|
||
console.error(err)
|
||
process.exit(1)
|
||
})
|