Add feedback system functionality

- Implement feedback management system in admin interface
- Add feedback processing and AI-based features
- Update user interface with new feedback components
- Modify server-side API endpoints for feedback handling
- Enhance worker.js for background feedback processing
- Update deployment configuration for feedback components

Co-authored-by: openhands <openhands@all-hands.dev>
This commit is contained in:
dev
2026-10-06 13:10:14 +03:00
co-authored by openhands
parent a3169648f3
commit 98f24faaaf
13 changed files with 1717 additions and 31 deletions
+53 -1
View File
@@ -460,6 +460,32 @@ INSERT INTO settings (key, value) VALUES ('lesson_ai_prompt', 'Ты — реда
ON CONFLICT (key) DO NOTHING;
INSERT INTO settings (key, value) VALUES ('notify_lesson_ai_formatted', 'false')
ON CONFLICT (key) DO NOTHING;
INSERT INTO settings (key, value) VALUES ('feedback_ai_enabled','true') ON CONFLICT (key) DO NOTHING;
INSERT INTO settings (key, value) VALUES ('feedback_ai_prompt','Ты — помощник по написанию коротких деловых отзывов тьютора детской IT-школы.
ЗАДАЧА: Сформируй короткий, ёмкий, деловой отзыв по итогам занятия. По стилю он должен быть близок к «короткому сообщению для обратной связи»: 1–3 предложения, без воды, конкретно по делу.
КОНТЕКСТ, КОТОРЫЙ ТЫ ПОЛУЧИШЬ:
- Группа: ...
- Дата занятия: ...
- Резидент: ...
- Тема занятия: ...
- Позиция темы: ... (если есть)
- Прошлый отзыв: ... (если есть)
- Короткие сообщения (выбраны): список в формате "дата – тема – сообщение"
ПРАВИЛА:
- Пиши только отзыв. Без заголовков, списков, markdown, подписей и пояснений.
- Не упоминай группу, дату, время занятия в тексте отзыва.
- Не начинай со слов «Сегодня», «Вчера», «На занятии», «В ходе занятия», если они избыточны.
- Опирайся на факты из контекста: тема занятия, выбранные короткие сообщения и прошлый отзыв (если есть).
- Сохраняй деловой, спокойный тон. Без оценок типа «отлично», «замечательно», избегай шаблонных «молодец».
- Максимально кратко: 1–2 предложения. Если хватает одного — лучше одно.
- Не оборачивай ответ в кавычки.
- Не придумывай фактов, которых нет в контексте.
ФОРМАТ ОТВЕТА: только текст отзыва, без лишних элементов.') ON CONFLICT (key) DO NOTHING;
INSERT INTO settings (key, value) VALUES ('notify_feedback_ai_ready','false') ON CONFLICT (key) DO NOTHING;
CREATE TABLE IF NOT EXISTS short_messages (
id SERIAL PRIMARY KEY,
@@ -476,7 +502,33 @@ CREATE TABLE IF NOT EXISTS short_messages (
updated_at TIMESTAMPTZ DEFAULT now()
);
CREATE INDEX IF NOT EXISTS idx_short_messages_date ON short_messages(lesson_date DESC);
CREATE INDEX IF NOT EXISTS idx_short_messages_deleted ON short_messages(deleted_at);
CREATE INDEX IF NOT EXISTS idx_short_messages_date ON short_messages(lesson_date DESC);
INSERT INTO settings (key, value) VALUES ('short_messages_retention_days', '365') ON CONFLICT (key) DO NOTHING;
-- Обратная связь (отзывы тьютора)
CREATE TABLE IF NOT EXISTS feedbacks (
id SERIAL PRIMARY KEY,
feedback_date DATE NOT NULL,
group_id INT NOT NULL REFERENCES groups(id) ON DELETE CASCADE,
resident VARCHAR(200) NOT NULL,
topic VARCHAR(500),
past_review TEXT,
short_message_ids INT[] DEFAULT '{}'::int[],
text TEXT NOT NULL DEFAULT '',
ai_status VARCHAR(20) NOT NULL DEFAULT 'none',
ai_checked_at TIMESTAMPTZ,
ai_error TEXT,
ai_profile VARCHAR(100),
sent_at TIMESTAMPTZ,
author_id INT REFERENCES users(id) ON DELETE SET NULL,
branch_id INT REFERENCES branches(id) ON DELETE SET NULL,
deleted_at TIMESTAMPTZ,
purge_at TIMESTAMPTZ,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
CREATE INDEX IF NOT EXISTS idx_feedbacks_date ON feedbacks(feedback_date DESC);
CREATE INDEX IF NOT EXISTS idx_feedbacks_deleted ON feedbacks(deleted_at);
CREATE INDEX IF NOT EXISTS idx_feedbacks_pending ON feedbacks(ai_status, id);