From 80e0cb5272dbbef571076af441c5ff3fcae5cda2 Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 4 Jun 2025 18:39:53 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B2=D0=B0=D1=88=D0=B5=20=D1=81=D0=BE=D0=BE?= =?UTF-8?q?=D0=B1=D1=89=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BA=D0=BE=D0=BC=D0=BC?= =?UTF-8?q?=D0=B8=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../032_create_is_rag_source_table.sql | 11 ++ ...33_add_is_rag_source_id_to_user_tables.sql | 2 + backend/routes/chat.js | 48 ++++---- backend/routes/tables.js | 17 +-- .../components/tables/CreateTableModal.vue | 111 ----------------- .../components/tables/DynamicTablesModal.vue | 101 ---------------- .../src/components/tables/UserTableView.vue | 24 +++- .../src/components/tables/UserTablesList.vue | 19 +-- frontend/src/router/index.js | 28 +++++ frontend/src/views/CrmView.vue | 8 +- .../views/settings/AiAssistantSettings.vue | 27 ++++- frontend/src/views/tables/CreateTableView.vue | 111 +++++++++++++++++ frontend/src/views/tables/DeleteTableView.vue | 58 +++++++++ frontend/src/views/tables/EditTableView.vue | 81 +++++++++++++ frontend/src/views/tables/TableView.vue | 112 ++++++++++++++++++ frontend/src/views/tables/TablesListView.vue | 11 ++ 16 files changed, 504 insertions(+), 265 deletions(-) create mode 100644 backend/db/migrations/032_create_is_rag_source_table.sql create mode 100644 backend/db/migrations/033_add_is_rag_source_id_to_user_tables.sql delete mode 100644 frontend/src/components/tables/CreateTableModal.vue delete mode 100644 frontend/src/components/tables/DynamicTablesModal.vue create mode 100644 frontend/src/views/tables/CreateTableView.vue create mode 100644 frontend/src/views/tables/DeleteTableView.vue create mode 100644 frontend/src/views/tables/EditTableView.vue create mode 100644 frontend/src/views/tables/TableView.vue create mode 100644 frontend/src/views/tables/TablesListView.vue diff --git a/backend/db/migrations/032_create_is_rag_source_table.sql b/backend/db/migrations/032_create_is_rag_source_table.sql new file mode 100644 index 0000000..81b8d8c --- /dev/null +++ b/backend/db/migrations/032_create_is_rag_source_table.sql @@ -0,0 +1,11 @@ +-- Создание справочной таблицы is_rag_source +CREATE TABLE IF NOT EXISTS is_rag_source ( + id SERIAL PRIMARY KEY, + name VARCHAR(64) NOT NULL UNIQUE +); + +-- Заполнение начальными значениями +INSERT INTO is_rag_source (name) VALUES + ('Да'), + ('Нет') +ON CONFLICT (name) DO NOTHING; \ No newline at end of file diff --git a/backend/db/migrations/033_add_is_rag_source_id_to_user_tables.sql b/backend/db/migrations/033_add_is_rag_source_id_to_user_tables.sql new file mode 100644 index 0000000..ee1bcc3 --- /dev/null +++ b/backend/db/migrations/033_add_is_rag_source_id_to_user_tables.sql @@ -0,0 +1,2 @@ +ALTER TABLE user_tables +ADD COLUMN is_rag_source_id INTEGER REFERENCES is_rag_source(id) DEFAULT 2; -- 2 = 'Нет' \ No newline at end of file diff --git a/backend/routes/chat.js b/backend/routes/chat.js index 2a9b1ac..c7fa055 100644 --- a/backend/routes/chat.js +++ b/backend/routes/chat.js @@ -73,16 +73,16 @@ async function processGuestMessages(userId, guestId) { conversation = lastConvResult.rows[0]; } else { // Если нет ни одного диалога, создаём новый - const firstMessage = guestMessages[0]; - const title = firstMessage.content - ? (firstMessage.content.length > 30 ? `${firstMessage.content.substring(0, 30)}...` : firstMessage.content) - : (firstMessage.attachment_filename ? `Файл: ${firstMessage.attachment_filename}` : 'Новый диалог'); - const newConversationResult = await db.getQuery()( - 'INSERT INTO conversations (user_id, title) VALUES ($1, $2) RETURNING *', - [userId, title] - ); + const firstMessage = guestMessages[0]; + const title = firstMessage.content + ? (firstMessage.content.length > 30 ? `${firstMessage.content.substring(0, 30)}...` : firstMessage.content) + : (firstMessage.attachment_filename ? `Файл: ${firstMessage.attachment_filename}` : 'Новый диалог'); + const newConversationResult = await db.getQuery()( + 'INSERT INTO conversations (user_id, title) VALUES ($1, $2) RETURNING *', + [userId, title] + ); conversation = newConversationResult.rows[0]; - logger.info(`Created new conversation ${conversation.id} for guest messages`); + logger.info(`Created new conversation ${conversation.id} for guest messages`); } // --- КОНЕЦ блока поиска/создания диалога --- @@ -151,18 +151,18 @@ async function processGuestMessages(userId, guestId) { rules ? rules.rules : null ); logger.info('AI response for guest message received' + (aiResponseContent ? '' : ' (empty)'), { conversationId: conversation.id }); - if (aiResponseContent) { + if (aiResponseContent) { await db.getQuery()( - `INSERT INTO messages + `INSERT INTO messages (conversation_id, user_id, content, sender_type, role, channel) VALUES ($1, $2, $3, 'assistant', 'assistant', 'web')`, [conversation.id, userId, aiResponseContent] - ); + ); logger.info('AI response for guest message saved', { conversationId: conversation.id }); - } + } } catch (aiError) { logger.error('Error getting or saving AI response for guest message:', aiError); - } + } } } // --- конец блока генерации ответа ИИ --- @@ -361,16 +361,16 @@ router.post('/message', requireAuth, upload.array('attachments'), async (req, re conversationId = conversation.id; } else { // Создаем новый диалог, если нет ни одного - const title = message - ? (message.length > 50 ? `${message.substring(0, 50)}...` : message) - : (file ? `Файл: ${file.originalname}` : 'Новый диалог'); - const newConvResult = await db.getQuery()( - 'INSERT INTO conversations (user_id, title) VALUES ($1, $2) RETURNING *', - [userId, title] - ); - conversation = newConvResult.rows[0]; - conversationId = conversation.id; - logger.info('Created new conversation', { conversationId, userId }); + const title = message + ? (message.length > 50 ? `${message.substring(0, 50)}...` : message) + : (file ? `Файл: ${file.originalname}` : 'Новый диалог'); + const newConvResult = await db.getQuery()( + 'INSERT INTO conversations (user_id, title) VALUES ($1, $2) RETURNING *', + [userId, title] + ); + conversation = newConvResult.rows[0]; + conversationId = conversation.id; + logger.info('Created new conversation', { conversationId, userId }); } } diff --git a/backend/routes/tables.js b/backend/routes/tables.js index eb094bf..225f105 100644 --- a/backend/routes/tables.js +++ b/backend/routes/tables.js @@ -23,10 +23,10 @@ router.get('/', async (req, res, next) => { // Создать новую таблицу (доступно всем) router.post('/', async (req, res, next) => { try { - const { name, description } = req.body; + const { name, description, isRagSourceId } = req.body; const result = await db.getQuery()( - 'INSERT INTO user_tables (name, description) VALUES ($1, $2) RETURNING *', - [name, description || null] + 'INSERT INTO user_tables (name, description, is_rag_source_id) VALUES ($1, $2, $3) RETURNING *', + [name, description || null, isRagSourceId || 2] ); res.json(result.rows[0]); } catch (err) { @@ -38,10 +38,12 @@ router.post('/', async (req, res, next) => { router.get('/:id', async (req, res, next) => { try { const tableId = req.params.id; + const tableMetaResult = await db.getQuery()('SELECT name, description FROM user_tables WHERE id = $1', [tableId]); + const tableMeta = tableMetaResult.rows[0] || { name: '', description: '' }; const columns = (await db.getQuery()('SELECT * FROM user_columns WHERE table_id = $1 ORDER BY "order" ASC, id ASC', [tableId])).rows; const rows = (await db.getQuery()('SELECT * FROM user_rows WHERE table_id = $1 ORDER BY id', [tableId])).rows; const cellValues = (await db.getQuery()('SELECT * FROM user_cell_values WHERE row_id IN (SELECT id FROM user_rows WHERE table_id = $1)', [tableId])).rows; - res.json({ columns, rows, cellValues }); + res.json({ name: tableMeta.name, description: tableMeta.description, columns, rows, cellValues }); } catch (err) { next(err); } @@ -181,14 +183,15 @@ router.patch('/column/:columnId', async (req, res, next) => { router.patch('/:id', async (req, res, next) => { try { const tableId = req.params.id; - const { name, description } = req.body; + const { name, description, isRagSourceId } = req.body; const result = await db.getQuery()( `UPDATE user_tables SET name = COALESCE($1, name), description = COALESCE($2, description), + is_rag_source_id = COALESCE($3, is_rag_source_id), updated_at = NOW() - WHERE id = $3 RETURNING *`, - [name, description, tableId] + WHERE id = $4 RETURNING *`, + [name, description, isRagSourceId, tableId] ); res.json(result.rows[0]); } catch (err) { diff --git a/frontend/src/components/tables/CreateTableModal.vue b/frontend/src/components/tables/CreateTableModal.vue deleted file mode 100644 index aaf1fb4..0000000 --- a/frontend/src/components/tables/CreateTableModal.vue +++ /dev/null @@ -1,111 +0,0 @@ - - - - - \ No newline at end of file diff --git a/frontend/src/components/tables/DynamicTablesModal.vue b/frontend/src/components/tables/DynamicTablesModal.vue deleted file mode 100644 index e9407ab..0000000 --- a/frontend/src/components/tables/DynamicTablesModal.vue +++ /dev/null @@ -1,101 +0,0 @@ - - - - - \ No newline at end of file diff --git a/frontend/src/components/tables/UserTableView.vue b/frontend/src/components/tables/UserTableView.vue index 105d00b..76f4363 100644 --- a/frontend/src/components/tables/UserTableView.vue +++ b/frontend/src/components/tables/UserTableView.vue @@ -1,4 +1,8 @@