Files
aiform_prod/SESSION_LOG_2025-11-19.md
AI Assistant 0978e485dc feat: Add claim plan confirmation flow via Redis SSE
Problem:
- After wizard form submission, need to wait for claim data from n8n
- Claim data comes via Redis channel claim:plan:{session_token}
- Need to display confirmation form with claim data

Solution:
1. Backend: Added SSE endpoint /api/v1/claim-plan/{session_token}
   - Subscribes to Redis channel claim:plan:{session_token}
   - Streams claim data from n8n to frontend
   - Handles timeouts and errors gracefully

2. Frontend: Added subscription to claim:plan channel
   - StepWizardPlan: After form submission, subscribes to SSE
   - Waits for claim_plan_ready event
   - Shows loading message while waiting
   - On success: saves claimPlanData and shows confirmation step

3. New component: StepClaimConfirmation
   - Displays claim confirmation form in iframe
   - Receives claimPlanData from parent
   - Generates HTML form (placeholder - should call n8n for real HTML)
   - Handles confirmation/cancellation via postMessage

4. ClaimForm: Added conditional step for confirmation
   - Shows StepClaimConfirmation when showClaimConfirmation=true
   - Step appears after StepWizardPlan
   - Only visible when claimPlanData is available

Flow:
1. User fills wizard form → submits
2. Form data sent to n8n via /api/v1/claims/wizard
3. Frontend subscribes to SSE /api/v1/claim-plan/{session_token}
4. n8n processes data → publishes to Redis claim:plan:{session_token}
5. Backend receives → streams to frontend via SSE
6. Frontend receives → shows StepClaimConfirmation
7. User confirms → proceeds to next step

Files:
- backend/app/api/events.py: Added stream_claim_plan endpoint
- frontend/src/components/form/StepWizardPlan.tsx: Added subscribeToClaimPlan
- frontend/src/components/form/StepClaimConfirmation.tsx: New component
- frontend/src/pages/ClaimForm.tsx: Added confirmation step to steps array
2025-11-24 13:36:14 +03:00

202 lines
7.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 📋 Лог сессии 19.11.2025
## Основные задачи
1. ✅ Исправлен конфликт имён переменных в `loadDraft` (claimId → finalClaimId)
2. ✅ Убран `claim_id` из ранних этапов формы - используется только `session_id`
3. ✅ Настроен узел `claimsave` для сохранения первичного черновика
4. ✅ Исправлены ошибки в n8n Code узлах
---
## 1. Исправление ошибки загрузки черновика
**Проблема:** `ReferenceError: Cannot access 'claimId2' before initialization`
**Причина:** Конфликт имён - параметр функции `claimId` и локальная переменная `const claimId`
**Решение:**
- Переименована локальная переменная в `finalClaimId`
- Обновлены все использования переменной
**Файлы:**
- `ticket_form/frontend/src/pages/ClaimForm.tsx`
---
## 2. Убран `claim_id` из ранних этапов
**Решение:** Использовать только `session_id` на этапах до генерации `wizard_plan`
### Изменения в фронтенде:
#### `StepDescription.tsx`:
- ❌ Убрана проверка `if (!formData.claim_id)`
- ❌ Убран `claim_id` из запроса к `/api/v1/claims/description`
- ❌ Убран `claim_id` из mock данных
#### `Step1Phone.tsx`:
- ❌ Убран `claim_id` из сохранения данных после верификации телефона
- ✅ Сохраняется только `unified_id`, `contact_id`, `phone`
#### `StepWizardPlan.tsx`:
- ✅ Заменен `claim_id` на `session_id` для SSE подключения (`/events/${sessionId}`)
- ❌ Убрана проверка `claim_id` перед рендером
- ❌ Убран `claim_id` из отправки данных в n8n
### Изменения в backend:
#### `claims.py`:
-`claim_id` уже опциональный в модели `TicketFormDescriptionRequest`
- ✅ Обновлено логирование для работы с опциональным `claim_id`
**Файлы:**
- `ticket_form/frontend/src/components/form/StepDescription.tsx`
- `ticket_form/frontend/src/components/form/Step1Phone.tsx`
- `ticket_form/frontend/src/components/form/StepWizardPlan.tsx`
- `ticket_form/backend/app/api/claims.py`
---
## 3. Настройка узла `claimsave` для первичного черновика
**Задача:** Сохранить первичный черновик сразу после генерации `wizard_plan`
**Решение:**
- Создан SQL запрос для сохранения первичного черновика
- Используется `session_token` для связи (вместо `claim_id`)
- Сохраняются данные из AI Agent1 и AI Agent13
**Что сохраняется:**
-`wizard_plan` - план вопросов от AI Agent12
-`problem_description` - описание проблемы
-`answers_prefill` - предзаполненные ответы
-`coverage_report` - отчёт о покрытии
-`ai_agent1_facts` - факты из AI Agent1 (facts_short, facts_full, problem)
-`ai_agent13_rag` - RAG ответ от AI Agent13
-`session_token` - для связи
-`unified_id` - если есть (передается с фронта)
- ⚠️ `claim_id` - пока NULL, будет сгенерирован позже
**Документация:**
- `ticket_form/docs/CLAIMSAVE_PRIMARY_DRAFT_FIX.md` - полная инструкция
- `ticket_form/docs/SQL_CLAIMSAVE_PRIMARY_DRAFT.sql` - готовый SQL запрос
---
## 4. Исправления n8n Code узлов
### Узел `Code4` (подготовка данных для Redis)
**Проблема:** Использовался `claim_id` вместо `session_token` для Redis ключа
**Исправление:**
```javascript
// Было:
const sessionToken = $('Redis Trigger').first().json.message.claim_id
// Стало:
const sessionToken = $('Edit Fields11').first().json.session_token
|| $('Redis Trigger').first().json.message.session_id
|| null;
const redisKey = `ocr_events:${sessionToken || 'temp-' + Date.now()}`;
```
**Файл:** `ticket_form/docs/CODE4_FIXED.js`
### Узел создания контакта (CreateWebContact)
**Проблема:**
- Использовалась неопределённая переменная `session` в `redis_key`
- Генерировался `claim_id`, который не нужен на этих этапах
- Не было `unified_id` из ноды `user_get`
**Исправление:**
- Убрана генерация `claim_id`
- Добавлен `unified_id` из ноды `user_get`
- Убраны `voucher` и `event_type` из `sessionData`
- Исправлен `redis_key` на использование `session_id`
**Файл:** `ticket_form/docs/CODE_CREATE_WEB_CONTACT_FINAL.js`
**Что теперь в `redis_value`:**
```json
{
"unified_id": "usr_90599ff2-ac79-4236-b950-0df85395096c",
"contact_id": "396625",
"phone": "79262306381",
"is_new_contact": false,
"status": "draft",
"current_step": 1,
"created_at": "2025-11-19T20:30:00.000Z",
"updated_at": "2025-11-19T20:30:00.000Z",
"documents": {},
"email": null,
"bank_name": null
}
```
---
## 5. Анализ workflow `ticket_form:description`
**Workflow ID:** `b4K4u851b4JFivyD`
**Структура:**
- 35 узлов, 31 соединение
- Заканчивается узлом `push_wizard1` - пушит wizard plan в Redis
**Основной поток:**
1. Redis Trigger → получает событие из `ticket_form:description`
2. get_claime_data1 → получает данные из Redis
3. AI Agent1 → извлекает факты (полный и короткий)
4. AI Agent13 → генерирует RAG ответ
5. AI Agent12 → генерирует wizard_plan
6. Code4 → форматирует для Redis
7. **claimsave_primary** → сохраняет первичный черновик (нужно добавить)
8. push_wizard1 → пушит wizard_plan в Redis для SSE
**Что публикуется в `ticket_form:description`:**
```json
{
"type": "ticket_form_description",
"session_id": "sess-abc-123...",
"claim_id": null, // опционально
"phone": "79262306381",
"email": "user@example.com",
"description": "Текст описания проблемы",
"source": "ticket_form",
"timestamp": "2025-11-19T20:30:00.000Z"
}
```
---
## Коммиты
1. **de011efb** - `fix: исправлен конфликт имён переменных в loadDraft (claimId -> finalClaimId)`
2. **d2f37faa** - `fix: убран claim_id, используется только session_id на ранних этапах`
---
## Следующие шаги
1. ✅ Добавить узел `claimsave_primary` в workflow после `Code4`
2. ✅ Исправить узел `Code4` в n8n (использовать `session_token`)
3. ✅ Исправить узел создания контакта в n8n (убрать `claim_id`, добавить `unified_id`)
4. ⏳ Протестировать создание нового обращения
5. ⏳ Проверить сохранение первичного черновика
---
## Файлы документации
- `ticket_form/docs/CLAIMSAVE_PRIMARY_DRAFT_FIX.md` - инструкция по настройке `claimsave`
- `ticket_form/docs/SQL_CLAIMSAVE_PRIMARY_DRAFT.sql` - SQL запрос для первичного черновика
- `ticket_form/docs/CODE4_FIXED.js` - исправленный код узла Code4
- `ticket_form/docs/CODE_CREATE_WEB_CONTACT_FINAL.js` - исправленный код создания контакта