- Добавлен сервис CrmMySQLService для прямого подключения к MySQL CRM - Обновлён метод get_draft() для получения cf_2624 напрямую из БД - Реализована блокировка полей (readonly) при contact_data_confirmed = true - Добавлен выбор банка для СБП выплат с динамической загрузкой из API - Обновлена документация по работе с cf_2624 и MySQL - Добавлен network_mode: host в docker-compose для доступа к MySQL - Обновлены компоненты формы для поддержки блокировки полей
3.6 KiB
3.6 KiB
Добавление 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;
Порядок работы
-
n8n workflow:
CreateWebContacКлиентправ→ получаетcf_2624из CRMclaimsave→ сохраняет черновикCode: Prepare OCR Status Event→ формирует событие сcf_2624HTTP RequestилиRedis Publish→ публикует вocr_events:{session_id}
-
Backend:
- Получает событие из Redis
- Сохраняет
cf_2624в черновик - Загружает
form_draftиз PostgreSQL - Отправляет на фронтенд через SSE
-
Фронтенд:
- Получает событие через SSE
- Использует
cf_2624для блокировки полей
Проверка
- ✅ Событие публикуется в
ocr_events:{session_id}сcf_2624 - ✅ Backend сохраняет
cf_2624в черновик (payload.cf_2624) - ✅ При загрузке черновика
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 - Использоваться для блокировки полей на фронтенде