Files
aiform_dev/SESSION_LOG_2025-12-03.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

199 lines
7.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Лог сессии 2025-12-03
## Задача 1: Получение cf_2624 из MySQL при загрузке черновика
### Проблема
Пользователь заметил, что для `claim_id: "226564ce-d7cf-48ee-a820-690e8f5ec8e5"` доступно редактирование, хотя в CRM стоит галка "Данные подтверждены" (`cf_2624 = "1"`).
### Решение
Вместо передачи `cf_2624` через события Redis, реализован прямой SQL запрос к MySQL БД vtiger CRM при загрузке черновика.
## Изменения
### 1. Добавлены credentials для MySQL CRM в `config.py`
```python
# MySQL CRM (vtiger CRM)
mysql_crm_host: str = "localhost"
mysql_crm_port: int = 3306
mysql_crm_db: str = "ci20465_72new"
mysql_crm_user: str = "ci20465_72new"
mysql_crm_password: str = "EcY979Rn"
```
### 2. Создан сервис `CrmMySQLService`
**Файл:** `ticket_form/backend/app/services/crm_mysql_service.py`
- Подключение к MySQL БД vtiger CRM
- Методы: `fetch_one()`, `fetch_all()`, `execute()`
- Использует `aiomysql` для асинхронных запросов
### 3. Обновлён `main.py`
- Добавлено подключение к MySQL CRM при старте
- Добавлено закрытие соединения при остановке
### 4. Обновлён `claims.py` - метод `get_draft()`
**Эндпоинт:** `GET /api/v1/claims/drafts/{claim_id}`
**Изменения:**
- Убран webservice API (getchallenge → login → retrieve)
- Добавлен прямой SQL запрос к MySQL для получения `cf_2624`
- Получаем все данные контакта, включая `cf_2624`
- Добавлено логирование для отладки
**SQL запрос:**
```sql
SELECT
cd.contactid,
cd.firstname,
cd.lastname,
cd.email,
cd.mobile,
ccf.cf_2624 AS cf_2624
FROM vtiger_contactdetails cd
LEFT JOIN vtiger_contactscf ccf ON ccf.contactid = cd.contactid
LEFT JOIN vtiger_crmentity ce ON ce.crmid = cd.contactid
WHERE cd.contactid = %s
AND ce.deleted = 0
LIMIT 1
```
**Логика:**
- Если `cf_2624 = "1"``contact_data_confirmed = True`, `contact_data_can_edit = False`
- Если `cf_2624 = "0"` или `NULL``contact_data_confirmed = False`, `contact_data_can_edit = True`
### 5. Обновлены SQL файлы и документация
- `N8N_POSTGRESQL_GET_CONTACT_DATA.sql``N8N_MYSQL_GET_CONTACT_DATA.sql`
- Изменён синтаксис: `$1``?` (для n8n MySQL ноды)
- Обновлена документация `BACKEND_GET_CONTACT_CF_2624_FROM_POSTGRESQL.md`
- Создан `N8N_MYSQL_GET_CONTACT_DATA.md`
## Преимущества нового подхода
1.**Проще** - один SQL запрос вместо цепочки HTTP запросов
2.**Быстрее** - прямой запрос к БД
3.**Надёжнее** - не зависит от webservice API
4.**Актуальнее** - всегда получаем свежие данные из БД
## Проблемы и решения
### Проблема 1: Файл crm_mysql_service.py отсутствовал в контейнере
**Решение:** Пересобран контейнер через `docker-compose build ticket_form_backend`
### Проблема 2: MySQL не подключался из Docker контейнера
**Ошибка:** `Can't connect to MySQL server on 'localhost'`
**Решение:**
- Изменён `docker-compose.yml`: добавлен `network_mode: host`
- Изменён `config.py`: `mysql_crm_host = "localhost"` (в режиме host работает)
**Результат:** `✅ MySQL CRM DB connected: localhost:3306/ci20465_72new`
### Проблема 3: contact_data_confirmed возвращал None
**Причина:** Флаг не передавался в компонент `StepClaimConfirmation`
**Решение:**
- Добавлен prop `contact_data_confirmed` в `StepClaimConfirmation`
- Передача флага из `formData.contact_data_confirmed` в компонент
- Исправлена логика получения флага (приоритет: props > claimPlanData > false)
## Проверка
**MySQL запрос:**
```bash
mysql -h localhost -u ci20465_72new -p'EcY979Rn' ci20465_72new \
-e "SELECT contactid, cf_2624 FROM vtiger_contactscf WHERE contactid = '399542' LIMIT 1;"
```
**Результат:**
```
contactid cf_2624
399542 1
```
В MySQL `cf_2624 = "1"` для `contact_id = "399542"` - данные подтверждены.
**API тест:**
```bash
curl "http://localhost:8200/api/v1/claims/drafts/226564ce-d7cf-48ee-a820-690e8f5ec8e5"
```
**Результат:**
```json
{
"contact_data_confirmed": true,
"contact_data_can_edit": false,
"contact_data_from_crm": {
"contactid": "399542",
"cf_2624": "1",
...
}
}
```
## Текущий статус
- ✅ Код обновлён
- ✅ Бэкенд пересобран и перезапущен
- ✅ MySQL CRM подключён
- ✅ API возвращает правильные данные
- ✅ Фронтенд получает `contact_data_confirmed` и блокирует поля
- ✅ Поля формы блокируются (readonly) при `contact_data_confirmed = true`
## Блокировка полей
При `contact_data_confirmed = true` блокируются следующие поля:
- `firstname` (Имя)
- `lastname` (Фамилия)
- `secondname` / `middle_name` (Отчество)
- `inn` (ИНН)
- `birthday` (Дата рождения)
- `birthplace` / `birth_place` (Место рождения)
- `address` / `mailingstreet` (Адрес)
- `email` (E-mail)
Поля становятся `readonly` и отображаются с серым фоном.
---
## Задача 2: Выбор банка для СБП выплат
### Реализация
- Динамическая загрузка списка банков из API `http://212.193.27.93/api/payouts/dictionaries/nspk-banks`
- Добавлено в форму создания заявки (`Step3Payment.tsx`)
- Добавлено в форму редактирования (`generateConfirmationFormHTML.ts`)
- Используется `input` + `datalist` для автоподстановки
---
## Файлы изменены
### Backend:
- `ticket_form/backend/app/config.py` - добавлены credentials для MySQL CRM
- `ticket_form/backend/app/services/crm_mysql_service.py` - новый сервис
- `ticket_form/backend/app/main.py` - подключение к MySQL CRM
- `ticket_form/backend/app/api/claims.py` - прямой SQL запрос к MySQL
- `ticket_form/docker-compose.yml` - добавлен `network_mode: host`
### Frontend:
- `ticket_form/frontend/src/components/form/StepClaimConfirmation.tsx` - передача `contact_data_confirmed`
- `ticket_form/frontend/src/pages/ClaimForm.tsx` - передача флага в компонент
- `ticket_form/frontend/src/components/form/generateConfirmationFormHTML.ts` - блокировка полей
### Документация:
- `ticket_form/docs/N8N_MYSQL_GET_CONTACT_DATA.sql` - SQL запрос для n8n
- `ticket_form/docs/N8N_MYSQL_GET_CONTACT_DATA.md` - документация
- `ticket_form/docs/BACKEND_GET_CONTACT_CF_2624_FROM_POSTGRESQL.md` - обновлена документация
---
## Коммиты
1. `e1142315` - feat: Получение cf_2624 из MySQL при загрузке черновика
2. `a86120dd` - fix: передача contact_data_confirmed в StepClaimConfirmation для блокировки полей
---
**Время работы:** 2025-12-03 16:00-17:00
**Статус:** ✅ Завершено успешно