6.7 KiB
Handoff: миграция отчётов на Domain-архитектуру
Дата: 2026-04-26
Что уже сделано
1. Базовый каркас Domain / Application / Infrastructure
Добавлены новые слои:
app/Domain/Reportsapp/Application/Reportsapp/Infrastructure/Reports
Ключевые элементы:
Domain/Reports/ValueObjects/MetrikaConfigDomain/Reports/Models/ReportSnapshotDomain/Reports/Contracts/*Application/Reports/DTO/*Application/Reports/GenerateReportUseCaseApplication/Reports/CompareLegacyAndNewReportUseCaseInfrastructure/Reports/Repositories/EloquentReportRepositoryInfrastructure/Reports/Adapters/LegacyReportServiceAdapterInfrastructure/Reports/Logging/ReportsAuditLogger
2. Save-path уже переведён на strangler-схему
Новый save-flow работает рядом со старым кодом:
- старый
ReportServiceне удалён - новый путь включается через feature-flag
- legacy остаётся fallback
- сравнение old/new идёт через comparator и audit logger
Точки входа уже знают про новый flow:
app/Http/Controllers/Web/ReportController.phpapp/Http/Controllers/Api/ReportController.phpapp/Services/AutoReportService.php
3. Вынесена существенная часть persistence и orchestration
Из ReportService уже выделены:
Infrastructure/Reports/Services/ReportStorageServiceInfrastructure/Reports/Services/ReportMetricsFinalizerInfrastructure/Reports/Services/CalculatedMetricsSynchronizerInfrastructure/Reports/Services/SnapshotPersistenceServiceInfrastructure/Reports/Services/AutoFillReportPayloadBuilder
4. Вынесены источники данных
Сейчас выделены отдельные источники:
Infrastructure/Reports/Sources/MisPatientSourceInfrastructure/Reports/Sources/SpecialPatientSourceInfrastructure/Reports/Sources/SnapshotPatientSourceInfrastructure/Reports/Sources/MisClinicalDataSourceInfrastructure/Reports/Sources/LegacyAutoFillPatientSource
5. Вынесены Domain-calculators
Сейчас в Domain уже есть:
BedDaysCalculatorPreoperativeDaysCalculatorDepartmentLoadCalculator
6. Read-path пациентов тоже вынесен
Добавлены:
Infrastructure/Reports/Services/ReportPatientsReadServiceInfrastructure/Reports/Services/ReportReadContextResolver
Теперь ReportService уже делегирует туда:
getPatientsByStatusgetPatientsCountByStatusgetPatientsCountsMapgetPatientsFromSnapshots
Это важный шаг: ReportService постепенно становится legacy facade, а не местом, где живёт вся логика.
Что ещё специально НЕ сделано
- старый код не удалён
- полный cutover на новую архитектуру не выполнен
getReportStatisticsпока ещё остаётся внутриReportService- часть legacy read/statistics логики ещё не вынесена в отдельный infrastructure/application слой
- integration tests на SQLite здесь не гонялись, потому что в окружении нет
pdo_sqlite
Проверки и тесты
Проходит:
php artisan test tests/Unit/Reports
Сейчас зелёные unit-тесты для:
MetrikaConfigReportSnapshotGenerateReportUseCaseCompareLegacyAndNewReportUseCaseReportInputFactoryReportPatientsReadService- domain calculators
Важный контекст по БД и тестам
Основное приложение работает с pgsql из .env, но тесты не обязаны использовать это окружение.
Важно:
- в
phpunit.xmlтестовый runtime жёстко переключён наsqlite - в текущем окружении отсутствует
pdo_sqlite - поэтому feature/integration тесты здесь не были полноценно прогнаны
Если завтра нужно будет запускать integration-тесты на PostgreSQL, надо отдельно переводить test-конфиг.
Дополнительные важные замечания
1. В worktree есть изменённые файлы
Нужно быть осторожным и не перетирать чужие правки.
Особенно внимательно смотреть на:
app/Http/Controllers/Api/ReportController.phpapp/Services/ReportService.phpapp/Services/Reports/PatientQueryBuilder.php
2. Есть защитный фикс в конфиге Excel
Ранее был добавлен безопасный guard в config/excel.php, чтобы bootstrap не падал, если в окружении нет нужных excel-классов.
3. Комментарии в новом слое частично русифицированы
Русифицированы PHPDoc в основных новых infrastructure/application классах миграции. При желании можно отдельным проходом довести до конца все новые DTO, адаптеры и domain models.
Самый логичный следующий шаг
Следующая итерация:
- Вынести
getReportStatisticsизReportServiceв отдельный read-service. - Затем вынести snapshot/replica statistics orchestration в новый infrastructure/application слой.
- После этого ещё сильнее сузить
ReportServiceдо legacy facade.
Рекомендуемое направление:
- создать что-то вроде
Infrastructure/Reports/Services/ReportStatisticsReadService - перевести туда:
getStatisticsFromSnapshotsgetStatisticsFromReplica- вспомогательные read-context части, если они ещё не покрыты
ReportReadContextResolver
Если нужно быстро продолжить завтра
Сначала открыть:
docs/report-domain-migration-handoff.mdapp/Services/ReportService.phpapp/Infrastructure/Reports/Services/ReportPatientsReadService.phpapp/Infrastructure/Reports/Services/ReportReadContextResolver.php
Потом проверить:
php artisan test tests/Unit/Reports
И дальше брать следующий шаг:
- перенос
getReportStatisticsв отдельный сервис