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 - Обновлены компоненты формы для поддержки блокировки полей
This commit is contained in:
114
docs/CF_2624_IN_OCR_STATUS_EVENT.md
Normal file
114
docs/CF_2624_IN_OCR_STATUS_EVENT.md
Normal file
@@ -0,0 +1,114 @@
|
||||
# Добавление 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`
|
||||
- Использоваться для блокировки полей на фронтенде
|
||||
|
||||
|
||||
Reference in New Issue
Block a user