115 lines
3.6 KiB
Markdown
115 lines
3.6 KiB
Markdown
|
|
# Добавление 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`
|
|||
|
|
- Использоваться для блокировки полей на фронтенде
|
|||
|
|
|
|||
|
|
|