Files
aiform_prod/docs/CF_2624_IN_OCR_STATUS_EVENT.md

115 lines
3.6 KiB
Markdown
Raw Normal View History

# Добавление cf_2624 в событие ocr_status ready
## ✅ Да, правильно!
Событие `ocr_status` с `status: "ready"` должно содержать поле `cf_2624` и сохраняться в черновик.
## Формат события в Redis
**Канал:** `ocr_events:sess_5fc7cdd1-a848-4e92-aed4-3ee4bfb19b4c`
**Событие:**
```json
{
"event_type": "ocr_status",
"status": "ready",
"claim_id": "ef853bac-f54b-46aa-adf8-f0c9c0cd76bc",
"message": "Заявление сформировано",
"timestamp": "2025-12-03T12:44:12.347Z",
"cf_2624": "0"
}
```
## Что происходит
### 1. n8n workflow публикует событие
После сохранения черновика (после `claimsave`) n8n публикует событие в Redis канал `ocr_events:{session_id}` с полем `cf_2624`.
**Где добавить:** После ноды `claimsave`, перед публикацией в Redis.
**См. подробности:** `ticket_form/docs/N8N_ADD_CF_2624_TO_OCR_STATUS_EVENT.md`
---
### 2. Backend обрабатывает событие
Backend получает событие из Redis и:
- ✅ Загружает `form_draft` из PostgreSQL
-**Сохраняет `cf_2624` в черновик**`payload.cf_2624`)
- ✅ Отправляет событие на фронтенд через SSE
**Файл:** `ticket_form/backend/app/api/events.py` (строки 218-273)
---
### 3. Сохранение в черновик
`cf_2624` сохраняется в таблицу `clpr_claims` в поле `payload.cf_2624`:
```sql
UPDATE clpr_claims
SET payload = jsonb_set(
COALESCE(payload, '{}'::jsonb),
'{cf_2624}',
'"0"'::jsonb -- или '"1"'
)
WHERE id::text = $1 OR payload->>'claim_id' = $1;
```
---
## Порядок работы
1. **n8n workflow:**
- `CreateWebContacКлиентправ` → получает `cf_2624` из CRM
- `claimsave` → сохраняет черновик
- `Code: Prepare OCR Status Event` → формирует событие с `cf_2624`
- `HTTP Request` или `Redis Publish` → публикует в `ocr_events:{session_id}`
2. **Backend:**
- Получает событие из Redis
- Сохраняет `cf_2624` в черновик
- Загружает `form_draft` из PostgreSQL
- Отправляет на фронтенд через SSE
3. **Фронтенд:**
- Получает событие через SSE
- Использует `cf_2624` для блокировки полей
---
## Проверка
1. ✅ Событие публикуется в `ocr_events:{session_id}` с `cf_2624`
2. ✅ Backend сохраняет `cf_2624` в черновик (`payload.cf_2624`)
3. ✅ При загрузке черновика `cf_2624` доступен в `payload.cf_2624`
---
## SQL для проверки
```sql
-- Проверить, что cf_2624 сохранён в черновик
SELECT
id,
payload->>'claim_id' as claim_id,
payload->>'cf_2624' as cf_2624,
updated_at
FROM clpr_claims
WHERE payload->>'claim_id' = 'ef853bac-f54b-46aa-adf8-f0c9c0cd76bc'
ORDER BY updated_at DESC
LIMIT 1;
```
---
## Итого
**Да, правильно!** Событие `ocr_status` с `status: "ready"` должно содержать `cf_2624`, и это значение будет:
- Публиковаться в Redis канал `ocr_events:{session_id}`
- Сохраняться в черновик в `payload.cf_2624`
- Использоваться для блокировки полей на фронтенде