6.3 KiB
6.3 KiB
title
| title |
|---|
| Синхронизация врачей и отзывов (Backend) |
Сценарий 4.1: Синхронизация врачей и отзывов (Infoclinica + Bitrix)
Бизнес-цель
Актуализировать справочники backend из внешних систем:
- Список врачей из Инфоклиники загружается и складывается в PostgreSQL (сущность
Idoctor— staging/интеграционная модель). - Нормализация признаков
Specialistиз Bitrix-related данных (командаbitrix-update-doctors— очисткаdcodes). - Отзывы подтягиваются из MySQL Bitrix через
BitrixServiceи сохраняются какReview, связанные сSpecialist.
Точки входа
| Тип | Имя команды Symfony | Класс |
|---|---|---|
| CLI | upload:doctors |
UploadDoctorsCommand |
| CLI | bitrix-update-doctors |
BitrixUpdateDoctorsCommand |
| CLI | bitrix-update-reviews |
BitrixUpdateReviewsCommand |
Все три предназначены для cron или ручного запуска в контейнере php84.
Сценарий A — upload:doctors (Инфоклиника → Idoctor)
Алгоритм
- Читает активные отделения из PostgreSQL (
Department, опция--departmentдля одногоdid). - Для каждого отделения в цикле вызывает HTTP через клиент Инфоклиники:
GET /specialists/doctors?departments={did}&onlineMode={0|1}&firstrow=&lastrow=чанками (CHUNK_SIZE300). - Для каждого врача определяется ключ
"{dcode}_{departmentId}_{onlineMode}", подгружаются существующиеIdoctorтем же ключом. updateDoctorEntityобновляет поля (dcode,name,department,filial,nearestDate,onlineMode),persist, пакетныйflushкаждыеBATCH_SIZE(150).- Между отделениями —
sleep(1); между чанками —usleep(200000).
«Конфликты»
Явного SQL ON CONFLICT нет: используется ORM upsert-паттерн — найти сущность по составному ключу в PHP или создать new Idoctor(), затем persist.
Сценарий B — bitrix-update-doctors (PostgreSQL Specialist)
Алгоритм
- Загружает все
Specialistиз БД. - Нормализует строку
dcodes: для каждого врача фильтрует коды длиной ≥ 7, отбрасывает'0', пустые наборы превращает вnull. flushодин раз в конце.- Обращение к
BitrixServiceдляkodoperзакомментировано в текущей версии файла.
Это не загрузка врачей из Bitrix, а офлайн-очистка данных в уже существующей таблице specialist.
Сценарий C — bitrix-update-reviews (MySQL Bitrix → PostgreSQL Review)
Алгоритм
- Постранично обходит
Specialistбатчами по 5 записей. - Для каждого врача
BitrixService::getReviews($specialist->getId()):- читает связанные элементы инфоблоков в MySQL (
doctrine.dbal.mysql_connection); - для каждого отзыва известен
REVIEW_ID.
- читает связанные элементы инфоблоков в MySQL (
- В PostgreSQL ищется
Reviewс тем жеexternalId; если нет —new Review()+setExternalId. - Поля текста, рейтинга, автора, даты, активности заполняются из структуры Bitrix (включая «распаковку» сериализованных полей в
getReviews). - Неактивные или без текста — пропуск.
$specialist->addReview($review),flush; при ошибке драйвера — логирование проблемных UTF-8 последовательностей.
«Конфликты»
Снова без ON CONFLICT: идемпотентность за счёт поиска по externalId перед вставкой.
Mermaid
flowchart LR
subgraph MIS["Инфоклиника"]
API["GET /specialists/doctors"]
end
subgraph PG["PostgreSQL"]
ID["Idoctor"]
SP["Specialist"]
RV["Review"]
end
subgraph BX["Bitrix MySQL"]
IB["Инфоблоки отзывов"]
end
UC["upload:doctors"] --> API
API --> ID
BD["bitrix-update-doctors"] --> SP
BR["bitrix-update-reviews"] --> IB
BR --> RV
RV --> SP
Узлы UC / BD / BR — это команды upload:doctors, bitrix-update-doctors, bitrix-update-reviews.
Внешние зависимости
| Система | Сценарий |
|---|---|
| Инфоклиника HTTP | upload:doctors |
| PostgreSQL | все три команды |
| Bitrix MySQL | bitrix-update-reviews (и потенциально расширения BitrixService) |
Обработка ошибок и edge cases
- Сетевые ошибки загрузки врачей — warning в консоли, переход к следующему чанку/отделению.
- Проблемные отзывы —
DriverExceptionлогируется с дампом полей. BitrixServiceзависит отregionIdв некоторых методах — убедитесь, что выставление региона покрыто в вашем окружении при расширении команды.
Ссылки на классы
apps/backend/src/Command/UploadDoctorsCommand.phpapps/backend/src/Command/BitrixUpdateDoctorsCommand.phpapps/backend/src/Command/BitrixUpdateReviewsCommand.phpapps/backend/src/Service/Bitrix/BitrixService.phpapps/backend/src/Entity/Idoctor.php,Specialist.php,Review.php
См. backend-ddd.md и data-model.md.