- Добавлены функции to_local() и fmt_local() - Время рассылок теперь 17:55 вместо 13:55 - Время прочтений в локальном поясе - Время запланированных постов исправлено - Время дайджестов исправлено Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
9.3 KiB
9.3 KiB
Спецификация V3.1 - Умная рассылка + Еженедельный дайджест
Дата: 6 апреля 2026 г.
Статус: В разработке
Версия: 3.1
📢 Умная рассылка с прочтением
Архитектура
Новые таблицы БД:
-
broadcast— рассылкиid(PK)message_id(Telegram message ID)chat_idtext(текст рассылки)photo_file_id(опционально)sent_at(timestamp)sent_by(admin user ID)total_sent(количество получателей)has_read_button(boolean — показывать ли кнопку "Прочитал")is_reminder_sent(было ли напоминание)created_at
-
broadcast_read— кто прочиталid(PK)broadcast_id(FK → broadcast)user_id(FK → users)read_at(timestamp)
Функционал
В Telegram:
- Рассылка с inline-кнопкой "✅ Прочитал"
- При нажатии — обновляется статус в БД
- Кнопка меняется на "✅ Прочитано" (неактивная)
В веб-панели:
- Список всех рассылок
- Статистика: отправлено / прочитано / не прочитано
- Кнопка "Показать кто прочитал"
- Кнопка "Показать кто НЕ прочитал"
- Кнопка "⚠️ Отправить напоминание непрочитавшим"
- Создание новой рассылки с опцией "Добавить кнопку прочтения"
Команды
/broadcast— создать рассылку (админ)/broadcast_stats <id>— статистика по рассылке
📰 Еженедельный дайджест
Архитектура
Новые таблицы БД:
digest— дайджестыid(PK)period_start(начало периода, дата)period_end(конец периода, дата)week_number(номер недели)year(год)content(JSON с данными дайджеста)status— 'draft' | 'pending_approval' | 'approved' | 'rejected' | 'sent'message_id(ID сообщения в Telegram, если отправлен)created_at(автогенерация)approved_atapproved_by(admin ID)sent_atrejected_byrejection_reason(причина отклонения)
Генерация контента
Автоматический сбор данных (воскресенье 09:00):
- События за неделю (из таблицы events)
- Активные опросы (из polls)
- Новые объявления (из ads)
- Топ-5 активных жильцов (из users по rating)
- Запланированные отключения (из schedule на следующую неделю)
- Новые верификации (из verification_requests)
- Статистика: всего сообщений, активных пользователей
Формирование текста:
digest_text = f"""
📰 ДАЙДЖЕСТ ДОМА ЗА НЕДЕЛЮ ({period_start} - {period_end})
🔔 События:
{events_list}
📊 Опросы:
{polls_list}
📢 Объявления: {ads_count} новых
🏆 Активные жильцы:
{top_users}
⏰ На следующей неделе:
{schedule_list}
📈 Статистика:
• Сообщений в чате: {messages_count}
• Активных жильцов: {active_users}
• Новых верификаций: {new_verifications}
"""
Процесс утверждения
Автоматический workflow:
-
Воскресенье 09:00 — бот генерирует дайджест
-
Сохраняет в БД со статусом
pending_approval -
Отправляет АДМИНУ в личку превью дайджеста:
📰 Дайджест за неделю готов! [Просмотреть в веб-панели] Статус: ⏳ Ожидает утверждения -
Админ заходит в веб-панель, видит:
┌─────────────────────────────────────┐ │ 📰 Дайджест за 30.03 - 06.04 │ │ Статус: ⏳ Ожидает утверждения │ ├─────────────────────────────────────┤ │ [Предпросмотр текста] │ │ │ │ [✅ Утвердить и отправить] │ │ [❌ Отклонить] │ │ [✏️ Редактировать текст] │ └─────────────────────────────────────┘ -
Если утвердил:
- Статус →
approved→sent - Бот рассылает ВСЕМ верифицированным жильцам
- В веб-панели: "✅ Отправлен в 14:32"
- В чат (опционально): "📰 Дайджест за неделю опубликован!"
- Статус →
-
Если отклонил:
- Статус →
rejected - Можно указать причину
- В БД сохраняется (история)
- Статус →
Хранение и архив
В веб-панели раздел "Архив дайджестов":
📰 Архив дайджестов
Фильтры: [За неделю] [За месяц] [За квартал] [За год] [Все]
┌──────┬──────────────┬──────────┬────────────┐
│ Нед │ Период │ Статус │ Отправлен │
├──────┼──────────────┼──────────┼────────────┤
│ #14 │ 30.03-06.04 │ ✅ Отпр │ 06.04 14:32│
│ #13 │ 23.03-29.03 │ ✅ Отпр │ 29.03 10:15│
│ #12 │ 16.03-22.03 │ ❌ Откл │ - │
│ ... │ ... │ ... │ ... │
└──────┴──────────────┴──────────┴────────────┘
[Экспорт в PDF] [Экспорт в CSV]
Генерация дайджеста за период:
- Квартальный: сумма недельных дайджестов
- Полугодовой: агрегация
- Годовой: полная статистика + тренды
Настройки в веб-панели
⚙️ Настройки дайджеста
[✓] Включить автоматическую генерацию
День недели: [Воскресенье ▼]
Время генерации: [09:00]
Время отправки (после утверждения): [10:00]
Содержимое:
[✓] События
[✓] Опросы
[✓] Объявления
[✓] Топ активных жильцов
[✓] Запланированные отключения
[✓] Статистика чата
[✓] Новые верификации
Дополнительно:
[✓] Отправлять превью админу
[ ] Публиковать автоматически (без утверждения)
[✓] Сохранять в архив
План реализации
Этап 1: База данных
- Модель Broadcast
- Модель BroadcastRead
- Модель Digest
- Миграция БД
Этап 2: Умная рассылка
- Handler /broadcast
- Inline кнопки "Прочитал"
- Callback обработчики
- Веб-панель: список рассылок
- Веб-панель: статистика
- Веб-панель: создание рассылки
- Напоминания непрочитавшим
Этап 3: Дайджест
- Сервис генерации контента
- APScheduler задача (воскресенье 09:00)
- Уведомление админу
- Веб-панель: утверждение/отклонение
- Веб-панель: редактирование текста
- Веб-панель: архив дайджестов
- Рассылка после утверждения
- Настройки дайджеста
Этап 4: Интеграция
- Обновить веб-сервер (новые роуты)
- Обновить меню админа
- Документация
Технические детали
Используемые технологии
- SQLAlchemy модели (async)
- aiogram inline keyboards
- APScheduler (cron trigger)
- FastAPI endpoints
- Jinja2 templates
Совместимость
- Не ломает существующий функционал
- Миграция БД обратима
- Feature flags для включения/выключения