115 lines
5.5 KiB
Markdown
115 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. Убедиться, что все данные корректно восстанавливаются в форму
|
|||
|
|
|