219 lines
9.1 KiB
Markdown
219 lines
9.1 KiB
Markdown
|
|
# Лог сессии: Создание PDF отчётов с графиками
|
|||
|
|
**Дата:** 28 октября 2025, 00:00 - 00:30
|
|||
|
|
**Регион:** Орловская область
|
|||
|
|
**Задача:** Генерация пресс-релиза в формате PDF с графиками и заключением
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎯 Цель
|
|||
|
|
Создать красивый PDF отчёт с графиками и заключением по результатам аудита гостиничной индустрии Орловской области для использования в пресс-релизах и презентациях.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📊 Исходные данные
|
|||
|
|
- **Регион:** Орловская область
|
|||
|
|
- **Всего действующих отелей:** 64
|
|||
|
|
- **Проведено аудитов:** 29
|
|||
|
|
- **Средний балл соответствия:** 42.1%
|
|||
|
|
- **Отелей с сайтами:** 29 (100%)
|
|||
|
|
- **Отелей с баллом ≥50%:** 7 (24.1%)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## ✅ Выполненные задачи
|
|||
|
|
|
|||
|
|
### 1. Анализ требований (00:00)
|
|||
|
|
- Пользователь запросил пресс-релиз с графиками и заключением
|
|||
|
|
- Определены требования: Excel + PDF с визуализацией
|
|||
|
|
|
|||
|
|
### 2. Создание генератора PDF (00:05-00:15)
|
|||
|
|
**Файл:** `create_pdf_report.py`
|
|||
|
|
|
|||
|
|
**Функционал:**
|
|||
|
|
- Подключение к PostgreSQL БД
|
|||
|
|
- Сбор статистики по аудиту
|
|||
|
|
- Генерация 3 типов графиков через matplotlib:
|
|||
|
|
1. **Pie chart** — распределение отелей по баллам соответствия
|
|||
|
|
2. **Bar chart** — топ-10 критериев (найдено/не найдено)
|
|||
|
|
3. **Summary bar chart** — общая статистика аудита
|
|||
|
|
|
|||
|
|
**Структура PDF:**
|
|||
|
|
- Титульная страница
|
|||
|
|
- Введение с описанием аудита
|
|||
|
|
- Основные результаты (статистика)
|
|||
|
|
- График 1: Распределение по баллам
|
|||
|
|
- Топ-5 успешных критериев
|
|||
|
|
- Топ-5 проблемных критериев
|
|||
|
|
- График 2: Детализация по критериям
|
|||
|
|
- График 3: Сводная статистика
|
|||
|
|
- Заключение с выводами
|
|||
|
|
|
|||
|
|
### 3. Проблема с кириллицей (00:20)
|
|||
|
|
**Проблема:**
|
|||
|
|
- Helvetica (стандартный шрифт reportlab) не поддерживает кириллицу
|
|||
|
|
- Текст отображался как чёрные прямоугольники
|
|||
|
|
|
|||
|
|
**Решение:**
|
|||
|
|
- Подключены системные шрифты DejaVu Sans/DejaVu Serif
|
|||
|
|
- Путь: `/usr/share/fonts/truetype/dejavu/`
|
|||
|
|
- Зарегистрированы через `pdfmetrics.registerFont(TTFont(...))`
|
|||
|
|
- Обновлены все стили на DejaVu шрифты
|
|||
|
|
|
|||
|
|
**Код:**
|
|||
|
|
```python
|
|||
|
|
pdfmetrics.registerFont(TTFont('DejaVuSans', '/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf'))
|
|||
|
|
pdfmetrics.registerFont(TTFont('DejaVuSans-Bold', '/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf'))
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 4. Генерация отчётов (00:25)
|
|||
|
|
**Созданы файлы:**
|
|||
|
|
1. `experimental_report_20251027_235235.xlsx` — Excel (47 KB)
|
|||
|
|
- Дашборд с графиками
|
|||
|
|
- Детальная таблица по 29 отелям
|
|||
|
|
- 18 критериев в горизонтальном формате
|
|||
|
|
|
|||
|
|
2. `audit_report_orel_20251028_003022.pdf` — PDF (259 KB, 5 страниц)
|
|||
|
|
- Шрифт DejaVu Sans с кириллицей
|
|||
|
|
- 3 графика высокого разрешения (150 DPI)
|
|||
|
|
- Профессиональное оформление
|
|||
|
|
|
|||
|
|
### 5. Отправка в Git (00:30)
|
|||
|
|
**Commit:** `54e2206`
|
|||
|
|
```
|
|||
|
|
✨ Добавлен генератор PDF отчетов с графиками и поддержкой кириллицы
|
|||
|
|
|
|||
|
|
- Создан create_pdf_report.py для генерации PDF отчётов
|
|||
|
|
- Поддержка кириллицы через DejaVu Sans шрифты
|
|||
|
|
- 3 типа графиков: распределение по баллам, топ-10 критериев, общая статистика
|
|||
|
|
- Отчёт для Орловской области: 259KB, 5 страниц
|
|||
|
|
- Обновлен create_horizontal_report.py
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Отправлено в Gitea:**
|
|||
|
|
- `create_pdf_report.py` (новый)
|
|||
|
|
- `audit_report_orel_20251028_003022.pdf` (новый)
|
|||
|
|
- `create_horizontal_report.py` (обновлён)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📈 Статистика по критериям
|
|||
|
|
|
|||
|
|
### Топ-5 успешных критериев
|
|||
|
|
1. Юридическая идентификация и верификация
|
|||
|
|
2. Адрес
|
|||
|
|
3. Контакты
|
|||
|
|
4. Цены/прайс
|
|||
|
|
5. Способы оплаты
|
|||
|
|
|
|||
|
|
### Топ-5 проблемных критериев
|
|||
|
|
1. Актуальность документов
|
|||
|
|
2. Уголок потребителя
|
|||
|
|
3. Команда/сотрудники
|
|||
|
|
4. Партнеры/бренды
|
|||
|
|
5. Доступность для ЛОВЗ
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🛠 Технические детали
|
|||
|
|
|
|||
|
|
### Используемые библиотеки
|
|||
|
|
```python
|
|||
|
|
psycopg2 # Подключение к PostgreSQL
|
|||
|
|
matplotlib 3.6.3 # Генерация графиков
|
|||
|
|
reportlab # Создание PDF
|
|||
|
|
Pillow # Обработка изображений
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Алгоритм генерации
|
|||
|
|
1. Подключение к БД и загрузка данных
|
|||
|
|
2. Анализ критериев и подсчёт статистики
|
|||
|
|
3. Генерация графиков в PNG (temp_chart1/2/3.png)
|
|||
|
|
4. Сборка PDF через reportlab platypus
|
|||
|
|
5. Удаление временных файлов
|
|||
|
|
|
|||
|
|
### Особенности реализации
|
|||
|
|
- Автоматическое определение путей через `os.path.dirname(os.path.abspath(__file__))`
|
|||
|
|
- Безопасная очистка временных файлов после создания PDF
|
|||
|
|
- Динамическая генерация контента на основе БД
|
|||
|
|
- Цветовое кодирование: зелёный (успех), жёлтый (средне), красный (проблема)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📁 Структура файлов
|
|||
|
|
|
|||
|
|
### Генераторы отчётов
|
|||
|
|
- `create_horizontal_report.py` — универсальный генератор Excel (для любого региона)
|
|||
|
|
- `create_pdf_report.py` — генератор PDF с графиками (NEW)
|
|||
|
|
|
|||
|
|
### Отчёты
|
|||
|
|
- `experimental_report_20251027_235235.xlsx` — Excel для Орловской области
|
|||
|
|
- `audit_report_orel_20251028_003022.pdf` — PDF для Орловской области
|
|||
|
|
|
|||
|
|
### Утилиты
|
|||
|
|
- `audit_orel_to_excel.py` — запуск аудита через n8n webhook
|
|||
|
|
- `check_db.py` — проверка статистики в БД
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎨 Дизайн PDF
|
|||
|
|
|
|||
|
|
### Цветовая схема
|
|||
|
|
- **Заголовки:** #1f4788 (тёмно-синий)
|
|||
|
|
- **Подзаголовки:** #2c5aa0 (синий)
|
|||
|
|
- **Акценты:** #4a90e2 (голубой)
|
|||
|
|
- **Текст:** #333333 (тёмно-серый)
|
|||
|
|
|
|||
|
|
### Графики
|
|||
|
|
- **0-25%:** #ff6b6b (красный)
|
|||
|
|
- **26-50%:** #ffa726 (оранжевый)
|
|||
|
|
- **51-75%:** #66bb6a (зелёный)
|
|||
|
|
- **76-100%:** #42a5f5 (синий)
|
|||
|
|
|
|||
|
|
### Размеры
|
|||
|
|
- **Формат:** A4 (210×297 мм)
|
|||
|
|
- **Отступы:** 72pt (2.54 см)
|
|||
|
|
- **Шрифт заголовка:** 20pt DejaVuSans-Bold
|
|||
|
|
- **Шрифт текста:** 11pt DejaVuSans
|
|||
|
|
- **Разрешение графиков:** 150 DPI
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 💡 Выводы и рекомендации
|
|||
|
|
|
|||
|
|
### Положительные результаты
|
|||
|
|
- 100% отелей имеют рабочие сайты
|
|||
|
|
- Высокий уровень юридической идентификации
|
|||
|
|
- Хорошая доступность контактной информации
|
|||
|
|
|
|||
|
|
### Области для улучшения
|
|||
|
|
- Актуализация документов на сайтах
|
|||
|
|
- Внедрение уголка потребителя
|
|||
|
|
- Информация о сотрудниках и команде
|
|||
|
|
- Партнёрская информация
|
|||
|
|
- Доступность для маломобильных групп
|
|||
|
|
|
|||
|
|
### Средний балл 42.1%
|
|||
|
|
Указывает на необходимость дальнейшей работы по совершенствованию доступности информации для гостей.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔗 Ссылки
|
|||
|
|
- **Gitea:** http://147.45.146.17:3002/negodiy/hotels
|
|||
|
|
- **Commit:** 54e2206
|
|||
|
|
- **БД:** 147.45.189.234:5432/default_db
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📝 Примечания
|
|||
|
|
- PDF файл подготовлен для печати и презентаций
|
|||
|
|
- Все данные актуальны на момент формирования отчёта
|
|||
|
|
- Шрифты DejaVu обеспечивают корректное отображение кириллицы
|
|||
|
|
- Графики сохраняются в высоком разрешении для качественной печати
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**Статус:** ✅ Завершено
|
|||
|
|
**Время выполнения:** ~30 минут
|
|||
|
|
**Результат:** 2 файла отчётов (Excel + PDF) готовы к публикации
|
|||
|
|
|