- Добавлен сервис CrmMySQLService для прямого подключения к MySQL CRM - Обновлён метод get_draft() для получения cf_2624 напрямую из БД - Реализована блокировка полей (readonly) при contact_data_confirmed = true - Добавлен выбор банка для СБП выплат с динамической загрузкой из API - Обновлена документация по работе с cf_2624 и MySQL - Добавлен network_mode: host в docker-compose для доступа к MySQL - Обновлены компоненты формы для поддержки блокировки полей
7.8 KiB
Лог сессии 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
# 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 запрос:
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
Преимущества нового подхода
- ✅ Проще - один SQL запрос вместо цепочки HTTP запросов
- ✅ Быстрее - прямой запрос к БД
- ✅ Надёжнее - не зависит от webservice API
- ✅ Актуальнее - всегда получаем свежие данные из БД
Проблемы и решения
Проблема 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 запрос:
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 тест:
curl "http://localhost:8200/api/v1/claims/drafts/226564ce-d7cf-48ee-a820-690e8f5ec8e5"
Результат:
{
"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 CRMticket_form/backend/app/services/crm_mysql_service.py- новый сервисticket_form/backend/app/main.py- подключение к MySQL CRMticket_form/backend/app/api/claims.py- прямой SQL запрос к MySQLticket_form/docker-compose.yml- добавленnetwork_mode: host
Frontend:
ticket_form/frontend/src/components/form/StepClaimConfirmation.tsx- передачаcontact_data_confirmedticket_form/frontend/src/pages/ClaimForm.tsx- передача флага в компонентticket_form/frontend/src/components/form/generateConfirmationFormHTML.ts- блокировка полей
Документация:
ticket_form/docs/N8N_MYSQL_GET_CONTACT_DATA.sql- SQL запрос для n8nticket_form/docs/N8N_MYSQL_GET_CONTACT_DATA.md- документацияticket_form/docs/BACKEND_GET_CONTACT_CF_2624_FROM_POSTGRESQL.md- обновлена документация
Коммиты
e1142315- feat: Получение cf_2624 из MySQL при загрузке черновикаa86120dd- fix: передача contact_data_confirmed в StepClaimConfirmation для блокировки полей
Время работы: 2025-12-03 16:00-17:00
Статус: ✅ Завершено успешно