Database changes: - Add unified_id, contact_id, phone columns to clpr_claims table - Create indexes for fast lookup by these fields - Migrate existing data from payload to new columns - SQL migration: docs/SQL_ALTER_CLPR_CLAIMS_ADD_FIELDS.sql SQL improvements: - Simplify claimsave query: remove complex claim_lookup logic - Use UPSERT (INSERT ON CONFLICT) with known claim_id - Always return claim (fix NULL issue) - Store unified_id, contact_id, phone directly in table columns - SQL: docs/SQL_CLAIMSAVE_UPSERT_SIMPLE.sql Workflow enhancements: - Add branch for form submissions WITHOUT files - Create 6 new nodes: extract, prepare, save, redis, respond - Separate flow for has_files=false in IF node - Instructions: docs/N8N_FORM_GET_NO_FILES_INSTRUCTIONS.md - Node config: docs/N8N_FORM_GET_NO_FILES_BRANCH.json Migration stats: - Total claims: 81 - With unified_id: 77 - Migrated from payload: 2 Next steps: 1. Add 6 nodes to n8n workflow form_get (ID: 8ZVMTsuH7Cmw7snw) 2. Connect TRUE branch of IF node to extract_webhook_data_no_files 3. Test form submission without files 4. Verify PostgreSQL save and Redis event
116 lines
5.5 KiB
Markdown
116 lines
5.5 KiB
Markdown
# Лог сессии разработки - 20 ноября 2025
|
||
|
||
## Проблема (из предыдущей сессии)
|
||
После верификации телефона не отображался список черновиков, хотя в базе данных есть заявки с `unified_id`.
|
||
|
||
## Решение
|
||
|
||
### 1. Исправлен SQL запрос в backend (`claims.py`)
|
||
**Проблема:** Запрос строился через конкатенацию строк, что могло приводить к проблемам с параметрами.
|
||
|
||
**Решение:** Переписан SQL запрос - теперь используется прямой запрос для каждого случая:
|
||
- Для `unified_id`: прямой запрос `WHERE c.unified_id = $1`
|
||
- Для `phone`: подзапрос через `clpr_user_accounts` и `clpr_users`
|
||
- Для `session_id`: прямой запрос `WHERE c.session_token = $1`
|
||
|
||
```python
|
||
if unified_id:
|
||
query = """
|
||
SELECT
|
||
c.id,
|
||
c.payload->>'claim_id' as claim_id,
|
||
c.session_token,
|
||
c.status_code,
|
||
c.channel,
|
||
c.payload,
|
||
c.created_at,
|
||
c.updated_at
|
||
FROM clpr_claims c
|
||
WHERE c.unified_id = $1
|
||
ORDER BY c.updated_at DESC
|
||
LIMIT 20
|
||
"""
|
||
params = [unified_id]
|
||
```
|
||
|
||
### 2. Улучшена обработка черновиков в frontend (`ClaimForm.tsx`)
|
||
**Проблема:** Черновики из Telegram имеют другую структуру данных (данные в `payload.body`), а не напрямую в `payload`.
|
||
|
||
**Решение:** Добавлена поддержка обоих форматов:
|
||
- **Telegram формат:** данные в `payload.body.wizard_plan`, `payload.body.answers`
|
||
- **Web form формат:** данные напрямую в `payload.wizard_plan`, `payload.answers`
|
||
|
||
```typescript
|
||
// ✅ Для telegram черновиков данные могут быть в payload.body
|
||
const body = payload.body || {};
|
||
const isTelegramFormat = !!payload.body;
|
||
|
||
// ✅ Извлекаем данные из body (telegram) или напрямую из payload (web_form)
|
||
const wizardPlanRaw = body.wizard_plan || payload.wizard_plan;
|
||
const answersRaw = body.answers || payload.answers;
|
||
const problemDescription = body.problem_description || payload.problem_description || body.description || payload.description;
|
||
|
||
// ✅ Парсим wizard_plan и answers, если они строки (JSON)
|
||
let wizardPlan = wizardPlanRaw;
|
||
if (typeof wizardPlanRaw === 'string') {
|
||
try {
|
||
wizardPlan = JSON.parse(wizardPlanRaw);
|
||
} catch (e) {
|
||
console.warn('⚠️ Не удалось распарсить wizard_plan:', e);
|
||
}
|
||
}
|
||
```
|
||
|
||
### 3. Улучшена обработка `claim_id`
|
||
**Проблема:** `claim_id` может быть в разных местах в зависимости от формата данных.
|
||
|
||
**Решение:** Добавлен поиск `claim_id` в нескольких местах:
|
||
```typescript
|
||
const finalClaimId = claim.claim_id || payload.claim_id || body.claim_id || claim.id || formData.claim_id || claimId;
|
||
```
|
||
|
||
### 4. Добавлено детальное логирование
|
||
- В `loadDraft`: логирование всех этапов загрузки черновика
|
||
- В `get_draft` (backend): логирование найденных данных
|
||
- В `list_drafts` (backend): тестовые COUNT запросы для отладки
|
||
|
||
### 5. Исправлена обработка `claim_id` в backend
|
||
В `get_draft` теперь извлекается `claim_id` из `payload`, если его нет в `row`:
|
||
```python
|
||
claim_id_from_payload = payload.get('claim_id') if isinstance(payload, dict) else None
|
||
final_claim_id = row.get('claim_id') or claim_id_from_payload
|
||
```
|
||
|
||
## Результат
|
||
✅ **Черновики теперь возвращаются!** API корректно возвращает список черновиков для `unified_id`.
|
||
|
||
## Файлы изменены
|
||
|
||
1. `backend/app/api/claims.py`:
|
||
- Переписан SQL запрос для `list_drafts`
|
||
- Добавлено логирование и тестовые COUNT запросы
|
||
- Улучшена обработка `claim_id` в `get_draft`
|
||
|
||
2. `frontend/src/pages/ClaimForm.tsx`:
|
||
- Добавлена поддержка формата Telegram черновиков
|
||
- Улучшена обработка `claim_id` из разных источников
|
||
- Добавлено детальное логирование загрузки черновика
|
||
|
||
3. `frontend/src/components/form/Step1Phone.tsx`:
|
||
- (Возможно, были изменения для передачи unified_id)
|
||
|
||
4. `frontend/src/components/form/StepDraftSelection.tsx`:
|
||
- (Возможно, были изменения для отображения черновиков)
|
||
|
||
## Текущий статус
|
||
✅ **Работает:** API возвращает черновики
|
||
✅ **Работает:** Загрузка черновиков поддерживает оба формата (Telegram и web_form)
|
||
⚠️ **Требует проверки:** Отображение черновиков в UI (StepDraftSelection)
|
||
|
||
## Следующие шаги
|
||
1. Проверить отображение черновиков в UI
|
||
2. Протестировать загрузку черновика из Telegram формата
|
||
3. Убедиться, что все данные корректно восстанавливаются в форму
|
||
|
||
|