v1.7.0
minor от 26.09.2026
Задание 131. Уведомления: 4 уровня критичности, YouTube-чтение, настройки пользователя, почта и Telegram — без тысяч записей
4 уровня критичности
- 1 Информация — произошло событие: перемещение товара, добавлен товар в каталог
- 2 Внимание — проактивная защита «что-то не так»: вход пользователя, низкий остаток, лид веб-чата
- 3 Важное — привезли/увезли товар, создан новый пользователь, итог импорта данных
- 4 Критично — система упала, ошибка: глобальное уведомление, приходит всем, скрыть нельзя
YouTube-семантика чтения
- Открыл список в колокольчике — показанные уведомления автоматически помечены прочитанными
- Кликнул строку — отмечено прочитанным + переход к событию (related_url)
- Кнопок «прочитано» нет — циферка убавляется при просмотре, как в YouTube
- Логирование — таблица notification_recipients.viewed_at: кто и когда посмотрел (система и ИИ-агент видят)
Настройки и каналы
- Per-user — Настройки → Уведомления: пользователь включает/выключает уровни 1–3 (таблица user_notification_settings)
- Email — важные (3+) и критические уведомления пишутся администратору на почту
- Telegram — Bot Token и Chat ID администратора: важные события; критичные уходят всегда, если интеграция настроена
Агрегация вместо тысяч записей
- group_key + окно — одинаковые события внутри окна схлопываются в одну запись с счётчиком «×N»
- Импорт XLSX (222 движения) — одно сводное уведомление об импорте, наблюдатели на время импорта отключены
- Не 1525 и не «каждое движение» — за день 1–5…20 событий, как нужно
Реализация
- Таблицы — platform_notifications (уровни, категории, источники, group_key, occurrences), notification_recipients (viewed_at), user_notification_settings
- App\Services\NotificationService — единый notify(): уровни, агрегация, маршрутизация по настройкам, каналы, markViewed
- App\Livewire\NotificationBell — колокольчик в шапке панели (renderHook TOPBAR_END)
- /admin/notifications — таблица с цветными бейджами уровней, авто-чтение кликом, переход к событию
- Версия платформы — 1.6.2 → 1.7.0 (config/app.php, config/instances.php, versions.json)
← Ко всем версиям