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
202 lines
7.9 KiB
Markdown
202 lines
7.9 KiB
Markdown
# 📋 Лог сессии 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` - исправленный код создания контакта
|
||
|
||
|
||
|