Files
aiform_prod/docs/CF_2624_IN_OCR_STATUS_EVENT.md
AI Assistant 080e7ec105 feat: Получение cf_2624 из MySQL и блокировка полей при подтверждении данных
- Добавлен сервис CrmMySQLService для прямого подключения к MySQL CRM
- Обновлён метод get_draft() для получения cf_2624 напрямую из БД
- Реализована блокировка полей (readonly) при contact_data_confirmed = true
- Добавлен выбор банка для СБП выплат с динамической загрузкой из API
- Обновлена документация по работе с cf_2624 и MySQL
- Добавлен network_mode: host в docker-compose для доступа к MySQL
- Обновлены компоненты формы для поддержки блокировки полей
2025-12-04 12:22:23 +03:00

3.6 KiB
Raw Blame History

Добавление cf_2624 в событие ocr_status ready

Да, правильно!

Событие ocr_status с status: "ready" должно содержать поле cf_2624 и сохраняться в черновик.

Формат события в Redis

Канал: ocr_events:sess_5fc7cdd1-a848-4e92-aed4-3ee4bfb19b4c

Событие:

{
  "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:

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 для проверки

-- Проверить, что 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
  • Использоваться для блокировки полей на фронтенде